áááşášáááŹá፠Habrá ááŽááąáˇ macOS áážáŹ áááŻááşáááŻááşáá°áá˝áąáá˛áˇ áááŻááşáááŻááşáážáŻáá˝áąáááą ááŻááşáááşá¸á ááşáá˝áąááᯠáááşáááŻááŹáá˝ááşáááŻááşááá˛áááŻááŹááᯠáá˝áąá¸áá˝áąá¸ááťááşááŤáááşá áĽáááŹáĄáŹá¸ááźááˇáşá áááşá¸áááş antivirus áááŻáˇáááŻááş backup á áá áşáĄáá˝ááş áĄááŻáśá¸áááşáááşá áĄáá°á¸áááźááˇáş macOS áĄáąáŹááşáá˝ááş ááŻááşáááşá¸á ááşáá áşááŻááᯠ"áááşáááş" áááşá¸áááşá¸ááťáŹá¸á á˝áŹáážáááąáŹááźáąáŹááˇáşááźá áşáááşá á¤áĄááźáąáŹááşá¸áážááˇáş áĄááŹáĄáá˝ááşáááşá¸áááşá¸ááťáŹá¸ááᯠáĄáąáŹááşáá˝ááş áááşáážáŻááŤá
ááŻááşáááşá¸á ááşáá áşááŻááᯠ"áááş" áááşááášááááşáááşá¸áááşá¸
ááŻááşáááşá¸á ááşáá áşááŻááᯠâáááşáá áşáááşâ áá°ááááťáŹá¸ááąáŹáááşá¸áááşá¸áážáŹ ááŻááşáááşá¸á ááşáááŻáˇ SIGKILL áĄááťááşááźáážáŻáá áşáᯠááąá¸áááŻáˇááźááşá¸ááźá áşáááşá bash ááźááˇáş áááşáááş standard "kill -SIGKILL PID" áááŻáˇáááŻááş "pkill -9 NAME" ááŻááąáŤáşáááŻáááŻááşááŤáááşá "kill" command ááᯠUNIX áááşáááşááááşá¸á áááážáááŹá¸ááźáŽá¸ macOS áá˝ááşááŹáá áĄááźáŹá¸ááąáŹ UNIX áá˛áˇáááŻáˇááąáŹ á áá áşááťáŹá¸áá˝ááşáááşá¸ ááááŻááşááŤáááşá
UNIX áážááˇáşáá°ááąáŹá áá áşááťáŹá¸áá˝ááşáá˛áˇáááŻáˇáááşá macOS áááş SIGKILL áážááˇáş SIGSTOP áážá áşááŻáážáá˝á˛á ááŻááşáááşá¸á ááşáá áşááŻáááŻáˇ áááşáááˇáşáĄááťááşááźáážáŻááťáŹá¸ááᯠááźáŹá¸ááźááşáááŻááşá áąáááşááźá áşáááşá á¤ááąáŹááşá¸ááŤá¸áááş ááźá áşá ááşááᯠááąá áąáááˇáşáĄááťááşáĄááźá áş SIGKILL áĄááťááşááźáážáŻáĄááąáŤáş áĄááááĄáŹááŻáśá ááŻááşááŤáááşá
macOS áĄáá°á¸ááťáŹá¸
macOS áá˝ááşá XNU kernel áážá kill system call áááş psignal(SIGKILL,...) function áááŻááąáŤáşáááŻáááşá psignal ááŻááşááąáŹááşááťááşááźááˇáş userspace áá˝ááş áĄááźáŹá¸áĄááŻáśá¸ááźáŻáá° ááŻááşááąáŹááşááťááşááťáŹá¸ááᯠááźááˇáşááĄáąáŹááşá kernel ááĄáá˝ááşá¸áááŻááşá¸ááášáááŹá¸ááťáŹá¸áážá 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);
}
...
}
áá áşáá˝ážááşáááŻááşáááşá
system startup áá˝ááş daemons áááşááŽá¸áááşáážááˇáş áááşá¸áááŻáˇá áááşáááşá¸ááᯠááááşá¸ááťáŻááşáááş á áśáááşá¸áááşá¸ááᯠá áááşáááŻááşááźáŽááźá áşáááşá áĄáááşá¸áĄááźá áşááťáŹá¸áááş macOS 10.10 áĄáá launchctl ááŹá¸áážááşá¸ááąáŹááşá¸áĄáá˝ááşááźá áşááźáŽá¸á ááŻááşááá°ááŹááťáŹá¸ááᯠáááŻááşááąáŹáşáááşáĄáá˝ááş ááśáˇáááŻá¸ááąá¸ááŹá¸ááźáąáŹááşá¸ ááťáąá¸áá°á¸ááźáŻá áááááźáŻááŤá ááąááşáᎠlaunchctl áááş XPC áážáá áşáááˇáş launchd signals ááťáŹá¸ááąá¸áááŻáˇáááşá launchctl logic ááᯠáááşá¸áááŻáˇ áá˝ážáąáˇááŹá¸áááşá
áĄáááŽááąá¸áážááşá¸ááťáŹá¸ááᯠáááşáá˛áˇáááŻáˇ áááşáááˇáşááŹá¸áááşááᯠááźááˇáşááźááŤá ááŻáˇá 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 áááŻá፠ááąá¸áááŻáˇáááŻááşááŤáááşá
Indirect Kill - áĄáááşá¸áĄááźá áşáááˇáşáááşááťááş
áĄááźáŹá¸á
áá
áşááąáŤáşáááŻáážáŻáá˝ááş áááŻáááŻá
áááşáááşá
áŹá¸á
ááŹááąáŹááşá¸áááˇáş ááá
ášá
áááşááᯠáá˝áąáˇáááŻááşááŤáááşá
á¤á
áá
áşááąáŤáşáááŻáážáŻáááş ááŻááşáááşá¸á
ááşáá
áşááŻáĄáŹá¸ áááşáá
áşáááŻááşááąáŹáşáááşá¸á á
áá
áşáááş á
áá
áşááąáŤáşáááŻáážáŻááąáŤáşáááŻáááˇáş ááŻááşáááşá¸á
ááşááĄáá˝ááˇáşáĄááąá¸ááťáŹá¸ááᯠááŻáśááąáŹááşá
á˝áŹ áá
á
áşááąá¸áááŻááşáá˛áˇááŤá ááááşá
á
áşáááşá
áááŻáˇááźáąáŹááˇáş áááşáááş áĄáááŽááąá¸áážááşá¸á CPU ááŻáśá¸á á˝á˛áážáŻáá˝á˛áááşá¸ááᯠ"áááˇáşáááş" ááŹá¸ááťážááş (áĽáááŹá 1 ns ááŹáááşáááşáá˝ááˇáşááźáŻáááş) áááŻááťážááş áááşáááş á áá áşáĄáá˝ááşá¸áážá áááşáááˇáşááŻááşáááşá¸á ááşáááŻáááᯠáááşáá áşáááŻááşáááşá áááŻáˇááźáąáŹááˇáşá malware áááş antivirus ááŻááşáááşá¸á ááşáĄááŤáĄáááş system áážá áááşáááˇáşááŻááşáááşá¸á ááşáááŻáááᯠáááşáá áşáááŻááşáááşá áááŻáˇáĄááźááş á áááşáááşá áŹá¸á ááŹááąáŹááşá¸áááşáážáŹ pid 1 (launchctl) ááźááˇáş ááŻááşáááşá¸á ááşááᯠáááşáááˇáşáĄá፠ááźá áşááąáŤáşááŹáááˇáş áĄááťááŻá¸áááşááąáŹááşáážáŻ - SIGKILL áĄááťááşááźáážáŻááᯠááŻááşááąáŹááşáááˇáşáĄá፠kernel áĄááááşááááˇáşááźá áşááźááşá¸ :)
ááźáżááŹááᯠáááşáááŻááźáąáážááşá¸ááá˛á
ááŻááşáááşá¸á ááşááᯠáĄáááşáááśááĄáąáŹááş ááŹáá˝ááşáááş áĄáááŻá¸áážááşá¸ááŻáśá¸áááşá¸áááşá¸áážáŹ á áá áşááąáŤáşáááŻáážáŻáááŹá¸áážá function pointer ááᯠáĄá áŹá¸áááŻá¸ááźááşá¸ááźá áşáááşá ááśáááąáŹááşá¸á á˝áŹááźááˇáşá á¤áááşá¸áááşá¸áááş áĄááźáąáŹááşá¸áĄááťááŻá¸ááťááŻá¸ááźáąáŹááˇáş áĄááąá¸áĄáá˝á˛áááŻááşááąá
ááááŚá¸á á˝áŹá sysent ááážááşááŹááşáááşááąááŹáááŻááááşá¸ááťáŻááşáááˇáşáááşášááąááááş XNU kernel áááşášááąááĄáá˝ááşááŽá¸áááˇáşáááŻááşááąáŹáşáááşá¸ kernel áááşášááąáááťáŹá¸áá˝ááşááá˝áąáˇáááŻááşááŤá ááŻááşááąáŹááşááťááşááᯠáĄááşáááŻááşáĄáŹá¸áááŻááş áá˝á˛ááŻááşááźááşá¸áážááˇáş áááşá¸áážá áá˝ážááşááźááťááşááᯠáážáŹáá˝áąááźááşá¸áá˛áˇáááŻáˇááąáŹ áá°áá áşá ááŽááťááąáŹ áážáŹáá˝áąááąá¸áááşá¸áááşá¸ááťáŹá¸ááᯠáááşáĄááŻáśá¸ááźáŻááááşááźá áşááŤáááşá
ááŻááááĄááąááźááˇáşá áááŹá¸áážá entry ááťáŹá¸ááá˝á˛áˇá
ááşá¸ááŻáśáááş kernel ááźáŻá
áŻááŹá¸ááąáŹáĄááśááťáŹá¸ááąáŤáşáá˝ááşáá°áááşáááşá 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;
}
áĄááŹá¸áá°á áĄááťááşááźááŹáá˝ááşáážáŻáááşá¸áááşá¸ (áá°ááŤá proc_check_signal) áááŻááśáˇáááŻá¸ááąá¸áááˇáş kernel áá˝ááş MAC áá°ááŤáááᯠáážááşááŻáśáááşáááŻááşááąáŹáşáááşá¸ API áááŻáááŹá¸áááşááśáˇáááŻá¸áááŹá¸ááŤá
Kernel áááŻá¸ááťá˛áˇáážáŻááŹáá˝ááşáážáŻ
á áá áşáĄáá˝ááşá¸áážá ááŻááşáááşá¸á ááşááťáŹá¸ááᯠááŹáá˝ááşááźááşá¸áĄááźááş kernel extension áááŻááşáááŻááş (kext) ááᯠááŹáá˝ááşáááşáááşá¸ áááŻáĄááşááŤáááşá macOS áááş IOKit á ááşáá ášá ááşá¸ááááŻááşááŹááťáŹá¸ááᯠáĄáá˝ááşááá°ááŽáá˝ááşáááŻááşáááş developer ááťáŹá¸áĄáá˝ááş framework áá áşááŻááąá¸ááŹá¸áááşá á ááşáá ášá ááşá¸ááťáŹá¸áážááˇáş áĄááŻááşááŻááşáááş ááááááŹááťáŹá¸ ááśáˇáááŻá¸ááąá¸áááˇáşáĄááźááşá IOKit áááş C++ áĄáááşá¸ááťáŹá¸ááᯠáĄááŻáśá¸ááźáŻá ááááŻááşáᏠstacking áĄáá˝ááş áááşá¸áááşá¸ááťáŹá¸ááᯠááąá¸ááŤáááşá áĄááŻáśá¸ááźáŻáá°ááąááŹáážá áĄáááŽááąá¸áážááşá¸áá áşááŻáááş kernel-userspace áááşááśááąá¸ááᯠáá°ááąáŹááşáááş áĄáááşá¸á á áŹáááşá¸áá˝ááşá¸ááŹá¸ááąáŹ á áśááá°ááŹáá áşááŻááᯠâáážáŹâ áááŻááşáááşááźá áşáááşá
á áá áşáážá class instance áĄááąáĄáá˝ááşááᯠáááážááááş ioclasscount utility áážáááŤáááşá
my_kext_ioservice = 1
my_kext_iouserclient = 1
driver stack ááźááˇáş á áŹáááşá¸áá˝ááşá¸áááŻááąáŹ áááşáááˇáş kernel extension áááş IOService ááž áĄáá˝áąáááşááśááąáŹ class áá áşááŻááᯠááźáąááŹááááşááźá áşááźáŽá¸ áĽáááŹá áĽááᏠmy_kext_ioservice áááş á¤ááá ášá áááşáá˝ááş ááźá áşáááşá áĄááŻáśá¸ááźáŻáá°áĄáááŽááąá¸áážááşá¸ááťáŹá¸ááᯠááťáááşáááşááźááşá¸ááźááˇáş IOUserClient ááśááž áĄáá˝áąáááşááśááąáŹ áĄáááşá¸á instance áĄáá áşááᯠáááşááŽá¸á áąáááşá áĽááᏠmy_kext_iouserclient áá˝ááşá
á áá áş (kextunload command) ááž ááááŻááşááŹááᯠááźáŻááşááťáááş ááźááŻá¸á áŹá¸ááąáŹáĄááŤá virtual function âbool terminate(IOOptionBits options)â ááᯠááąáŤáşáááşá kextunload ááᯠdisable ááŻááşááźáŽá¸ unload ááŻááşáááŻáˇááźááŻá¸á áŹá¸áá˛áˇáĄá፠ááąáŤáşáááŻáážáŻáážáŹ false ááźááşááŹáááŻáˇ ááŻáśááąáŹááşááŤáááşá
bool Kext::terminate(IOOptionBits options)
{
if (!IsUnloadAllowed)
{
// Unload is not allowed, returning false
return false;
}
return super::terminate(options);
}
áááşáááˇáşáĄá፠IsUnloadAllowed áĄááśááᯠIOUserClient á áááşáážááşáááŻááşáááşá ááąáŤááşá¸ááŻááşáááˇáşáááşááťááşáážáááŤá kextunload command áááş áĄáąáŹááşá፠output ááᯠááźááşááąá¸ááááˇáşáááş-
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 áĄááśá io_name_t ááąáŹáşááźááťááş);â ááᯠáĄááŻáśá¸ááźáŻá áĄáááşá¸ááťáŹá¸á ááźá áşáááşááťáŹá¸ááᯠááźááşáá˝ááˇáşáááŻááşáááşá userspace áĄáááŽááąá¸áážááşá¸ "ááą" áá°ááąáŹ áĄáááášááŤááşáážáŹ "clientDied" ááŻááşááąáŹááşááťááşááᯠáááąáŤáşáááťááşá¸ "terminate" áĄááááˇáşááᯠááąáŤáşáááŻááąáŹáĄá፠áááşáááş false ááźááşááąá¸áááŻááşáááşá
áááŻááşááŹáá˝ááşááąá¸
áááŻááşááťáŹá¸áááŻááŹáá˝ááşáááşá áááŻááşááťáŹá¸áááşááąáŹááşáá˝ááˇáşáááŻáááˇáşáááşáááşáá˝ááˇáşááźáŻááąáŹ Kauth API áááŻáĄááŻáśá¸ááźáŻáááşááŻáśááąáŹááşáááşá Apple áááş áááşáááşáĄáá˝ááşá¸áážá áĄááťááŻá¸ááťááŻá¸ááąáŹ ááźá áşáááşááťáŹá¸áĄááźáąáŹááşá¸ áĄááźáąáŹááşá¸ááźáŹá¸ááťááşááťáŹá¸ááᯠááąáŹáˇááşáá˛áĄááşááťááşááŽááŹááťáŹá¸áĄáŹá¸ ááśáˇáááŻá¸ááąá¸áááşá ááťá˝ááşáŻááşáááŻáˇáĄáá˝ááşá KAUTH_VNODE_DELETEá KAUTH_VNODE_WRITE_DATA áážááˇáş KAUTH_VNODE_DELETE_CHILD ááŻááşááąáŹááşááťááşááťáŹá¸áááş áĄááąá¸ááźáŽá¸ááŤáááşá áááŻááşááťáŹá¸áááŻáˇáááşááąáŹááşáá˝ááˇáşááᯠáááˇáşáááşáááş áĄáá˝ááşáá°ááŻáśá¸áááşá¸áááşá¸áážáŹ áááşá¸ááźáąáŹááşá¸áĄáŹá¸ááźááˇáşááźá áşáááş - ááťá˝ááşáŻááşáááŻáˇáááş áááŻááşáááŻáˇáááşá¸ááźáąáŹááşá¸áááŻááá°áááşáážááˇáş áááşá¸ááźáąáŹááşá¸áážáąáˇáááşááᯠáážááŻááşá¸áážááşáááş "vn_getpath" API ááᯠáĄááŻáśá¸ááźáŻááŤáááşá áááŻááşáááŻááşáá˝á˛áááşá¸ááźáąáŹááşá¸ááťáŹá¸ááᯠáĄáááşááźáąáŹááşá¸ááźááşá¸áĄáŹá¸ áĄááąáŹááşá¸ááŻáśá¸ááźá áşáĄáąáŹááş ááŻááşááąáŹááşáááşá á áá áşáááş áááŻááşáá áşááŻá áŽáááŻáˇ áááşááąáŹááşáá˝ááˇáşááᯠáá˝ááˇáşáááźáŻááąáŹáşáááşá¸ áĄáááşááźáąáŹááşá¸ááŹá¸áááˇáş áááŻááŤáááŻááşáááŻááşáááŻáᏠáááááźáŻááŤá áááşááááşá¸ááźáąáŹááşá¸ááᯠáážááŻááşá¸áážááşááźáŽá¸ áááşá¸áĄáá˝ááş KAUTH_VNODE_DELETE ááᯠáááˇáşáááşáááş áááŻáĄááşááŤáááşá
á¤ááťááşá¸áááşáážáŻá áĄáŹá¸áááşá¸ááťááşáážáŹ áážáąáˇáááşáĄááąáĄáá˝ááş áááŻá¸ááŹáááşáážááˇáşáĄááťáž á
á˝ááşá¸ááąáŹááşáááş ááááˇáşááŤá¸áááŻááşáááşá áážááŻááşá¸áážááşáážáŻáááş O(prefix*length) áážááˇáş áááŽááťážááźáąáŹááşá¸ ááąááťáŹá
áąáááşáĄáá˝ááş áážáąáˇáááşáááş áážáąáˇáááşáĄááąáĄáá˝ááşááźá
áşááźáŽá¸á length áááş string ááĄáážááşááźá
áşáááşá áááşáááş prefix ááťáŹá¸ááźááˇáşáááşááąáŹááşááŹá¸ááąáŹ deterministic finite automaton (DFA) áááŻááŻáśá¸áááŻááşáááşá
ááąá¸ááŹá¸ááąáŹ áážáąáˇáááşáá˝á˛ááťáŹá¸áĄáá˝ááş DFA áá áşááŻááᯠáááşááąáŹááşáááş áááşá¸áááşá¸ááᯠá ááşá¸á áŹá¸ááźááˇáşááźááŤá ááŻáˇá áážáąáˇáááşáá áşááŻá áŽááĄá áá˝ááş ááŹááŹááťáŹá¸ááᯠááťá˝ááşáŻááşáááŻáˇ á áááşááŻááşááąáŹááşááŤáááşá ááŹááŹááťáŹá¸áĄáŹá¸ááŻáśá¸áááş áá°ááŽááąáŹáĄáášáááŹááᯠáá˝ážááşááźááŤáá ááŹááŹáá áşááŻá áŽááᯠáĄáášáááŹáá áşááŻá áŽááźááˇáş áááŻá¸ááźážááˇáşááźáŽá¸ áá°ááŽááąáŹá áŹááźáąáŹááşá¸ááĄááťáŹá¸áááş áá áşááŻááźáŽá¸áá áşáᯠáááŻááźáŽá¸áááşááᯠááááááŤá ááá°áá˝á˛ááźáŹá¸ááąáŹ áááşášááąáááťáŹá¸ááŤáááˇáş ááŹááŹáážá áşááŻáážáááŤáá áááşá¸áááŻáˇáá˝ážááşááźáááˇáş áááşášááąááĄáááŻááşá¸ áĄáŻááşá áŻááťáŹá¸áá˝á˛áᏠáĄáŻááşá áŻáá áşááŻá áŽáĄáá˝ááş áĄááşááááŻááŽáááşááᯠááźááşááŻááşááŤá
áááááá ášá áá˝ááş (ááŹááŹáĄáąáŹááşáážá á áŹááŻáśá¸áĄáŹá¸ááŻáśá¸áááş áá°ááŽáááş)á ááťá˝ááşáŻááşáááŻáˇáááş áá°ááŽááąáŹááťááşá¸áá áşááťážáąáŹááş áá°á¸ááźáąáŹááşá¸áážáŻáá áşááŻááŹáážáááąáŹ DFA áĄááźáąáĄááąáá áşááŻááᯠááážááááşá ááŻááááĄááźáąáĄááąáá˝ááşá ááŻááşááąáŹááşááťááşááᯠáááşááŤááá˛áá˛ááąáŤáşáááŻááźááşá¸ááźááˇáş ááážáááąáŹ ááąáŹááşáááşáá˝á˛áĄááźáąáĄááąááťáŹá¸áááŻáˇ á áŹááŻáśá¸áĄááąáĄáá˝ááş 256 (á áŹááŻáśá¸áĄááąáĄáá˝ááşáážááˇáş áĄááťáŹá¸ááŻáśá¸áĄáŻááşá áŻáĄááąáĄáá˝ááş) á áĄáá°á¸áĄááźáąáŹááşá¸áááŹá¸áá áşááŻááᯠááťá˝ááşáŻááşáááŻáˇááážááááşá
áĽáááŹáá áşááŻáááŻááźááˇáşááĄáąáŹááşá áážáąáˇáááşáá˝á˛ááťáŹá¸ (â/foo/bar/tmp/âá â/var/db/foo/âá â/foo/bar/aba/âá âfoo/bar/aac/â) áĄáąáŹááşááŤáááŻáˇááᯠáááşááááŻááşáááş DFA ááááşá¸ááááşá¸áááş áĄááźáŹá¸ááźááşáááşááťáŹá¸áááŻáˇ áŚá¸áááşááąáŹ áĄáá˝ááşáá°á¸ááźáąáŹááşá¸áážáŻááťáŹá¸áááŻáᏠááźááááşá áĄááźáŹá¸áĄáá°á¸áĄááźáąáŹááşá¸ááťáŹá¸áááş áĄááźáŽá¸áááşáááşáááŻááşááŤá
DKA ááźááşáááşáá˝áąááᯠááźááşáá˝áŹá¸áá˛áˇáĄá፠áĄáážáŻ á áážáŻ áážááááŻááşááŤáááşá
- ááąáŹááşááŻáśá¸áĄááźáąáĄááąáááŻáˇ ááąáŹááşáážááá˝áŹá¸ááŤááźáŽ - áááşá¸ááźáąáŹááşá¸ááᯠááŹáá˝ááşááŹá¸ááźáŽá¸á ááťá˝ááşáŻááşáááŻáˇáááş KAUTH_VNODE_DELETEá KAUTH_VNODE_WRITE_DATA áážááˇáş KAUTH_VNODE_DELETE_CHILD ááŻááşááąáŹááşááťááşááťáŹá¸ááᯠáááˇáşáááşááŹá¸ááŤáááşá
- ááąáŹááşááŻáśá¸áĄááźáąáĄááąáááŻáˇ áááąáŹááşááąá¸ááąáŹáşáááşá¸ "ááźáŽá¸ááŻáśá¸áááş" áááşá¸ááźáąáŹááşá¸ ( null terminator áááŻááąáŹááşáážááá˛áˇáááş) - áááşá¸ááźáąáŹááşá¸áááş áááááźá áşáááşá KAUTH_VNODE_DELETE ááᯠáááˇáşáááşáááş áááŻáĄááşááŤáááşá vnode áááş áááŻááŤáá áşááŻááźá áşááŤáá áááşáááş áĄááŻáśá¸áá˝ááş '/' ááᯠáááˇáşáááş áááŻáĄááşáááşá áááŻáˇáááŻááşááŤá áááşá¸áááş áážáŹá¸áá˝ááşá¸ááąáááˇáş áááŻááş â/foor/bar/tâ áá˝ááş áááˇáşáááşááŹá¸áááŻááşáááşááᯠáááááźáŻááŤá
- ááąáŹááşááŻáśá¸áĄááźáąáĄááąáááŻáˇ áááąáŹááşá áááşá¸ááźáąáŹááşá¸áááŻáśá¸ááŤá áážáąáˇáááşáá˝á˛ááťáŹá¸ áá áşááŻááž á¤áá áşááŻáážááˇáş áááŻááşááŽáážáŻááážáááŤá ááťá˝ááşáŻááşáááŻáˇáááş áááˇáşáááşááťááşááťáŹá¸ááᯠáááąáŹáşááźááŤá
ááąáŹááşááťááş
ááŻáśááźáŻáśááąá¸ááźáąáážááşá¸áááşá¸ááťáŹá¸ ááŽáá˝ááşááŻááşááŻááşááźááşá¸á áááşáá˝ááşááťááşáážáŹ ááŻáśá¸á á˝á˛áá°áážááˇáş áá°áááąááŹááťáŹá¸á ááŻáśááźáŻáśááąá¸áĄáááˇáşááᯠáááŻá¸ááźážááˇáşáááşááźá áşáááşá áá áşáááşáá˝ááşá áááşáááşáážáŻá áá áşáááŻááşáááŻááş âáĄáŹá¸áááşá¸â áááˇáş áĄáááŻááŤáĄáŹá¸áááşá¸ááťááşááťáŹá¸ááᯠááááşááąá¸áááˇáş Acronis ááąáŹáˇááşáá˛ááŻááşááŻááşááᯠááŽáá˝ááşááźááşá¸ááźááˇáş á¤áááşá¸áááŻááşááᯠáĄááąáŹááşáĄáááşááąáŹáşáááŻááşáááşááźá áşáááşá áá áşáááşáá˝ááşá áĄáá°á¸áááźááˇáş áĄáááŻááŤáĄáŹá¸áááşá¸ááťááşááťáŹá¸áááŻááááşááźááşá¸ááźááˇáş ááŻááşááŻááşáá áşááŻáĄááąááźááˇáş ááťá˝ááşáŻááşáááŻáˇááááŻááşáááŻááşáááşááźáááşáážáŻááᯠáááŻá¸ááźááˇáşá áąááąáŹááźáąáŹááˇáş OS áááşáá˝ááş áááŻáááŻááąáŹááşá¸áá˝ááşááŹá áąáááŻááşáááˇáş áĄáááŻááŤááŻáśááźáŻáśááąá¸ááášáááťáŹá¸ááᯠáĄáŹá¸ááąáŹááşá¸ááŹá áąáááşáĄáá˝ááş ááťá˝ááşáŻááşáááŻáˇááťá áşááťá°ááážáŻáááˇáşááŤá áĄáŹá¸áááşá¸ááťááşááᯠApple ááŻááşááŻááşááŻáśááźáŻáśááąá¸áĄáá˝á˛áˇááś áááŻááşááźáŹá¸ááŹá¸ááźáŽá¸ macOS 10.14.5 (https://support.apple.com/en-gb/HT210119) áá˝ááş ááźááşáááşááźáŽá¸ááźá áşáááşá
áááşá utility ááᯠkernel áá˝ááşáááŹá¸áááşáááˇáşáá˝ááşá¸ááŹá¸áážááŹá¤áĄááŹáĄáŹá¸ááŻáśá¸áááŻááŻááşááąáŹááşáááŻááşáááşá áááŻáááŻáááşáážáŹá ááźááşááážááˇáş ááááŻááŹá¸áĄááşááąáŹ ááąáŹáˇááşáá˛ááşááťáŹá¸áĄáá˝ááş áááŻáá˛áˇáááŻáˇááąáŹ áá˝ááşáááşááťáŹá¸ ááážáááŤá áááŻáˇááąáŹáşá áááşáá˝áąáˇááźááşááááˇáşáĄáááŻááşá¸á áááŻááşá¸áááşá
áşáážááˇáş áĄáááşá
áá
áşááťáŹá¸áá˛áˇáááŻáˇááąáŹ áááŹá¸áááşááááŻááááşááťáŹá¸ááᯠááŹáá˝ááşáááşáááş ááŻááşááąáŹááşáááş áááŻáĄááşááŤáááşá áááŻáˇááąáŹáş ááᯠmacOS áĄáá˝ááş Acronis ááŻááşááŻááşáĄáá
áşááťáŹá¸áááş á
áá
áşááž áá˝ážááˇáşááŻááşááźááşá¸ááž áááşááąáŹááşá¸ááŹáá˝ááşáážáŻ áážáááŹáááşááźá
áşáááşá
source: www.habr.com