แแแแแ แฏแแแ, แฐแแแ ! แแฆแแก แแกแฃแ แก แแแกแแฃแแ แ แแแแแ, แแฃ แ แแแแ แจแแแแซแแแแ แแแแชแแแ แแ แแชแแกแแแ macOS-แจแ แแแแแแแกแฎแแแแแแแกแแแ แแแแแแกแฎแแแแแกแแแ. แแแแแแแแแ, แแก แกแแกแแ แแแแแแ แแแขแแแแ แฃแกแฃแแ แแ แกแแ แแแแ แแ แกแแกแขแแแแกแแแแก, แแแ แฃแแแขแแก, แ แแ macOS-แแก แแแ แแแแแจแ แแ แแชแแกแแก โแแแแแแแกโ แ แแแแแแแแ แแแ แแ แกแแแแแก. แฌแแแแแแฎแแ แแแแก แจแแกแแฎแแ แแ แแแชแแแก แแแแแแแแ แญแ แแก แฅแแแจ.
แแ แแชแแกแแก "แแแแแแแก" แแแแกแแแฃแ แ แแแ
แแ แแชแแกแแก โแแแแแแแกโ แชแแแแแแ แแแ แแ แแก แแ แแชแแกแแ SIGKILL แกแแแแแแแก แแแแแแแแ. แแแจแแก แกแแจแฃแแแแแแ แจแแแแซแแแแ แแแแแแแก แฃแฌแแแแ แกแขแแแแแ แขแฃแแ "kill -SIGKILL PID" แแ "pkill -9 NAME". "แแแแแแแแแแก" แแ แซแแแแแ แชแแแแแแแ UNIX-แแก แแ แแแแแ แแ แฎแแแแแกแแฌแแแแแแ แแ แ แแฎแแแแ macOS-แแ, แแ แแแแ UNIX-แแก แแกแแแแก แกแฎแแ แกแแกแขแแแแแแแช.
แแกแแแ, แ แแแแ แช UNIX-แแก แแกแแแแก แกแแกแขแแแแแจแ, macOS แกแแจแฃแแแแแแก แแแซแแแแ แฉแแญแ แแ แแ แแชแแกแแก แแแแแกแแแแ แ แกแแแแแแ, แแแ แแ แแ แแกแ - SIGKILL แแ SIGSTOP. แแก แกแขแแขแแ แแแ แแแ แ แแแจแ แงแฃแ แแแฆแแแแก แแแแแแฎแแแแแแก SIGKILL แกแแแแแแแ, แ แแแแ แช แกแแแแแแแ, แ แแแแแแช แแฌแแแแก แแ แแชแแกแแก แแแแแแแก.
macOS-แแก แกแแแชแแคแแแ
macOS-แแ แแแแแแแก แกแแกแขแแแแก แแแ แ XNU แแแ แแแจแ แแซแแฎแแแก psignal(SIGKILL,...) แคแฃแแฅแชแแแก. แจแแแแชแแแแ แแแแฎแแ, แ แ แกแฎแแ แแแแฎแแแ แแแแแก แฅแแแแแแแแก แจแแแซแแแแ แแฌแแแแก แแแแฎแแแ แแแแแก แกแแแ แชแแจแ 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);
}
...
}
แแแฃแจแแ
แแแแฅแแแแแ แแแแแแแแแก แจแแฅแแแแก แกแขแแแแแ แขแฃแแ แแแ แกแแกแขแแแแก แแแจแแแแแกแแก แแ แแแแ แกแแชแแชแฎแแแก แแแแขแ แแแ. แแแฎแแแ, แแแแแแแแแกแฌแแแแ, แ แแ แฌแงแแ แแแแ แแ แแก launchctl-แแก แซแแแแ แแแ แกแแแกแแแแก macOS 10.10-แแแ, แแแแแก แแแแแแแแแแ แแแฌแแแแแฃแแแ แกแแแแฃแกแขแ แแชแแ แแแแแแแแกแแแแก. แแแแแแแแ แแแ 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-แก, แแแฃแฎแแแแแแ แแแกแ แกแแฎแแแแกแ, แจแแฃแซแแแ แแแแแแแแแก แแ แ แแฎแแแแ psignal SIGTERM-แแ, แแ แแแแ SIGKILL.
แแ แแแแ แแแแแ แ แแแแแแ - แ แแกแฃแ แกแแแแก แแแแแขแ
แฃแคแ แ แกแแแแขแแ แแกแ แจแแแแฎแแแแ แจแแแซแแแแ แแแฎแแ แกแฎแแ แกแแกแขแแแฃแ แแแ แจแ
แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแ แกแแกแขแแแฃแ แแแ แก แจแแฃแซแแแ แแแขแแแชแแฃแ แแ แแแแแแแแฃแ แแก แแ แแชแแกแ, แกแแกแขแแแแ แกแแแแแแแแ แแแ แจแแแแแฌแแ แกแแกแขแแแฃแ แ แแแ แแก แแแแแซแแฎแแแแก แแ แแชแแกแแก แฃแคแแแแแแ. แ แแแแฃแ แแ แแแแฌแแแแก
แแฅแแแแ แแแแแแแแแแ แ, แแฃ แแฅแแแ โแจแแแฆแฃแแแแโ แแแแแแแชแแแก CPU-แก แแแแแงแแแแแแก แแแแขแแก (แแแแแแแแแ, แแฎแแแแ 1 ns-แแก แแแจแแแแแก แแแแแก แแซแแแแ), แแแจแแ แจแแแแซแแแแ แแแแแแ แแแแแกแแแแ แ แแ แแชแแกแ แกแแกแขแแแแจแ. แแแ แแแแ, แแแแแ แแ แแแ แแแแก แจแแฃแซแแแ แแแแแแก แกแแกแขแแแแจแ แแ แกแแแฃแแ แแแแแกแแแแ แ แแ แแชแแกแ, แแแ แจแแ แแก แแแขแแแแ แฃแกแฃแแ แแ แแชแแกแ. แแกแแแ แกแแแแขแแ แแกแแ แแคแแฅแขแ, แ แแแแแแช แฉแแแแแ แแ แแชแแกแแก แแแแแแแกแแก pid 1-แแ (แแแจแแแแ) - แแแ แแแแก แแแแแแ 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 แกแแจแฃแแแแแแก แแซแแแแก แแแแแแขแแแก แแแฃแจแแแ แแ แแแแแ แแแแฎแแแแ แกแฎแแ แแ แแชแแกแแแแ. แแแ แแแแ, แแฅแแแ แจแแแแซแแแแ แแแแแแแแ แแแแแกแแแแ แ แกแแแแแแ แแ แแชแแกแแแแ, แแแ แจแแ แแก SIGKILL แกแแแแแแแก แฉแแแแแแ, แแแแแ แแฆแแแจแแฃแแ API-แก แแแแแงแแแแแแ.
#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 แแแแแขแแแ แจแแแซแแแแ แแแ แแแแกแขแ แแ แแแก แแแ แแแจแ, แ แแแแแแช แฃแแ แฃแแแแแงแแคแก แกแแแแแแแก แแแชแแแก แแแแแแก (policy proc_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 แแ แซแแแแแ), แแแแแแซแแฎแแแ แแแ แขแฃแแแฃแ แ แคแฃแแฅแชแแ "bool terminate(IOOptionBits options)". แกแแแแแ แแกแแ แแแแแซแแฎแแแแแ false แแแแแ แฃแแแ, แ แแแ แจแแฌแงแแแก แแแแขแแแ แแแแก แแชแแแแแแแกแแก, แ แแแ แแแแแ แแแ 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 userspace แคแฃแแฅแชแแแก โIOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);โ แแแแแงแแแแแแ. แแฅแแแ แจแแแแซแแแแ แแแแแ แฃแแแ false แแ แซแแแแแแก "terminate" แแแแแซแแฎแแแแกแแก, แกแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแก แแแแแแแชแแ "แแแแแแแแ", แแแฃ "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", แ แแช แแ แแกแฌแแ แแ.
- แกแแแแแแ แแแแแแแ แแแแ แแ แแงแ แแแฆแฌแแฃแแ, แแแ แแ แแแกแ แฃแแแแฃแแ. แแ แชแแ แแ แแ แแคแแฅแกแ แแ แแแแฎแแแแ แแแแก, แฉแแแ แแ แแแฌแแกแแแ แจแแแฆแฃแแแแแก.
แแแกแแแแ
แจแแแฃแจแแแแแฃแแ แฃแกแแคแ แแฎแแแแแก แแแแแฌแงแแแขแแแแแแแแก แแแแแแแ แแแแฎแแแ แแแแแก แแ แแแกแ แแแแแชแแแแแแก แฃแกแแคแ แแฎแแแแแก แแแแแก แแแแฆแแแแ. แแ แแแก แแฎแ แแ, แแ แแแแแแก แแแแฆแฌแแแ Acronis แแ แแแ แแแฃแแ แแ แแแฃแฅแขแแก แจแแแฃแจแแแแแแ, แ แแแแแแช แฎแฃแ แแแก แแ แแแฃแชแแแแแแแก, แกแแแแช แแแแแ แแแแ แแชแแฃแแ แกแแกแขแแแ โแกแฃแกแขแแโ. แแแแ แแก แแฎแ แแ, แฉแแแ แแ แฃแแแ แฃแแฃแแแแแแแงแแ แฃแกแแคแ แแฎแแแแแก แแ แแกแแแฅแขแแแแก แแแซแแแแ แแแ, แ แแแแแแแช แจแแแซแแแแ แแแฃแแฏแแแแกแแแก OS-แแก แแฎแแ แแก, แแแ แฃแแแขแแก, แ แแ แแกแแแ แแแฃแชแแแแแแแก แแแฎแฃแ แแ แแ แแแก แฉแแแแก แกแขแแแแแฃแ แแแแก, แ แแแแ แช แแ แแแฃแฅแขแแก. แแแฃแชแแแแแแ แแชแแแแ Apple-แแก แแ แแแฃแฅแขแแก แฃแกแแคแ แแฎแแแแแก แแฃแแแก แแ แแแคแแฅแกแแ แแ macOS 10.14.5-แจแ (https://support.apple.com/en-gb/HT210119).
แแก แงแแแแแคแแ แ แจแแแซแแแแ แแแแแแแแก แแฎแแแแ แแ แจแแแแฎแแแแแจแ, แแฃ แแฅแแแแ แแ แแแ แแแ แแคแแชแแแแฃแ แแ แแแแแกแขแแแแ แแแฃแแแ แแแ แแแจแ. แแแฃ, แแ แแ แกแแแแแก แแกแแแ แฎแแ แแแแแแ แแแ แ แแ แแ แแกแแกแฃแ แแแแ แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแแกแแแแก. แแฃแแชแ, แ แแแแ แช แฎแแแแแ, แแแแแขแแแฃแ แ แแ แแแ แแแแแแก แแแชแแแช แแ, แ แแแแ แแชแแ แแแขแแแแ แฃแกแ แแ แกแแ แแแแ แแ แกแแกแขแแแแแ, แแแแแฎแแแก แแฃแจแแแแแก. แแแแ แแ แแฎแแ MacOS-แแกแแแแก Acronis-แแก แแฎแแ แแ แแแฃแฅแขแแแก แแฅแแแแแ แแแแแขแแแแแ แแแชแแ แกแแกแขแแแแแแ แแแแแแขแแแ แแแแกแแแ.
แฌแงแแ แ: www.habr.com