рдирдорд╕реНрддреЗ, Habr! рдЖрдЬ рдо рддрдкрд╛рдЗрдБ рдХрд╕рд░реА 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 рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рдХрд▓рд╣рд░реВ рдмрд╛рд╣рд┐рд░ рдирд┐рдХрд╛рд▓реМрдВ (рдпрджреНрдпрдкрд┐ рддрд┐рдиреАрд╣рд░реВ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реБрди рд╕рдХреНрдЫрдиреН, рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЕрд░реНрдХреЛ рд▓реЗрдЦрдХреЛ рд▓рд╛рдЧрд┐ рдЫреЛрдбреНрдиреЗрдЫреМрдВ ЁЯЩВ - рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рдорд╛рдгрд┐рдХрд░рдг, рдореЗрдореЛрд░реА рддреНрд░реБрдЯрд┐рд╣рд░реВ, рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрдиреЗ/рдЯрд░реНрдорд┐рдиреЗрдЯ рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдВрдЧ, рдлрд╛рдЗрд▓ рд╕реБрд░рдХреНрд╖рд╛ рдЙрд▓реНрд▓рдЩреНрдШрдирд╣рд░реВ, рдЖрджрд┐ред ред
рдкреНрд░рдХрд╛рд░реНрдп рд░ рд╕рдореНрдмрдиреНрдзрд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХрд▓рдХреЛ рд╕рд╛рде рд╕рдореАрдХреНрд╖рд╛ рд╕реБрд░реБ рдЧрд░реМрдВ
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 рдЙрдкрдпреЛрдЧ рдХреЛрдЯрд╛ "рд╕реАрдорд┐рдд" рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХреЗрд╡рд▓ 1 рдПрдирдПрд╕ рдЪрд▓рд╛рдЙрди рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИ), рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдЗрдБ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдХреБрдиреИ рдкрдирд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдорд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпрд╕рд░реА, рдорд╛рд▓рд╡реЗрдпрд░рд▓реЗ рдПрдиреНрдЯрд┐рднрд╛рдЗрд░рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд╣рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдХреБрдиреИ рдкрдирд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдорд╛рд░реНрди рд╕рдХреНрдЫред 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 рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред 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 рдкреНрд░рддрд┐рдмрдиреНрдзрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рдЙрдкрд╕рд░реНрдЧрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдмрдвреНрджреИ рдЬрд╛рдБрджрд╛ рдпрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдХреЛ рд╣рд╛рдирд┐ рдХрдо рдкреНрд░рджрд░реНрд╢рди рд╣реБрди рд╕рдХреНрдЫред рддреБрд▓рдирд╛ 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" рдорд╛ рд╕реАрдорд┐рдд рдЧрд░реНрди рд╕рдХреНрдЫ, рдЬреБрди рдЧрд▓рдд рдЫред
- рдЕрдиреНрддрд┐рдо рдЕрд╡рд╕реНрдерд╛ рдкреБрдЧреЗрди, рдмрд╛рдЯреЛ рдЯреБрдВрдЧрд┐рдПрдиред рдХреБрдиреИ рдкрдирд┐ рдЙрдкрд╕рд░реНрдЧ рдпрд╕рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдБрджреИрди, рд╣рд╛рдореА рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рдкрд░рд┐рдЪрдп рдЧрд░реНрджреИрдиреМрдВред
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рд╡рд┐рдХрд╛рд╕ рднрдЗрд░рд╣реЗрдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╛рдзрд╛рдирд╣рд░реВрдХреЛ рд▓рдХреНрд╖реНрдп рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд░ рдЙрд╕рдХреЛ рдбреЗрдЯрд╛рдХреЛ рд╕реБрд░рдХреНрд╖рд╛рдХреЛ рд╕реНрддрд░ рдмрдврд╛рдЙрдиреБ рд╣реЛред рдПрдХрд╛рддрд┐рд░, рдпреЛ рд▓рдХреНрд╖реНрдп рдПрдХреНрд░реЛрдирд┐рд╕ рд╕рдлреНрдЯрд╡реЗрдпрд░ рдЙрддреНрдкрд╛рджрдирдХреЛ рд╡рд┐рдХрд╛рд╕рджреНрд╡рд╛рд░рд╛ рд╣рд╛рд╕рд┐рд▓ рдЧрд░рд┐рдПрдХреЛ рдЫ, рдЬрд╕рд▓реЗ рддреА рдХрдордЬреЛрд░реАрд╣рд░реВрд▓рд╛рдИ рдмрдиреНрдж рдЧрд░реНрджрдЫ рдЬрд╣рд╛рдБ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдо рдЖрдлреИрдВ "рдХрдордЬреЛрд░" рдЫред рдЕрд░реНрдХреЛрддрд░реНрдл, рд╣рд╛рдореАрд▓реЗ рдУрдПрд╕ рдкрдХреНрд╖рдорд╛ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреЗ рд╕реБрд░рдХреНрд╖рд╛ рдкрдХреНрд╖рд╣рд░реВрд▓рд╛рдИ рд╕реБрджреГрдв рдЧрд░реНрди рдмреЗрд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрдиреБ рд╣реБрдБрджреИрди, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рддреНрдпрд╕реНрддрд╛ рдХрдордЬреЛрд░реАрд╣рд░реВрд▓рд╛рдИ рдмрдиреНрдж рдЧрд░реНрджрд╛ рдЙрддреНрдкрд╛рджрдирдХреЛ рд░реВрдкрдорд╛ рд╣рд╛рдореНрд░реЛ рдЖрдлреНрдиреИ рд╕реНрдерд┐рд░рддрд╛ рдмрдвреНрдЫред рдЬреЛрдЦрд┐рдо Apple рдЙрддреНрдкрд╛рджрди рд╕реБрд░рдХреНрд╖рд╛ рдЯреЛрд▓реАрд▓рд╛рдИ рд░рд┐рдкреЛрд░реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рд░ macOS 10.14.5 (https://support.apple.com/en-gb/HT210119) рдорд╛ рдлрд┐рдХреНрд╕ рдЧрд░рд┐рдПрдХреЛ рдЫред
рдпрджрд┐ рддрдкрд╛рдЗрдБрдХреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдкрдорд╛ рдХрд░реНрдиреЗрд▓рдорд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ рдорд╛рддреНрд░ рдпреЛ рд╕рдмреИ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рддреНрдпреЛ рд╣реЛ, рддреНрдпрд╣рд╛рдБ рдмрд╛рд╣рд┐рд░реА рд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдлреНрдЯрд╡реЗрдпрд░рдХреЛ рд▓рд╛рдЧрд┐ рддреНрдпрд╕реНрддреЛ рдХреБрдиреИ рдХрдореАрд╣рд░реВ рдЫреИрдирдиреНред рдпрджреНрдпрдкрд┐, рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдПрдиреНрдЯрд┐рднрд╛рдЗрд░рд╕ рд░ рдмреНрдпрд╛рдХрдЕрдк рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВ рдЬрд╕реНрддрд╛ рд╡реИрдз рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВрдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рдЧрд░реНрди рдкрдирд┐ рдХрд╛рдо рдЖрд╡рд╢реНрдпрдХ рдЫред рддрд░ рдЕрдм macOS рдХрд╛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ Acronis рдЙрддреНрдкрд╛рджрдирд╣рд░реВрд╕рдБрдЧ рдкреНрд░рдгрд╛рд▓реАрдмрд╛рдЯ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рд╡рд┐рд░реБрджреНрдз рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ рд╣реБрдиреЗрдЫред
рд╕реНрд░реЛрдд: www.habr.com