MacOS рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ

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

рдЫрд╡рд┐

рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рд░рдиреЗ рдХрд╛ рдХреНрд▓рд╛рд╕рд┐рдХ рддрд░реАрдХрд╛


рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ "рдорд╛рд░рдиреЗ" рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз рддрд░реАрдХрд╛ рдПрдХ рд╕рдВрдХреЗрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрдд рднреЗрдЬрдирд╛ рд╣реИред рдорд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдк рдорд╛рдирдХ "рдорд╛рд░ -SIGKILL PID" рдпрд╛ "pkill -9 NAME" рдХреЛ рдорд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рд░ рдХрдорд╛рдВрдб UNIX рдХреЗ рдмрд╛рдж рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рди рдХреЗрд╡рд▓ macOS рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп UNIX рдЬреИрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред

UNIX рдЬреИрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ, macOS рдЖрдкрдХреЛ рджреЛ рд╕рд┐рд╡рд╛рдп SIGKILL рдФрд░ SIGSTOP рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, SIGKILL рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╣рддреНрдпрд╛ рдХреЛ рдЬрдиреНрдо рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред

MacOS рдХреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ


MacOS рдкрд░, XNU рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдорд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рд╕рд╛рдЗрдЧреНрдирд▓ рдлрд╝рдВрдХреНрд╢рди (SIGKILL, ...) рдХрд╣рддрд╛ рд╣реИред рдЖрдЗрдП рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рд╕реНрдкреЗрд╕ рдореЗрдВ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╕рд╛рдЗрдЧреНрдирд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддреА рд╣реИрдВред рд╣рдо рдХрд░реНрдиреЗрд▓ рдХреЗ рдЖрдВрддрд░рд┐рдХ рддрдВрддреНрд░ рдореЗрдВ Psignal рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ nontrivial рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВ :) - рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рддреНрдпрд╛рдкрди, рдореЗрдореЛрд░реА рддреНрд░реБрдЯрд┐рдпреЛрдВ, рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ / рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛, рдлрд╝рд╛рдЗрд▓ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди, рдЖрджрд┐ред

рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ terminate_with_payload рдХреЗ рд╕рд╛рде рдУрд╡рд░рд╡реНрдпреВ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд┐рд▓ рдХреЙрд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рдореИрдХрдУрдПрд╕ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдФрд░ рдмреАрдПрд╕рдбреА рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рджреНрдзрд╛рдВрдд рднреА рдХрд░реАрдм рд╣реИрдВред рд╡реЗ рд╕рд┐рдЧреНрдирд▓ рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдХреЙрд▓ рд╣реИрдВред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ "рдХреИрдирд╕рд┐рдЧреНрдирд▓" рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬ рд╕рдХрддреА рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

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);
	}
...
}

launchd


рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдбреЗрдореЙрди рдмрдирд╛рдиреЗ рдФрд░ рдЙрдирдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдореИрдХрдУрдЯреА 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 рдХреЗ рд╕рд╛рде рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ SIGKILL рдХреЛ рднреА рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред

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


рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓рд╛ рдПрдХ рдФрд░ process_policy рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдорд╛рдирдХ рдЙрдкрдпреЛрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд╕рд╛рдзрди рд╕реАрдорд╛рдПрдБ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдФрд░ рдореЗрдореЛрд░реА рдХреЛрдЯрд╛ рдкрд░ рдПрдХ рд╕реАрдорд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рд╛рдЗрд▓ рдХреИрд╢рд┐рдВрдЧ рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдХрд╛рдлреА рдзреАрдорд╛ рди рд╣реЛред рдпрджрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд╕рд╛рдзрди рд╕реАрдорд╛ рддрдХ рдкрд╣реБрдБрдЪ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ 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 рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рддреЛ, рдЖрдк рдХрд┐рд╕реА рднреА рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 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("%d\n", getpid());
    sleep(60); // could be replaced with other waiting primitive

    es_unsubscribe_all(cli);
    es_delete_client(cli);

    return 0;
}

рдЗрд╕реА рддрд░рд╣, рдЖрдк рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдореИрдХ рдкреЙрд▓рд┐рд╕реА рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрдЯреЗрдХреНрд╢рди рдореЗрдердб (рдкреЙрд▓рд┐рд╕реА proc_check_signal) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди API рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕рдВрд░рдХреНрд╖рдг


рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рд╕реНрд╡рдпрдВ (kext) рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореИрдХрдУрдПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП IOKit рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, IOKit C ++ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реНрдЯреИрдХрд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд░реНрдиреЗрд▓-рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдкрдВрдЬреАрдХреГрдд рдЙрджрд╛рд╣рд░рдг "рдЦреЛрдЬ" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрдХреНрд╖рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, ioclasscount рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореМрдЬреВрдж рд╣реИред

my_kext_ioservice = 1
my_kext_iouserclient = 1

рдбреНрд░рд╛рдЗрд╡рд░ рд╕реНрдЯреИрдХ рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ IOService рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдПрдХ рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ my_kext_ioserviceред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рд╕реЗ рдЙрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрди рдЬрд╛рдПрдЧрд╛ рдЬреЛ IOUkeClient рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдореЗрдВ 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 рд╡рд┐рд╡рд░рдг);" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдХреНрд╖рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЙрддрд╛рд░ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдХреЙрд▓ рдХреЛ "рдЯрд░реНрдорд┐рдиреЗрдЯ" рдХрдорд╛рдВрдб рдкрд░ рддрдм рддрдХ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдпреВрдЬрд░реНрд╕ рдРрдкреНрд▓рд┐рдХреЗрд╢рдВрд╕ рд╕реЗ рдорд░ рди рдЬрд╛рдП, рдпрд╛рдиреА рдХреНрд▓рд╛рдЗрдВрдЯрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдИ рдХреЙрд▓ рди рдЖрдПред

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


рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, рдХрд╛рдКрде рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред Apple рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╕рдВрдЪрд╛рд▓рди KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA рдФрд░ KAUTH_VNODE_ELELE_CHILD рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ - рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП API "vn_getpath" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрде рдЙрдкрд╕рд░реНрдЧ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЗ рдкрде рдХреЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдЕрдзрд┐рдХреГрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╣реА, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рд╛ рдЧрдпрд╛ рдерд╛ред рдореВрд▓ рдкрде рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП KAUTH_VNODE_DELETE рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЫрд╡рд┐

рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреА рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдХрдо рдкреНрд░рджрд░реНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдУ (рдЙрдкрд╕рд░реНрдЧ * рд▓рдВрдмрд╛рдИ) рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдЙрдкрд╕рд░реНрдЧ рдЙрдкрд╕рд░реНрдЧ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рд▓рдВрдмрд╛рдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рд╣реИ, рдЖрдк рдЙрдкрд╕рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдирд┐рдпрдд рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди (рдбреАрдПрдлрдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рджрд┐рдП рдЧрдП рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП DFA рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд╕рд░реНрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд░реНрд╕рд░ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рднреА рд╢рд╛рдкрдХрд░реНрддрд╛ рдПрдХ рд╣реА рдЪрд░рд┐рддреНрд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрд░реНрд╕рд░ рдХреЛ рдПрдХ рд╡рд░реНрдг рд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╛рдж рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреА рд▓рдВрдмрд╛рдИ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдпрджрд┐ рдЙрдирдХреЗ рддрд╣рдд рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рдХрд░реНрд╕рд░ рд╣реИрдВ, рддреЛ рд╣рдо рдХрд░реНрд╕рд░ рдХреЛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЙрд╕ рдкреНрд░рддреАрдХ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред

рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рд╢рд╛рдкрдХрд░реНрддрд╛рдУрдВ рдХреЗ рддрд╣рдд рд╕рднреА рд╡рд░реНрдг рд╕рдорд╛рди рд╣реИрдВ), рд╣рдореЗрдВ рдбреАрдПрдлрдП рд░рд╛рдЬреНрдп рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣реА рд▓рд╛рдЗрди рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХреНрд░рдордг рд╣реЛрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рдЖрдХрд╛рд░ 256 (рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕рдореВрд╣реЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛) рдХреА рдПрдХ рд╕рдВрдХреНрд░рдордг рддрд╛рд▓рд┐рдХрд╛ рдорд┐рд▓рддреА рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЙрдкрд╕рд░реНрдЧреЛрдВ ("/ foo / bar / tmp /", "/ var / db / foo /", "/ foo / bar / aba /", "foo / bar / aac /") рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд DFA рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдВрдХрдбрд╝рд╛ рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдХреНрд░рдордгреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдп рд╕рдВрдХреНрд░рдордг рдЕрдВрддрд┐рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рдЫрд╡рд┐

рдбреАрдХреЗрдП рд░рд╛рдЬреНрдпреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╕рдордп, 3 рдорд╛рдорд▓реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

  1. рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рддрдХ рдкрд╣реБрдБрдЪ рдЧрдпрд╛ рдерд╛ - рдкрде рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ, рд╣рдо рд╕рдВрдЪрд╛рд▓рди KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA рдФрд░ KAUTH_VNODE_DELETE_CHILD рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
  2. , тАЬтАЭ ( -) тАФ , KAUTH_VNODE_DELETE. , vnode , тАШ/тАЩ, тАЬ/foor/bar/tтАЭ, .
  3. , . , .


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

рдЫрд╡рд┐

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

All Articles