เจฎเฉˆเจ•เฉ‹เจธ 'เจคเฉ‡ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจเจพ เจนเฉˆ

เจนเฉˆเจฒเฉ‹, เจนเฉˆเจฌเจฐ! เจ…เฉฑเจœ เจฎเฉˆเจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจจเจพ เจšเจพเจนเจพเจ‚เจ—เจพ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ macOS เจตเจฟเฉฑเจš เจนเจฎเจฒเจพเจตเจฐเจพเจ‚ เจฆเฉ‡ เจนเจฎเจฒเจฟเจ†เจ‚ เจคเฉ‹เจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฆเฉ€ เจฐเฉฑเจ–เจฟเจ† เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เจน เจ‡เฉฑเจ• เจเจ‚เจŸเฉ€เจตเจพเจ‡เจฐเจธ เจœเจพเจ‚ เจฌเฉˆเจ•เจ…เฉฑเจช เจธเจฟเจธเจŸเจฎ เจฒเจˆ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉˆ, เจ–เจพเจธ เจ•เจฐเจ•เฉ‡ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฎเฉˆเจ•เฉ‹เจธ เจฆเฉ‡ เจ…เจงเฉ€เจจ เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ "เจฎเจพเจฐเจจ" เจฆเฉ‡ เจ•เจˆ เจคเจฐเฉ€เจ•เฉ‡ เจนเจจเฅค เจ‡เจธ เจฌเจพเจฐเฉ‡ เจ…เจคเฉ‡ เจ•เฉฑเจŸ เจฆเฉ‡ เจ…เจงเฉ€เจจ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ‡ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจฌเจพเจฐเฉ‡ เจชเฉœเฉเจนเฉ‹เฅค

เจฎเฉˆเจ•เฉ‹เจธ 'เจคเฉ‡ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจเจพ เจนเฉˆ

เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ "เจฎเจพเจฐเจจ" เจฆเจพ เจ•เจฒเจพเจธเจฟเจ• เจคเจฐเฉ€เจ•เจพ

เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ "เจฎเจพเจฐเจจ" เจฆเจพ เจ‡เฉฑเจ• เจœเจพเจฃเจฟเจ†-เจชเจ›เจพเจฃเจฟเจ† เจคเจฐเฉ€เจ•เจพ เจนเฉˆ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจธเจฟเจ—เจ•เจฟเฉฑเจฒ เจธเจฟเจ—เจจเจฒ เจญเฉ‡เจœเจฃเจพเฅค เจฌเฉˆเจธเจผ เจฆเฉเจ†เจฐเจพ เจคเฉเจธเฉ€เจ‚ เจฎเจพเจฐเจจ เจฒเจˆ เจธเจŸเฉˆเจ‚เจกเจฐเจก "เจ•เจฟเฉฑเจฒ -เจธเจฟเจ—เจ•เจฟเฉฑเจฒ เจชเฉ€เจ†เจˆเจกเฉ€" เจœเจพเจ‚ "เจชเฉ€เจ•เจฟเจฒ -9 เจจเจพเจฎ" เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค "เจ•เจฟเฉฑเจฒ" เจ•เจฎเจพเจ‚เจก UNIX เจฆเฉ‡ เจฆเจฟเจจเจพเจ‚ เจคเฉ‹เจ‚ เจœเจพเจฃเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจน เจจเจพ เจธเจฟเจฐเจซเจผ เจฎเฉˆเจ•เฉ‹เจธ 'เจคเฉ‡ เจ‰เจชเจฒเจฌเจง เจนเฉˆ, เจธเจ—เฉ‹เจ‚ เจนเฉ‹เจฐ UNIX-เจตเจฐเจ—เฉ‡ เจธเจฟเจธเจŸเจฎเจพเจ‚ 'เจคเฉ‡ เจตเฉ€ เจ‰เจชเจฒเจฌเจง เจนเฉˆเฅค

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ UNIX-เจตเจฐเจ—เฉ‡ เจธเจฟเจธเจŸเจฎเจพเจ‚ เจตเจฟเฉฑเจš, macOS เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉ‹ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจ•เฉ‡ เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฒเจˆ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจฟเจ—เจจเจฒ เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ - SIGKILL เจ…เจคเฉ‡ SIGSTOPเฅค เจ‡เจน เจฒเฉ‡เจ– เจฎเฉเฉฑเจ– เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจฟเจ—เจ•เจฟเฉฑเจฒ เจธเจฟเจ—เจจเจฒ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจฟเจ—เจจเจฒ เจตเจœเฉ‹เจ‚ เจซเฉ‹เจ•เจธ เจ•เจฐเฉ‡เจ—เจพ เจœเฉ‹ เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฎเจพเจฐเจจ เจฆเจพ เจ•เจพเจฐเจจ เจฌเจฃเจฆเจพ เจนเฉˆเฅค

macOS เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚

เจฎเฉˆเจ•เฉ‹เจธ เจ‰เฉฑเจคเฉ‡, XNU เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจ•เจฟเฉฑเจฒ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ psignal(SIGKILL,...) เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค เจ†เจ‰ เจ‡เจน เจฆเฉ‡เจ–เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ เจ•เจฟ เจฏเฉ‚เจœเจผเจฐเจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ psignal เจซเฉฐเจ•เจธเจผเจจ เจฆเฉเจ†เจฐเจพ เจ•เจฟเจนเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ†เจ‰ เจ•เจฐเจจเจฒ เจฆเฉ‡ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจฎเจ•เฉˆเจจเจฟเจœเจผเจฎ เจตเจฟเฉฑเจš เจธเจฟเจ—เจจเจฒ เจซเฉฐเจ•เจธเจผเจจ เจฒเจˆ เจ•เจพเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐเฉ€เจ (เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ‰เจน เจ—เฉˆเจฐ-เจฎเจพเจฎเฉ‚เจฒเฉ€ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจ, เจ…เจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจฒเฉ‡เจ– เจฒเจˆ เจ›เฉฑเจก เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡ ๐Ÿ™‚ - เจฆเจธเจคเจ–เจค เจคเจธเจฆเฉ€เจ•, เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจ—เจฒเจคเฉ€เจ†เจ‚, เจเจ—เจœเจผเจฟเจŸ/เจŸเจฐเจฎเฉ€เจจเฉ‡เจŸ เจนเฉˆเจ‚เจกเจฒเจฟเฉฐเจ—, เจซเจพเจˆเจฒ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจ‰เจฒเฉฐเจ˜เจฃเจพเจตเจพเจ‚, เจ†เจฆเจฟ .

เจ†เจ‰ เจซเฉฐเจ•เจธเจผเจจ เจ…เจคเฉ‡ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจจเจพเจฒ เจธเจฎเฉ€เจ–เจฟเจ† เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ เจŸเจฐเจฎเฉ€เจจเฉ‡เจŸ_เจตเจฟเจฆ_เจชเฉ‡เจฒเฉ‹เจก. เจ‡เจน เจฆเฉ‡เจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เจฒเจพเจธเจฟเจ• เจ•เจฟเฉฑเจฒ เจ•เจพเจฒ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ‡เฉฑเจ• เจตเจฟเจ•เจฒเจชเจฟเจ• เจชเจนเฉเฉฐเจš เจนเฉˆ เจœเฉ‹ เจฎเฉˆเจ•เฉ‹เจธ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจฒเจˆ เจตเจฟเจธเจผเฉ‡เจธเจผ เจนเฉˆ เจ…เจคเฉ‡ BSD เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเจฆเฉ€ เจนเฉˆเฅค เจฆเฉ‹เจตเฉ‡เจ‚ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚ เจฆเฉ‡ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจงเจพเจ‚เจค เจตเฉ€ เจธเจฎเจพเจจ เจนเจจเฅค เจ‡เจน เจ•เจฐเจจเจฒ เจซเฉฐเจ•เจธเจผเจจ psignal เจจเฉ‚เฉฐ เจธเจฟเฉฑเจงเฉ€เจ†เจ‚ เจ•เจพเจฒเจพเจ‚ เจนเจจเฅค เจ‡เจน เจตเฉ€ เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฎเจพเจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ‡เฉฑเจ• "เจ•เฉˆเจจเจธเจฟเจ—เจจเจฒ" เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ - เจ•เฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจฟเจ—เจจเจฒ เจญเฉ‡เจœ เจธเจ•เจฆเฉ€ เจนเฉˆ; เจธเจฟเจธเจŸเจฎ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจธเจฟเจธเจŸเจฎ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจจเจนเฉ€เจ‚ เจฆเจฟเฉฐเจฆเจพ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ.

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);
	}
...
}

เจฒเจพเจ‚เจš เจ•เฉ€เจคเจพ

เจธเจฟเจธเจŸเจฎ เจธเจŸเจพเจฐเจŸเจ…เฉฑเจช เจคเฉ‡ เจกเฉˆเจฎเจจ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจœเฉ€เจตเจจ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจ•เจฐเจจ เจฆเจพ เจฎเจฟเจ†เจฐเฉ€ เจคเจฐเฉ€เจ•เจพ เจฒเจพเจ‚เจš เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจธเจฐเฉ‹เจค macOS 10.10 เจคเฉฑเจ• เจฒเจพเจ‚เจšctl เจฆเฉ‡ เจชเฉเจฐเจพเจฃเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจฒเจˆ เจนเจจ, เจ•เฉ‹เจก เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจตเจฟเจ†เจ–เจฟเจ†เจคเจฎเจ• เจ‰เจฆเฉ‡เจธเจผเจพเจ‚ เจฒเจˆ เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจเฅค เจ†เจงเฉเจจเจฟเจ• launchctl XPC เจฐเจพเจนเฉ€เจ‚ เจฒเจพเจ‚เจšเจก เจธเจฟเจ—เจจเจฒ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ, เจฒเจพเจ‚เจšเจ•เจŸเจฒ เจคเจฐเจ• เจจเฉ‚เฉฐ เจ‡เจธ เจตเจฟเฉฑเจš เจญเฉ‡เจœเจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค

เจ†เจ“ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฐเฉ‹เจ•เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค 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, เจ‡เจธเจฆเฉ‡ เจจเจพเจฎ เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ, SIGTERM เจจเจพเจฒ เจจเจพ เจธเจฟเจฐเจซเจผ psignal เจญเฉ‡เจœ เจธเจ•เจฆเจพ เจนเฉˆ, เจธเจ—เฉ‹เจ‚ SIGKILL เจตเฉ€ เจญเฉ‡เจœ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจ…เจธเจฟเฉฑเจงเฉ‡ เจ•เจคเจฒ - เจธเจฐเฉ‹เจค เจธเฉ€เจฎเจพ

เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจฆเจฟเจฒเจšเจธเจช เจ•เฉ‡เจธ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†_เจจเฉ€เจคเฉ€. เจ‡เจธ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจ‡เฉฑเจ• เจ†เจฎ เจตเจฐเจคเฉ‹เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเจฐเฉ‹เจคเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉ€เจฎเจค เจ•เจฐเจจเจพ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‡เฉฑเจ• เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจฒเจˆ CPU เจธเจฎเจพเจ‚ เจ…เจคเฉ‡ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจ•เฉ‹เจŸเจพ เจธเฉ€เจฎเจฟเจค เจ•เจฐเจจเจพ เจคเจพเจ‚ เจœเฉ‹ เจธเจฟเจธเจŸเจฎ เจซเจพเจˆเจฒ เจ•เฉˆเจšเจฟเฉฐเจ— เจ—เจคเฉ€เจตเจฟเจงเฉ€เจ†เจ‚ เจฆเฉเจ†เจฐเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจคเฉŒเจฐ 'เจคเฉ‡ เจนเฉŒเจฒเฉ€ เจจเจพ เจนเฉ‹ เจœเจพเจตเฉ‡เฅค เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ†เจชเจฃเฉ€ เจธเจฐเฉ‹เจค เจธเฉ€เจฎเจพ 'เจคเฉ‡ เจชเจนเฉเฉฐเจš เจ—เจˆ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ proc_apply_resource_actions เจซเฉฐเจ•เจธเจผเจจ เจคเฉ‹เจ‚ เจฆเฉ‡เจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‡เฉฑเจ• SIGKILL เจธเจฟเจ—เจจเจฒ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจญเฉ‡เจœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ‡เจน เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจธเฉฐเจญเจพเจตเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐ เจธเจ•เจฆเฉ€ เจนเฉˆ, เจธเจฟเจธเจŸเจฎ เจจเฉ‡ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจจ เจตเจพเจฒเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ‡ เจ…เจงเจฟเจ•เจพเจฐเจพเจ‚ เจฆเฉ€ เจขเฉเจ•เจตเฉ€เจ‚ เจœเจพเจ‚เจš เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€เฅค เจ…เจธเจฒ เจตเจฟเฉฑเจš เจœเจพเจ‚เจš เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ เจฎเฉŒเจœเฉ‚เจฆ เจธเฉ€, เจชเจฐ เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจพเจˆเจชเจพเจธ เจ•เจฐเจจ เจฒเจˆ เจตเจฟเจ•เจฒเจชเจ• เจซเจฒเฉˆเจ— PROC_POLICY_ACTION_SET เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจ•เจพเจซเจผเฉ€ เจนเฉˆเฅค

เจ‡เจธ เจฒเจˆ, เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ CPU เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ‹เจŸเฉ‡ เจจเฉ‚เฉฐ "เจธเฉ€เจฎเจฟเจค" เจ•เจฐเจฆเฉ‡ เจนเฉ‹ (เจ‰เจฆเจพเจนเจฐเจฃ เจตเจœเฉ‹เจ‚, เจธเจฟเจฐเจซ 1 ns เจจเฉ‚เฉฐ เจšเฉฑเจฒเจฃ เจฆเจฟเจ“), เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจ•เจฟเจธเฉ‡ เจตเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจฎเจพเจฒเจตเฉ‡เจ…เจฐ เจเจ‚เจŸเฉ€เจตเจพเจ‡เจฐเจธ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจธเจฎเฉ‡เจค เจธเจฟเจธเจŸเจฎ 'เจคเฉ‡ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‡เจน เจตเฉ€ เจฆเจฟเจฒเจšเจธเจช เจชเฉเจฐเจญเจพเจต เจนเฉˆ เจœเฉ‹ เจชเจฟเจก 1 (เจฒเจพเจ‚เจšเจธเฉ€เจŸเฉ€เจเจฒ) - เจธเจฟเจ—เจ•เจฟเฉฑเจฒ เจธเจฟเจ—เจจเจฒ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจ•เจฐเจจเจฒ เจชเฉˆเจจเจฟเจ• เจจเจพเจฒ เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจนเฉเฉฐเจฆเจพ เจนเฉˆ :)

เจฎเฉˆเจ•เฉ‹เจธ 'เจคเฉ‡ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจเจพ เจนเฉˆ

เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจนเฉฑเจฒ เจ•เจฐเจจเจพ เจนเฉˆ?

เจ•เจฟเจธเฉ‡ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฎเจพเจฐเจจ เจคเฉ‹เจ‚ เจฐเฉ‹เจ•เจฃ เจฆเจพ เจธเจญ เจคเฉ‹เจ‚ เจธเจฟเฉฑเจงเจพ เจคเจฐเฉ€เจ•เจพ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจŸเฉ‡เจฌเจฒ เจตเจฟเฉฑเจš เจซเฉฐเจ•เจธเจผเจจ เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃเจพ เจนเฉˆเฅค เจฌเจฆเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจ‡เจน เจตเจฟเจงเฉ€ เจ•เจˆ เจ•เจพเจฐเจจเจพเจ‚ เจ•เจฐเจ•เฉ‡ เจ—เฉˆเจฐ-เจฎเจพเจฎเฉ‚เจฒเฉ€ เจนเฉˆ.

เจชเจนเจฟเจฒเจพเจ‚, เจชเฉเจฐเจคเฉ€เจ• เจœเฉ‹ เจ•เจฟ 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
                                         */
};

เจ–เฉเจธเจผเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจฎเฉˆเจ•เฉ‹เจธ เจฆเฉ‡ เจ†เจงเฉเจจเจฟเจ• เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจตเจฟเฉฑเจš, เจเจชเจฒ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ API เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจเจ‚เจกเจชเฉเจ†เจ‡เฉฐเจŸ เจธเจ•เจฟเจ“เจฐเจฟเจŸเฉ€ API เจ—เจพเจนเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฒเจˆ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ…เจงเจฟเจ•เจพเจฐเจค เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจคเฉเจธเฉ€เจ‚ เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเฉ‡ API เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, SIGKILL เจธเจฟเจ—เจจเจฒ เจธเจฎเฉ‡เจค, เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฒเจˆ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจฟเจ—เจจเจฒ เจจเฉ‚เฉฐ เจฌเจฒเฉŒเจ• เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

#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 เจ…เจงเจฟเจ•เจพเจฐเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจฎเจฐเจฅเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจ•เจฐเจจเจฒ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ เจธเฉเจฐเฉฑเจ–เจฟเจ†

เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ•เจฐเจจเจฒ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ (เจ•เฉ‡เจ•เจธเจŸ) เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจเจพ เจตเฉ€ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆเฅค macOS เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจจเฉ‚เฉฐ IOKit เจกเจฟเจตเจพเจˆเจธ เจกเจฐเจพเจˆเจตเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจตเจฟเจ•เจธเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจขเจพเจ‚เจšเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจกเจฟเจตเจพเจˆเจธเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจŸเฉ‚เจฒ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, IOKit C++ เจ•เจฒเจพเจธเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเจฐเจพเจˆเจตเจฐ เจธเจŸเฉˆเจ•เจฟเฉฐเจ— เจฒเจˆ เจขเฉฐเจ— เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจฏเฉ‚เจœเจผเจฐเจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ‡เฉฑเจ• เจ•เจฐเจจเจฒ-เจฏเฉ‚เจœเจผเจฐเจธเจชเฉ‡เจธ เจธเจฌเฉฐเจง เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจ•เจฒเจพเจธ เจฆเฉ€ เจ‡เฉฑเจ• เจฐเจœเจฟเจธเจŸเจฐเจก เจ‰เจฆเจพเจนเจฐเจฃ "เจฒเฉฑเจญเจฃ" เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค

เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจ•เจฒเจพเจธ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจฒเจˆ, ioclasscount เจธเจนเฉ‚เจฒเจค เจนเฉˆเฅค

my_kext_ioservice = 1
my_kext_iouserclient = 1

เจ•เฉ‹เจˆ เจตเฉ€ เจ•เจฐเจจเจฒ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ เจœเฉ‹ เจกเจฐเจพเจˆเจตเจฐ เจธเจŸเฉˆเจ• เจจเจพเจฒ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจจเฉ‚เฉฐ เจฒเจพเจœเจผเจฎเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจ•เจฒเจพเจธ เจ˜เฉ‹เจธเจผเจฟเจค เจ•เจฐเจจเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ เจœเฉ‹ IOService เจคเฉ‹เจ‚ เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ my_kext_ioservice เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจšเฅค เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจจเฉˆเจ•เจŸ เจ•เจฐเจจ เจจเจพเจฒ เจ•เจฒเจพเจธ เจฆเฉ€ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจ‰เจฆเจพเจนเจฐเจฃ เจฌเจฃ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจœเฉ‹ IOUserClient เจคเฉ‹เจ‚ เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš my_kext_iouserclientเฅค

เจธเจฟเจธเจŸเจฎ (kextunload เจ•เจฎเจพเจ‚เจก) เจคเฉ‹เจ‚ เจกเจฐเจพเจˆเจตเจฐ เจจเฉ‚เฉฐ เจ…เจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจตเจฐเจšเฉเจ…เจฒ เจซเฉฐเจ•เจธเจผเจจ โ€œเจฌเฉ‚เจฒ เจŸเจฐเจฎเฉ€เจจเฉ‡เจŸ(IOOptionBits เจตเจฟเจ•เจฒเจช)โ€ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ•เฉ‡เจ•เจธเจŸเฉ‚เจจเจฒเฉ‹เจก เจจเฉ‚เฉฐ เจ…เจฏเฉ‹เจ— เจ•เจฐเจจ เจฒเจˆ เจ…เจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจธเจฎเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจ•เจพเจฒ 'เจคเฉ‡ เจ—เจฒเจค เจตเจพเจชเจธ เจ•เจฐเจจเจพ เจ•เจพเจซเจผเฉ€ เจนเฉˆเฅค

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 เจฏเฉ‚เจœเจผเจฐเจธเจชเฉ‡เจธ เจซเฉฐเจ•เจธเจผเจจ "IOCatalogueTerminate(mach_port_t, uint32_t เจซเจฒเฉˆเจ—, io_name_t เจตเจฐเจฃเจจ);" เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เจฒเจพเจธเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจจเจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจคเฉเจธเฉ€เจ‚ "เจŸเจฐเจฎเฉ€เจจเฉ‡เจŸ" เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจ—เจฒเจค เจตเจพเจชเจธ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจฏเฉ‚เจœเจผเจฐเจธเจชเฉ‡เจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ "เจกเจพเจˆเจœเจผ" เจจเจนเฉ€เจ‚ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€, เจฏเจพเจจเฉ€ เจ•เจฟ "เจ•เจฒเจพเจ‡เฉฐเจŸเจกเจพเจˆเจก" เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจซเจพเจˆเจฒ เจธเฉเจฐเฉฑเจ–เจฟเจ†

เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฒเจˆ, Kauth API เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจ•เจพเจซเจผเฉ€ เจนเฉˆ, เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจซเจพเจˆเจฒเจพเจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจจเฉ‚เฉฐ เจธเฉ€เจฎเจค เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค Apple เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเจ•เฉ‹เจช เจตเจฟเฉฑเจš เจตเฉฑเจ–-เจตเฉฑเจ– เจ˜เจŸเจจเจพเจตเจพเจ‚ เจฌเจพเจฐเฉ‡ เจธเฉ‚เจšเจจเจพเจตเจพเจ‚ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ; เจธเจพเจกเฉ‡ เจฒเจˆ, KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA เจ…เจคเฉ‡ KAUTH_VNODE_DELETE_CHILD เจ“เจชเจฐเฉ‡เจธเจผเจจ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเจจเฅค เจซเจพเจˆเจฒเจพเจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจจเฉ‚เฉฐ เจธเฉ€เจฎเจค เจ•เจฐเจจ เจฆเจพ เจธเจญ เจคเฉ‹เจ‚ เจ†เจธเจพเจจ เจคเจฐเฉ€เจ•เจพ เจฎเจพเจฐเจ— เจฆเฉเจ†เจฐเจพ เจนเฉˆ - เจ…เจธเฉ€เจ‚ เจซเจพเจˆเจฒ เจฆเจพ เจฎเจพเจฐเจ— เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจชเจพเจฅ เจชเฉเจฐเฉ€เจซเจฟเจ•เจธ เจฆเฉ€ เจคเฉเจฒเจจเจพ เจ•เจฐเจจ เจฒเจˆ "vn_getpath" API เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจซเจพเจˆเจฒ เจซเฉ‹เจฒเจกเจฐ เจฎเจพเจฐเจ—เจพเจ‚ เจฆเฉ‡ เจจเจพเจฎ เจฌเจฆเจฒเจฃ เจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ, เจธเจฟเจธเจŸเจฎ เจนเจฐเฉ‡เจ• เจซเจพเจˆเจฒ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจฆเจพ เจ…เจงเจฟเจ•เจพเจฐ เจจเจนเฉ€เจ‚ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจธเจฟเจฐเจซ เจ‰เจธ เจซเฉ‹เจฒเจกเจฐ เจฒเจˆ เจœเจฟเจธเจฆเจพ เจจเจพเจฎ เจฌเจฆเจฒเจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค เจฎเฉ‚เจฒ เจฎเจพเจฐเจ— เจฆเฉ€ เจคเฉเจฒเจจเจพ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจฒเจˆ KAUTH_VNODE_DELETE เจจเฉ‚เฉฐ เจชเฉเจฐเจคเจฟเจฌเฉฐเจงเจฟเจค เจ•เจฐเจจเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆเฅค

เจฎเฉˆเจ•เฉ‹เจธ 'เจคเฉ‡ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจเจพ เจนเฉˆ

เจ‡เจธ เจชเจนเฉเฉฐเจš เจฆเจพ เจจเฉเจ•เจธเจพเจจ เจ˜เฉฑเจŸ เจ•เจพเจฐเจ—เฉเจœเจผเจพเจฐเฉ€ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจ—เฉ‡เจคเจฐเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจตเจงเจฆเฉ€ เจนเฉˆเฅค เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ•เจฟ เจคเฉเจฒเจจเจพ O(เจ…เจ—เฉ‡เจคเจฐ*เจฒเฉฐเจฌเจพเจˆ) เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจœเจฟเฉฑเจฅเฉ‡ เจ…เจ—เฉ‡เจคเจฐ เจ…เจ—เฉ‡เจคเจฐเจพเจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจนเฉˆ, เจฒเฉฐเจฌเจพเจˆ เจธเจŸเฉเจฐเจฟเฉฐเจ— เจฆเฉ€ เจฒเฉฐเจฌเจพเจˆ เจนเฉˆ, เจคเฉเจธเฉ€เจ‚ เจชเฉเจฐเฉ€เจซเจฟเจ•เจธ เจฆเฉเจ†เจฐเจพ เจฌเจฃเจพเจ เจ‡เฉฑเจ• เจจเจฟเจฐเจงเจพเจฐเจ• เจธเฉ€เจฎเจฟเจค เจ†เจŸเฉ‹เจฎเฉ‡เจŸเจจ (DFA) เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจ†เจ‰ เจ…เจ—เฉ‡เจคเจฐเจพเจ‚ เจฆเฉ‡ เจฆเจฟเฉฑเจคเฉ‡ เจ—เจ เจธเจฎเฉ‚เจน เจฒเจˆ เจ‡เฉฑเจ• DFA เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจตเจฟเจงเฉ€ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ€เจเฅค เจ…เจธเฉ€เจ‚ เจนเจฐเฉ‡เจ• เจชเฉเจฐเฉ€เจซเจฟเจ•เจธ เจฆเฉ‡ เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš เจ•เจฐเจธเจฐ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจœเฉ‡เจ•เจฐ เจธเจพเจฐเฉ‡ เจ•เจฐเจธเจฐ เจ‡เฉฑเจ•เฉ‹ เจ…เฉฑเจ–เจฐ เจตเฉฑเจฒ เจ‡เจธเจผเจพเจฐเจพ เจ•เจฐเจฆเฉ‡ เจนเจจ, เจคเจพเจ‚ เจนเจฐเฉ‡เจ• เจ•เจฐเจธเจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ…เฉฑเจ–เจฐ เจจเจพเจฒ เจตเจงเจพเจ“ เจ…เจคเฉ‡ เจฏเจพเจฆ เจฐเฉฑเจ–เฉ‹ เจ•เจฟ เจ‡เฉฑเจ•เฉ‹ เจฒเจพเจˆเจจ เจฆเฉ€ เจฒเฉฐเจฌเจพเจˆ เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจตเฉฑเจง เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจตเฉฑเจ–-เจตเฉฑเจ– เจšเจฟเฉฐเจจเฉเจนเจพเจ‚ เจตเจพเจฒเฉ‡ เจฆเฉ‹ เจ•เจฐเจธเจฐ เจนเจจ, เจคเจพเจ‚ เจ•เจฐเจธเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจชเฉเจฐเจคเฉ€เจ• เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจธเจฎเฉ‚เจนเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเฉ‹ เจ…เจคเฉ‡ เจนเจฐเฉ‡เจ• เจธเจฎเฉ‚เจน เจฒเจˆ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจจเฉ‚เฉฐ เจฆเฉเจนเจฐเจพเจ“เฅค

เจชเจนเจฟเจฒเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš (เจ•เจฐเจธเจฐ เจฆเฉ‡ เจนเฉ‡เจ เจพเจ‚ เจธเจพเจฐเฉ‡ เจ…เฉฑเจ–เจฐ เจ‡เฉฑเจ•เฉ‹ เจœเจฟเจนเฉ‡ เจนเจจ), เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• DFA เจ…เจตเจธเจฅเจพ เจฎเจฟเจฒเจฆเฉ€ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ•เฉ‹ เจฒเจพเจˆเจจ เจฆเฉ‡ เจจเจพเจฒ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจคเจฌเจฆเฉ€เจฒเฉ€ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจฆเฉ‚เจœเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจธเจพเจจเฉ‚เฉฐ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจฎเฉเฉœ-เจฎเฉเฉœ เจ•เจพเจฒ เจ•เจฐเจจ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ‡ เจœเจพเจฃ เจตเจพเจฒเฉ‡ เจฐเจพเจœเจพเจ‚ เจตเจฟเฉฑเจš เจ†เจ•เจพเจฐ 256 (เจ…เฉฑเจ–เจฐเจพเจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจ…เจคเฉ‡ เจธเจฎเฉ‚เจนเจพเจ‚ เจฆเฉ€ เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจธเฉฐเจ–เจฟเจ†) เจฆเฉ‡ เจชเจฐเจฟเจตเจฐเจคเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจธเจพเจฐเจฃเฉ€ เจฎเจฟเจฒเจฆเฉ€ เจนเฉˆเฅค

เจ†เจ“ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ‡เจ–เฉ€เจเฅค เจ…เจ—เฉ‡เจคเจฐเจพเจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจธเจฎเฉ‚เจน เจฒเจˆ (โ€œ/foo/bar/tmp/โ€, โ€œ/var/db/foo/โ€, โ€œ/foo/bar/aba/โ€, โ€œfoo/bar/aac/โ€) เจคเฉเจธเฉ€เจ‚ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ DFA เจšเจฟเฉฑเจคเจฐ เจธเจฟเจฐเจซ เจฆเฉ‚เจœเฉ‡ เจฐเจพเจœเจพเจ‚ เจจเฉ‚เฉฐ เจœเจพเจฃ เจตเจพเจฒเฉ‡ เจชเจฐเจฟเจตเจฐเจคเจจ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆ; เจนเฉ‹เจฐ เจชเจฐเจฟเจตเจฐเจคเจจ เจ…เฉฐเจคเจฟเจฎ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจ—เฉ‡เฅค

เจฎเฉˆเจ•เฉ‹เจธ 'เจคเฉ‡ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจเจพ เจนเฉˆ

DKA เจฐเจพเจœเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฒเฉฐเจ˜เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, 3 เจ•เฉ‡เจธ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

  1. เจ…เฉฐเจคเจฟเจฎ เจธเจฅเจฟเจคเฉ€ 'เจคเฉ‡ เจชเจนเฉเฉฐเจš เจ—เจฟเจ† เจนเฉˆ - เจฎเจพเจฐเจ— เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจนเฉˆ, เจ…เจธเฉ€เจ‚ KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA เจ…เจคเฉ‡ KAUTH_VNODE_DELETE_CHILD เจ“เจชเจฐเฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉ€เจฎเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚
  2. เจ…เฉฐเจคเจฎ เจธเจฅเจฟเจคเฉ€ 'เจคเฉ‡ เจจเจนเฉ€เจ‚ เจชเจนเฉเฉฐเจšเจฟเจ† เจ—เจฟเจ† เจธเฉ€, เจชเจฐ เจฎเจพเจฐเจ— "เจ–เจคเจฎ" (เจจเจฒ เจŸเจฐเจฎเฉ€เจจเฉ‡เจŸเจฐ 'เจคเฉ‡ เจชเจนเฉเฉฐเจš เจ—เจฟเจ† เจธเฉ€) - เจฎเจพเจฐเจ— เจ‡เฉฑเจ• เจฎเจพเจชเฉ‡ เจนเฉˆ, KAUTH_VNODE_DELETE เจจเฉ‚เฉฐ เจธเฉ€เจฎเจฟเจค เจ•เจฐเจจเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆเฅค เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจœเฉ‡เจ•เจฐ vnode เจ‡เฉฑเจ• เจซเฉ‹เจฒเจกเจฐ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจ‡เฉฑเจ• '/' เจœเฉ‹เฉœเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจจเจนเฉ€เจ‚ เจคเจพเจ‚ เจ‡เจน เจ‡เจธเจจเฉ‚เฉฐ "/foor/bar/t" เจซเจพเจˆเจฒ เจคเฉฑเจ• เจธเฉ€เจฎเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ€ เจนเฉˆ, เจœเฉ‹ เจ•เจฟ เจ—เจฒเจค เจนเฉˆเฅค
  3. เจ…เฉฐเจคเจฎ เจ…เจตเจธเจฅเจพ เจจเจนเฉ€เจ‚ เจชเจนเฉเฉฐเจšเฉ€, เจฐเจธเจคเจพ เจ–เจคเจฎ เจจเจนเฉ€เจ‚ เจนเฉ‹เจ‡เจ†เฅค เจ•เฉ‹เจˆ เจตเฉ€ เจ…เจ—เฉ‡เจคเจฐ เจ‡เจธ เจจเจพเจฒ เจฎเฉ‡เจฒ เจจเจนเฉ€เจ‚ เจ–เจพเจ‚เจฆเจพ, เจ…เจธเฉ€เจ‚ เจชเจพเจฌเฉฐเจฆเฉ€เจ†เจ‚ เจชเฉ‡เจธเจผ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

เจธเจฟเฉฑเจŸเจพ

เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเฉ‡ เจœเจพ เจฐเจนเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจนเฉฑเจฒเจพเจ‚ เจฆเจพ เจŸเฉ€เจšเจพ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ…เจคเฉ‡ เจ‰เจธเจฆเฉ‡ เจกเฉ‡เจŸเจพ เจฆเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ‡ เจชเฉฑเจงเจฐ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃเจพ เจนเฉˆเฅค เจ‡เฉฑเจ• เจชเจพเจธเฉ‡, เจ‡เจน เจŸเฉ€เจšเจพ เจเจ•เฉเจฐเฉ‹เจจเจฟเจธ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจ‰เจคเจชเจพเจฆ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจœเฉ‹ เจ‰เจนเจจเจพเจ‚ เจ•เจฎเจœเจผเฉ‹เจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจ–เฉเจฆ "เจ•เจฎเจœเจผเฉ‹เจฐ" เจนเฉˆเฅค เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡, เจธเจพเจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจชเจนเจฟเจฒเฉ‚เจ†เจ‚ เจจเฉ‚เฉฐ เจฎเจœเจผเจฌเฉ‚เจค โ€‹โ€‹เจ•เจฐเจจ เจฆเฉ€ เจ…เจฃเจฆเฉ‡เจ–เฉ€ เจจเจนเฉ€เจ‚ เจ•เจฐเจจเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจœเฉ‹ OS เจตเจพเจฒเฉ‡ เจชเจพเจธเฉ‡ เจธเฉเจงเจพเจฐเฉ‡ เจœเจพ เจธเจ•เจฆเฉ‡ เจนเจจ, เจ–เจพเจธ เจ•เจฐเจ•เฉ‡ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจ•เจฎเจœเจผเฉ‹เจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐเจจ เจจเจพเจฒ เจ‰เจคเจชเจพเจฆ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจพเจกเฉ€ เจ†เจชเจฃเฉ€ เจธเจฅเจฟเจฐเจคเจพ เจตเจงเจฆเฉ€ เจนเฉˆเฅค เจ•เจฎเจœเจผเฉ‹เจฐเฉ€ เจฆเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸ Apple เจ‰เจคเจชเจพเจฆ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจŸเฉ€เจฎ เจจเฉ‚เฉฐ เจฆเจฟเฉฑเจคเฉ€ เจ—เจˆ เจธเฉ€ เจ…เจคเฉ‡ macOS 10.14.5 (https://support.apple.com/en-gb/HT210119) เจตเจฟเฉฑเจš เจนเฉฑเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค

เจฎเฉˆเจ•เฉ‹เจธ 'เจคเฉ‡ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจเจพ เจนเฉˆ

เจ‡เจน เจธเจญ เจคเจพเจ‚ เจนเฉ€ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ€ เจธเจนเฉ‚เจฒเจค เจ…เจงเจฟเจ•เจพเจฐเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจธเจฅเจพเจชเจฟเจค เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆเฅค เจญเจพเจต, เจฌเจพเจนเจฐเฉ€ เจ…เจคเฉ‡ เจ…เจฃเจšเจพเจนเฉ‡ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจฒเจˆ เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจ•เฉ‹เจˆ เจ•เจฎเฉ€เจ†เจ‚ เจจเจนเฉ€เจ‚ เจนเจจเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‡เฉฑเจฅเฉ‹เจ‚ เจคเฉฑเจ• เจ•เจฟ เจเจ‚เจŸเฉ€เจตเจพเจ‡เจฐเจธ เจ…เจคเฉ‡ เจฌเฉˆเจ•เจ…เฉฑเจช เจธเจฟเจธเจŸเจฎเจพเจ‚ เจตเจฐเจ—เฉ‡ เจœเจพเจ‡เจœเจผ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฒเจˆ เจตเฉ€ เจ•เฉฐเจฎ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจชเจฐ เจนเฉเจฃ เจฎเฉˆเจ•เฉ‹เจธ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจเจ•เฉเจฐเฉ‹เจจเจฟเจธ เจ‰เจคเจชเจพเจฆเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฟเจธเจŸเจฎ เจคเฉ‹เจ‚ เจ…เจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจตเจพเจงเฉ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹