MacOS рдорд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд░ рдХрд░реНрдиреЗрд▓ рд╡рд┐рд╕реНрддрд╛рд░рд╣рд░реВ рдХрд╕рд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрдиреЗ

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

MacOS рдорд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд░ рдХрд░реНрдиреЗрд▓ рд╡рд┐рд╕реНрддрд╛рд░рд╣рд░реВ рдХрд╕рд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрдиреЗ

рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ "рдорд╛рд░" рдХреЛ рдХреНрд▓рд╛рд╕рд┐рдХ рддрд░рд┐рдХрд╛

рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ "рдорд╛рд░" рдЧрд░реНрдиреЗ рдПрдЙрдЯрд╛ рдкреНрд░рдЦреНрдпрд╛рдд рддрд░рд┐рдХрд╛ рднрдиреЗрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛ SIGKILL рд╕рд┐рдЧреНрдирд▓ рдкрдард╛рдЙрдиреБ рд╣реЛред bash рдорд╛рд░реНрдлрдд рддрдкрд╛рдИрд▓реЗ рдорд╛рд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рдирдХ "kill -SIGKILL PID" рд╡рд╛ "pkill -9 NAME" рд▓рд╛рдИ рдХрд▓ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред "рдХрд┐рд▓" рдЖрджреЗрд╢ 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 рд╕рдореНрдо launchctl рдХреЛ рдкреБрд░рд╛рдиреЛ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╣реЛ, рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдЪрд┐рддреНрд░рдг рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐ рдкреНрд░рджрд╛рди рдЧрд░рд┐рдПрдХреЛ рдЫред рдЖрдзреБрдирд┐рдХ launchctl рд▓реЗ XPC рдорд╛рд░реНрдлрдд рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕рдВрдХреЗрддрд╣рд░реВ рдкрдард╛рдЙрдБрдЫ, 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 рд╕рдБрдЧ psignal рдорд╛рддреНрд░ рдкрдард╛рдЙрди рд╕рдХреНрджреИрди, рддрд░ SIGKILL рдкрдирд┐ред

рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╣рддреНрдпрд╛ - рд╕рдВрд╕рд╛рдзрди рд╕реАрдорд╛

рдердк рд░реЛрдЪрдХ рдорд╛рдорд▓рд╛ рдЕрд░реНрдХреЛ рдкреНрд░рдгрд╛рд▓реА рдХрд▓рдорд╛ рджреЗрдЦреНрди рд╕рдХрд┐рдиреНрдЫ рдкреНрд░рдХреНрд░рд┐рдпрд╛_рдиреАрддрд┐ред рдпрд╕ рдкреНрд░рдгрд╛рд▓реА рдХрд▓рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЧ рднрдиреЗрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрд░реЛрддрд╣рд░реВ рд╕реАрдорд┐рдд рдЧрд░реНрдиреБ рд╣реЛ, рдЬрд╕реНрддреИ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХреЛ рд▓рд╛рдЧрд┐ CPU рд╕рдордп рд░ рдореЗрдореЛрд░реА рдХреЛрдЯрд╛рд╣рд░реВ рд╕реАрдорд┐рдд рдЧрд░реНрди рддрд╛рдХрд┐ рдлрд╛рдЗрд▓ рдХреНрдпрд╛рд╕рд┐рдВрдЧ рдЧрддрд┐рд╡рд┐рдзрд┐рд╣рд░реВрджреНрд╡рд╛рд░рд╛ рдкреНрд░рдгрд╛рд▓реА рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдврд┐рд▓реЛ рдирд╣реЛрд╕реНред рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдпрд╕рдХреЛ рд╕реНрд░реЛрдд рд╕реАрдорд╛рдорд╛ рдкреБрдЧреЗрдХреЛ рдЫ, рдЬрд╕реНрддреИ proc_apply_resource_actions рдкреНрд░рдХрд╛рд░реНрдпрдмрд╛рдЯ рджреЗрдЦреНрди рд╕рдХрд┐рдиреНрдЫ, рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛ SIGKILL рд╕рдВрдХреЗрдд рдкрдард╛рдЗрдиреНрдЫред

рдпрджреНрдпрдкрд┐ рдпреЛ рдкреНрд░рдгрд╛рд▓реА рдХрд▓рд▓реЗ рд╕рдореНрднрд╛рд╡рд┐рдд рд░реВрдкрдорд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдирд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдЫ, рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдХрд▓ рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдЕрдзрд┐рдХрд╛рд░рд╣рд░реВ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдкрдорд╛ рдЬрд╛рдБрдЪ рдЧрд░реЗрдиред рд╡рд╛рд╕реНрддрд╡рдорд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ рдЕрд╡рд╕реНрдерд┐рдд рдерд┐рдпреЛ, рддрд░ рдпреЛ рдЕрд╡рд╕реНрдерд╛ рдмрд╛рдЗрдкрд╛рд╕ рдЧрд░реНрди рд╡реИрдХрд▓реНрдкрд┐рдХ рдЭрдгреНрдбрд╛ PROC_POLICY_ACTION_SET рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдкрд░реНрдпрд╛рдкреНрдд рдЫред

рддрд╕рд░реНрде, рдпрджрд┐ рддрдкрд╛рдЗрдБ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ CPU рдЙрдкрдпреЛрдЧ рдХреЛрдЯрд╛ "рд╕реАрдорд┐рдд" рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХреЗрд╡рд▓ 1 рдПрдирдПрд╕ рдЪрд▓рд╛рдЙрди рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИ), рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдЗрдБ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдХреБрдиреИ рдкрдирд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдорд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпрд╕рд░реА, рдорд╛рд▓рд╡реЗрдпрд░рд▓реЗ рдПрдиреНрдЯрд┐рднрд╛рдЗрд░рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд╣рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдХреБрдиреИ рдкрдирд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдорд╛рд░реНрди рд╕рдХреНрдЫред 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 рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред Endpoint Security 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 рдиреАрддрд┐ рдХрд░реНрдиреЗрд▓рдорд╛ рджрд░реНрддрд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЬрд╕рд▓реЗ рд╕рдВрдХреЗрдд рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдзрд┐ (polic_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 рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдЧрд░реНрджрд╛ рд╕реЗрдЯ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЬрдм рддреНрдпрд╣рд╛рдБ рдбрд╛рдЙрдирд▓реЛрдб рд╕реАрдорд╛ рд╣реБрдиреНрдЫ, рдХреЗрдХреНрд╕рдЯрдирд▓реЛрдб рдЖрджреЗрд╢рд▓реЗ рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗрдЫ:

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 рд╡рд┐рд╡рд░рдг);" рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдХреНрд╖рд╛рд╣рд░реВрдХреЛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдЕрдирд▓реЛрдб рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рддрдкрд╛рдИрд▓реЗ "рдЯрд░реНрдорд┐рдиреЗрдЯ" рдХрдорд╛рдгреНрдбрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрджрд╛ рдЧрд▓рдд рдлрд░реНрдХрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЬрдмрд╕рдореНрдо рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧ "рдорд░реНрджреИрди", рдЕрд░реНрдерд╛рддреН, "clientDied" рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдмреЛрд▓рд╛рдЗрдПрдХреЛ рдЫреИрдиред

рдлрд╛рдЗрд▓ рд╕реБрд░рдХреНрд╖рд╛

рдлрд╛рдЗрд▓рд╣рд░реВ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрди, рдпреЛ 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. рдЕрдиреНрддрд┐рдо рдЕрд╡рд╕реНрдерд╛ рдкреБрдЧреЗрди, рдмрд╛рдЯреЛ рдЯреБрдВрдЧрд┐рдПрдиред рдХреБрдиреИ рдкрдирд┐ рдЙрдкрд╕рд░реНрдЧ рдпрд╕рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдБрджреИрди, рд╣рд╛рдореА рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рдкрд░рд┐рдЪрдп рдЧрд░реНрджреИрдиреМрдВред

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

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

MacOS рдорд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд░ рдХрд░реНрдиреЗрд▓ рд╡рд┐рд╕реНрддрд╛рд░рд╣рд░реВ рдХрд╕рд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрдиреЗ

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди