MacOS рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдгрд┐ рдХрд░реНрдирд▓ рд╡рд┐рд╕реНрддрд╛рд░рд╛рдВрдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд╕реЗ рдХрд░рд╛рд╡реЗ

рд╣реЕрд▓реЛ, рд╣реЕрдмреНрд░! рдЖрдЬ рдореА macOS рдордзреАрд▓ рдЖрдХреНрд░рдордгрдХрд░реНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╣рд▓реНрд▓реНрдпрд╛рдВрдкрд╛рд╕реВрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд╕реЗ рдХрд░реВ рд╢рдХрддреЛ рдпрд╛рдмрджреНрджрд▓ рдмреЛрд▓реВ рдЗрдЪреНрдЫрд┐рддреЛ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╣реЗ рдЕрдБрдЯреАрд╡реНрд╣рд╛рдпрд░рд╕ рдХрд┐рдВрд╡рд╛ рдмреЕрдХрдЕрдк рд╕рд┐рд╕реНрдЯрдорд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдЖрд╣реЗ, рд╡рд┐рд╢реЗрд╖рдд: macOS рдЕрдВрддрд░реНрдЧрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ "рдорд╛рд░рдгреНрдпрд╛рдЪреЗ" рдЕрдиреЗрдХ рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд. рдпрд╛рдмрджреНрджрд▓ рдЖрдгрд┐ рдХрдЯ рдЕрдВрддрд░реНрдЧрдд рд╕рдВрд░рдХреНрд╖рдг рдкрджреНрдзрддреА рд╡рд╛рдЪрд╛.

MacOS рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдгрд┐ рдХрд░реНрдирд▓ рд╡рд┐рд╕реНрддрд╛рд░рд╛рдВрдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд╕реЗ рдХрд░рд╛рд╡реЗ

рдкреНрд░рдХреНрд░рд┐рдпрд╛ "рдорд╛рд░рдгреНрдпрд╛рдЪрд╛" рдХреНрд▓рд╛рд╕рд┐рдХ рдорд╛рд░реНрдЧ

рдкреНрд░рдХреНрд░рд┐рдпреЗрд▓рд╛ "рдорд╛рд░рдгреНрдпрд╛рдЪрд╛" рдПрдХ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рдкреНрд░рдХреНрд░рд┐рдпреЗрд▓рд╛ SIGKILL рд╕рд┐рдЧреНрдирд▓ рдкрд╛рдард╡рдгреЗ. рдмреЕрд╢рджреНрд╡рд╛рд░реЗ рддреБрдореНрд╣реА рдорд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рдорд╛рдирдХ "kill -SIGKILL PID" рдХрд┐рдВрд╡рд╛ "pkill -9 NAME" рдХреЙрд▓ рдХрд░реВ рд╢рдХрддрд╛. "kill" рдХрдорд╛рдВрдб UNIX рдЪреНрдпрд╛ рджрд┐рд╡рд╕рд╛рдВрдкрд╛рд╕реВрди рдУрд│рдЦрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рддреА рдХреЗрд╡рд│ macOS рд╡рд░рдЪ рдирд╛рд╣реА рддрд░ рдЗрддрд░ UNIX рд╕рд╛рд░рдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реАрдВрд╡рд░ рджреЗрдЦреАрд▓ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ.

UNIX рд╕рд╛рд░рдЦреНрдпрд╛ рд╕рд┐рд╕реНрдЯреАрдо рдкреНрд░рдорд╛рдгреЗ, macOS рддреБрдореНрд╣рд╛рд▓рд╛ рджреЛрди рд╡рдЧрд│рддрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рд╕рд┐рдЧреНрдирд▓ рд░реЛрдЦрдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ - SIGKILL рдЖрдгрд┐ SIGSTOP. рд╣рд╛ рд▓реЗрдЦ рдкреНрд░рд╛рдореБрдЦреНрдпрд╛рдиреЗ SIGKILL рд╕рд┐рдЧреНрдирд▓рд╡рд░ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдореНрд╣рдгреВрди рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрд▓ рдЬреНрдпрд╛рдореБрд│реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛рд░рд▓реА рдЬрд╛рдИрд▓.

macOS рддрдкрд╢реАрд▓

macOS рд╡рд░, XNU рдХрд░реНрдирд▓рдордзреАрд▓ рдХрд┐рд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ psignal(SIGKILL,...) рдлрдВрдХреНрд╢рдирд▓рд╛ рдХреЙрд▓ рдХрд░рддреЗ. psignal рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рдпреБрдЬрд░рд╕реНрдкреЗрд╕рдордзреАрд▓ рдЗрддрд░ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдХреНрд░рд┐рдпрд╛рдВрдирд╛ рдХрд╛рдп рдореНрд╣рдЯрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рддреЗ рдкрд╛рд╣рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛. рдХрд░реНрдирд▓рдЪреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рдпрдВрддреНрд░рдгреЗрддреАрд▓ psignal рдлрдВрдХреНрд╢рдирдЪреЗ рдХреЙрд▓ рдХрд╛рдвреВрди рдЯрд╛рдХреВ (рдЬрд░реА рддреЗ рдХреНрд╖реБрд▓реНрд▓рдХ рдирд╕рд▓реЗ рддрд░реА, рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рджреБрд╕рд░реНтАНрдпрд╛ рд▓реЗрдЦрд╛рд╕рд╛рдареА рд╕реЛрдбреВ ЁЯЩВ - рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдкрдбрддрд╛рд│рдгреА, рдореЗрдорд░реА рддреНрд░реБрдЯреА, рдмрд╛рд╣реЗрд░ рдкрдбрдгреЗ/рд╕рдорд╛рдкреНрдд рдХрд░рдгреЗ, рдлрд╛рдЗрд▓ рд╕рдВрд░рдХреНрд╖рдг рдЙрд▓реНрд▓рдВрдШрди рдЗ. .

рдЪрд▓рд╛ рдлрдВрдХреНрд╢рди рдЖрдгрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рд╕рд╣ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рд╕реБрд░реВ рдХрд░реВрдпрд╛ terminate_with_payload. рд╣реЗ рдкрд╛рд╣рд┐рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рдХреА рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд┐рд▓ рдХреЙрд▓ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдПрдХ рдкрд░реНрдпрд╛рдпреА рджреГрд╖реНрдЯреАрдХреЛрди рдЖрд╣реЗ рдЬреЛ 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 рдкрд░реНрдпрдВрдд рд▓реЙрдиреНрдЪctl рдЪреНрдпрд╛ рдЬреБрдиреНрдпрд╛ рдЖрд╡реГрддреНрддреАрд╕рд╛рдареА рдЖрд╣реЗрдд, рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгрд╛рд╕рд╛рдареА рдкреНрд░рджрд╛рди рдХреЗрд▓реА рдЖрд╣реЗрдд. рдореЙрдбрд░реНрди рд▓реЙрдиреНрдЪрдХреНрдЯрд▓ 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 рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА), рддрд░ рддреБрдореНрд╣реА рд╕рд┐рд╕реНрдЯрдордордзреАрд▓ рдХреЛрдгрддреАрд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╖реНрдЯ рдХрд░реВ рд╢рдХрддрд╛. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдорд╛рд▓рд╡реЗрдЕрд░ рдЕрдБрдЯреАрд╡реНрд╣рд╛рдпрд░рд╕ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╣ рд╕рд┐рд╕реНрдЯрдорд╡рд░реАрд▓ рдХреЛрдгрддреАрд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╖реНрдЯ рдХрд░реВ рд╢рдХрддреЛ. pid 1 (launchctl) - SIGKILL рд╕рд┐рдЧреНрдирд▓рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддрд╛рдирд╛ рдХрд░реНрдирд▓ рдкреЕрдирд┐рдХрд╕рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛рд░рддрд╛рдирд╛ рдЙрджреНрднрд╡рдгрд╛рд░рд╛ рдкреНрд░рднрд╛рд╡ рджреЗрдЦреАрд▓ рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ :)

MacOS рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдгрд┐ рдХрд░реНрдирд▓ рд╡рд┐рд╕реНрддрд╛рд░рд╛рдВрдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд╕реЗ рдХрд░рд╛рд╡реЗ

рд╕рдорд╕реНрдпрд╛ рдХрд╢реА рд╕реЛрдбрд╡рд╛рдпрдЪреА?

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛рд░рд▓реА рдЬрд╛рдгреНрдпрд╛рдкрд╛рд╕реВрди рд░реЛрдЦрдгреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреЗрдмрд▓рдордзреАрд▓ рдлрдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдмрджрд▓рдгреЗ. рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рд╣реА рдкрджреНрдзрдд рдЕрдиреЗрдХ рдХрд╛рд░рдгрд╛рдВрдореБрд│реЗ рдХреНрд╖реБрд▓реНрд▓рдХ рдирд╛рд╣реА.

рдкреНрд░рдердо, sysent рдЪреЗ рдореЗрдорд░реА рд╕реНрдерд╛рди рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгрд╛рд░реЗ рдЪрд┐рдиреНрд╣ рдХреЗрд╡рд│ XNU рдХрд░реНрдирд▓ рдЪрд┐рдиреНрд╣рд╛рд╕рд╛рдареА рдЦрд╛рдЬрдЧреА рдирд╛рд╣реА, рдкрд░рдВрддреБ рдХрд░реНрдирд▓ рдЪрд┐рдиреНрд╣рд╛рдВрдордзреНрдпреЗ рдЖрдврд│реВ рд╢рдХрдд рдирд╛рд╣реА. рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реНрдпреБрд░рд┐рд╕реНрдЯрд┐рдХ рд╢реЛрдз рдкрджреНрдзрддреА рд╡рд╛рдкрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддреАрд▓, рдЬрд╕реЗ рдХреА рдлрдВрдХреНрд╢рди рдбрд╛рдпрдиреЕрдорд┐рдХрд▓реА рдбрд┐рд╕реЗрдореНрдмрд▓ рдХрд░рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рдкреЙрдЗрдВрдЯрд░ рд╢реЛрдзрдгреЗ.

рджреБрд╕рд░реЗ рдореНрд╣рдгрдЬреЗ, рддрдХреНрддреНрдпрд╛рддреАрд▓ рдиреЛрдВрджреАрдВрдЪреА рд░рдЪрдирд╛ рдХрд░реНрдирд▓ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдзреНрд╡рдЬрд╛рдВрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ. CONFIG_REQUIRES_U32_MUNGING рдзреНрд╡рдЬ рдШреЛрд╖рд┐рдд рдХреЗрд▓реНрдпрд╛рд╕, рд╕рдВрд░рдЪрдиреЗрдЪрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рд▓рд╛ рдЬрд╛рдИрд▓ - рдЕрддрд┐рд░рд┐рдХреНрдд рдлреАрд▓реНрдб рдЬреЛрдбрд▓реЗ рдЬрд╛рдИрд▓ sy_arg_munge32. рдХрд░реНрдирд▓ рдХреЛрдгрддреНрдпрд╛ рдзреНрд╡рдЬрд╛рд╕рд╣ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓рд╛ рдЖрд╣реЗ рд╣реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрддрд┐рд░рд┐рдХреНрдд рддрдкрд╛рд╕рдгреА рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдХрд┐рдВрд╡рд╛ рд╡реИрдХрд▓реНрдкрд┐рдХрд░рд┐рддреНрдпрд╛, рдЬреНрдЮрд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛рдВрд╡рд┐рд░реВрджреНрдз рдлрдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рддрдкрд╛рд╕рд╛.

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

рд╕реБрджреИрд╡рд╛рдиреЗ, macOS рдЪреНрдпрд╛ рдЖрдзреБрдирд┐рдХ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдордзреНрдпреЗ, Apple рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди API рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдПрдВрдбрдкреЙрдИрдВрдЯ рд╕рд┐рдХреНрдпреБрд░рд┐рдЯреА 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);
}

рд▓реЛрдб рдХрд░рддрд╛рдирд╛ IOUserClient рджреНрд╡рд╛рд░реЗ IsUnloadAllowed рдзреНрд╡рдЬ рд╕реЗрдЯ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдЬреЗрд╡реНрд╣рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдорд░реНрдпрд╛рджрд╛ рдЕрд╕рддреЗ, рддреЗрд╡реНрд╣рд╛ рдХреЗрдХреНрд╕рдЯрдирд▓реЛрдб рдХрдорд╛рдВрдб рдЦрд╛рд▓реАрд▓ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдИрд▓:

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 рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

MacOS рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдгрд┐ рдХрд░реНрдирд▓ рд╡рд┐рд╕реНрддрд╛рд░рд╛рдВрдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд╕реЗ рдХрд░рд╛рд╡реЗ

рдЙрдкрд╕рд░реНрдЧрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдврд▓реНрдпрд╛рдореБрд│реЗ рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдЪрд╛ рддреЛрдЯрд╛ рдХрдореА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрд╕реВ рд╢рдХрддреЛ. рддреБрд▓рдирд╛ O(рдЙрдкрд╕рд░реНрдЧ*рд▓рд╛рдВрдмреА) рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдЪреА рдирд╛рд╣реА рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЬреЗрдереЗ рдЙрдкрд╕рд░реНрдЧ рд╣рд╛ рдЙрдкрд╕рд░реНрдЧрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдЖрд╣реЗ, рд▓рд╛рдВрдмреА рд╣реА рд╕реНрдЯреНрд░рд┐рдВрдЧрдЪреА рд▓рд╛рдВрдмреА рдЖрд╣реЗ, рддреБрдореНрд╣реА рдЙрдкрд╕рд░реНрдЧрд╛рдВрджреНрд╡рд╛рд░реЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рдирд┐рд░реНрдзрд╛рд░рдХ рдорд░реНрдпрд╛рджрд┐рдд рдСрдЯреЛрдореЕрдЯрди тАЛтАЛ(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. рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддреА рдЧрд╛рдард▓реА рдЧреЗрд▓реА рдирд╛рд╣реА, рдкрд░рдВрддреБ рдорд╛рд░реНрдЧ тАЬрд╕рдорд╛рдкреНрддтАЭ рдЭрд╛рд▓рд╛ (рд╢реВрдиреНрдп рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рдкреЛрд╣реЛрдЪрд▓рд╛) - рдкрде рдкрд╛рд▓рдХ рдЖрд╣реЗ, рддреЛ KAUTH_VNODE_DELETE рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА vnode рд╣реЗ рдлреЛрд▓реНрдбрд░ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рд╢реЗрд╡рдЯреА '/' рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЕрдиреНрдпрдерд╛ рддреЗ "/foor/bar/t" рдлрд╛рдЗрд▓рд╡рд░ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░реВ рд╢рдХрддреЗ, рдЬреЗ рдЪреБрдХреАрдЪреЗ рдЖрд╣реЗ.
  3. рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддреА рдЧрд╛рдард▓реА рдирд╛рд╣реА, рдорд╛рд░реНрдЧ рд╕рдВрдкрд▓рд╛ рдирд╛рд╣реА. рдХреЛрдгрддрд╛рд╣реА рдЙрдкрд╕рд░реНрдЧ рдпрд╛рд╢реА рдЬреБрд│рдд рдирд╛рд╣реА, рдЖрдореНрд╣реА рдирд┐рд░реНрдмрдВрдз рдЖрдгрдд рдирд╛рд╣реА.

рдирд┐рд╖реНрдХрд░реНрд╖

рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдбреЗрдЯрд╛рдЪреНрдпрд╛ рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрдЪреА рдкрд╛рддрд│реА рд╡рд╛рдврд╡рдгреЗ рд╣реЗ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпрд╛рдВрдЪреЗ рдЙрджреНрджрд┐рд╖реНрдЯ рдЖрд╣реЗ. рдПрдХреАрдХрдбреЗ, рд╣реЗ рд▓рдХреНрд╖реНрдп Acronis рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдЙрддреНрдкрд╛рджрдирд╛рдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рджреНрд╡рд╛рд░реЗ рд╕рд╛рдзреНрдп рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рдЬреЗ рддреНрдпрд╛ рдЕрд╕реБрд░рдХреНрд╖рд╛ рдмрдВрдж рдХрд░рддреЗ рдЬреЗрдереЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рддрдГ "рдХрдордХреБрд╡рдд" рдЖрд╣реЗ. рджреБрд╕рд░реАрдХрдбреЗ, OS рдЪреНрдпрд╛ рдмрд╛рдЬреВрдиреЗ рд╕реБрдзрд╛рд░рддрд╛ рдпреЗрдК рд╢рдХрдгрд╛рд░реНтАНрдпрд╛ рд╕реБрд░рдХреНрд╖рд┐рддрддрд╛ рдкреИрд▓реВрдВрдирд╛ рдмрд│рдХрдЯ рдХрд░рдгреНрдпрд╛рдХрдбреЗ рдЖрдкрдг рджреБрд░реНрд▓рдХреНрд╖ рдХрд░реВ рдирдпреЗ, рд╡рд┐рд╢реЗрд╖рдд: рдЕрд╢рд╛ рднреЗрджреНрдпрддрд╛ рдмрдВрдж рдХреЗрд▓реНрдпрд╛рдиреЗ рдЙрддреНрдкрд╛рджрди рдореНрд╣рдгреВрди рдЖрдкрд▓реА рд╕реНрд╡рддрдГрдЪреА рд╕реНрдерд┐рд░рддрд╛ рд╡рд╛рдврддреЗ. рдНрдкрд▓ рдЙрддреНрдкрд╛рджрди рд╕реБрд░рдХреНрд╖рд╛ рдЯреАрдорд▓рд╛ рднреЗрджреНрдпрддреЗрдЪреА рддрдХреНрд░рд╛рд░ рдХрд░рдгреНрдпрд╛рдд рдЖрд▓реА рд╣реЛрддреА рдЖрдгрд┐ рддреА macOS 10.14.5 (https://support.apple.com/en-gb/HT210119) рдордзреНрдпреЗ рдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ.

MacOS рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдгрд┐ рдХрд░реНрдирд▓ рд╡рд┐рд╕реНрддрд╛рд░рд╛рдВрдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд╕реЗ рдХрд░рд╛рд╡реЗ

рдЬрд░ рддреБрдордЪреА рдЙрдкрдпреБрдХреНрддрддрд╛ рдЕрдзрд┐рдХреГрддрдкрдгреЗ рдХрд░реНрдирд▓рдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реА рдЧреЗрд▓реА рдЕрд╕реЗрд▓ рддрд░рдЪ рд╣реЗ рд╕рд░реНрд╡ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдореНрд╣рдгрдЬреЗрдЪ, рдмрд╛рд╣реНрдп рдЖрдгрд┐ рдЕрд╡рд╛рдВрдЫрд┐рдд рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рд╕рд╛рдареА рдЕрд╢рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рддреНрд░реБрдЯреА рдирд╛рд╣реАрдд. рддрдерд╛рдкрд┐, рддреБрдореНрд╣реА рдмрдШреВ рд╢рдХрддрд╛, рдЕрдБрдЯреАрд╡реНрд╣рд╛рдпрд░рд╕ рдЖрдгрд┐ рдмреЕрдХрдЕрдк рд╕рд┐рд╕реНрдЯрдо рд╕рд╛рд░рдЦреНрдпрд╛ рдХрд╛рдпрджреЗрд╢реАрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рджреЗрдЦреАрд▓ рдХрд╛рд░реНрдп рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдкрд░рдВрддреБ рдЖрддрд╛ macOS рд╕рд╛рдареА рдирд╡реАрди Acronis рдЙрддреНрдкрд╛рджрдирд╛рдВрдирд╛ рд╕рд┐рд╕реНрдЯрдордордзреВрди рдЕрдирд▓реЛрдбрд┐рдВрдЧрдкрд╛рд╕реВрди рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд░рдХреНрд╖рдг рдЕрд╕реЗрд▓.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛