แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒ˜แƒชแƒ•แƒแƒ— แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜ macOS-แƒ–แƒ”

แƒ’แƒแƒ›แƒแƒ แƒฏแƒแƒ‘แƒ, แƒฐแƒแƒ‘แƒ ! แƒ“แƒฆแƒ”แƒก แƒ›แƒกแƒฃแƒ แƒก แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ แƒ˜แƒ›แƒแƒ–แƒ”, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒ˜แƒชแƒ•แƒแƒ— แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜ macOS-แƒจแƒ˜ แƒ—แƒแƒ•แƒ“แƒแƒ›แƒกแƒฎแƒ›แƒ”แƒšแƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ แƒ—แƒแƒ•แƒ“แƒแƒกแƒฎแƒ›แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ”แƒก แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒแƒ แƒแƒœแƒขแƒ˜แƒ•แƒ˜แƒ แƒฃแƒกแƒฃแƒšแƒ˜ แƒแƒœ แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒ˜แƒ— แƒฃแƒ›แƒ”แƒขแƒ”แƒก, แƒ แƒแƒ› macOS-แƒ˜แƒก แƒžแƒ˜แƒ แƒแƒ‘แƒ”แƒ‘แƒจแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก โ€žแƒ›แƒแƒ™แƒ•แƒšแƒ˜แƒกโ€œ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ’แƒ–แƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก. แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ”แƒ— แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ“แƒ แƒ“แƒแƒชแƒ•แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜ แƒญแƒ แƒ˜แƒก แƒฅแƒ•แƒ”แƒจ.

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒ˜แƒชแƒ•แƒแƒ— แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜ macOS-แƒ–แƒ”

แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก "แƒ›แƒแƒ™แƒ•แƒšแƒ˜แƒก" แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ’แƒ–แƒ

แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก โ€žแƒ›แƒแƒ™แƒ•แƒšแƒ˜แƒกโ€œ แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜ แƒ’แƒ–แƒ แƒแƒ แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ–แƒ” SIGKILL แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ. แƒ‘แƒแƒจแƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒ™แƒ•แƒšแƒแƒก แƒฃแƒฌแƒแƒ“แƒแƒ— แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ "kill -SIGKILL PID" แƒแƒœ "pkill -9 NAME". "แƒ›แƒ™แƒ•แƒšแƒ”แƒšแƒแƒ‘แƒ˜แƒก" แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜แƒ UNIX-แƒ˜แƒก แƒ“แƒ แƒแƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ macOS-แƒ–แƒ”, แƒแƒ แƒแƒ›แƒ”แƒ“ UNIX-แƒ˜แƒก แƒ›แƒกแƒ’แƒแƒ•แƒก แƒกแƒฎแƒ•แƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒ–แƒ”แƒช.

แƒ˜แƒกแƒ”แƒ•แƒ”, แƒ แƒแƒ’แƒแƒ แƒช UNIX-แƒ˜แƒก แƒ›แƒกแƒ’แƒแƒ•แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒจแƒ˜, macOS แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒฉแƒแƒญแƒ แƒแƒ— แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜, แƒ’แƒแƒ แƒ“แƒ แƒแƒ แƒ˜แƒกแƒ - SIGKILL แƒ“แƒ SIGSTOP. แƒ”แƒก แƒกแƒขแƒแƒขแƒ˜แƒ แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒแƒก แƒ’แƒแƒแƒ›แƒแƒฎแƒ•แƒ˜แƒšแƒ”แƒ‘แƒก SIGKILL แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ–แƒ”, แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒฌแƒ•แƒ”แƒ•แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒ›แƒแƒ™แƒ•แƒšแƒแƒก.

macOS-แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒ

macOS-แƒ–แƒ” แƒ›แƒแƒ™แƒ•แƒšแƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ–แƒแƒ แƒ˜ XNU แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜ แƒ˜แƒซแƒแƒฎแƒ”แƒ‘แƒก psignal(SIGKILL,...) แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก. แƒจแƒ”แƒ•แƒ”แƒชแƒแƒ“แƒแƒ— แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒ แƒกแƒฎแƒ•แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ”แƒ‘แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ”แƒฌแƒแƒ“แƒแƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜ psignal แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ. แƒ›แƒแƒ“แƒ˜ แƒ’แƒแƒ›แƒแƒ•แƒ แƒ˜แƒชแƒฎแƒแƒ— แƒžแƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒจแƒ˜แƒ“แƒ แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ”แƒ‘แƒจแƒ˜ (แƒ—แƒฃแƒ›แƒชแƒ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒแƒ แƒ แƒขแƒ แƒ˜แƒ•แƒ˜แƒแƒšแƒฃแƒ แƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒ— แƒกแƒฎแƒ•แƒ แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒ•แƒขแƒแƒ•แƒ”แƒ‘แƒ— ๐Ÿ™‚ - แƒฎแƒ”แƒšแƒ›แƒแƒฌแƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ, แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜, แƒ’แƒแƒกแƒ•แƒšแƒ/แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ, แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒชแƒ•แƒ˜แƒก แƒ“แƒแƒ แƒฆแƒ•แƒ”แƒ•แƒ แƒ“แƒ แƒ.แƒจ. .

แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒ— แƒ“แƒ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒ–แƒแƒ แƒ˜แƒ— terminate_with_payload. แƒฉแƒแƒœแƒก, แƒ แƒแƒ› แƒ’แƒแƒ แƒ“แƒ แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ›แƒแƒ™แƒ•แƒšแƒ˜แƒก แƒ–แƒแƒ แƒ˜แƒกแƒ, แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒแƒšแƒขแƒ”แƒ แƒœแƒแƒขแƒ˜แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒฃแƒ แƒ˜แƒ macOS แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒแƒ  แƒ’แƒ•แƒฎแƒ•แƒ“แƒ”แƒ‘แƒ BSD-แƒจแƒ˜. แƒแƒ แƒ˜แƒ•แƒ” แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒ–แƒแƒ แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒ”แƒ‘แƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜แƒ. แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ แƒ˜ แƒ–แƒแƒ แƒ”แƒ‘แƒ˜แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒžแƒกแƒ˜แƒœแƒ’แƒแƒšแƒ–แƒ”. แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ—, แƒ แƒแƒ› แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒ›แƒแƒ™แƒ•แƒšแƒแƒ›แƒ“แƒ” แƒขแƒแƒ แƒ“แƒ”แƒ‘แƒ โ€žแƒ™แƒแƒœแƒ˜แƒก แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜แƒกโ€œ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ - แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ—แƒฃ แƒแƒ แƒ แƒžแƒ แƒแƒชแƒ”แƒกแƒก แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ แƒกแƒฎแƒ•แƒ แƒžแƒ แƒแƒชแƒ”แƒกแƒ–แƒ”; แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ แƒแƒ  แƒแƒซแƒšแƒ”แƒ•แƒก แƒฃแƒคแƒšแƒ”แƒ‘แƒแƒก, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒ›แƒ” แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก แƒ›แƒแƒ™แƒšแƒแƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜.

static int
terminate_with_payload_internal(struct proc *cur_proc, int target_pid, uint32_t reason_namespace,
				uint64_t reason_code, user_addr_t payload, uint32_t payload_size,
				user_addr_t reason_string, uint64_t reason_flags)
{
...
	target_proc = proc_find(target_pid);
...
	if (!cansignal(cur_proc, cur_cred, target_proc, SIGKILL)) {
		proc_rele(target_proc);
		return EPERM;
	}
...
	if (target_pid == cur_proc->p_pid) {
		/*
		 * psignal_thread_with_reason() will pend a SIGKILL on the specified thread or
		 * return if the thread and/or task are already terminating. Either way, the
		 * current thread won't return to userspace.
		 */
		psignal_thread_with_reason(target_proc, current_thread(), SIGKILL, signal_reason);
	} else {
		psignal_with_reason(target_proc, SIGKILL, signal_reason);
	}
...
}

แƒ’แƒแƒฃแƒจแƒ•แƒ

แƒแƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ“แƒ แƒ“แƒ”แƒ›แƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ แƒ’แƒ–แƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒ“แƒ แƒ›แƒแƒ—แƒ˜ แƒกแƒ˜แƒชแƒแƒชแƒฎแƒšแƒ˜แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜. แƒ’แƒ—แƒฎแƒแƒ•แƒ—, แƒ’แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒแƒ—, แƒ แƒแƒ› แƒฌแƒงแƒแƒ แƒแƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก launchctl-แƒ˜แƒก แƒซแƒ•แƒ”แƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก macOS 10.10-แƒ›แƒ“แƒ”, แƒ™แƒแƒ“แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜ แƒ›แƒแƒฌแƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒกแƒแƒ˜แƒšแƒฃแƒกแƒขแƒ แƒแƒชแƒ˜แƒ แƒ›แƒ˜แƒ–แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ—แƒแƒœแƒแƒ›แƒ”แƒ“แƒ แƒแƒ•แƒ” launchctl แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒš แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ”แƒ‘แƒก XPC-แƒ˜แƒ—, แƒ›แƒแƒกแƒจแƒ˜ แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒ˜แƒšแƒ˜แƒ launchctl แƒšแƒแƒ’แƒ˜แƒ™แƒ.

แƒ›แƒแƒ“แƒ˜ แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒแƒ’แƒแƒ  แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒจแƒ”แƒฉแƒ”แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜. SIGTERM แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒแƒ›แƒ“แƒ” แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒฉแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ แƒฎแƒ“แƒ”แƒ‘แƒ "proc_terminate" แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒ–แƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

<launchctl src/core.c>
...
	error = proc_terminate(j->p, &sig);
	if (error) {
		job_log(j, LOG_ERR | LOG_CONSOLE, "Could not terminate job: %d: %s", error, strerror(error));
		job_log(j, LOG_NOTICE | LOG_CONSOLE, "Using fallback option to terminate job...");
		error = kill2(j->p, SIGTERM);
		if (error) {
			job_log(j, LOG_ERR, "Could not signal job: %d: %s", error, strerror(error));
		} 
...
<>

แƒฅแƒฃแƒ“แƒ˜แƒก แƒฅแƒ•แƒ”แƒจ, proc_terminate-แƒก, แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ›แƒ˜แƒกแƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒกแƒ, แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒแƒก แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ psignal SIGTERM-แƒ˜แƒ—, แƒแƒ แƒแƒ›แƒ”แƒ“ SIGKILL.

แƒแƒ แƒแƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ แƒ˜ แƒ›แƒแƒ™แƒ•แƒšแƒ - แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒก แƒšแƒ˜แƒ›แƒ˜แƒขแƒ˜

แƒฃแƒคแƒ แƒ แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒœแƒแƒฎแƒแƒ— แƒกแƒฎแƒ•แƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ  แƒ–แƒแƒ แƒจแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜_แƒžแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒ. แƒแƒ› แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒ”แƒ แƒ—แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒแƒขแƒแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก CPU แƒ“แƒ แƒแƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ™แƒ•แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒแƒ  แƒจแƒ”แƒœแƒ”แƒšแƒ“แƒ”แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒฅแƒ”แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒแƒฅแƒขแƒ˜แƒ•แƒแƒ‘แƒ”แƒ‘แƒ˜แƒ—. แƒ—แƒฃ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒ› แƒ›แƒ˜แƒแƒฆแƒฌแƒ˜แƒ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ˜แƒก แƒšแƒ˜แƒ›แƒ˜แƒขแƒก, แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒแƒœแƒก proc_apply_resource_actions แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒ“แƒแƒœ, แƒžแƒ แƒแƒชแƒ”แƒกแƒก แƒ”แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ SIGKILL แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜.

แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ แƒแƒ› แƒแƒ› แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ  แƒ–แƒแƒ แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒžแƒแƒขแƒ”แƒœแƒชแƒ˜แƒฃแƒ แƒแƒ“ แƒ’แƒแƒแƒœแƒแƒ“แƒ’แƒฃแƒ แƒแƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜, แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒ› แƒกแƒแƒ—แƒแƒœแƒแƒ“แƒแƒ“ แƒ•แƒ”แƒ  แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒ–แƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒฃแƒคแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜. แƒ แƒ”แƒแƒšแƒฃแƒ แƒแƒ“ แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒ“แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒแƒšแƒขแƒ”แƒ แƒœแƒแƒขแƒ˜แƒฃแƒšแƒ˜ แƒ“แƒ แƒแƒจแƒ PROC_POLICY_ACTION_SET แƒแƒ› แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜แƒก แƒแƒ•แƒšแƒ˜แƒ—.

แƒแƒฅแƒ”แƒ“แƒแƒœ แƒ’แƒแƒ›แƒแƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ”, แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ โ€žแƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒแƒ•แƒ—โ€œ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก CPU-แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ™แƒ•แƒแƒขแƒแƒก (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ›แƒฎแƒแƒšแƒแƒ“ 1 ns-แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒœแƒ”แƒ‘แƒแƒก แƒแƒซแƒšแƒ”แƒ•แƒ—), แƒ›แƒแƒจแƒ˜แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒ™แƒšแƒแƒ— แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒจแƒ˜. แƒแƒ›แƒ แƒ˜แƒ’แƒแƒ“, แƒ›แƒแƒ•แƒœแƒ” แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ›แƒแƒ™แƒšแƒแƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒจแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜, แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒแƒœแƒขแƒ˜แƒ•แƒ˜แƒ แƒฃแƒกแƒฃแƒšแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜. แƒแƒกแƒ”แƒ•แƒ” แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ แƒ”แƒคแƒ”แƒฅแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒ›แƒแƒ™แƒ•แƒšแƒ˜แƒกแƒแƒก pid 1-แƒ˜แƒ— (แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ) - แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒžแƒแƒœแƒ˜แƒ™แƒ SIGKILL แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ˜แƒกแƒแƒก :)

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒ˜แƒชแƒ•แƒแƒ— แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜ macOS-แƒ–แƒ”

แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ“แƒแƒ•แƒญแƒ แƒแƒ— แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ?

แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒ›แƒแƒ™แƒ•แƒšแƒ˜แƒก แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒแƒกแƒแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ’แƒ–แƒ แƒแƒ แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒšแƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒก แƒชแƒฎแƒ แƒ˜แƒšแƒจแƒ˜. แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ“, แƒ”แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ แƒแƒขแƒ แƒ˜แƒ•แƒ˜แƒแƒšแƒฃแƒ แƒ˜แƒ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜แƒก แƒ’แƒแƒ›แƒ.

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜, แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ‘แƒก sysent-แƒ˜แƒก แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒแƒก, แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ™แƒ”แƒ แƒซแƒแƒ XNU แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ•แƒ”แƒ  แƒ›แƒแƒ˜แƒซแƒ”แƒ‘แƒœแƒ”แƒ‘แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ”แƒ‘แƒจแƒ˜. แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒแƒ’แƒ˜แƒฌแƒ”แƒ•แƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ”แƒ•แƒ แƒ˜แƒกแƒขแƒ˜แƒ™แƒฃแƒšแƒ˜ แƒซแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒฃแƒ แƒแƒ“ แƒ“แƒแƒจแƒšแƒ แƒ“แƒ แƒ›แƒแƒกแƒจแƒ˜ แƒ›แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒšแƒ˜แƒก แƒซแƒ˜แƒ”แƒ‘แƒ.

แƒ›แƒ”แƒแƒ แƒ”แƒช, แƒชแƒฎแƒ แƒ˜แƒšแƒจแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ“แƒ แƒแƒจแƒ”แƒ‘แƒ–แƒ”, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒ—แƒแƒช แƒจแƒ”แƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜. แƒ—แƒฃ แƒ’แƒแƒ›แƒแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ CONFIG_REQUIRES_U32_MUNGING แƒ“แƒ แƒแƒจแƒ, แƒจแƒ”แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒ–แƒแƒ›แƒ - แƒ“แƒแƒ”แƒ›แƒแƒขแƒ”แƒ‘แƒ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ•แƒ”แƒšแƒ˜ sy_arg_munge32. แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ, แƒ แƒแƒ—แƒ แƒ“แƒแƒ“แƒ’แƒ˜แƒœแƒ“แƒ”แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜ แƒ“แƒ แƒแƒจแƒ˜แƒ— แƒ˜แƒงแƒ แƒจแƒ”แƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜, แƒแƒœ แƒแƒšแƒขแƒ”แƒ แƒœแƒแƒขแƒ˜แƒฃแƒšแƒแƒ“, แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ— แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜ แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜แƒก แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’.

struct sysent {         /* system call table */
        sy_call_t       *sy_call;       /* implementing function */
#if CONFIG_REQUIRES_U32_MUNGING || (__arm__ && (__BIGGEST_ALIGNMENT__ > 4))
        sy_munge_t      *sy_arg_munge32; /* system call arguments munger for 32-bit process */
#endif
        int32_t         sy_return_type; /* system call return types */
        int16_t         sy_narg;        /* number of args */
        uint16_t        sy_arg_bytes;   /* Total size of arguments in bytes for
                                         * 32-bit system calls
                                         */
};

แƒกแƒแƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒแƒ“, macOS-แƒ˜แƒก แƒ—แƒแƒœแƒแƒ›แƒ”แƒ“แƒ แƒแƒ•แƒ” แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒจแƒ˜ Apple แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒแƒฎแƒแƒš API-แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. Endpoint Security API แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒแƒซแƒšแƒ”แƒ•แƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ”แƒ‘แƒก แƒ“แƒแƒฃแƒจแƒ•แƒแƒœ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒกแƒฎแƒ•แƒ แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ–แƒ”. แƒแƒ›แƒ แƒ˜แƒ’แƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒ‘แƒšแƒแƒ™แƒแƒ— แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ–แƒ”, แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก SIGKILL แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜แƒก แƒฉแƒแƒ—แƒ•แƒšแƒ˜แƒ—, แƒ–แƒ”แƒ›แƒแƒ— แƒแƒฆแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜ API-แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

#include <bsm/libbsm.h>
#include <EndpointSecurity/EndpointSecurity.h>
#include <unistd.h>

int main(int argc, const char * argv[]) {
    es_client_t* cli = nullptr;
    {
        auto res = es_new_client(&cli, ^(es_client_t * client, const es_message_t * message) {
            switch (message->event_type) {
                case ES_EVENT_TYPE_AUTH_SIGNAL:
                {
                    auto& msg = message->event.signal;
                    auto target = msg.target;
                    auto& token = target->audit_token;
                    auto pid = audit_token_to_pid(token);
                    printf("signal '%d' sent to pid '%d'n", msg.sig, pid);
                    es_respond_auth_result(client, message, pid == getpid() ? ES_AUTH_RESULT_DENY : ES_AUTH_RESULT_ALLOW, false);
                }
                    break;
                default:
                    break;
            }
        });
    }

    {
        es_event_type_t evs[] = { ES_EVENT_TYPE_AUTH_SIGNAL };
        es_subscribe(cli, evs, sizeof(evs) / sizeof(*evs));
    }

    printf("%dn", getpid());
    sleep(60); // could be replaced with other waiting primitive

    es_unsubscribe_all(cli);
    es_delete_client(cli);

    return 0;
}

แƒแƒœแƒแƒšแƒแƒ’แƒ˜แƒฃแƒ แƒแƒ“, MAC แƒžแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒ“แƒ”แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜แƒก แƒ“แƒแƒชแƒ•แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒก (policy proc_check_signal), แƒ›แƒแƒ’แƒ แƒแƒ› API แƒแƒคแƒ˜แƒชแƒ˜แƒแƒšแƒฃแƒ แƒแƒ“ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒšแƒ˜.

แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒชแƒ•แƒ

แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒจแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒชแƒ•แƒ˜แƒก แƒ’แƒแƒ แƒ“แƒ, แƒแƒกแƒ”แƒ•แƒ” แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ˜แƒก (kext) แƒ“แƒแƒชแƒ•แƒ. macOS แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒก แƒฉแƒแƒ แƒฉแƒแƒก, แƒ แƒแƒ—แƒ แƒแƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ’แƒแƒœแƒแƒ•แƒ˜แƒ—แƒแƒ แƒแƒœ IOKit แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒ˜แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜. แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ“แƒ, IOKit แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒ“แƒ แƒแƒ˜แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒก C++ แƒ™แƒšแƒแƒกแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก แƒจแƒ”แƒ”แƒซแƒšแƒ”แƒ‘แƒ แƒ™แƒšแƒแƒกแƒ˜แƒก แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก โ€žแƒ›แƒแƒซแƒ”แƒ‘แƒœแƒโ€œ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒแƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒšแƒแƒ“.

แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒจแƒ˜ แƒ™แƒšแƒแƒกแƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒ“แƒ’แƒ”แƒœแƒแƒ“, แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก ioclasscount แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ.

my_kext_ioservice = 1
my_kext_iouserclient = 1

แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒกแƒฃแƒ แƒก แƒ“แƒแƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒ“แƒ”แƒก แƒ“แƒ แƒแƒ˜แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒขแƒแƒจแƒ˜, แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒแƒชแƒฎแƒแƒ“แƒแƒก แƒ™แƒšแƒแƒกแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒ”แƒ›แƒ™แƒ•แƒ˜แƒ“แƒ แƒ”แƒแƒ‘แƒ˜แƒ— แƒ˜แƒฆแƒ”แƒ‘แƒก IOService-แƒก, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ my_kext_ioservice แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜. แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ แƒ˜แƒฌแƒ•แƒ”แƒ•แƒก แƒ™แƒšแƒแƒกแƒ˜แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒ”แƒ›แƒ™แƒ•แƒ˜แƒ“แƒ แƒ”แƒแƒ‘แƒ˜แƒ— แƒ˜แƒฆแƒ”แƒ‘แƒก IOUserClient-แƒก, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒจแƒ˜ my_kext_iouserclient.

แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒ— แƒ“แƒ แƒแƒ˜แƒ•แƒ”แƒ แƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒ“แƒแƒœ แƒ’แƒแƒ“แƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒแƒก (kextunload แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ), แƒ’แƒแƒ›แƒแƒ˜แƒซแƒแƒฎแƒ”แƒ‘แƒ แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ "bool terminate(IOOptionBits options)". แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜แƒ แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒแƒ–แƒ” false แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒแƒ—, แƒ แƒแƒ—แƒ แƒจแƒ”แƒฌแƒงแƒ“แƒ”แƒก แƒ’แƒแƒœแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ˜แƒกแƒแƒก, แƒ แƒแƒ—แƒ แƒ’แƒแƒ›แƒแƒ แƒ—แƒแƒ— kextunload.

bool Kext::terminate(IOOptionBits options)
{

  if (!IsUnloadAllowed)
  {
    // Unload is not allowed, returning false
    return false;
  }

  return super::terminate(options);
}

IsUnloadAllowed แƒ“แƒ แƒแƒจแƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒงแƒ”แƒœแƒ“แƒ”แƒก IOUserClient-แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒกแƒแƒก. แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒแƒ แƒ˜แƒก แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒšแƒ˜แƒ›แƒ˜แƒขแƒ˜, kextunload แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒก:

admin@admins-Mac drivermanager % sudo kextunload ./test.kext
Password:
(kernel) Can't remove kext my.kext.test; services failed to terminate - 0xe00002c7.
Failed to unload my.kext.test - (iokit/common) unsupported function.

แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ“แƒแƒชแƒ•แƒ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ”แƒก IOUserClient-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ™แƒšแƒแƒกแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ IOKitLib userspace แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก โ€žIOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);โ€œ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒแƒ— false แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก "terminate" แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒกแƒแƒก, แƒกแƒแƒœแƒแƒ› แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ "แƒ›แƒแƒ™แƒ•แƒ“แƒ”แƒ‘แƒ", แƒแƒœแƒฃ "clientDied" แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒซแƒแƒฎแƒ”แƒ‘แƒ.

แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒ“แƒแƒชแƒ•แƒ

แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒชแƒแƒ•แƒแƒ“ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— Kauth API, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒแƒ— แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒ. Apple แƒแƒฌแƒ•แƒ“แƒ˜แƒก แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘; แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA แƒ“แƒ KAUTH_VNODE_DELETE_CHILD. แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ˜แƒก แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒกแƒ˜ แƒ’แƒ–แƒแƒ แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ˜ - แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— โ€œvn_getpathโ€ API-แƒก, แƒ แƒแƒ—แƒ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒแƒ— แƒ’แƒ–แƒ แƒคแƒแƒ˜แƒšแƒ˜แƒกแƒ™แƒ”แƒœ แƒ“แƒ แƒจแƒ”แƒ•แƒแƒ“แƒแƒ แƒแƒ— แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ˜แƒก แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ˜. แƒ’แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ—, แƒ แƒแƒ› แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ˜แƒก แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ แƒฅแƒ›แƒ”แƒ•แƒ˜แƒก แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ แƒแƒ  แƒ˜แƒซแƒšแƒ”แƒ•แƒ แƒฌแƒ•แƒ“แƒแƒ›แƒแƒก แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒคแƒแƒ˜แƒšแƒ–แƒ”, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ—แƒแƒ•แƒแƒ“ แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒกแƒแƒฎแƒ”แƒšแƒ˜ แƒจแƒ”แƒฃแƒชแƒ•แƒแƒšแƒ”แƒก. แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ›แƒจแƒแƒ‘แƒ”แƒšแƒ˜ แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ˜แƒก แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก KAUTH_VNODE_DELETE แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ.

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒ˜แƒชแƒ•แƒแƒ— แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜ macOS-แƒ–แƒ”

แƒแƒ› แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ˜แƒก แƒ›แƒ˜แƒœแƒฃแƒกแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒ“แƒแƒ‘แƒแƒšแƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ˜แƒ–แƒ แƒ“แƒ”แƒ‘แƒ. แƒ˜แƒ›แƒ˜แƒก แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒกแƒแƒงแƒแƒคแƒแƒ“, แƒ แƒแƒ› แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ แƒแƒ  แƒ˜แƒงแƒแƒก แƒขแƒแƒšแƒ˜ O (แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ˜*แƒกแƒ˜แƒ’แƒ แƒซแƒ”), แƒกแƒแƒ“แƒแƒช แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ˜ แƒแƒ แƒ˜แƒก แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ, แƒกแƒ˜แƒ’แƒ แƒซแƒ” แƒแƒ แƒ˜แƒก แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜แƒก แƒกแƒ˜แƒ’แƒ แƒซแƒ”, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ”แƒ‘แƒ˜แƒ— แƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒ”แƒขแƒ”แƒ แƒ›แƒ˜แƒœแƒ˜แƒกแƒขแƒฃแƒšแƒ˜ แƒกแƒแƒกแƒ แƒฃแƒšแƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜ (DFA).

แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ— แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก DFA-แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒ™แƒฃแƒ แƒกแƒแƒ แƒ”แƒ‘แƒก แƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒจแƒ˜. แƒ—แƒฃ แƒงแƒ•แƒ”แƒšแƒ แƒ™แƒฃแƒ แƒกแƒแƒ แƒ˜ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒก แƒ”แƒ แƒ— แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ–แƒ”, แƒ›แƒแƒจแƒ˜แƒœ แƒ’แƒแƒ–แƒแƒ แƒ“แƒ”แƒ— แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ™แƒฃแƒ แƒกแƒแƒ แƒ˜ แƒ”แƒ แƒ—แƒ˜ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ—แƒ˜ แƒ“แƒ แƒ’แƒแƒฎแƒกแƒแƒ•แƒ“แƒ”แƒ—, แƒ แƒแƒ› แƒ”แƒ แƒ—แƒ˜ แƒ“แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒฎแƒแƒ–แƒ˜แƒก แƒกแƒ˜แƒ’แƒ แƒซแƒ” แƒ”แƒ แƒ—แƒ˜แƒ— แƒ›แƒ”แƒขแƒ˜แƒ. แƒ—แƒฃ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒแƒ แƒ˜ แƒ™แƒฃแƒ แƒกแƒแƒ แƒ˜ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ—แƒ˜, แƒ“แƒแƒงแƒแƒ•แƒ˜แƒ— แƒ™แƒฃแƒ แƒกแƒแƒ แƒ”แƒ‘แƒ˜ แƒฏแƒ’แƒฃแƒคแƒ”แƒ‘แƒแƒ“ แƒ˜แƒ› แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ–แƒ”แƒช แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ”แƒœ แƒ“แƒ แƒ’แƒแƒ˜แƒ›แƒ”แƒแƒ แƒ”แƒ— แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒฏแƒ’แƒฃแƒคแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ (แƒ™แƒฃแƒ แƒกแƒแƒ แƒ˜แƒก แƒฅแƒ•แƒ”แƒจ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ แƒ”แƒ แƒ—แƒœแƒแƒ˜แƒ แƒ˜แƒ), แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— DFA แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒฅแƒ•แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒ’แƒแƒ“แƒแƒกแƒ•แƒšแƒ แƒ˜แƒ›แƒแƒ•แƒ” แƒฎแƒแƒ–แƒ˜แƒก แƒ’แƒแƒกแƒฌแƒ•แƒ แƒ˜แƒ•. แƒ›แƒ”แƒแƒ แƒ” แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— 256 แƒ–แƒแƒ›แƒ˜แƒก (แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ“แƒ แƒฏแƒ’แƒฃแƒคแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒฅแƒกแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ) แƒ’แƒแƒ“แƒแƒกแƒ•แƒšแƒ”แƒ‘แƒ˜แƒก แƒชแƒฎแƒ แƒ˜แƒšแƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒ—.

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก. แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (โ€œ/foo/bar/tmp/โ€, โ€œ/var/db/foo/โ€, โ€œ/foo/bar/aba/โ€, โ€œfoo/bar/aac/โ€) แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ DFA. แƒคแƒ˜แƒ’แƒฃแƒ แƒแƒจแƒ˜ แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒฎแƒ•แƒ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ™แƒ”แƒœ แƒ›แƒ˜แƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ’แƒแƒ“แƒแƒกแƒ•แƒšแƒ”แƒ‘แƒ˜; แƒกแƒฎแƒ•แƒ แƒ’แƒแƒ“แƒแƒกแƒ•แƒšแƒ”แƒ‘แƒ˜ แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒกแƒแƒ‘แƒแƒšแƒแƒ.

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒ˜แƒชแƒ•แƒแƒ— แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜ macOS-แƒ–แƒ”

DKA แƒจแƒขแƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ•แƒšแƒ˜แƒกแƒแƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก 3 แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ.

  1. แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒ›แƒ˜แƒฆแƒฌแƒ”แƒฃแƒšแƒ˜แƒ - แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ˜ แƒ“แƒแƒชแƒฃแƒšแƒ˜แƒ, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ–แƒฆแƒฃแƒ“แƒแƒ•แƒ— แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒก KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA แƒ“แƒ KAUTH_VNODE_DELETE_CHILD
  2. แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒแƒ  แƒ˜แƒงแƒ แƒ›แƒ˜แƒฆแƒฌแƒ”แƒฃแƒšแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ’แƒ–แƒ "แƒ“แƒแƒกแƒ แƒฃแƒšแƒ“แƒ" (แƒœแƒฃแƒš แƒขแƒ”แƒ แƒ›แƒ˜แƒœแƒแƒขแƒแƒ แƒ˜ แƒ›แƒ˜แƒฆแƒฌแƒ”แƒฃแƒšแƒ˜แƒ) - แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ˜ แƒแƒ แƒ˜แƒก แƒ›แƒจแƒแƒ‘แƒ”แƒšแƒ˜, แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ KAUTH_VNODE_DELETE-แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ. แƒ’แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ—, แƒ แƒแƒ› แƒ—แƒฃ vnode แƒแƒ แƒ˜แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— '/' แƒ‘แƒแƒšแƒแƒก, แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒแƒก แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜แƒ— "/foor/bar/t", แƒ แƒแƒช แƒแƒ แƒแƒกแƒฌแƒแƒ แƒ˜แƒ.
  3. แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒแƒ  แƒ˜แƒงแƒ แƒ›แƒ˜แƒฆแƒฌแƒ”แƒฃแƒšแƒ˜, แƒ’แƒ–แƒ แƒแƒ  แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ. แƒแƒ แƒชแƒ”แƒ แƒ—แƒ˜ แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ˜ แƒแƒ  แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒแƒ›แƒแƒก, แƒฉแƒ•แƒ”แƒœ แƒแƒ  แƒ•แƒแƒฌแƒ”แƒกแƒ”แƒ‘แƒ— แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ”แƒ‘แƒก.

แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ–แƒแƒœแƒ˜แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ“แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ˜แƒก แƒแƒ›แƒแƒฆแƒšแƒ”แƒ‘แƒ. แƒ”แƒ แƒ—แƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, แƒแƒ› แƒ›แƒ˜แƒ–แƒแƒœแƒก แƒ›แƒ˜แƒ˜แƒฆแƒฌแƒ”แƒ•แƒ Acronis แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฎแƒฃแƒ แƒแƒ•แƒก แƒ˜แƒ› แƒ“แƒแƒฃแƒชแƒ•แƒ”แƒšแƒแƒ‘แƒแƒก, แƒกแƒแƒ“แƒแƒช แƒ—แƒแƒ•แƒแƒ“ แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ โ€žแƒกแƒฃแƒกแƒขแƒ˜แƒโ€œ. แƒ›แƒ”แƒแƒ แƒ”แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, แƒฉแƒ•แƒ”แƒœ แƒแƒ  แƒฃแƒœแƒ“แƒ แƒฃแƒ’แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒ•แƒงแƒแƒ— แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒ› แƒแƒกแƒžแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒซแƒšแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ“แƒ”แƒก OS-แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ”แƒก, แƒ›แƒ˜แƒ— แƒฃแƒ›แƒ”แƒขแƒ”แƒก, แƒ แƒแƒ› แƒแƒกแƒ”แƒ—แƒ˜ แƒ“แƒแƒฃแƒชแƒ•แƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ แƒ–แƒ แƒ“แƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒก แƒกแƒขแƒแƒ‘แƒ˜แƒšแƒฃแƒ แƒแƒ‘แƒแƒก, แƒ แƒแƒ’แƒแƒ แƒช แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ˜แƒก. แƒ“แƒแƒฃแƒชแƒ•แƒ”แƒšแƒแƒ‘แƒ แƒ”แƒชแƒœแƒแƒ‘แƒ Apple-แƒ˜แƒก แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ˜แƒก แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ˜แƒก แƒ’แƒฃแƒœแƒ“แƒก แƒ“แƒ แƒ“แƒแƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ“แƒ macOS 10.14.5-แƒจแƒ˜ (https://support.apple.com/en-gb/HT210119).

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒ˜แƒชแƒ•แƒแƒ— แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜ macOS-แƒ–แƒ”

แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ”แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ˜แƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒแƒคแƒ˜แƒชแƒ˜แƒแƒšแƒฃแƒ แƒแƒ“ แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜. แƒแƒœแƒฃ, แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒแƒกแƒ”แƒ—แƒ˜ แƒฎแƒแƒ แƒ•แƒ”แƒ–แƒ”แƒ‘แƒ˜ แƒ’แƒแƒ แƒ” แƒ“แƒ แƒแƒ แƒแƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ—แƒฃแƒ›แƒชแƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒšแƒ”แƒ’แƒ˜แƒขแƒ˜แƒ›แƒฃแƒ แƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒชแƒ•แƒแƒช แƒ™แƒ˜, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒแƒœแƒขแƒ˜แƒ•แƒ˜แƒ แƒฃแƒกแƒ˜ แƒ“แƒ แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒ˜, แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฎแƒšแƒ MacOS-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก Acronis-แƒ˜แƒก แƒแƒฎแƒแƒš แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ”แƒ‘แƒก แƒ”แƒฅแƒœแƒ”แƒ‘แƒแƒ— แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ“แƒแƒชแƒ•แƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒ“แƒแƒœ แƒ’แƒแƒ“แƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒกแƒ’แƒแƒœ.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ