MacOS-เตฝ เดชเตเดฐเต‹เดธเดธเตเดธเตเด•เดณเตเด‚ เด•เต‡เตผเดฃเตฝ เดŽเด•เตเดธเตเดฑเตเดฑเตปเดทเดจเตเด•เดณเตเด‚ เดŽเด™เตเด™เดจเต† เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเด‚

เดนเดฒเต‹, เดนเดฌเตเตผ! MacOS-เดฒเต† เด†เด•เตเดฐเดฎเดฃเด•เดพเดฐเดฟเด•เดณเตเดŸเต† เด†เด•เตเดฐเดฎเดฃเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเต† เดŽเด™เตเด™เดจเต† เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเด‚ เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด‡เดจเตเดจเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด‡เดคเต เด’เดฐเต เด†เดจเตเดฑเดฟเดตเตˆเดฑเดธเดฟเดจเต‹ เดฌเดพเด•เตเด•เดชเตเดชเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเต‹ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฃเต, เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚ MacOS-เดจเต เด•เต€เดดเดฟเตฝ เด’เดฐเต เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเต† "เด•เตŠเดฒเตเดฒเดพเตป" เดจเดฟเดฐเดตเดงเดฟ เดฎเดพเตผเด—เด™เตเด™เดณเตเดฃเตเดŸเต. เด‡เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เด•เดŸเตเดŸเดฟเดจเต เด•เต€เดดเดฟเดฒเตเดณเตเดณ เดธเด‚เดฐเด•เตเดทเดฃ เดฐเต€เดคเดฟเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เดตเดพเดฏเดฟเด•เตเด•เตเด•.

MacOS-เตฝ เดชเตเดฐเต‹เดธเดธเตเดธเตเด•เดณเตเด‚ เด•เต‡เตผเดฃเตฝ เดŽเด•เตเดธเตเดฑเตเดฑเตปเดทเดจเตเด•เดณเตเด‚ เดŽเด™เตเด™เดจเต† เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเด‚

เด’เดฐเต เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเต† "เด•เตŠเดฒเตเดฒเดพเดจเตเดณเตเดณ" เด•เตเดฒเดพเดธเดฟเด•เต เดฎเดพเตผเด—เด‚

เด’เดฐเต เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเต† "เด•เตŠเดฒเตเดฒเดพเตป" เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจ เด’เดฐเต เดฎเดพเตผเด—เตเด—เด‚, เดชเตเดฐเต‹เดธเดธเตเดธเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต SIGKILL เดธเดฟเด—เตเดจเตฝ เด…เดฏเดฏเตเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต. เดฌเดพเดทเดฟเดฒเต‚เดŸเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เตŠเดฒเตเดฒเดพเตป เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต โ€œkill -SIGKILL PIDโ€ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ โ€œpkill -9 NAMEโ€ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เดพเด‚. "เด•เดฟเตฝ" เด•เดฎเดพเตปเดกเต UNIX-เดจเตเดฑเต† เด•เดพเดฒเด‚ เดฎเตเดคเตฝ เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต, เด‡เดคเต macOS-เตฝ เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดฎเดฑเตเดฑเต UNIX-เดชเต‹เดฒเตเดณเตเดณ เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเดฟเดฒเตเด‚ เดฒเดญเตเดฏเดฎเดพเดฃเต.

เดฏเตเดฃเดฟเด•เตโ€Œเดธเต เดชเต‹เดฒเตเดณเตเดณ เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเดฟเดฒเต†เดจเตเดจเดชเต‹เดฒเต†, เดธเดฟเด—เตโ€Œเด•เดฟเตฝ, เดธเดฟเด—เตโ€Œเดธเตเดฑเตเดฑเต‹เดชเตเดชเต เดŽเดจเตเดจเดฟเดต เด’เดดเดฟเด•เต†เดฏเตเดณเตเดณ เด’เดฐเต เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดธเดฟเด—เตเดจเดฒเตเด•เดณเต† เดคเดŸเดธเตเดธเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป macOS เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เดˆ เดฒเต‡เด–เดจเด‚ เดชเตเดฐเดพเดฅเดฎเดฟเด•เดฎเดพเดฏเดฟ SIGKILL เดธเดฟเด—เตเดจเดฒเดฟเตฝ เดถเตเดฐเดฆเตเดง เด•เต‡เดจเตเดฆเตเดฐเต€เด•เดฐเดฟเด•เตเด•เตเด‚, เด…เดคเต เด’เดฐเต เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเต† เดจเดถเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดพเดฐเดฃเดฎเดพเด•เตเดจเตเดจเต.

macOS เดชเตเดฐเดคเตเดฏเต‡เด•เดคเด•เตพ

MacOS-เตฝ, XNU เด•เต‡เตผเดฃเดฒเดฟเดฒเต† เด•เดฟเตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ psignal(SIGKILL,...) เดซเด‚เด—เตโ€Œเดทเดจเต† เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต. เด‰เดชเดฏเต‹เด•เตเดคเตƒเดธเตโ€Œเดชเต‡เดธเดฟเดฒเต† เดฎเดฑเตเดฑเต เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเต† เดธเดฟเด—เตเดจเตฝ เดซเด‚เด—เตโ€Œเดทเตป เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚. เด•เต‡เตผเดฃเดฒเดฟเดจเตเดฑเต† เด†เดจเตเดคเดฐเดฟเด• เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด™เตเด™เดณเดฟเดฒเต† เดธเดฟเด—เตเดจเตฝ เดซเด‚เด—เตโ€Œเดทเดจเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด•เต‹เดณเตเด•เตพ เดจเดฎเตเด•เตเด•เต เด’เดดเดฟเดตเดพเด•เตเด•เดพเด‚ (เด…เดต เดจเดฟเดธเตเดธเดพเดฐเดฎเดฒเตเดฒเต†เด™เตเด•เดฟเดฒเตเด‚, เดžเด™เตเด™เตพ เด…เดตเดฏเต† เดฎเดฑเตเดฑเตŠเดฐเต เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดตเดฟเดŸเตเด‚ ๐Ÿ™‚ - เด’เดชเตเดชเต เดชเดฐเดฟเดถเต‹เดงเดจ, เดฎเต†เดฎเตเดฎเดฑเดฟ เดชเดฟเดถเด•เตเด•เตพ, เดŽเด•เตโ€Œเดธเดฟเดฑเตเดฑเต/เดŸเต†เตผเดฎเดฟเดจเต‡เดฑเตเดฑเต เดนเดพเตปเดกเตโ€Œเดฒเดฟเด‚เด—เต, เดซเดฏเตฝ เดธเด‚เดฐเด•เตเดทเดฃ เดฒเด‚เด˜เดจเด™เตเด™เตพ เดฎเตเดคเดฒเดพเดฏเดต. .

เดชเตเดฐเดตเตผเดคเตเดคเดจเดตเตเด‚ เด…เดจเตเดฌเดจเตเดง เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดตเดฒเต‹เด•เดจเด‚ เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚ เดŸเต†เตผเดฎเดฟเดจเต‡เดฑเตเดฑเต_เดตเดฟเดคเตเดคเต_เดชเต‡เดฒเต‹เดกเต. เด•เตเดฒเดพเดธเดฟเด•เต เด•เดฟเตฝ เด•เต‹เดณเดฟเดจเต เดชเตเดฑเดฎเต‡, 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);
	}
...
}

เดตเดฟเด•เตเดทเต‡เดชเดฟเดšเตเดšเต

เดธเดฟเดธเตเดฑเตเดฑเด‚ เดธเตเดฑเตเดฑเดพเตผเดŸเตเดŸเดชเตเดชเดฟเตฝ เดกเต†เดฎเดฃเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด…เดตเดฏเตเดŸเต† เด†เดฏเตเดธเตเดธเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดฎเดพเตผเด—เด‚ เดธเดฎเดพเดฐเด‚เดญเดฟเดšเตเดšเต. MacOS 10.10 เดตเดฐเต†เดฏเตเดณเตเดณ 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, เด…เดคเดฟเดจเตเดฑเต† เดชเต‡เดฐเต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดฟเดŸเตเดŸเตเด‚, SIGTERM เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเดฟเด—เตเดจเตฝ เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, SIGKILL-เดจเตเด‚ เด…เดฏเดฏเตเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เดชเดฐเต‹เด•เตเดท เด•เดฟเตฝ - เดฑเดฟเดธเต‹เดดเตเดธเต เดชเดฐเดฟเดงเดฟ

เดฎเดฑเตเดฑเตŠเดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เดฐเดธเด•เดฐเดฎเดพเดฏ เด’เดฐเต เด•เต‡เดธเต เด•เดพเดฃเดพเด‚ เดชเตเดฐเด•เตเดฐเดฟเดฏ_เดจเดฏเด‚. เดซเดฏเตฝ เด•เดพเดทเดฟเด‚เด—เต เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเดพเตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด—เดฃเตเดฏเดฎเดพเดฏเดฟ เดฎเดจเตเดฆเด—เดคเดฟเดฏเดฟเดฒเดพเด•เดพเดคเดฟเดฐเดฟเด•เตเด•เดพเตป, เดธเดฟเดชเดฟเดฏเต เดธเดฎเดฏเดตเตเด‚ เดฎเต†เดฎเตเดฎเดฑเดฟ เด•เตเดตเดพเดŸเตเดŸเดฏเตเด‚ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เดธเต‚เดšเดฟเด•เดฏเตเด•เตเด•เต เดตเต‡เดฃเตเดŸเดฟเดฏเตเดณเตเดณ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดˆ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเดฟเดจเตเดฑเต† เดชเตŠเดคเตเดตเดพเดฏ เด‰เดชเดฏเต‹เด—เด‚. เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด…เดคเดฟเดจเตเดฑเต† เดฑเดฟเดธเต‹เดดเตเดธเต เดชเดฐเดฟเดงเดฟเดฏเดฟเตฝ เดŽเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, 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-เดจเตเดฑเต† เด†เดงเตเดจเดฟเด• เดชเดคเดฟเดชเตเดชเตเด•เดณเดฟเตฝ, เดชเตเดฐเต‹เดธเดธเตเด•เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด†เดชเตเดชเดฟเตพ เด’เดฐเต เดชเตเดคเดฟเดฏ 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;
}

เด…เดคเตเดชเต‹เดฒเต†, เด’เดฐเต เดธเดฟเด—เตเดจเตฝ เดชเดฐเดฟเดฐเด•เตเดทเดฃ เดฐเต€เดคเดฟ (policy proc_check_signal) เดจเตฝเด•เตเดจเตเดจ เด•เต‡เตผเดฃเดฒเดฟเตฝ เด’เดฐเต MAC เดชเต‹เดณเดฟเดธเดฟ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเดพเดตเตเดจเตเดจเดคเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ API เด”เดฆเตเดฏเต‹เด—เดฟเด•เดฎเดพเดฏเดฟ เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ.

เด•เต‡เตผเดฃเตฝ เดตเดฟเดชเตเดฒเต€เด•เดฐเดฃ เดธเด‚เดฐเด•เตเดทเดฃเด‚

เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต† เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เตพ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดชเตเดฑเดฎเต‡, เด•เต‡เตผเดฃเตฝ เดŽเด•เตเดธเตเดฑเตเดฑเตปเดทเตป เดคเดจเตเดจเต† (เด•เต†เด•เตเดธเตเดฑเตเดฑเต) เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เต IOKit เดกเดฟเดตเตˆเดธเต เดกเตเดฐเตˆเดตเดฑเตเด•เตพ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเต macOS เดจเตฝเด•เตเดจเตเดจเต. เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดŸเต‚เดณเตเด•เตพ เดจเตฝเด•เตเดจเตเดจเดคเดฟเดจเต เดชเตเดฑเดฎเต‡, C++ เด•เตเดฒเดพเดธเตเด•เดณเตเดŸเต† เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต IOKit เดกเตเดฐเตˆเดตเตผ เดธเตเดฑเตเดฑเดพเด•เตเด•เดฟเด‚เด—เต เดฐเต€เดคเดฟเด•เตพ เดจเตฝเด•เตเดจเตเดจเต. เด’เดฐเต เด•เต‡เตผเดฃเตฝ-เด‰เดชเดฏเต‹เด•เตเดคเตƒเดธเตโ€Œเดชเต‡เดธเต เดฌเดจเตเดงเด‚ เดธเตเดฅเดพเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด•เตเดฒเดพเดธเตเดธเดฟเดจเตเดฑเต† เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดค เด‰เดฆเดพเดนเดฐเดฃเด‚ "เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป" เดฏเต‚เดธเตผเดธเตโ€Œเดชเต‡เดธเดฟเดฒเต† เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเต เด•เดดเดฟเดฏเตเด‚.

เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต† เด•เตเดฒเดพเดธเต เด‡เตปเดธเตโ€Œเดฑเตเดฑเตปเดธเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเดฟเดจเต, ioclasscount เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดฃเตเดŸเต.

my_kext_ioservice = 1
my_kext_iouserclient = 1

เดกเตเดฐเตˆเดตเตผ เดธเตเดฑเตเดฑเดพเด•เตเด•เดฟเตฝ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจ เดเดคเตŠเดฐเต เด•เต‡เตผเดฃเตฝ เดŽเด•เตเดธเตเดฑเตเดฑเตปเดทเดจเตเด‚ IOService-เตฝ เดจเดฟเดจเตเดจเต เดชเดพเดฐเดฎเตเดชเดฐเตเดฏเดฎเดพเดฏเดฟ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด•เตเดฒเดพเดธเต เดชเตเดฐเด–เตเดฏเดพเดชเดฟเด•เตเด•เดฃเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต my_kext_ioservice เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต IOUserClient-เตฝ เดจเดฟเดจเตเดจเต เด…เดตเด•เดพเดถเดฎเดพเด•เตเด•เตเดจเตเดจ เด•เตเดฒเดพเดธเดฟเดจเตเดฑเต† เด’เดฐเต เดชเตเดคเดฟเดฏ เด‰เดฆเดพเดนเดฐเดฃเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด•เดพเดฐเดฃเดฎเดพเด•เตเดจเตเดจเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ my_kext_iouserclient.

เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดกเตเดฐเตˆเดตเตผ เด…เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ (kextunload เด•เดฎเดพเตปเดกเต), เดตเต†เตผเดšเตเดตเตฝ เดซเด‚เด—เตเดทเตป "bool Terminate (IOOptionBits เด“เดชเตเดทเดจเตเด•เตพ)" เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต. เด•เต†เด•เตโ€Œเดธเตเดฑเตเดฑเตบเดฒเต‹เดกเต เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เดพเตป เด…เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดŸเต†เตผเดฎเดฟเดจเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เด•เต‹เดณเดฟเตฝ เดคเต†เดฑเตเดฑเดพเดฏเดฟ เดจเตฝเด•เดฟเดฏเดพเตฝ เดฎเดคเดฟ.

bool Kext::terminate(IOOptionBits options)
{

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

  return super::terminate(options);
}

เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ IOUserClient-เดจเต IsUnloadAllowed เดซเตเดฒเดพเด—เต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเดจเดพเด•เตเด‚. เด’เดฐเต เดกเต—เตบเดฒเต‹เดกเต เดชเดฐเดฟเดงเดฟ เด‰เดณเตเดณเดชเตเดชเต‹เตพ, 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-เดจเต เดธเดฎเดพเดจเดฎเดพเดฏ เดธเด‚เดฐเด•เตเดทเดฃเด‚ เดจเตฝเด•เดฃเด‚. "IOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);" IOKitLib เด‰เดชเดฏเต‹เด•เตเดคเตƒเดธเตโ€Œเดชเต‡เดธเต เดซเด‚เด—เตโ€Œเดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เตเดฒเดพเดธเตเด•เดณเตเดŸเต† เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เด…เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚. "เดŸเต†เตผเดฎเดฟเดจเต‡เดฑเตเดฑเต" เด•เดฎเดพเตปเดกเต เดตเดฟเดณเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดคเต†เดฑเตเดฑเดพเดฏเดฟ เดจเตฝเด•เดพเด‚, เด‰เดชเดฏเต‹เด•เตเดคเตƒเดธเตเดชเต‡เดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป "เดกเต†เดฏเตเดธเต" เดตเดฐเต†, เด…เดคเดพเดฏเดคเต, "เด•เตเดฒเดฏเดจเตเดฑเต เดกเตˆเดกเต" เดซเด‚เด—เตเดทเตป เดตเดฟเดณเดฟเด•เตเด•เดชเตเดชเต†เดŸเดฟเดฒเตเดฒ.

เดซเดฏเตฝ เดธเด‚เดฐเด•เตเดทเดฃเด‚

เดซเดฏเดฒเตเด•เตพ เดชเดฐเดฟเดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดซเดฏเดฒเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เด•เตเดธเดธเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ Kauth API เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเตฝ เดฎเดคเดฟเดฏเดพเด•เตเด‚. เดตเตเดฏเดคเตเดฏเดธเตโ€Œเดค เดชเดฐเดฟเดชเดพเดŸเดฟเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด…เดฑเดฟเดฏเดฟเดชเตเดชเตเด•เตพ เด†เดชเตเดชเดฟเตพ เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เต เดจเตฝเด•เตเดจเตเดจเต; เดžเด™เตเด™เดณเต† เดธเด‚เดฌเดจเตเดงเดฟเดšเตเดšเดฟเดŸเดคเตเดคเต‹เดณเด‚, KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA, KAUTH_VNODE_DELETE_CHILD เดŽเดจเตเดจเต€ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต. เดซเดฏเดฒเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เด•เตโ€Œเดธเดธเต เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเดพเดจเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด‚ เดŽเดณเตเดชเตเดช เดฎเดพเตผเด—เด‚ เดชเดพเดคเตเดคเต เดตเดดเดฟเดฏเดพเดฃเต - เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเดพเดคเตเดคเต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเดพเดคเตเดคเต เดชเตเดฐเดฟเดซเดฟเด•เตโ€Œเดธเต เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดžเด™เตเด™เตพ โ€œvn_getpathโ€ API เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดซเดฏเตฝ เดซเต‹เตพเดกเตผ เดชเดพเดฅเตเด•เดณเตเดŸเต† เดชเตเดจเตผเดจเดพเดฎเด•เดฐเดฃเด‚ เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดธเดฟเดธเตเดฑเตเดฑเด‚ เด“เดฐเต‹ เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เตเด‚ เดชเตเดฐเดตเต‡เดถเดจเด‚ เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เดฎเดฑเดฟเดšเตเดšเต เดชเต‡เดฐเตเดฎเดพเดฑเตเดฑเดฟเดฏ เดซเต‹เตพเดกเดฑเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต. เดชเดพเดฐเดจเตเดฑเต เดชเดพเดคเตเดคเต เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เด…เดคเดฟเดจเดพเดฏเดฟ KAUTH_VNODE_DELETE เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต.

MacOS-เตฝ เดชเตเดฐเต‹เดธเดธเตเดธเตเด•เดณเตเด‚ เด•เต‡เตผเดฃเตฝ เดŽเด•เตเดธเตเดฑเตเดฑเตปเดทเดจเตเด•เดณเตเด‚ เดŽเด™เตเด™เดจเต† เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเด‚

เดชเตเดฐเดฟเดซเดฟเด•เตเดธเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดตเตผเดฆเตเดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ เดˆ เดธเดฎเต€เดชเดจเดคเตเดคเดฟเดจเตเดฑเต† เดชเต‹เดฐเดพเดฏเตเดฎ เด•เตเดฑเดžเตเดž เดชเตเดฐเด•เดŸเดจเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚. เดชเตเดฐเดฟเดซเดฟเด•เตโ€Œเดธเต เดŽเดจเตเดจเดคเต เดชเตเดฐเดฟเดซเดฟเด•เตโ€Œเดธเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดตเตเด‚ เดจเต€เดณเด‚ เดŽเดจเตเดจเดคเต เดธเตโ€ŒเดŸเตเดฐเดฟเด‚เด—เดฟเดจเตเดฑเต† เดจเต€เดณเดตเตเด‚ เด†เดฏ O(เดชเตเดฐเดฟเดซเดฟเด•เตโ€Œเดธเต*เดฆเตˆเตผเด˜เตเดฏเดคเตเดคเดฟเดจเต) เดคเตเดฒเตเดฏเดฎเดฒเตเดฒ เดคเดพเดฐเดคเดฎเตเดฏเดฎเต†เดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เดพเตป, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดฟเดซเดฟเด•เตโ€Œเดธเตเด•เดณเดพเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดš เด’เดฐเต เดกเดฟเดฑเตเดฑเตผเดฎเดฟเดจเดฟเดธเตเดฑเตเดฑเดฟเด•เต เดซเดฟเดจเดฟเดฑเตเดฑเต เด“เดŸเตเดŸเต‹เดฎเดพเดฑเตเดฑเตบ (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 เด’เดฐเต เดซเต‹เตพเดกเดฑเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เด…เดตเดธเดพเดจเด‚ เด’เดฐเต '/' เดšเต‡เตผเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เด…เดฒเตเดฒเดพเดคเตเดคเดชเด•เตเดทเด‚ เด…เดคเต "/for/bar/t" เดŽเดจเตเดจ เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เต เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเต‡เด•เตเด•เดพเด‚, เด…เดคเต เดคเต†เดฑเตเดฑเดพเดฃเต.
  3. เด…เดจเตเดคเดฟเดฎ เด…เดตเดธเตเดฅเดฏเดฟเตฝ เดŽเดคเตเดคเดฟเดฏเดฟเดฒเตเดฒ, เดชเดพเดค เด…เดตเดธเดพเดจเดฟเดšเตเดšเดฟเดฒเตเดฒ. เดชเตเดฐเดฟเดซเดฟเด•เตโ€Œเดธเตเด•เดณเตŠเดจเตเดจเตเด‚ เด‡เดคเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒ, เดžเด™เตเด™เตพ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด™เตเด™เตพ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ.

เดคเต€เดฐเตเดฎเดพเดจเด‚

เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเตเดฐเด•เตเดทเดพ เดชเดฐเดฟเดนเดพเดฐเด™เตเด™เดณเตเดŸเต† เดฒเด•เตเดทเตเดฏเด‚ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเตเดฑเต†เดฏเตเด‚ เด…เดตเดจเตเดฑเต† เดกเดพเดฑเตเดฑเดฏเตเดŸเต†เดฏเตเด‚ เดธเตเดฐเด•เตเดทเดฏเตเดŸเต† เดจเดฟเดฒเดตเดพเดฐเด‚ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต. เด’เดฐเต เดตเดถเดคเตเดคเต, เด…เด•เตเดฐเต‹เดฃเดฟเดธเต เดธเต‹เดซเตเดฑเตเดฑเตเดตเต†เดฏเตผ เด‰เตฝเดชเตเดชเดจเตเดจเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเด•เดธเดจเด‚ เดตเดดเดฟ เดˆ เดฒเด•เตเดทเตเดฏเด‚ เด•เตˆเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เดคเดจเตเดจเต† "เดฆเตเตผเดฌเดฒเดฎเดพเดฏ" เด† เด•เต‡เดŸเตเดชเดพเดŸเตเด•เตพ เด…เดŸเดฏเตเด•เตเด•เตเดจเตเดจเต. เดฎเดฑเตเดตเดถเดคเตเดคเต, OS เดตเดถเดคเตเดคเต เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เดธเตเดฐเด•เตเดทเดพ เดตเดถเด™เตเด™เตพ เดถเด•เตเดคเดฟเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเต เดžเด™เตเด™เตพ เด…เดตเด—เดฃเดฟเด•เตเด•เดฐเตเดคเต, เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚ เด…เดคเตเดคเดฐเด‚ เด•เต‡เดŸเตเดชเดพเดŸเตเด•เตพ เด…เดŸเดฏเตเด•เตเด•เตเดจเตเดจเดคเต เด’เดฐเต เด‰เตฝเดชเตเดชเดจเตเดจเดฎเต†เดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ เดจเดฎเตเดฎเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดธเตเดฅเดฟเดฐเดค เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ. เด…เดชเด•เดŸเดธเดพเดงเตเดฏเดค Apple Product Security Team-เดจเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดคเต, macOS 10.14.5 (https://support.apple.com/en-gb/HT210119)-เตฝ เด…เดคเต เดชเดฐเดฟเดนเดฐเดฟเดšเตเดšเต.

MacOS-เตฝ เดชเตเดฐเต‹เดธเดธเตเดธเตเด•เดณเตเด‚ เด•เต‡เตผเดฃเตฝ เดŽเด•เตเดธเตเดฑเตเดฑเตปเดทเดจเตเด•เดณเตเด‚ เดŽเด™เตเด™เดจเต† เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเด‚

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด”เดฆเตเดฏเต‹เด—เดฟเด•เดฎเดพเดฏเดฟ เด•เต‡เตผเดฃเดฒเดฟเตฝ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เดฎเดพเดคเตเดฐเดฎเต‡ เด‡เดคเต†เดฒเตเดฒเดพเด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเต‚. เด…เดคเดพเดฏเดคเต, เดฌเดพเดนเตเดฏเดตเตเด‚ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเดพเดคเตเดคเดคเตเดฎเดพเดฏ เดธเต‹เดซเตโ€Œเดฑเตเดฑเตโ€Œเดตเต†เดฏเดฑเตเด•เตพเด•เตเด•เต เด…เดคเตเดคเดฐเด‚ เดชเดดเตเดคเตเด•เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เด†เดจเตเดฑเดฟเดตเตˆเดฑเดธเตเด‚ เดฌเดพเด•เตเด•เดชเตเดชเต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเตเด‚ เดชเต‹เดฒเตเดณเตเดณ เดจเดฟเดฏเดฎเดพเดจเตเดธเตƒเดค เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดชเดฐเดฟเดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดชเต‹เดฒเตเด‚ เดœเต‹เดฒเดฟ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดŽเดจเตเดจเดพเตฝ เด‡เดชเตเดชเต‹เตพ MacOS-เดจเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด…เด•เตเดฐเต‹เดฃเดฟเดธเต เด‰เตฝเดชเตเดชเดจเตเดจเด™เตเด™เตพเด•เตเด•เต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เตบเดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต†เดคเดฟเดฐเต† เด…เดงเดฟเด• เดชเดฐเดฟเดฐเด•เตเดท เดฒเดญเดฟเด•เตเด•เตเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•