reason.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /*
  2. * Copyright (c) 2019 Apple Inc. All rights reserved.
  3. *
  4. * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  5. *
  6. * This file contains Original Code and/or Modifications of Original Code
  7. * as defined in and that are subject to the Apple Public Source License
  8. * Version 2.0 (the 'License'). You may not use this file except in
  9. * compliance with the License. The rights granted to you under the License
  10. * may not be used to create, or enable the creation or redistribution of,
  11. * unlawful or unlicensed copies of an Apple operating system, or to
  12. * circumvent, violate, or enable the circumvention or violation of, any
  13. * terms of an Apple operating system software license agreement.
  14. *
  15. * Please obtain a copy of the License at
  16. * http://www.opensource.apple.com/apsl/ and read it before using this file.
  17. *
  18. * The Original Code and all software distributed under the License are
  19. * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  20. * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  21. * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  22. * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
  23. * Please see the License for the specific language governing rights and
  24. * limitations under the License.
  25. *
  26. * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  27. */
  28. #ifndef _REASON_H_
  29. #define _REASON_H_
  30. #include <stdint.h>
  31. __BEGIN_DECLS
  32. #ifdef KERNEL_PRIVATE
  33. #include <kern/kern_cdata.h>
  34. #include <os/refcnt.h>
  35. #ifdef XNU_KERNEL_PRIVATE
  36. #include <kern/locks.h>
  37. typedef struct os_reason {
  38. decl_lck_mtx_data(, osr_lock);
  39. os_refcnt_t osr_refcount;
  40. uint32_t osr_namespace;
  41. uint64_t osr_code;
  42. uint64_t osr_flags;
  43. uint32_t osr_bufsize;
  44. struct kcdata_descriptor osr_kcd_descriptor;
  45. char *osr_kcd_buf;
  46. } *os_reason_t;
  47. #define OS_REASON_NULL ((os_reason_t) 0)
  48. /* We only include 800 bytes of the exit reason description to not blow through the panic buffer */
  49. #define LAUNCHD_PANIC_REASON_STRING_MAXLEN "800"
  50. void os_reason_init(void);
  51. os_reason_t build_userspace_exit_reason(uint32_t reason_namespace, uint64_t reason_code, user_addr_t payload, uint32_t payload_size,
  52. user_addr_t reason_string, uint64_t reason_flags);
  53. char *launchd_exit_reason_get_string_desc(os_reason_t exit_reason);
  54. /* The blocking allocation is currently not exported to KEXTs */
  55. int os_reason_alloc_buffer(os_reason_t cur_reason, uint32_t osr_bufsize);
  56. #else /* XNU_KERNEL_PRIVATE */
  57. typedef void * os_reason_t;
  58. #endif /* XNU_KERNEL_PRIVATE */
  59. os_reason_t os_reason_create(uint32_t osr_namespace, uint64_t osr_code);
  60. int os_reason_alloc_buffer_noblock(os_reason_t cur_reason, uint32_t osr_bufsize);
  61. struct kcdata_descriptor * os_reason_get_kcdata_descriptor(os_reason_t cur_reason);
  62. void os_reason_ref(os_reason_t cur_reason);
  63. void os_reason_free(os_reason_t cur_reason);
  64. void os_reason_set_flags(os_reason_t cur_reason, uint64_t flags);
  65. void os_reason_set_description_data(os_reason_t cur_reason, uint32_t type, void *reason_data, uint32_t reason_data_len);
  66. #endif /* KERNEL_PRIVATE */
  67. /*
  68. * Reason namespaces.
  69. */
  70. #define OS_REASON_INVALID 0
  71. #define OS_REASON_JETSAM 1
  72. #define OS_REASON_SIGNAL 2
  73. #define OS_REASON_CODESIGNING 3
  74. #define OS_REASON_HANGTRACER 4
  75. #define OS_REASON_TEST 5
  76. #define OS_REASON_DYLD 6
  77. #define OS_REASON_LIBXPC 7
  78. #define OS_REASON_OBJC 8
  79. #define OS_REASON_EXEC 9
  80. #define OS_REASON_SPRINGBOARD 10
  81. #define OS_REASON_TCC 11
  82. #define OS_REASON_REPORTCRASH 12
  83. #define OS_REASON_COREANIMATION 13
  84. #define OS_REASON_AGGREGATED 14
  85. #define OS_REASON_RUNNINGBOARD 15
  86. #define OS_REASON_ASSERTIOND OS_REASON_RUNNINGBOARD /* old name */
  87. #define OS_REASON_SKYWALK 16
  88. #define OS_REASON_SETTINGS 17
  89. #define OS_REASON_LIBSYSTEM 18
  90. #define OS_REASON_FOUNDATION 19
  91. #define OS_REASON_WATCHDOG 20
  92. #define OS_REASON_METAL 21
  93. #define OS_REASON_WATCHKIT 22
  94. #define OS_REASON_GUARD 23
  95. #define OS_REASON_ANALYTICS 24
  96. #define OS_REASON_SANDBOX 25
  97. #define OS_REASON_SECURITY 26
  98. #define OS_REASON_ENDPOINTSECURITY 27
  99. /*
  100. * Update whenever new OS_REASON namespaces are added.
  101. */
  102. #define OS_REASON_MAX_VALID_NAMESPACE OS_REASON_ENDPOINTSECURITY
  103. #define OS_REASON_BUFFER_MAX_SIZE 5120
  104. #define OS_REASON_FLAG_NO_CRASH_REPORT 0x1 /* Don't create a crash report */
  105. #define OS_REASON_FLAG_GENERATE_CRASH_REPORT 0x2 /* Create a crash report - the default for userspace requests */
  106. #define OS_REASON_FLAG_FROM_USERSPACE 0x4 /* Reason created from a userspace syscall */
  107. #define OS_REASON_FLAG_FAILED_DATA_COPYIN 0x8 /* We failed to copyin data from userspace */
  108. #define OS_REASON_FLAG_PAYLOAD_TRUNCATED 0x10 /* The payload was truncated because it was longer than allowed */
  109. #define OS_REASON_FLAG_BAD_PARAMS 0x20 /* Invalid parameters were passed involved with creating this reason */
  110. #define OS_REASON_FLAG_CONSISTENT_FAILURE 0x40 /* Whatever caused this reason to be created will happen again */
  111. #define OS_REASON_FLAG_ONE_TIME_FAILURE 0x80 /* Whatever caused this reason to be created was a one time issue */
  112. #define OS_REASON_FLAG_NO_CRASHED_TID 0x100 /* Don't include the TID that processed the exit in the crash report */
  113. #define OS_REASON_FLAG_ABORT 0x200 /* Reason created from abort_* rather than terminate_* */
  114. /*
  115. * Set of flags that are allowed to be passed from userspace
  116. */
  117. #define OS_REASON_FLAG_MASK_ALLOWED_FROM_USER (OS_REASON_FLAG_CONSISTENT_FAILURE | OS_REASON_FLAG_ONE_TIME_FAILURE | OS_REASON_FLAG_NO_CRASH_REPORT | OS_REASON_FLAG_ABORT)
  118. /*
  119. * Macros to encode the exit reason namespace and first 32 bits of code in exception code
  120. * which is used by Report Crash as a hint. It should be only used as a hint since it
  121. * looses higher 32 bits of exit reason code.
  122. */
  123. #define ENCODE_OSR_NAMESPACE_TO_MACH_EXCEPTION_CODE(code, osr_namespace) \
  124. (code) = (code) | (((osr_namespace) & ((uint64_t)UINT32_MAX)) << 32)
  125. #define ENCODE_OSR_CODE_TO_MACH_EXCEPTION_CODE(code, osr_code) \
  126. (code) = (code) | ((osr_code) & ((uint64_t)UINT32_MAX))
  127. #ifndef KERNEL
  128. /*
  129. * abort_with_reason: Used to exit the current process and pass along
  130. * specific information about why it is being terminated.
  131. *
  132. * Inputs: args->reason_namespace - OS_REASON namespace specified for the reason
  133. * args->reason_code - code in the specified namespace for the reason
  134. * args->reason_string - additional string formatted information about the request
  135. * args->reason_flags - options requested for how the process should be terminated (see OS_REASON_FLAG_* above).
  136. *
  137. * Outputs: Does not return.
  138. */
  139. void abort_with_reason(uint32_t reason_namespace, uint64_t reason_code, const char *reason_string, uint64_t reason_flags)
  140. __attribute__((noreturn, cold));
  141. /*
  142. * abort_with_payload: Used to exit the current process and pass along
  143. * specific information about why it is being terminated. The payload pointer
  144. * should point to structured data that can be interpreted by the consumer of
  145. * exit reason information.
  146. *
  147. * Inputs: args->reason_namespace - OS_REASON namespace specified for the reason
  148. * args->reason_code - code in the specified namespace for the reason
  149. * args->payload - pointer to payload structure in user space
  150. * args->payload_size - length of payload buffer (this will be truncated to EXIT_REASON_PAYLOAD_MAX_LEN)
  151. * args->reason_string - additional string formatted information about the request
  152. * args->reason_flags - options requested for how the process should be terminated (see OS_REASON_FLAG_* above).
  153. *
  154. * Outputs: Does not return.
  155. */
  156. void abort_with_payload(uint32_t reason_namespace, uint64_t reason_code, void *payload, uint32_t payload_size, const char *reason_string,
  157. uint64_t reason_flags) __attribute__((noreturn, cold));
  158. /*
  159. * terminate_with_reason: Used to terminate a specific process and pass along
  160. * specific information about why it is being terminated.
  161. *
  162. * Inputs: args->pid - the PID of the process to be terminated
  163. * args->reason_namespace - OS_REASON namespace specified for the reason
  164. * args->reason_code - code in the specified namespace for the reason
  165. * args->reason_string - additional string formatted information about the request
  166. * args->reason_flags - options requested for how the process should be terminated (see OS_REASON_FLAG_* above)
  167. *
  168. * Outputs: EINVAL if the PID requested is the same as that of the calling process, invalid or the namespace provided is invalid.
  169. * ESRCH if we couldn't find a live process with the requested PID
  170. * EPERM if the caller is not privileged enough to kill the process with the requested PID
  171. * returns 0 otherwise
  172. */
  173. int terminate_with_reason(int pid, uint32_t reason_namespace, uint64_t reason_code, const char *reason_string, uint64_t reason_flags);
  174. /*
  175. * terminate_with_payload: Used to terminate a specific process and pass along
  176. * specific information about why it is being terminated. The payload pointer
  177. * should point to structured data that can be interpreted by the consumer of
  178. * exit reason information.
  179. *
  180. * Inputs: args->pid - the PID of the process to be terminated.
  181. * args->reason_namespace - OS_REASON namespace specified for the reason
  182. * args->reason_code - code in the specified namespace for the reason
  183. * args->payload - pointer to payload structure in user space
  184. * args->payload_size - length of payload buffer (this will be truncated to EXIT_REASON_PAYLOAD_MAX_LEN)
  185. * args->reason_string - additional string formatted information about the request
  186. * args->reason_flags - options requested for how the process should be terminated (see OS_REASON_FLAG_* above)
  187. *
  188. * Outputs: EINVAL if the PID requested is the same as that of the calling process, is invalid or the namespace provided is invalid.
  189. * ESRCH if we couldn't find a live process with the requested PID
  190. * EPERM if the caller is not privileged enough to kill the process with the requested PID
  191. * returns 0 otherwise
  192. */
  193. int terminate_with_payload(int pid, uint32_t reason_namespace, uint64_t reason_code, void *payload, uint32_t payload_size,
  194. const char *reason_string, uint64_t reason_flags);
  195. #endif /* KERNEL */
  196. /*
  197. * codesigning exit reasons
  198. */
  199. #define CODESIGNING_EXIT_REASON_TASKGATED_INVALID_SIG 1
  200. #define CODESIGNING_EXIT_REASON_INVALID_PAGE 2
  201. #define CODESIGNING_EXIT_REASON_TASK_ACCESS_PORT 3
  202. /*
  203. * exec path specific exit reasons
  204. */
  205. #define EXEC_EXIT_REASON_BAD_MACHO 1
  206. #define EXEC_EXIT_REASON_SUGID_FAILURE 2
  207. #define EXEC_EXIT_REASON_ACTV_THREADSTATE 3
  208. #define EXEC_EXIT_REASON_STACK_ALLOC 4
  209. #define EXEC_EXIT_REASON_APPLE_STRING_INIT 5
  210. #define EXEC_EXIT_REASON_COPYOUT_STRINGS 6
  211. #define EXEC_EXIT_REASON_COPYOUT_DYNLINKER 7
  212. #define EXEC_EXIT_REASON_SECURITY_POLICY 8
  213. #define EXEC_EXIT_REASON_TASKGATED_OTHER 9
  214. #define EXEC_EXIT_REASON_FAIRPLAY_DECRYPT 10
  215. #define EXEC_EXIT_REASON_DECRYPT 11
  216. #define EXEC_EXIT_REASON_UPX 12
  217. #define EXEC_EXIT_REASON_NO32EXEC 13
  218. /*
  219. * guard reasons
  220. */
  221. #define GUARD_REASON_VNODE 1
  222. #define GUARD_REASON_VIRT_MEMORY 2
  223. #define GUARD_REASON_MACH_PORT 3
  224. __END_DECLS
  225. #endif /* _REASON_H_ */