рд╣реЕрд▓реЛ, рд╣реЕрдмреНрд░! рдЖрдЬ рдореА 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 рдлрдВрдХреНрд╢рдирдЪреЗ рдХреЙрд▓ рдХрд╛рдвреВрди рдЯрд╛рдХреВ (рдЬрд░реА рддреЗ рдХреНрд╖реБрд▓реНрд▓рдХ рдирд╕рд▓реЗ рддрд░реА, рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рджреБрд╕рд░реНтАНрдпрд╛ рд▓реЗрдЦрд╛рд╕рд╛рдареА рд╕реЛрдбреВ ЁЯЩВ - рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдкрдбрддрд╛рд│рдгреА, рдореЗрдорд░реА рддреНрд░реБрдЯреА, рдмрд╛рд╣реЗрд░ рдкрдбрдгреЗ/рд╕рдорд╛рдкреНрдд рдХрд░рдгреЗ, рдлрд╛рдЗрд▓ рд╕рдВрд░рдХреНрд╖рдг рдЙрд▓реНрд▓рдВрдШрди рдЗ. .
рдЪрд▓рд╛ рдлрдВрдХреНрд╢рди рдЖрдгрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рд╕рд╣ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рд╕реБрд░реВ рдХрд░реВрдпрд╛
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 рд╡рд╛рдкрд░ рдХреЛрдЯрд╛ "рдорд░реНрдпрд╛рджрд┐рдд" рдХреЗрд▓рд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдлрдХреНрдд 1 ns рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА), рддрд░ рддреБрдореНрд╣реА рд╕рд┐рд╕реНрдЯрдордордзреАрд▓ рдХреЛрдгрддреАрд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╖реНрдЯ рдХрд░реВ рд╢рдХрддрд╛. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдорд╛рд▓рд╡реЗрдЕрд░ рдЕрдБрдЯреАрд╡реНрд╣рд╛рдпрд░рд╕ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╣ рд╕рд┐рд╕реНрдЯрдорд╡рд░реАрд▓ рдХреЛрдгрддреАрд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╖реНрдЯ рдХрд░реВ рд╢рдХрддреЛ. pid 1 (launchctl) - SIGKILL рд╕рд┐рдЧреНрдирд▓рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддрд╛рдирд╛ рдХрд░реНрдирд▓ рдкреЕрдирд┐рдХрд╕рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛рд░рддрд╛рдирд╛ рдЙрджреНрднрд╡рдгрд╛рд░рд╛ рдкреНрд░рднрд╛рд╡ рджреЗрдЦреАрд▓ рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ :)
рд╕рдорд╕реНрдпрд╛ рдХрд╢реА рд╕реЛрдбрд╡рд╛рдпрдЪреА?
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛рд░рд▓реА рдЬрд╛рдгреНрдпрд╛рдкрд╛рд╕реВрди рд░реЛрдЦрдгреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреЗрдмрд▓рдордзреАрд▓ рдлрдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдмрджрд▓рдгреЗ. рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рд╣реА рдкрджреНрдзрдд рдЕрдиреЗрдХ рдХрд╛рд░рдгрд╛рдВрдореБрд│реЗ рдХреНрд╖реБрд▓реНрд▓рдХ рдирд╛рд╣реА.
рдкреНрд░рдердо, sysent рдЪреЗ рдореЗрдорд░реА рд╕реНрдерд╛рди рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгрд╛рд░реЗ рдЪрд┐рдиреНрд╣ рдХреЗрд╡рд│ XNU рдХрд░реНрдирд▓ рдЪрд┐рдиреНрд╣рд╛рд╕рд╛рдареА рдЦрд╛рдЬрдЧреА рдирд╛рд╣реА, рдкрд░рдВрддреБ рдХрд░реНрдирд▓ рдЪрд┐рдиреНрд╣рд╛рдВрдордзреНрдпреЗ рдЖрдврд│реВ рд╢рдХрдд рдирд╛рд╣реА. рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реНрдпреБрд░рд┐рд╕реНрдЯрд┐рдХ рд╢реЛрдз рдкрджреНрдзрддреА рд╡рд╛рдкрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддреАрд▓, рдЬрд╕реЗ рдХреА рдлрдВрдХреНрд╢рди рдбрд╛рдпрдиреЕрдорд┐рдХрд▓реА рдбрд┐рд╕реЗрдореНрдмрд▓ рдХрд░рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рдкреЙрдЗрдВрдЯрд░ рд╢реЛрдзрдгреЗ.
рджреБрд╕рд░реЗ рдореНрд╣рдгрдЬреЗ, рддрдХреНрддреНрдпрд╛рддреАрд▓ рдиреЛрдВрджреАрдВрдЪреА рд░рдЪрдирд╛ рдХрд░реНрдирд▓ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдзреНрд╡рдЬрд╛рдВрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ. CONFIG_REQUIRES_U32_MUNGING рдзреНрд╡рдЬ рдШреЛрд╖рд┐рдд рдХреЗрд▓реНрдпрд╛рд╕, рд╕рдВрд░рдЪрдиреЗрдЪрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рд▓рд╛ рдЬрд╛рдИрд▓ - рдЕрддрд┐рд░рд┐рдХреНрдд рдлреАрд▓реНрдб рдЬреЛрдбрд▓реЗ рдЬрд╛рдИрд▓
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 рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдЙрдкрд╕рд░реНрдЧрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдврд▓реНрдпрд╛рдореБрд│реЗ рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдЪрд╛ рддреЛрдЯрд╛ рдХрдореА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрд╕реВ рд╢рдХрддреЛ. рддреБрд▓рдирд╛ O(рдЙрдкрд╕рд░реНрдЧ*рд▓рд╛рдВрдмреА) рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдЪреА рдирд╛рд╣реА рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЬреЗрдереЗ рдЙрдкрд╕рд░реНрдЧ рд╣рд╛ рдЙрдкрд╕рд░реНрдЧрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдЖрд╣реЗ, рд▓рд╛рдВрдмреА рд╣реА рд╕реНрдЯреНрд░рд┐рдВрдЧрдЪреА рд▓рд╛рдВрдмреА рдЖрд╣реЗ, рддреБрдореНрд╣реА рдЙрдкрд╕рд░реНрдЧрд╛рдВрджреНрд╡рд╛рд░реЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рдирд┐рд░реНрдзрд╛рд░рдХ рдорд░реНрдпрд╛рджрд┐рдд рдСрдЯреЛрдореЕрдЯрди тАЛтАЛ(DFA) рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛.
рджрд┐рд▓реЗрд▓реНрдпрд╛ рдЙрдкрд╕рд░реНрдЧрд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЪрд╛рд╕рд╛рдареА DFA рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреАрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛. рдЖрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд╕рд░реНрдЧрд╛рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдХрд░реНрд╕рд░ рд╕реБрд░реВ рдХрд░рддреЛ. рдЬрд░ рд╕рд░реНрд╡ рдХрд░реНрд╕рд░ рдПрдХрд╛рдЪ рд╡рд░реНрдгрд╛рдХрдбреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛рдд, рддрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд░реНрд╕рд░рд▓рд╛ рдПрдХрд╛ рд╡рд░реНрдгрд╛рдиреЗ рд╡рд╛рдврд╡рд╛ рдЖрдгрд┐ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ рдХреА рддреНрдпрд╛рдЪ рд░реЗрд╖реЗрдЪреА рд▓рд╛рдВрдмреА рдПрдХрд╛рдиреЗ рдореЛрдареА рдЖрд╣реЗ. рднрд┐рдиреНрди рдЪрд┐рдиреНрд╣рд╛рдВрд╕рд╣ рджреЛрди рдХрд░реНрд╕рд░ рдЕрд╕рд▓реНрдпрд╛рд╕, рдХрд░реНрд╕рд░ рдЬреНрдпрд╛ рдЪрд┐рдиреНрд╣рд╛рдХрдбреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛рдд рддреНрдпрд╛рдиреБрд╕рд╛рд░ рдЧрдЯрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рд╛ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЧрдЯрд╛рд╕рд╛рдареА рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рдкреБрдиреНрд╣рд╛ рдХрд░рд╛.
рдкрд╣рд┐рд▓реНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд (рдХрд░реНрд╕рд░ рдЕрдВрддрд░реНрдЧрдд рд╕рд░реНрд╡ рд╡рд░реНрдг рд╕рдорд╛рди рдЖрд╣реЗрдд), рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ DFA рд╕реНрдерд┐рддреА рдорд┐рд│рддреЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдПрдХрд╛рдЪ рдУрд│реАрдд рдлрдХреНрдд рдПрдХ рд╕рдВрдХреНрд░рдордг рдЖрд╣реЗ. рджреБрд╕-рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдлрдВрдХреНрд╢рдирд▓рд╛ рдЖрд╡рд░реНрддреА рдХреЙрд▓ рдХрд░реВрди рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдкреБрдвреАрд▓ рд░рд╛рдЬреНрдпрд╛рдВрдордзреНрдпреЗ рдЖрдХрд╛рд░ 256 (рдЕрдХреНрд╖рд░рд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдЖрдгрд┐ рдЧрдЯрд╛рдВрдЪреА рдХрдорд╛рд▓ рд╕рдВрдЦреНрдпрд╛) рдЪреНрдпрд╛ рд╕рдВрдХреНрд░рдордгрд╛рдВрдЪреА рд╕рд╛рд░рдгреА рдорд┐рд│рддреЗ.
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ. рдЙрдкрд╕рд░реНрдЧрд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЪрд╛рд╕рд╛рдареА (тАЬ/foo/bar/tmp/тАЭ, тАЬ/var/db/foo/тАЭ, тАЬ/foo/bar/aba/тАЭ, тАЬfoo/bar/aac/тАЭ) рддреБрдореНрд╣рд╛рд▓рд╛ рдкреБрдвреАрд▓ рдЧреЛрд╖реНрдЯреА рдорд┐рд│реВ рд╢рдХрддрд╛рдд DFA. рдЖрдХреГрддреА рдлрдХреНрдд рдЗрддрд░ рд░рд╛рдЬреНрдпрд╛рдВрдХрдбреЗ рдЬрд╛рдгрд╛рд░реА рд╕рдВрдХреНрд░рдордгреЗ рджрд░реНрд╢рд╡рддреЗ; рдЗрддрд░ рд╕рдВрдХреНрд░рдордгреЗ рдЕрдВрддрд┐рдо рдирд╕рддреАрд▓.
DKA рд░рд╛рдЬреНрдпрд╛рдВрдордзреВрди рдЬрд╛рдд рдЕрд╕рддрд╛рдирд╛, 3 рдкреНрд░рдХрд░рдгреЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд.
- рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддреА рдЧрд╛рдард▓реА рдЧреЗрд▓реА рдЖрд╣реЗ - рдорд╛рд░реНрдЧ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗ, рдЖрдореНрд╣реА KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA рдЖрдгрд┐ KAUTH_VNODE_DELETE_CHILD рдСрдкрд░реЗрд╢рдиреНрд╕ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рддреЛ
- рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддреА рдЧрд╛рдард▓реА рдЧреЗрд▓реА рдирд╛рд╣реА, рдкрд░рдВрддреБ рдорд╛рд░реНрдЧ тАЬрд╕рдорд╛рдкреНрддтАЭ рдЭрд╛рд▓рд╛ (рд╢реВрдиреНрдп рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рдкреЛрд╣реЛрдЪрд▓рд╛) - рдкрде рдкрд╛рд▓рдХ рдЖрд╣реЗ, рддреЛ KAUTH_VNODE_DELETE рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА vnode рд╣реЗ рдлреЛрд▓реНрдбрд░ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рд╢реЗрд╡рдЯреА '/' рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЕрдиреНрдпрдерд╛ рддреЗ "/foor/bar/t" рдлрд╛рдЗрд▓рд╡рд░ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░реВ рд╢рдХрддреЗ, рдЬреЗ рдЪреБрдХреАрдЪреЗ рдЖрд╣реЗ.
- рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддреА рдЧрд╛рдард▓реА рдирд╛рд╣реА, рдорд╛рд░реНрдЧ рд╕рдВрдкрд▓рд╛ рдирд╛рд╣реА. рдХреЛрдгрддрд╛рд╣реА рдЙрдкрд╕рд░реНрдЧ рдпрд╛рд╢реА рдЬреБрд│рдд рдирд╛рд╣реА, рдЖрдореНрд╣реА рдирд┐рд░реНрдмрдВрдз рдЖрдгрдд рдирд╛рд╣реА.
рдирд┐рд╖реНрдХрд░реНрд╖
рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдбреЗрдЯрд╛рдЪреНрдпрд╛ рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрдЪреА рдкрд╛рддрд│реА рд╡рд╛рдврд╡рдгреЗ рд╣реЗ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпрд╛рдВрдЪреЗ рдЙрджреНрджрд┐рд╖реНрдЯ рдЖрд╣реЗ. рдПрдХреАрдХрдбреЗ, рд╣реЗ рд▓рдХреНрд╖реНрдп Acronis рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдЙрддреНрдкрд╛рджрдирд╛рдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рджреНрд╡рд╛рд░реЗ рд╕рд╛рдзреНрдп рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рдЬреЗ рддреНрдпрд╛ рдЕрд╕реБрд░рдХреНрд╖рд╛ рдмрдВрдж рдХрд░рддреЗ рдЬреЗрдереЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рддрдГ "рдХрдордХреБрд╡рдд" рдЖрд╣реЗ. рджреБрд╕рд░реАрдХрдбреЗ, OS рдЪреНрдпрд╛ рдмрд╛рдЬреВрдиреЗ рд╕реБрдзрд╛рд░рддрд╛ рдпреЗрдК рд╢рдХрдгрд╛рд░реНтАНрдпрд╛ рд╕реБрд░рдХреНрд╖рд┐рддрддрд╛ рдкреИрд▓реВрдВрдирд╛ рдмрд│рдХрдЯ рдХрд░рдгреНрдпрд╛рдХрдбреЗ рдЖрдкрдг рджреБрд░реНрд▓рдХреНрд╖ рдХрд░реВ рдирдпреЗ, рд╡рд┐рд╢реЗрд╖рдд: рдЕрд╢рд╛ рднреЗрджреНрдпрддрд╛ рдмрдВрдж рдХреЗрд▓реНрдпрд╛рдиреЗ рдЙрддреНрдкрд╛рджрди рдореНрд╣рдгреВрди рдЖрдкрд▓реА рд╕реНрд╡рддрдГрдЪреА рд╕реНрдерд┐рд░рддрд╛ рд╡рд╛рдврддреЗ. рдНрдкрд▓ рдЙрддреНрдкрд╛рджрди рд╕реБрд░рдХреНрд╖рд╛ рдЯреАрдорд▓рд╛ рднреЗрджреНрдпрддреЗрдЪреА рддрдХреНрд░рд╛рд░ рдХрд░рдгреНрдпрд╛рдд рдЖрд▓реА рд╣реЛрддреА рдЖрдгрд┐ рддреА macOS 10.14.5 (https://support.apple.com/en-gb/HT210119) рдордзреНрдпреЗ рдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ.
рдЬрд░ рддреБрдордЪреА рдЙрдкрдпреБрдХреНрддрддрд╛ рдЕрдзрд┐рдХреГрддрдкрдгреЗ рдХрд░реНрдирд▓рдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реА рдЧреЗрд▓реА рдЕрд╕реЗрд▓ рддрд░рдЪ рд╣реЗ рд╕рд░реНрд╡ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдореНрд╣рдгрдЬреЗрдЪ, рдмрд╛рд╣реНрдп рдЖрдгрд┐ рдЕрд╡рд╛рдВрдЫрд┐рдд рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рд╕рд╛рдареА рдЕрд╢рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рддреНрд░реБрдЯреА рдирд╛рд╣реАрдд. рддрдерд╛рдкрд┐, рддреБрдореНрд╣реА рдмрдШреВ рд╢рдХрддрд╛, рдЕрдБрдЯреАрд╡реНрд╣рд╛рдпрд░рд╕ рдЖрдгрд┐ рдмреЕрдХрдЕрдк рд╕рд┐рд╕реНрдЯрдо рд╕рд╛рд░рдЦреНрдпрд╛ рдХрд╛рдпрджреЗрд╢реАрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рджреЗрдЦреАрд▓ рдХрд╛рд░реНрдп рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдкрд░рдВрддреБ рдЖрддрд╛ macOS рд╕рд╛рдареА рдирд╡реАрди Acronis рдЙрддреНрдкрд╛рджрдирд╛рдВрдирд╛ рд╕рд┐рд╕реНрдЯрдордордзреВрди рдЕрдирд▓реЛрдбрд┐рдВрдЧрдкрд╛рд╕реВрди рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд░рдХреНрд╖рдг рдЕрд╕реЗрд▓.
рд╕реНрддреНрд░реЛрдд: www.habr.com