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

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

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

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

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

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

macOS рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдПрдБ

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

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

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

рд▓реЙрдиреНрдЪрдбреА

рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдбреЗрдореЙрди рдмрдирд╛рдиреЗ рдФрд░ рдЙрдирдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд░реЛрдд MacOS 10.10 рддрдХ рд▓реЙрдиреНрдЪрдХреНрдЯрд▓ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЖрдзреБрдирд┐рдХ рд▓реЙрдиреНрдЪрд╕реАрдЯреАрдПрд▓ рдПрдХреНрд╕рдкреАрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдиреНрдЪрдбреА рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрддрд╛ рд╣реИ, рд▓реЙрдиреНрдЪрд╕реАрдЯреАрдПрд▓ рддрд░реНрдХ рдХреЛ рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рд░реЛрдХреЗ рдЬрд╛рддреЗ рд╣реИрдВред SIGTERM рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ "proc_terminet" рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЛрдХрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

<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_terminet, рдЕрдкрдиреЗ рдирд╛рдо рдХреЗ рдмрд╛рд╡рдЬреВрдж, SIGTERM рдХреЗ рд╕рд╛рде рди рдХреЗрд╡рд▓ psignal рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ SIGKILL рднреА рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред

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

рдПрдХ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓рд╛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдкреНрд░рдХреНрд░рд┐рдпрд╛_рдиреАрддрд┐. рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕рд░ рдХреЗ рд▓рд┐рдП рд╕реАрдкреАрдпреВ рд╕рдордп рдФрд░ рдореЗрдореЛрд░реА рдХреЛрдЯрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рддрд╛рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рд╛рдЗрд▓ рдХреИрд╢рд┐рдВрдЧ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдХрд╛рдлреА рдзреАрдорд╛ рди рд╣реЛред рдпрджрд┐ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдиреА рд╕рдВрд╕рд╛рдзрди рд╕реАрдорд╛ рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ proc_apply_resource_actions рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ SIGKILL рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЦрд╝рддреНрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд╕реНрдЯрдо рдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рд╡рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдзреНрд╡рдЬ PROC_POLICY_ACTION_SET рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реАрдкреАрдпреВ рдЙрдкрдпреЛрдЧ рдХреЛрдЯрд╛ рдХреЛ "рд╕реАрдорд┐рдд" рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ 1 рдПрдирдПрд╕ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ), рддреЛ рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрд▓рд╡реЗрдпрд░ рдПрдВрдЯреАрд╡рд╛рдпрд░рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд╣рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЦрд╝рддреНрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рднрд╛рд╡ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдЬреЛ рдкреАрдЖрдИрдбреА тАЛтАЛ1 (рд▓реЙрдиреНрдЪрд╕реАрдЯреАрдПрд▓) рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЦрддреНрдо рдХрд░рддреЗ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ - рд╕рд┐рдЧрдХрд┐рд▓ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдХрд░реНрдиреЗрд▓ рдШрдмрд░рд╛рд╣рдЯ :)

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 рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╕реБрд░рдХреНрд╖рд╛ рдПрдкреАрдЖрдИ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдЙрдкрд░реНрдпреБрдХреНрдд рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 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;
}

рдЗрд╕реА рддрд░рд╣, рдПрдХ рдореИрдХ рдкреЙрд▓рд┐рд╕реА рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдзрд┐ (рдкреЙрд▓рд┐рд╕реА proc_check_signal) рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рдХрд░реНрдиреЗрд▓ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реБрд░рдХреНрд╖рд╛

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

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

my_kext_ioservice = 1
my_kext_iouserclient = 1

рдХреЛрдИ рднреА рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЙрд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ IOService рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ my_kext_ioserviceред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рд╕реЗ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирддрд╛ рд╣реИ рдЬреЛ IOUserClient рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП my_kext_iouserclientред

рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп (kextunload рдХрдорд╛рдВрдб), рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди "рдмреВрд▓ рдЯрд░реНрдорд┐рдиреЗрдЯ (IOOptionBits рд╡рд┐рдХрд▓реНрдк)" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред 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 рдлрд╝реНрд▓реИрдЧ, io_name_t рд╡рд┐рд╡рд░рдг);" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк "рдЯрд░реНрдорд┐рдиреЗрдЯ" рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЧрд▓рдд рд░рд┐рдЯрд░реНрди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди "рдорд░ рдирд╣реАрдВ рдЬрд╛рддрд╛", рдпрд╛рдиреА "рдХреНрд▓рд╛рдЗрдВрдЯрдбрд╛рдЗрдб" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

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

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

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

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

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

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

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

рдбреАрдХреЗрдП рд░рд╛рдЬреНрдпреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдкрд░, 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 рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ