αžšαž”αŸ€αž”αž€αžΆαžšαž–αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αžαžΊαžŽαŸ‚αž›αž“αŸ…αž›αžΎ macOS

αžŸαž½αžŸαŸ’αžαžΈ αž αžΆαž”! αžαŸ’αž„αŸƒαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž€αžΆαžšαž–αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΈαž€αžΆαžšαžœαžΆαž™αž”αŸ’αžšαž αžΆαžšαžŠαŸ„αž™αž’αŸ’αž“αž€αžœαžΆαž™αž”αŸ’αžšαž αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ macOS αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αžœαžΆαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž€αŸ†αž…αžΆαžαŸ‹αž˜αŸαžšαŸ„αž‚ αž¬αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ αž‡αžΆαž–αž·αžŸαŸαžŸαž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž“αŸ…αž€αŸ’αžšαŸ„αž˜ macOS αž˜αžΆαž“αžœαž·αž’αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαžΎαž˜αŸ’αž”αžΈ "αžŸαž˜αŸ’αž›αžΆαž”αŸ‹" αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αŸ” αž’αžΆαž“αž’αŸ†αž–αžΈαž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αž“αž·αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž€αžΆαžšαž–αžΆαžšαž“αŸ…αž€αŸ’αžšαŸ„αž˜αž€αžΆαžšαž€αžΆαžαŸ‹αŸ”

αžšαž”αŸ€αž”αž€αžΆαžšαž–αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αžαžΊαžŽαŸ‚αž›αž“αŸ…αž›αžΎ macOS

αžœαž·αž’αžΈαž”αž»αžšαžΆαžŽαžŠαžΎαž˜αŸ’αž”αžΈ "αžŸαž˜αŸ’αž›αžΆαž”αŸ‹" αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αŸ”

αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžŠαŸαž›αŸ’αž”αžΈαž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈ "αžŸαž˜αŸ’αž›αžΆαž”αŸ‹" αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‚αžΊαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαž‰αŸ’αž‰αžΆ SIGKILL αž‘αŸ…αž€αžΆαž“αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αžαžΆαž˜αžšαž™αŸˆ bash αž’αŸ’αž“αž€αž’αžΆαž…αž αŸ…αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš "αžŸαž˜αŸ’αž›αžΆαž”αŸ‹ -SIGKILL PID" ឬ "pkill -9 NAME" αžŠαžΎαž˜αŸ’αž”αžΈαžŸαž˜αŸ’αž›αžΆαž”αŸ‹αŸ” αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ "αžŸαž˜αŸ’αž›αžΆαž”αŸ‹" αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αžαžΆαŸ†αž„αž–αžΈαžŸαž˜αŸαž™αž™αžΌαž“αžΈαž€ αž αžΎαž™αž˜αžΆαž“αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž“αŸ…αž›αžΎ macOS αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸαž˜αžΆαž“αž“αŸ…αž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαŸ’αžšαžŠαŸ€αž„αž“αžΉαž„αž™αžΌαž“αžΈαž€αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž•αž„αžŠαŸ‚αžšαŸ”

αžŠαžΌαž…αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαžΌαž… UNIX αžŠαŸ‚αžš macOS αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαŸ’αž‘αžΆαž€αŸ‹αž…αžΆαž”αŸ‹αžŸαž‰αŸ’αž‰αžΆαžŽαžΆαž˜αž½αž™αž‘αŸ…αž€αžΆαž“αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™ αž›αžΎαž€αž›αŸ‚αž„αžαŸ‚αž–αžΈαžš - SIGKILL αž“αž·αž„ SIGSTOP αŸ” αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž“αžΉαž„αž•αŸ’αžαŸ„αžαž‡αžΆαž…αž˜αŸ’αž”αž„αž›αžΎαžŸαž‰αŸ’αž‰αžΆ SIGKILL αž‡αžΆαžŸαž‰αŸ’αž‰αžΆαžŠαŸ‚αž›αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αž›αžΆαž”αŸ‹αŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸ macOS

αž“αŸ…αž›αžΎ macOS αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαž˜αŸ’αž›αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž› XNU αž αŸ…αž˜αž»αžαž„αžΆαžš psignal(SIGKILL,...)αŸ” αžαŸ„αŸ‡αž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αžΎαž›αžαžΆαžαžΎαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„ userspace αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αžŠαŸ„αž™αž˜αž»αžαž„αžΆαžš psignal αŸ” αž…αžΌαžšαž›αž»αž”αž€αžΆαžšαž αŸ…αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αž»αžαž„αžΆαžš psignal αž“αŸ…αž€αŸ’αž“αž»αž„αž™αž“αŸ’αžαž€αžΆαžšαžαžΆαž„αž€αŸ’αž“αž»αž„αž“αŸƒαžαžΊαžŽαŸ‚αž› (αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžœαžΆαž’αžΆαž…αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžšαžΏαž„αžαžΌαž…αžαžΆαž…αž€αŸαžŠαŸ„αž™ αž™αžΎαž„αž“αžΉαž„αž‘αž»αž€αžœαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžαŸ’αžαž”αž‘αž˜αž½αž™αž‘αŸ€αžπŸ™‚ .

αž…αžΌαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αž»αžαž„αžΆαžš αž“αž·αž„αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ” terminate_with_payload. αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž˜αžΎαž›αžƒαžΎαž‰αžαžΆαž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž€αžΆαžšαž αŸ…αžŸαž˜αŸ’αž›αžΆαž”αŸ‹αž”αž»αžšαžΆαžŽαž˜αžΆαž“αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž‡αŸ†αž“αž½αžŸαžŠαŸ‚αž›αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž…αŸ†αž–αŸ„αŸ‡αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš macOS αž“αž·αž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„ BSD αŸ” αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸƒαž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž–αžΈαžšαž€αŸαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαžŠαŸ‚αžšαŸ” αž–αž½αž€αž‚αŸαž‚αžΊαž‡αžΆαž€αžΆαžšαž αŸ…αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αž»αžαž„αžΆαžšαžαžΊαžŽαŸ‚αž› psignal αŸ” αžŸαžΌαž˜αž…αŸ†αžŽαžΆαŸ†αž•αž„αžŠαŸ‚αžšαžαžΆαž˜αž»αž“αž–αŸαž›αžŸαž˜αŸ’αž›αžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™ αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ "cansignal" αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž - αžαžΆαžαžΎαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αžΆαž…αž”αž‰αŸ’αž‡αžΌαž“αžŸαž‰αŸ’αž‰αžΆαž‘αŸ…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž¬αž’αžαŸ‹ αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž·αž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŽαžΆαž˜αž½αž™αžŸαž˜αŸ’αž›αžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αŸ αž§αž‘αžΆαž αžšαžŽαŸαŸ”

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 logic αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž‘αŸ…αžœαžΆαŸ”

αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αžαžΆαžαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αžˆαž”αŸ‹αžŠαŸ„αž™αžšαž”αŸ€αž”αžŽαžΆαŸ” αž˜αž»αž“αž–αŸαž›αž•αŸ’αž‰αžΎαžŸαž‰αŸ’αž‰αžΆ 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 αž•αž„αžŠαŸ‚αžšαŸ”

αž€αžΆαžšαžŸαž˜αŸ’αž›αžΆαž”αŸ‹αžŠαŸ„αž™αž”αŸ’αžšαž™αŸ„αž› - αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž’αž“αž’αžΆαž“

αž€αžšαžŽαžΈαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž˜αžΎαž›αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” process_policy. αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΌαž‘αŸ…αž“αŸƒαž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αŸαŸ‡αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž’αž“αž’αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŠαžΌαž…αž‡αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαž›αž·αž”αž·αž€αŸ’αžšαž˜αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžœαŸαž›αžΆαžŸαŸŠαžΈαž—αžΈαž™αžΌ αž“αž·αž„αž€αžΌαžαžΆαžŸαžαž· αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αž™αžΊαžαž™αŸ‰αžΆαžœαžαŸ’αž›αžΆαŸ†αž„αžŠαŸ„αž™αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž•αŸ’αž‘αž»αž€αž―αž€αžŸαžΆαžšαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžΆαž“αžˆαžΆαž“αžŠαž›αŸ‹αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž’αž“αž’αžΆαž“αžšαž”αžŸαŸ‹αžœαžΆ αžŠαžΌαž…αžŠαŸ‚αž›αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž–αžΈαž˜αž»αžαž„αžΆαžš proc_apply_resource_actions αžŸαž‰αŸ’αž‰αžΆ SIGKILL αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αŸαŸ‡αž’αžΆαž…αžŸαž˜αŸ’αž›αžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸαžŠαŸ„αž™ αž€αŸαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž·αž“αž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™αž±αŸ’αž™αž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž“αžΌαžœαžŸαž·αž‘αŸ’αž’αž·αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αž‘αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αŸ„αŸ‡αž‘αŸαŸ” αž–αž·αž“αž·αžαŸ’αž™αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž˜αžΆαž“αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž‘αž„αŸ‹αž‡αŸ†αž“αž½αžŸ PROC_POLICY_ACTION_SET αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ†αž›αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž“αŸαŸ‡αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€ "αž€αŸ†αžŽαžαŸ‹" αž€αžΌαžαžΆαž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ CPU αžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ (αž§αž‘αžΆαž αžšαžŽαŸ αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αžšαžΉαž˜αžαŸ‚ 1 ns) αž“αŸ„αŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αžŸαž˜αŸ’αž›αžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŽαžΆαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αžΆαž“αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž˜αŸαžšαŸ„αž‚αž’αžΆαž…αžŸαž˜αŸ’αž›αžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŽαžΆαž˜αž½αž™αž“αŸ…αž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’ αžšαž½αž˜αž‘αžΆαŸ†αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ†αž…αžΆαžαŸ‹αž˜αŸαžšαŸ„αž‚αž•αž„αžŠαŸ‚αžšαŸ” αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž•αž„αžŠαŸ‚αžšαž‚αžΊαž₯αž‘αŸ’αž’αž·αž–αž›αžŠαŸ‚αž›αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž–αŸαž›αžŸαž˜αŸ’αž›αžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž˜αž½αž™ pid 1 (launchctl) - αžαžΊαžŽαŸ‚αž›αž—αŸαž™αžŸαŸ’αž›αž“αŸ‹αžŸαŸ’αž›αŸ„αž“αŸ…αž–αŸαž›αž–αŸ’αž™αžΆαž™αžΆαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž‰αŸ’αž‰αžΆ 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 αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž› αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž€αžΆαžšαž–αžΆαžšαžŸαž‰αŸ’αž‰αžΆ (αž‚αŸ„αž›αž€αžΆαžšαžŽαŸ proc_check_signal) αž”αŸ‰αž»αž“αŸ’αžαŸ‚ API αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αžΆαŸ†αž‘αŸ’αžšαž‡αžΆαž•αŸ’αž›αžΌαžœαž€αžΆαžšαž‘αŸαŸ”

αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αžαžΊαžŽαŸ‚αž›αŸ”

αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αžαžΊαžŽαŸ‚αž›αžαŸ’αž›αž½αž“αžœαžΆ (kext) αž€αŸαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž•αž„αžŠαŸ‚αžšαŸ” macOS αž•αŸ’αžαž›αŸ‹β€‹αž“αžΌαžœβ€‹αž€αŸ’αžšαž”αžαžŽαŸ’αžŒβ€‹αž˜αž½αž™β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž’αŸ’αž“αž€β€‹αž’αž—αž·αžœαžŒαŸ’αžαž“αŸβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž„αžΆαž™αžŸαŸ’αžšαž½αž›β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αž”αž‰αŸ’αž‡αžΆβ€‹αž§αž”αž€αžšαžŽαŸ IOKitαŸ” αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž€αžΆαžšαž•αŸ’αžαž›αŸ‹αž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž§αž”αž€αžšαžŽαŸ IOKit αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αž„αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ C ++ αŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„ userspace αž“αžΉαž„αž’αžΆαž… "αžŸαŸ’αžœαŸ‚αž„αžšαž€" instance αžŠαŸ‚αž›αž”αžΆαž“αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸƒ class αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ kernel-userspaceαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αžšαž€β€‹αžƒαžΎαž‰β€‹αž…αŸ†αž“αž½αž“ class instances αž€αŸ’αž“αž»αž„β€‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž˜αžΆαž“β€‹αž§αž”αž€αžšαžŽαŸβ€‹αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ ioclasscount αŸ”

my_kext_ioservice = 1
my_kext_iouserclient = 1

αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αžαžΊαžŽαŸ‚αž›αžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αž…αž„αŸ‹αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž‡αžΆαž˜αž½αž™αž‡αž„αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ’αžšαž€αžΆαžŸαžαŸ’αž“αžΆαž€αŸ‹αžŠαŸ‚αž›αž‘αž‘αž½αž›αž˜αžšαžαž€αž–αžΈ IOService αž§αž‘αžΆαž αžšαžŽαŸ my_kext_ioservice αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αŸ” αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž instance αžαŸ’αž˜αžΈαž“αŸƒ class αžŠαŸ‚αž›αž‘αž‘αž½αž›αž˜αžšαžαž€αž–αžΈ IOUserClient αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸ my_kext_iouserclient αŸ”

αž“αŸ…αž–αŸαž›αž–αŸ’αž™αžΆαž™αžΆαž˜αžŠαž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαž…αŸαž‰αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’ (αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ kextunload) αž˜αž»αžαž„αžΆαžšαž“αž·αž˜αŸ’αž˜αž·αž "bool terminate(IOOptionBits options)" αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αŸ” αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαžαŸ’αžšαž‘αž”αŸ‹αž˜αž·αž“αž–αž·αžαž“αŸ…αž›αžΎαž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ…αž–αŸαž›αž–αŸ’αž™αžΆαž™αžΆαž˜ unload αžŠαžΎαž˜αŸ’αž”αžΈαž”αž·αž‘ 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);” αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αžαŸ’αžšαž‘αž”αŸ‹αž˜αž·αž“αž–αž·αžαž“αŸ…αž–αŸαž›αž αŸ…αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ "αž”αž‰αŸ’αž…αž”αŸ‹" αžšαž αžΌαžαžŠαž›αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ userspace "αžŸαŸ’αž›αžΆαž”αŸ‹" αž“αŸ„αŸ‡αž‚αžΊαž˜αž»αžαž„αžΆαžš "clientDied" αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αž‘αŸαŸ”

αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž―αž€αžŸαžΆαžš

αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžšαž–αžΆαžšαž―αž€αžŸαžΆαžš αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎ Kauth API αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŠαžΆαž€αŸ‹αž€αž˜αŸ’αžšαž·αžαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαŸ” Apple αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž“αžΌαžœαž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž’αŸ†αž–αžΈαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž•αŸ’αžŸαŸαž„αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αžœαž·αžŸαžΆαž›αž—αžΆαž– αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αž™αžΎαž„ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA αž“αž·αž„ KAUTH_VNODE_DELETE_CHILD αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αŸ” αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαžΉαžαž”αž“αŸ’αžαžΉαž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαž‚αžΊαžαžΆαž˜αž•αŸ’αž›αžΌαžœ - αž™αžΎαž„αž”αŸ’αžšαžΎ β€œvn_getpath” API αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžš αž“αž·αž„αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž”αž»αž–αŸ’αžœαž”αž‘αž•αŸ’αž›αžΌαžœαŸ” αžŸαžΌαž˜αž…αŸ†αžŽαžΆαŸ†αžαžΆ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž€αžΆαžšαž”αŸ’αžαžΌαžšαžˆαŸ’αž˜αŸ„αŸ‡αž•αŸ’αž›αžΌαžœαžαžαž―αž€αžŸαžΆαžš αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž·αž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž…αžΌαž›αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαž“αžΈαž˜αž½αž™αŸ—αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αžαŸ‚αž…αŸ†αž–αŸ„αŸ‡αžαžαž―αž€αžŸαžΆαžšαžαŸ’αž›αž½αž“αžœαžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžαžΌαžšαžˆαŸ’αž˜αŸ„αŸ‡αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž•αŸ’αž›αžΌαžœαž˜αŸ αž αžΎαž™αžŠαžΆαž€αŸ‹αž€αž˜αŸ’αžšαž·αž KAUTH_VNODE_DELETE αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαŸ”

αžšαž”αŸ€αž”αž€αžΆαžšαž–αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αžαžΊαžŽαŸ‚αž›αž“αŸ…αž›αžΎ macOS

αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž’αžΆαž…αž“αžΉαž„αž˜αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαž” αžŠαŸ„αž™αžŸαžΆαžšαž…αŸ†αž“αž½αž“αž”αž»αž–αŸ’αžœαž”αž‘αž€αžΎαž“αž‘αžΎαž„αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαžαžΆαž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž˜αž·αž“αžŸαŸ’αž˜αžΎαž“αžΉαž„ O (αž”αž»αž–αŸ’αžœαž”αž‘*αž”αŸ’αžšαžœαŸ‚αž„) αžŠαŸ‚αž›αž”αž»αž–αŸ’αžœαž”αž‘αž‚αžΊαž‡αžΆαž…αŸ†αž“αž½αž“αž”αž»αž–αŸ’αžœαž”αž‘ αž”αŸ’αžšαžœαŸ‚αž„αž‚αžΊαž‡αžΆαž”αŸ’αžšαžœαŸ‚αž„αž“αŸƒαžαŸ’αžŸαŸ‚ αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎ automaton finite deterministic (DFA) αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž”αž»αž–αŸ’αžœαž”αž‘αŸ”

αž…αžΌαžšαž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž DFA αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαž»αŸ†αž”αž»αž–αŸ’αžœαž”αž‘αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αŸ” αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αžŸαŸ’αžŸαž“αŸαž‘αŸ’αžšαž“αž·αž…αž“αŸ…αžŠαžΎαž˜αž“αŸƒαž”αž»αž–αŸ’αžœαž”αž‘αž“αžΈαž˜αž½αž™αŸ—αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‘αžŸαŸ’αžŸαž“αŸαž‘αŸ’αžšαž“αž·αž…αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž…αž„αŸ’αž’αž»αž›αž‘αŸ…αžαž½αž’αž€αŸ’αžŸαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αž„αŸ’αž€αžΎαž“αž‘αžŸαŸ’αžŸαž“αŸαž‘αŸ’αžšαž“αž·αž…αž“αžΈαž˜αž½αž™αŸ—αžŠαŸ„αž™αžαž½αž’αž€αŸ’αžŸαžšαž˜αž½αž™ αž αžΎαž™αž…αž„αž…αžΆαŸ†αžαžΆαž”αŸ’αžšαžœαŸ‚αž„αž“αŸƒαž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‚αžΊαž’αŸ†αž‡αžΆαž„αž˜αž½αž™αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž‘αžŸαŸ’αžŸαž“αŸαž‘αŸ’αžšαž“αž·αž…αž–αžΈαžšαžŠαŸ‚αž›αž˜αžΆαž“αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αžŸαžΌαž˜αž”αŸ‚αž„αž…αŸ‚αž€αž‘αžŸαŸ’αžŸαž“αŸαž‘αŸ’αžšαž“αž·αž…αž‘αŸ…αž‡αžΆαž€αŸ’αžšαž»αž˜αžαžΆαž˜αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž…αž„αŸ’αž’αž»αž›αž‘αŸ… αž αžΎαž™αž’αŸ’αžœαžΎαž˜αŸ’αžαž„αž‘αŸ€αžαž“αžΌαžœαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αž“αžΈαž˜αž½αž™αŸ—αŸ”

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ†αž”αžΌαž„ (αžαž½αž’αž€αŸ’αžŸαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž‘αžŸαŸ’αžŸαž“αŸαž‘αŸ’αžšαž“αž·αž…αž‚αžΊαžŠαžΌαž…αž‚αŸ’αž“αžΆ) αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžšαžŠαŸ’αž‹ DFA αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαŸ‚αž˜αž½αž™αž“αŸ…αžαžΆαž˜αž”αžŽαŸ’αžαŸ„αž™αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž‘αžΈαž–αžΈαžš αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžαžΆαžšαžΆαž„αž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ†αž αŸ† 256 (αž…αŸ†αž“αž½αž“αžαž½αž’αž€αŸ’αžŸαžš αž“αž·αž„αž…αŸ†αž“αž½αž“αž’αžαž·αž”αžšαž˜αžΆαž“αŸƒαž€αŸ’αžšαž»αž˜) αž‘αŸ…αžšαžŠαŸ’αž‹αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αžŠαŸ„αž™αž€αžΆαžšαž αŸ…αž‘αžΎαž„αžœαž·αž‰αž“αžΌαžœαž˜αž»αžαž„αžΆαžšαŸ”

αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž”αž»αž–αŸ’αžœαž”αž‘ (β€œ/foo/bar/tmp/”, β€œ/var/db/foo/”, β€œ/foo/bar/aba/”, β€œfoo/bar/aac/”) αž’αŸ’αž“αž€αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αžŒαžΈαž’αŸαž αŸ’αžœαž’αŸαŸ” αžαž½αž›αŸαžαž“αŸαŸ‡αž”αž„αŸ’αž αžΆαž‰αžαŸ‚αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ‚αž›αž“αžΆαŸ†αž‘αŸ…αžŠαž›αŸ‹αžšαžŠαŸ’αž‹αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αžΉαž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ”

αžšαž”αŸ€αž”αž€αžΆαžšαž–αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αžαžΊαžŽαŸ‚αž›αž“αŸ…αž›αžΎ 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

αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž‡αžΆαž•αŸ’αž›αžΌαžœαž€αžΆαžšαž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž›αŸ” αž“αŸ„αŸ‡αž‚αžΊαž˜αž·αž“αž˜αžΆαž“αž…αž“αŸ’αž›αŸ„αŸ‡αž”αŸ’αžšαž αŸ„αž„αž”αŸ‚αž”αž“αŸαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž„αž€αŸ’αžšαŸ… αž“αž·αž„αžŠαŸ‚αž›αž˜αž·αž“αž…αž„αŸ‹αž”αžΆαž“αž“αŸ„αŸ‡αž‘αŸαŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰ αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαŸ’αžšαž”αž…αŸ’αž”αžΆαž”αŸ‹αžŠαžΌαž…αž‡αžΆαž€αŸ†αž…αžΆαžαŸ‹αž˜αŸαžšαŸ„αž‚ αž“αž·αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž€αŸαž‘αžΆαž˜αž‘αžΆαžšαž€αžΆαžšαž„αžΆαžšαžŠαŸ‚αžšαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž₯αž‘αžΌαžœαž“αŸαŸ‡αž•αž›αž·αžαž•αž› Acronis αžαŸ’αž˜αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ macOS αž“αžΉαž„αž˜αžΆαž“αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž”αŸ’αžšαž†αžΆαŸ†αž„αž“αžΉαž„αž€αžΆαžšαž•αŸ’αž‘αž»αž€αž…αŸαž‰αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹