เชฎเซ‡เช•เช“เชเชธ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเชตเซเช‚

เชนเซ‡เชฒเซ‹, เชนเซ‡เชฌเซเชฐ! เช†เชœเซ‡ เชนเซเช‚ เชคเซ‡ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชคเชฎเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ macOS เชฎเชพเช‚ เชนเซเชฎเชฒเชพเช–เซ‹เชฐเซ‹ เชฆเซเชตเชพเชฐเชพ เชนเซเชฎเชฒเชพเช“เชฅเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช† เชเชจเซเชŸเซ€เชตเชพเชฏเชฐเชธ เช…เชฅเชตเชพ เชฌเซ‡เช•เช…เชช เชธเชฟเชธเซเชŸเชฎ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เช›เซ‡, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เช•เชพเชฐเชฃ เช•เซ‡ macOS เชนเซ‡เช เชณ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ "เชฎเชพเชฐเชตเชพ" เชฎเชพเชŸเซ‡ เช˜เชฃเซ€ เชฐเซ€เชคเซ‹ เช›เซ‡. เช† เช…เชจเซ‡ เช•เชŸ เชนเซ‡เช เชณ เชฐเช•เซเชทเชฃ เชชเชฆเซเชงเชคเชฟเช“ เชตเชฟเชถเซ‡ เชตเชพเช‚เชšเซ‹.

เชฎเซ‡เช•เช“เชเชธ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเชตเซเช‚

เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ "เชฎเชพเชฐเชตเชพ" เชฎเชพเชŸเซ‡เชจเซ€ เช‰เชคเซเชคเชฎ เชฐเซ€เชค

เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ "เชฎเชพเชฐเชตเชพ" เชฎเชพเชŸเซ‡เชจเซ€ เชœเชพเชฃเซ€เชคเซ€ เชฐเซ€เชค เช เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชธเชฟเช—เช•เชฟเชฒ เชธเชฟเช—เซเชจเชฒ เชฎเซ‹เช•เชฒเชตเชพเชจเซ‹ เช›เซ‡. bash เชฆเซเชตเชพเชฐเชพ เชคเชฎเซ‡ เชฎเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฎเชพเชจเช• "kill -SIGKILL PID" เช…เชฅเชตเชพ "pkill -9 NAME" เช•เซ‰เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. "เช•เชฟเชฒ" เช†เชฆเซ‡เชถ UNIX เชจเชพ เชฆเชฟเชตเชธเซ‹เชฅเซ€ เชœเชพเชฃเซ€เชคเซ‹ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชฎเชพเชคเซเชฐ macOS เชชเชฐ เชœ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เช…เชจเซเชฏ UNIX เชœเซ‡เชตเซ€ เชธเชฟเชธเซเชŸเชฎเซเชธ เชชเชฐ เชชเชฃ เช‰เชชเชฒเชฌเซเชง เช›เซ‡.

UNIX เชœเซ‡เชตเซ€ เชธเชฟเชธเซเชŸเชฎเชจเซ€ เชœเซ‡เชฎ, macOS เชคเชฎเชจเซ‡ เชฌเซ‡ เชธเชฟเชตเชพเชฏเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เช•เซ‹เชˆเชชเชฃ เชธเชฟเช—เซเชจเชฒเชจเซ‡ เช…เชŸเช•เชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ - SIGKILL เช…เชจเซ‡ SIGSTOP. เช† เชฒเซ‡เช– เชฎเซเช–เซเชฏเชคเซเชตเซ‡ เชธเชฟเช—เซเชจเชฒ เชคเชฐเซ€เช•เซ‡ SIGKILL เชธเชฟเช—เซเชจเชฒ เชชเชฐ เชงเซเชฏเชพเชจ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เช•เชฐเชถเซ‡ เชœเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชฎเชพเชฐเซ€ เชจเชพเช–เชตเชพเชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ‡ เช›เซ‡.

macOS เชตเชฟเชถเชฟเชทเซเชŸเชคเชพเช“

macOS เชชเชฐ, XNU เช•เชฐเซเชจเชฒเชฎเชพเช‚ เช•เชฟเชฒ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ psignal(SIGKILL,...) เชซเช‚เช•เซเชถเชจเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ‡ เช›เซ‡. เชšเชพเชฒเซ‹ เช เชœเซ‹เชตเชพเชจเซ‹ เชชเซเชฐเชฏเชคเซเชจ เช•เชฐเซ€เช เช•เซ‡ เชฏเซเชเชฐเชธเซเชชเซ‡เชธเชฎเชพเช‚ เช…เชจเซเชฏ เช•เชˆ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‡ psignal เชซเช‚เช•เซเชถเชจ เชฆเซเชตเชพเชฐเชพ เช•เชนเซ€ เชถเช•เชพเชฏ. เชšเชพเชฒเซ‹ เช•เชฐเซเชจเชฒเชจเซ€ เช†เช‚เชคเชฐเชฟเช• เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเซเชธเชฎเชพเช‚ เชธเชฟเช—เซเชจเชฒ เชซเช‚เช•เซเชถเชจ เชฎเชพเชŸเซ‡เชจเชพ เช•เซ‰เชฒเซเชธเชจเซ‡ เชจเซ€เช‚เชฆเชฃ เช•เชฐเซ€เช (เชœเซ‹ เช•เซ‡ เชคเซ‡ เชฌเชฟเชจ-เชคเซเชšเซเช› เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชฌเซ€เชœเชพ เชฒเซ‡เช– เชฎเชพเชŸเซ‡ เช›เซ‹เชกเซ€เชถเซเช‚ ๐Ÿ™‚ - เชนเชธเซเชคเชพเช•เซเชทเชฐ เชšเช•เชพเชธเชฃเซ€, เชฎเซ‡เชฎเชฐเซ€ เชญเซ‚เชฒเซ‹, เชเช•เซเชเชฟเชŸ/เชŸเชฐเซเชฎเชฟเชจเซ‡เชŸ เชนเซ‡เชจเซเชกเชฒเชฟเช‚เช—, เชซเชพเช‡เชฒ เชธเช‚เชฐเช•เซเชทเชฃ เช‰เชฒเซเชฒเช‚เช˜เชจ, เชตเช—เซ‡เชฐเซ‡. .

เชšเชพเชฒเซ‹ เชซเช‚เช•เซเชถเชจ เช…เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชธเชพเชฅเซ‡ เชธเชฎเซ€เช•เซเชทเชพ เชถเชฐเซ‚ เช•เชฐเซ€เช เชŸเชฐเซเชฎเชฟเชจเซ‡เชŸ_เชตเชฟเชฅ_เชชเซ‡เชฒเซ‹เชก. เชคเซ‡ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡ เช•เซ‡ เช•เซเชฒเชพเชธเชฟเช• เช•เซ€เชฒ เช•เซ‹เชฒ เช‰เชชเชฐเชพเช‚เชค, เชเช• เชตเซˆเช•เชฒเซเชชเชฟเช• เช…เชญเชฟเช—เชฎ เช›เซ‡ เชœเซ‡ macOS เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เชฎเชพเชŸเซ‡ เชตเชฟเชถเชฟเชทเซเชŸ เช›เซ‡ เช…เชจเซ‡ 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 เชธเซเชงเซ€เชจเชพ เชฒเซ‹เชจเซเชšเช•เซเชŸเชฒเชจเชพ เชœเซ‚เชจเชพ เชตเชฐเซเชเชจ เชฎเชพเชŸเซ‡ เช›เซ‡, เช•เซ‹เชก เช‰เชฆเชพเชนเชฐเชฃเซ‹ เช‰เชฆเชพเชนเชฐเชฃเชฐเซ‚เชช เชนเซ‡เชคเซเช“ เชฎเชพเชŸเซ‡ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡. เช†เชงเซเชจเชฟเช• เชฒเซ‹เชจเซเชšเชธเซ€เชŸเซ€เชเชฒ เชเช•เซเชธเชชเซ€เชธเซ€ เชฆเซเชตเชพเชฐเชพ เชฒเซ‹เชจเซเชš เชธเชฟเช—เซเชจเชฒเซ‹ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡, เชฒเซ‹เชจเซเชšเชธเซ€เชŸเซ€เชเชฒ เชฒเซ‹เชœเซ€เช• เชคเซ‡เชฎเชพเช‚ เช–เชธเซ‡เชกเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡.

เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเช‚เชง เชฅเชพเชฏ เช›เซ‡. 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 เชชเชฃ เชฎเซ‹เช•เชฒเซ€ เชถเช•เซ‡ เช›เซ‡.

เชชเชฐเซ‹เช•เซเชท เช•เชฟเชฒ - เชธเช‚เชธเชพเชงเชจ เชฎเชฐเซเชฏเชพเชฆเชพ

เช…เชจเซเชฏ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชฎเชพเช‚ เชตเชงเซ เชฐเชธเชชเซเชฐเชฆ เช•เซ‡เชธ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ_เชจเซ€เชคเชฟ. เช† เชธเชฟเชธเซเชŸเชฎ เช•เซ‹เชฒเชจเซ‹ เชธเชพเชฎเชพเชจเซเชฏ เช‰เชชเชฏเซ‹เช— เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ‡ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช‡เชจเซเชกเซ‡เช•เซเชธเชฐ เชฎเชพเชŸเซ‡ เชธเซ€เชชเซ€เชฏเซ เชธเชฎเชฏ เช…เชจเซ‡ เชฎเซ‡เชฎเชฐเซ€ เช•เซเชตเซ‹เชŸเชพเชจเซ‡ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเซ‡เชฅเซ€ เชซเชพเช‡เชฒ เช•เซ‡เชถเซ€เช‚เช— เชชเซเชฐเชตเซƒเชคเซเชคเชฟเช“ เชฆเซเชตเชพเชฐเชพ เชธเชฟเชธเซเชŸเชฎ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เชงเซ€เชฎเซเช‚ เชจ เชฅเชพเชฏ. เชœเซ‹ เช•เซ‹เชˆ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชคเซ‡เชจเซ€ เชธเช‚เชธเชพเชงเชจ เชฎเชฐเซเชฏเชพเชฆเชพ เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเซ€ เช—เชˆ เชนเซ‹เชฏ, เชœเซ‡เชฎ เช•เซ‡ 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
                                         */
};

เชธเชฆเชจเชธเซ€เชฌเซ‡, macOS เชจเชพ เช†เชงเซเชจเชฟเช• เชธเช‚เชธเซเช•เชฐเชฃเซ‹เชฎเชพเช‚, Apple เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชจเชตเซเช‚ 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 เชธเชคเซเชคเชพเชตเชพเชฐ เชฐเซ€เชคเซ‡ เชธเชชเซ‹เชฐเซเชŸเซ‡เชก เชจเชฅเซ€.

เช•เชฐเซเชจเชฒ เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ เชฐเช•เซเชทเชฃ

เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเซเช‚ เชฐเช•เซเชทเชฃ เช•เชฐเชตเชพ เช‰เชชเชฐเชพเช‚เชค, เช•เชฐเซเชจเชฒ เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ (kext)เชจเซเช‚ เชฐเช•เซเชทเชฃ เช•เชฐเชตเซเช‚ เชชเชฃ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. 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/โ€) เชคเชฎเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชกเซ€เชเชซเช. เช†เช•เซƒเชคเชฟ เชซเช•เซเชค เช…เชจเซเชฏ เชฐเชพเชœเซเชฏเซ‹ เชคเชฐเชซ เชฆเซ‹เชฐเซ€ เชœเชคเชพ เชธเช‚เช•เซเชฐเชฎเชฃเซ‹ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡; เช…เชจเซเชฏ เชธเช‚เช•เซเชฐเชฎเชฃเซ‹ เช…เช‚เชคเชฟเชฎ เชฐเชนเซ‡เชถเซ‡ เชจเชนเซ€เช‚.

เชฎเซ‡เช•เช“เชเชธ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเชตเซเช‚

เชœเซเชฏเชพเชฐเซ‡ 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) เชฎเชพเช‚ เช เซ€เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡.

เชฎเซ‡เช•เช“เชเชธ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเชตเซเช‚

เช† เชฌเชงเซเช‚ เชซเช•เซเชค เชคเซเชฏเชพเชฐเซ‡ เชœ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡ เชœเซ‹ เชคเชฎเชพเชฐเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชธเชคเซเชคเชพเชตเชพเชฐ เชฐเซ€เชคเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเซ‹เชฏ. เชเชŸเชฒเซ‡ เช•เซ‡, เชฌเชพเชนเซเชฏ เช…เชจเซ‡ เช…เชจเชฟเชšเซเช›เชจเซ€เชฏ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชฎเชพเชŸเซ‡ เช†เชตเซ€ เช•เซ‹เชˆ เช›เชŸเช•เชฌเชพเชฐเซ€เช“ เชจเชฅเซ€. เชœเซ‹ เช•เซ‡, เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, เชเชจเซเชŸเซ€เชตเชพเชฏเชฐเชธ เช…เชจเซ‡ เชฌเซ‡เช•เช…เชช เชธเชฟเชธเซเชŸเชฎเซเชธ เชœเซ‡เชตเชพ เช•เชพเชฏเชฆเซ‡เชธเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฃ เช•เชพเชฐเซเชฏเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชชเชฐเช‚เชคเซ เชนเชตเซ‡ macOS เชฎเชพเชŸเซ‡ เชจเชตเชพ Acronis เช‰เชคเซเชชเชพเชฆเชจเซ‹เชฎเชพเช‚ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚เชฅเซ€ เช…เชจเชฒเซ‹เชกเชฟเช‚เช— เชธเชพเชฎเซ‡ เชตเชงเชพเชฐเชพเชจเซ€ เชธเซเชฐเช•เซเชทเชพ เชนเชถเซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹