เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเปเบเปˆเบ™เปƒเบ™ macOS

เบชเบฐเบšเบฒเบเบ”เบต, Habr! เบกเบทเป‰เบ™เบตเป‰เบ‚เป‰เบญเบเบขเบฒเบเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบปเบเบ›เป‰เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบˆเบฒเบเบเบฒเบ™เป‚เบˆเบกเบ•เบตเป‚เบ”เบเบœเบนเป‰เป‚เบˆเบกเบ•เบตเปƒเบ™ macOS. เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบšเบปเบšเบ•เป‰เบฒเบ™เป„เบงเบฅเบฑเบ”เบซเบผเบทเบชเปเบฒเบฎเบญเบ‡เบ‚เปเป‰เบกเบนเบ™, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบžเบฒเบเปƒเบ•เป‰ macOS เบกเบตเบซเบผเบฒเบเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐ "เบ‚เป‰เบฒ" เบ‚เบฐเบšเบงเบ™เบเบฒเบ™. เบญเปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบ•เบฑเบ”.

เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเปเบเปˆเบ™เปƒเบ™ macOS

เบงเบดเบ—เบตเบเบฒเบ™เบ„เบฅเบฒเบชเบชเบดเบเบ—เบตเปˆเบˆเบฐ "เบ‚เป‰เบฒ" เบ‚เบฐเบšเบงเบ™เบเบฒเบ™

เบงเบดเบ—เบตเบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบเบฑเบ™เบ”เบตเบ—เบตเปˆเบˆเบฐ "เบ‚เป‰เบฒ" เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบกเปˆเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™ SIGKILL เป„เบ›เบซเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™. เป‚เบ”เบเบœเปˆเบฒเบ™ bash เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป‚เบ—เบซเบฒเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ "เบ‚เป‰เบฒ -SIGKILL PID" เบซเบผเบท "pkill -9 NAME" เป€เบžเบทเปˆเบญเบ‚เป‰เบฒ. เบ„เปเบฒเบชเบฑเปˆเบ‡ "เบ‚เป‰เบฒ" เป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบ•เบฑเป‰เบ‡เปเบ•เปˆเบชเบฐ เป„เป เบ‚เบญเบ‡ UNIX เปเบฅเบฐเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบกเบตเบขเบนเปˆเปƒเบ™ macOS เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™, เปเบ•เปˆเบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบฅเบฐเบšเบปเบšเบญเบทเปˆเบ™เป†เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบš UNIX.

เบ„เบทเบเบฑเบ™เบเบฑเบšเปƒเบ™เบฅเบฐเบšเบปเบšเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบš UNIX, macOS เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบชเบฑเบ™เบเบฒเบ™เปƒเบ”เป†เปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™เบชเบญเบ‡ - SIGKILL เปเบฅเบฐ SIGSTOP. เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ•เบปเป‰เบ™เบ•เปเบˆเบฐเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบชเบฑเบ™เบเบฒเบ™ SIGKILL เป€เบ›เบฑเบ™เบชเบฑเบ™เบเบฒเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ–เบทเบเบ‚เป‰เบฒเบ•เบฒเบ.

เบชเบฐเป€เบžเบฒเบฐ macOS

เปƒเบ™ macOS, เบเบฒเบ™เป€เบญเบตเป‰เบ™เบฅเบฐเบšเบปเบš kill เปƒเบ™ kernel XNU เป€เบญเบตเป‰เบ™เบŸเบฑเบ‡เบŠเบฑเบ™ psignal(SIGKILL,...). เปƒเบซเป‰เบฅเบญเบ‡เป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบญเบทเปˆเบ™เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบชเบฒเบกเบฒเบ”เป€เบญเบตเป‰เบ™เป„เบ”เป‰เป‚เบ”เบเบซเบ™เป‰เบฒเบ—เบตเปˆ psignal. เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบˆเบฑเบ”เบเบฒเบ™เป‚เบ—เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆ psignal เปƒเบ™เบเบปเบ™เป„เบเบžเบฒเบเปƒเบ™เบ‚เบญเบ‡เปเบเปˆเบ™ (เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบšเปเปˆเปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เปˆเบญเบเปƒเบซเป‰เบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบกเบญเบทเปˆเบ™ ๐Ÿ™‚ - เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบฅเบฒเบเป€เบŠเบฑเบ™, เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ, เบเบฒเบ™เบญเบญเบ / เบขเบธเบ”เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™, เบเบฒเบ™เบฅเบฐเป€เบกเบตเบ”เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป„เบŸเบฅเปŒ, เปเบฅเบฐเบญเบทเปˆเบ™เป†. .

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเปเบฅเบฐเบเบฒเบ™เป‚เบ—เบซเบฒเบฅเบฐเบšเบปเบšเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™ terminate_with_payload. เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบงเปˆเบฒเบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เป‚เบ— kill เบ„เบฅเบฒเบชเบชเบดเบ, เบกเบตเบงเบดเบ—เบตเบเบฒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบชเบฐเป€เบžเบฒเบฐเบเบฑเบšเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ macOS เปเบฅเบฐเบšเปเปˆเบžเบปเบšเปƒเบ™ BSD. เบซเบผเบฑเบเบเบฒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบ—เบฑเบ‡เบชเบญเบ‡เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปเบกเปˆเบ™เบเบฒเบ™เป‚เบ—เป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆ kernel psignal. เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ‚เป‰เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™, เบเบฒเบ™เบเบงเบ”เบชเบญเบš "cansignal" เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ” - เบšเปเปˆเบงเปˆเบฒเบˆเบฐเป€เบ›เบฑเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™เป„เบ›เบซเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบทเปˆเบ™เป„เบ”เป‰; เบฅเบฐเบšเบปเบšเบšเปเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปƒเบ”เป†เบ—เบตเปˆเบˆเบฐเบ‚เป‰เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบฅเบฐเบšเบปเบš, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡.

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

เป€เบ›เบตเบ”เบ•เบปเบง

เบงเบดเบ—เบตเบเบฒเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡ daemon เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเปเบฅเบฐเบ„เบงเบšเบ„เบธเบกเบŠเบตเบงเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปเบกเปˆเบ™เป€เบ›เบตเบ”เบ•เบปเบง. เบเบฐเบฅเบธเบ™เบฒเบฎเบฑเบšเบŠเบฒเบšเบงเปˆเบฒเปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบชเปเบฒเบฅเบฑเบš launchctl เบฎเบธเปˆเบ™เป€เบเบปเปˆเบฒเป€เบ–เบดเบ‡ macOS 10.10, เบ•เบปเบงเบขเปˆเบฒเบ‡เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป€เบžเบทเปˆเบญเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡. launchctl เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบœเปˆเบฒเบ™ XPC, launchctl logic เป„เบ”เป‰เบ–เบทเบเบเป‰เบฒเบเป„เบ›เบ—เบตเปˆเบกเบฑเบ™.

เบ‚เปเปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ–เบทเบเบขเบธเบ”เป€เบŠเบปเบฒเปเบ™เบงเปƒเบ”. เบเปˆเบญเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบชเบปเปˆเบ‡โ€‹เบชเบฑเบ™โ€‹เบเบฒเบ™ SIGTERM, เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เปเบกเปˆเบ™โ€‹เบžเบฐโ€‹เบเบฒโ€‹เบเบฒเบกโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบขเบธเบ”โ€‹เป€เบŠเบปเบฒโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ โ€œproc_terminateโ€ เบเบฒเบ™โ€‹เป‚เบ—โ€‹เบฅเบฐโ€‹เบšเบปเบš.

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

เบžเบฒเบเปƒเบ•เป‰ hood, proc_terminate, เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบŠเบทเปˆเบ‚เบญเบ‡เบกเบฑเบ™, เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆ psignal เบเบฑเบš SIGTERM, เปเบ•เปˆเบเบฑเบ‡ SIGKILL.

เบเบฒเบ™เบ‚เป‰เบฒเบ—เบฒเบ‡เบญเป‰เบญเบก - เบˆเปเบฒเบเบฑเบ”เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™

เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เปƒเบ™เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบญเบทเปˆเบ™ process_policy. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบ™เบตเป‰เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบˆเปเบฒเบเบฑเบ”เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เป€เบŠเบฑเปˆเบ™: เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบ”เบฑเบ”เบชเบฐเบ™เบตเป€เบžเบทเปˆเบญเบˆเปเบฒเบเบฑเบ”เป€เบงเบฅเบฒ CPU เปเบฅเบฐเป‚เบ„เบ•เป‰เบฒเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบฅเบฐเบšเบปเบšเบŠเป‰เบฒเบฅเบปเบ‡เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบเป‚เบ”เบเบเบดเบ”เบˆเบฐเบเปเบฒเบเบฒเบ™เป€เบเบฑเบšเป„เบŸเบฅเปŒ. เบ–เป‰เบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป„เบ”เป‰เป€เบ–เบดเบ‡เบ‚เบตเบ”เบˆเบณเบเบฑเบ”เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ‚เบญเบ‡เบกเบฑเบ™, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบซเบฑเบ™เป„เบ”เป‰เบˆเบฒเบเบŸเบฑเบ‡เบŠเบฑเบ™ proc_apply_resource_actions, เบชเบฑเบ™เบเบฒเบ™ SIGKILL เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™.

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ‚เป‰เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปƒเบ”เบซเบ™เบถเปˆเบ‡, เปเบ•เปˆเบฅเบฐเบšเบปเบšเบšเปเปˆเป„เบ”เป‰เบเบงเบ”เบชเบญเบšเบชเบดเบ”เบ—เบดเบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป‚เบ—เบซเบฒเบฅเบฐเบšเบปเบšเบขเปˆเบฒเบ‡เบžเบฝเบ‡เบžเป. เบเบงเบ”เบชเบญเบšเบ•เบปเบงเบˆเบดเบ‡ เบกเบตเบขเบนเปˆ, เปเบ•เปˆเบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบ—เบธเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบ PROC_POLICY_ACTION_SET เป€เบžเบทเปˆเบญเบ‚เป‰เบฒเบกเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ™เบตเป‰.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบ—เปˆเบฒเบ™ "เบˆเปเบฒเบเบฑเบ”" เป‚เบ„เบ•เป‰เบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ CPU เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบฝเบ‡เปเบ•เปˆ 1 ns เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เป‰เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปƒเบ”เป†เปƒเบ™เบฅเบฐเบšเบปเบš. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, malware เบชเบฒเบกเบฒเบ”เบ‚เป‰เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปƒเบ”เป†เปƒเบ™เบฅเบฐเบšเบปเบš, เบฅเบงเบกเบ—เบฑเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ antivirus. เบเบฑเบ‡เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปเบกเปˆเบ™เบœเบปเบ™เบเบฐเบ—เบปเบšเบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เป‰เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเบกเบต pid 1 (launchctl) - kernel panic เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบฐเบเบฒเบเบฒเบกเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบชเบฑเบ™เบเบฒเบ™ SIGKILL :)

เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเปเบเปˆเบ™เปƒเบ™ macOS

เบงเบดเบ—เบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ?

เบงเบดเบ—เบตเบ—เบตเปˆเบเบปเบ‡เป„เบ›เบเบปเบ‡เบกเบฒเบ—เบตเปˆเบชเบธเบ”เป€เบžเบทเปˆเบญเบ›เป‰เบญเบ‡เบเบฑเบ™เบšเปเปˆเปƒเบซเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ–เบทเบเบ‚เป‰เบฒเปเบกเปˆเบ™เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™เบ•เบปเบงเบŠเบตเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบš. เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบซเบผเบฒเบเป€เบซเบ”เบœเบปเบ™.

เบ—เปเบฒเบญเบดเบ”, เบชเบฑเบ™เบเบฒเบฅเบฑเบเบ—เบตเปˆเบ„เบงเบšเบ„เบธเบกเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ‚เบญเบ‡ sysent เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบ•เบปเบงเบ‚เบญเบ‡เบชเบฑเบ™เบเบฒเบฅเบฑเบเปเบเปˆเบ™ XNU, เปเบ•เปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™เบชเบฑเบ™เบเบฒเบฅเบฑเบเบ‚เบญเบ‡เปเบเปˆเบ™. เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเปเบšเบš heuristic, เป€เบŠเบฑเปˆเบ™: เบเบฒเบ™เบ–เบญเบ”เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเปเบฅเบฐเบเบฒเบ™เบŠเบญเบเบซเบฒเบ•เบปเบงเบŠเบตเป‰เปƒเบ™เบกเบฑเบ™.

เบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบฅเบฒเบเบเบฒเบ™เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบ—เบธเบ‡เบ—เบตเปˆ kernel เป„เบ”เป‰เบ–เบทเบเบฅเบงเบšเบฅเบงเบก. เบ–เป‰เบฒเบ—เบธเบ‡ CONFIG_REQUIRES_U32_MUNGING เบ–เบทเบเบ›เบฐเบเบฒเบ”, เบ‚เบฐเปœเบฒเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบˆเบฐเบ–เบทเบเบ›เปˆเบฝเบ™ - เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบˆเบฐเบ–เบทเบเป€เบžเบตเปˆเบก. sy_arg_munge32. เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบงเปˆเบฒเบ—เบธเบ‡เปƒเบ”เบ—เบตเปˆเบ–เบทเบเบฅเบงเบšเบฅเบงเบกเบ”เป‰เบงเบ, เบซเบผเบทเบญเบตเบเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบซเบ™เบถเปˆเบ‡, เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบŠเบตเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เบ•เปเปˆเบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบ.

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

เป‚เบŠเบเบ”เบต, เปƒเบ™ macOS เบฎเบธเปˆเบ™เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก, Apple เปƒเบซเป‰ API เปƒเบซเบกเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™. Endpoint Security API เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบฅเบนเบเบ„เป‰เบฒเบญเบฐเบ™เบธเบเบฒเบ”เบซเบผเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบทเปˆเบ™เป†. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบฐเบเบฑเบ”เบชเบฑเบ™เบเบฒเบ™เปƒเบ”เป†เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™, เบฅเบงเบกเบ—เบฑเบ‡เบชเบฑเบ™เบเบฒเบ™ SIGKILL, เป‚เบ”เบเปƒเบŠเป‰ API เบ—เบตเปˆเบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡.

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

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

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

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

    es_unsubscribe_all(cli);
    es_delete_client(cli);

    return 0;
}

เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™, เบ™เบฐเป‚เบเบšเบฒเบ MAC เบชเบฒเบกเบฒเบ”เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบขเบนเปˆเปƒเบ™ kernel, เป€เบŠเบดเปˆเบ‡เบชเบฐเบซเบ™เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบชเบฑเบ™เบเบฒเบ™ (เบ™เบฐเป‚เบเบšเบฒเบ proc_check_signal), เปเบ•เปˆ API เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™.

เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบ Kernel

เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปƒเบ™เบฅเบฐเบšเบปเบš, เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบเปเบเปˆเบ™เบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡ (kext) เบเบฑเบ‡เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™. macOS เบชเบฐเบซเบ™เบญเบ‡เบเบญเบšเบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบžเบทเปˆเบญเบžเบฑเบ”เบ—เบฐเบ™เบฒเป„เบ”เป€เบงเบตเบญเบธเบ›เบฐเบเบญเบ™ IOKit เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ. เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบญเบธเบ›เบฐเบเบญเบ™, IOKit เบชเบฐเบซเบ™เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ stacking driver เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ C ++. เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบˆเบฐเบชเบฒเบกเบฒเบ” "เบŠเบญเบเบซเบฒ" เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบ‚เบญเบ‡เบŠเบฑเป‰เบ™เบฎเบฝเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบชเปเบฒเบžเบฑเบ™เบเบฑเบš kernel-userspace.

เป€เบžเบทเปˆเบญเบเบงเบ”เบซเบฒเบˆเบณเบ™เบงเบ™เบ‚เบญเบ‡ class instances เปƒเบ™เบฅเบฐเบšเบปเบš, เบกเบต ioclasscount utility.

my_kext_ioservice = 1
my_kext_iouserclient = 1

เบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบ kernel เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบเบฑเบš driver stack เบ•เป‰เบญเบ‡เบ›เบฐเบเบฒเบ” class เบ—เบตเปˆเบชเบทเบšเบ—เบญเบ”เบกเบฒเบˆเบฒเบ IOService, เบ•เบปเบงเบขเปˆเบฒเบ‡ my_kext_ioservice เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰. เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบชเป‰เบฒเบ‡ instance เปƒเปเปˆเบ‚เบญเบ‡ class เบ—เบตเปˆเบชเบทเบšเบ—เบญเบ”เบกเบฒเบˆเบฒเบ IOUserClient, เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡ my_kext_iouserclient.

เป€เบกเบทเปˆเบญเบžเบฐเบเบฒเบเบฒเบกเบเบปเบเป€เบฅเบตเบเบเบฒเบ™เป‚เบซเบผเบ”เป„เบ”เป€เบงเบตเบˆเบฒเบเบฅเบฐเบšเบปเบš (เบ„เปเบฒเบชเบฑเปˆเบ‡ kextunload), เบŸเบฑเบ‡เบŠเบฑเบ™ virtual "bool terminate (IOOptionBits options)" เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒ. เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบเบฑเบšเบ„เบทเบ™ false เปƒเบ™เบเบฒเบ™เป‚เบ—เป€เบžเบทเปˆเบญเบขเบธเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบฐเบเบฒเบเบฒเบก unload เป€เบžเบทเปˆเบญเบ›เบดเบ”เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™ kextunload.

bool Kext::terminate(IOOptionBits options)
{

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

  return super::terminate(options);
}

เบ—เบธเบ‡ IsUnloadAllowed เบชเบฒเบกเบฒเบ”เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบ IOUserClient เป€เบกเบทเปˆเบญเป‚เบซเบฅเบ”. เป€เบกเบทเปˆเบญเบกเบตเบเบฒเบ™เบˆเบณเบเบฑเบ”เบเบฒเบ™เบ”เบฒเบงเป‚เบซเบผเบ”, เบ„เบณเบชเบฑเปˆเบ‡ kextunload เบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

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

เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบชเปเบฒเบฅเบฑเบš IOUserClient. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบเบปเบเป€เบฅเบตเบเป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰ IOKitLib โ€œIOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);โ€. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบ„เบทเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป‚เบ—เบซเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡ "เบชเบดเป‰เบ™เบชเบธเบ”" เบˆเบปเบ™เบเปˆเบงเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰ "เบ•เบฒเบ", เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบŸเบฑเบ‡เบŠเบฑเบ™ "clientDied" เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเป€เบญเบตเป‰เบ™.

เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป„เบŸเบฅเปŒ

เป€เบžเบทเปˆเบญเบ›เบปเบเบ›เป‰เบญเบ‡เป„เบŸเบฅเปŒ, เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ Kauth API, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบŸเบฅเปŒ. Apple เปƒเบซเป‰เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบกเบตเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบเปˆเบฝเบงเบเบฑเบšเป€เบซเบ”เบเบฒเบ™เบ•เปˆเบฒเบ‡เป†เปƒเบ™เบ‚เบญเบšเป€เบ‚เบ”; เบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ, เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™ KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA เปเบฅเบฐ KAUTH_VNODE_DELETE_CHILD เปเบกเปˆเบ™เบชเปเบฒเบ„เบฑเบ™. เบงเบดเบ—เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบŸเบฅเปŒเปเบกเปˆเบ™เป„เบ›เบ•เบฒเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ - เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ API "vn_getpath" เป€เบžเบทเปˆเบญเป€เบญเบปเบฒเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเป„เบŸเบฅเปŒเปเบฅเบฐเบ›เบฝเบšเบ—เบฝเบšเบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡. เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เบŠเบทเปˆเบ‚เบญเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป‚เบŸเป€เบ”เบตเป„เบŸเบฅเปŒ, เบฅเบฐเบšเบปเบšเบšเปเปˆเป„เบ”เป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เปเบ•เปˆเบฅเบฐเป„เบŸเบฅเปŒ, เปเบ•เปˆเบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบเบฑเบšเป‚เบŸเป€เบ”เบตเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบ—เบตเปˆเบ–เบทเบเบ›เปˆเบฝเบ™เบŠเบทเปˆ. เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบˆเบฐเบ›เบฝเบšเบ—เบฝเบšเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ‚เบญเบ‡เบžเปเปˆเปเบกเปˆเปเบฅเบฐเบˆเปเบฒเบเบฑเบ” KAUTH_VNODE_DELETE เบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™.

เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเปเบเปˆเบ™เปƒเบ™ macOS

เบ‚เปเป‰เป€เบชเบเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เปˆเปเบฒเบเป‰เบญเบ™เบงเปˆเบฒเบˆเปเบฒเบ™เบงเบ™เบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™. เป€เบžเบทเปˆเบญเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบšเปเปˆเป€เบ—เบปเปˆเบฒเบเบฑเบš O (prefix*length), เป€เบŠเบดเปˆเบ‡เบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒเปเบกเปˆเบ™เบˆเปเบฒเบ™เบงเบ™เบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒ, เบ„เบงเบฒเบกเบเบฒเบงเปเบกเปˆเบ™เบ„เบงเบฒเบกเบเบฒเบงเบ‚เบญเบ‡เบชเบฒเบ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰ automaton finite finite (DFA) เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบเบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒ.

เปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡ DFA เบชเปเบฒเบฅเบฑเบšเบŠเบธเบ”เบ‚เบญเบ‡เบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒ. เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ•เบปเบงเบเบฐเบžเบดเบšเปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒ. เบ–เป‰เบฒเบ•เบปเบงเบเบฐเบžเบดเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ”เบฝเบงเบเบฑเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบซเป‰เปเบ•เปˆเบฅเบฐเบ•เบปเบงเบเบฐเบžเบดเบšเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบซเบ™เบถเปˆเบ‡เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เปเบฅเบฐเบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบ„เบงเบฒเบกเบเบฒเบงเบ‚เบญเบ‡เป€เบชเบฑเป‰เบ™เบ”เบฝเบงเบเบฑเบ™เปเบกเปˆเบ™เปƒเบซเบเปˆเบเบงเปˆเบฒเบซเบ™เบถเปˆเบ‡เบ•เบปเบง. เบ–เป‰เบฒเบกเบตเบชเบญเบ‡เบ•เบปเบงเบเบฐเบžเบดเบšเบ—เบตเปˆเบกเบตเบชเบฑเบ™เบเบฒเบฅเบฑเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบšเปˆเบ‡เบ•เบปเบงเบเบฐเบžเบดเบšเบญเบญเบเป€เบ›เบฑเบ™เบเบธเปˆเบกเบ•เบฒเบกเบชเบฑเบ™เบเบฒเบฅเบฑเบเบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบŠเบตเป‰เป„เบ›เบซเบฒเปเบฅเบฐเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบเบธเปˆเบก.

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เปเบฒเบญเบดเบ” (เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบžเบฒเบเปƒเบ•เป‰เบ•เบปเบงเบเบฐเบžเบดเบšเปเบกเปˆเบ™เบ„เบทเบเบฑเบ™), เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐ DFA เบ—เบตเปˆเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ•เบฒเบกเป€เบชเบฑเป‰เบ™เบ”เบฝเบงเบเบฑเบ™. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเบชเบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ” 256 (เบˆเปเบฒเบ™เบงเบ™เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบเบธเปˆเบก) เป„เบ›เบซเบฒเบฅเบฑเบ”เบ•เปเปˆเบกเบฒเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเบเบฒเบ™เป€เบญเบตเป‰เบ™เบ„เบทเบ™เบŸเบฑเบ‡เบŠเบฑเบ™.

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡. เบชเปเบฒเบฅเบฑเบšเบŠเบธเบ”เบ‚เบญเบ‡เบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒ (โ€œ/foo/bar/tmp/โ€, โ€œ/var/db/foo/โ€, โ€œ/foo/bar/aba/โ€, โ€œfoo/bar/aac/โ€) เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบ•เปเปˆเป„เบ›เบ™เบตเป‰. DFA. เบ•เบปเบงโ€‹เป€เบฅเบโ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบเบฒเบ™โ€‹เบซเบฑเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เบ—เบตเปˆโ€‹เบ™เบณโ€‹เป„เบ›โ€‹เบชเบนเปˆโ€‹เบฅเบฑเบ”โ€‹เบญเบทเปˆเบ™เป†; เบเบฒเบ™โ€‹เบซเบฑเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เบญเบทเปˆเบ™เป†โ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เบชเบดเป‰เบ™โ€‹เบชเบธเบ”โ€‹เบฅเบปเบ‡.

เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเปเบเปˆเบ™เปƒเบ™ macOS

เป€เบกเบทเปˆเบญเบœเปˆเบฒเบ™เบฅเบฑเบ” DKA, เบญเบฒเบ”เบˆเบฐเบกเบต 3 เบเปเบฅเบฐเบ™เบต.

  1. เบกเบฒเบฎเบญเบ”เบชเบฐเบ–เบฒเบ™เบฐเบชเบธเบ”เบ—เป‰เบฒเบเปเบฅเป‰เบง - เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ–เบทเบเบ›เบปเบเบ›เป‰เบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเบณเบเบฑเบ”เบเบฒเบ™เบ”เบณเป€เบ™เบตเบ™เบเบฒเบ™ KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA เปเบฅเบฐ KAUTH_VNODE_DELETE_CHILD
  2. เบชเบฐเบ–เบฒเบ™เบฐเบชเบธเบ”เบ—เป‰เบฒเบเบšเปเปˆเป„เบ”เป‰เบšเบฑเบ™เบฅเบธ, เปเบ•เปˆเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ "เบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡" (เป„เบ”เป‰เป€เบ–เบดเบ‡เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ” null) - เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เปเบกเปˆเบ™เบžเปเปˆเปเบกเปˆ, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบˆเปเบฒเบเบฑเบ” KAUTH_VNODE_DELETE. เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ–เป‰เบฒ vnode เป€เบ›เบฑเบ™เป‚เบŸเบ™เป€เบ”เบต, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบก '/' เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบ, เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบˆเปเบฒเบเบฑเบ”เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒ "/foor/bar/t", เป€เบŠเบดเปˆเบ‡เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡.
  3. เบฅเบฑเบ”เบชเบธเบ”เบ—เป‰เบฒเบเบšเปเปˆเป„เบ”เป‰เบšเบฑเบ™เบฅเบธ, เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบšเปเปˆเป„เบ”เป‰เบชเบดเป‰เบ™เบชเบธเบ”. เบšเปเปˆเบกเบตเบ„เบณเบ™เบณเปœเป‰เบฒเบญเบฑเบ™เปƒเบ”เบเบปเบ‡เบเบฑเบšเบญเบฑเบ™เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เปเบ™เบฐเบ™เบณเบ‚เปเป‰เบˆเบณเบเบฑเบ”.

เบชเบฐเบซเบฅเบธเบš

เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบฅเบฐเบ”เบฑเบšเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบฅเบฒเบง. เปƒเบ™เบญเบตเบเบ”เป‰เบฒเบ™เบซเบ™เบถเปˆเบ‡, เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบฅเบธเป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบŠเปเปเบง Acronis, เป€เบŠเบดเปˆเบ‡เบ›เบดเบ”เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡ "เบญเปˆเบญเบ™เปเบญ". เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบ„เบงเบ™เบฅเบฐเป€เบฅเบตเบเบเบฒเบ™เบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเป€เบ‚เบฑเป‰เบกเปเบ‚เบ‡เบ”เป‰เบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เป„เบ”เป‰เปƒเบ™เบ”เป‰เบฒเบ™ OS, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบ›เบดเบ”เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบฑเบ™เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™. เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเป„เบ”เป‰เบ–เบทเบเบฅเบฒเบเบ‡เบฒเบ™เปƒเบซเป‰เบ—เบตเบกเบ‡เบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™ Apple เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เปƒเบ™ macOS 10.14.5 (https://support.apple.com/en-gb/HT210119).

เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเปเบเปˆเบ™เปƒเบ™ macOS

เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ”เป‰เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ kernel. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบšเปเปˆเบกเบตเบŠเปˆเบญเบ‡เบซเบงเปˆเบฒเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบชเปเบฒเบฅเบฑเบšเบŠเบญเบšเปเบงเบžเบฒเบเบ™เบญเบเปเบฅเบฐเบ—เบตเปˆเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ•เบฒเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป€เบซเบฑเบ™เป„เบ”เป‰, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบ•เบฒเบกเบเบปเบ”เบซเบกเบฒเบเป€เบŠเบฑเปˆเบ™: antivirus เปเบฅเบฐเบฅเบฐเบšเบปเบšเบชเปเบฒเบฎเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ. เปเบ•เปˆเบ”เบฝเบงเบ™เบตเป‰เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™ Acronis เปƒเปเปˆ เบชเบณ เบฅเบฑเบš macOS เบˆเบฐเบกเบตเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ•เปเปˆเบเบฒเบ™เบ–เบญเบ™เบญเบญเบเบˆเบฒเบเบฅเบฐเบšเบปเบš.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™