เบชเบฐเบเบฒเบเบเบต, Habr! เบกเบทเปเบเบตเปเบเปเบญเบเบขเบฒเบเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบงเบดเบเบตเบเบตเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบปเบเบเปเบญเบเบเบฐเบเบงเบเบเบฒเบเบเบฒเบเบเบฒเบเปเบเบกเบเบตเปเบเบเบเบนเปเปเบเบกเบเบตเปเบ macOS. เบชเปเบฒเบฅเบฑเบเบเบปเบงเบขเปเบฒเบ, เบเบตเปเปเบกเปเบเปเบเบฑเบเบเบฐเปเบซเบเบเบชเปเบฒเบฅเบฑเบเบฅเบฐเบเบปเบเบเปเบฒเบเปเบงเบฅเบฑเบเบซเบผเบทเบชเปเบฒเบฎเบญเบเบเปเปเบกเบนเบ, เปเบเบเบชเบฐเปเบเบฒเบฐเปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเบฒเบเปเบเป macOS เบกเบตเบซเบผเบฒเบเบงเบดเบเบตเบเบตเปเบเบฐ "เบเปเบฒ" เบเบฐเบเบงเบเบเบฒเบ. เบญเปเบฒเบเบเปเบฝเบงเบเบฑเบเปเบฅเบทเปเบญเบเบเบตเปเปเบฅเบฐเบงเบดเบเบตเบเบฒเบเบเปเบญเบเบเบฑเบเบเบฒเบเปเบเปเบเบฒเบเบเบฑเบ.
เบงเบดเบเบตเบเบฒเบเบเบฅเบฒเบชเบชเบดเบเบเบตเปเบเบฐ "เบเปเบฒ" เบเบฐเบเบงเบเบเบฒเบ
เบงเบดเบเบตเบเบตเปเบฎเบนเปเบเบฑเบเบเบฑเบเบเบตเบเบตเปเบเบฐ "เบเปเบฒ" เบเบฐเบเบงเบเบเบฒเบเปเบกเปเบเบเบฒเบเบชเบปเปเบเบชเบฑเบเบเบฒเบ SIGKILL เปเบเบซเบฒเบเบฐเบเบงเบเบเบฒเบ. เปเบเบเบเปเบฒเบ bash เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบซเบฒเบกเบฒเบเบเบฐเบเบฒเบ "เบเปเบฒ -SIGKILL PID" เบซเบผเบท "pkill -9 NAME" เปเบเบทเปเบญเบเปเบฒ. เบเปเบฒเบชเบฑเปเบ "เบเปเบฒ" เปเบเบฑเบเบเบตเปเบฎเบนเปเบเบฑเบเบเบฑเปเบเปเบเปเบชเบฐ เปเป เบเบญเบ UNIX เปเบฅเบฐเบเปเปเบเบฝเบเปเบเปเบกเบตเบขเบนเปเปเบ macOS เปเบเบปเปเบฒเบเบฑเปเบ, เปเบเปเบเบฑเบเบขเบนเปเปเบเบฅเบฐเบเบปเบเบญเบทเปเบเปเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบ UNIX.
เบเบทเบเบฑเบเบเบฑเบเปเบเบฅเบฐเบเบปเบเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบ UNIX, macOS เบเปเบงเบเปเบซเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฑเบเบเบงเบฒเบเบชเบฑเบเบเบฒเบเปเบเปเปเบเบเบฐเบเบงเบเบเบฒเบเบเบปเบเปเบงเบฑเปเบเบชเบญเบ - SIGKILL เปเบฅเบฐ SIGSTOP. เบเบปเบเบเบงเบฒเบกเบเบตเปเบเบปเปเบเบเปเบเบฐเปเบเบฑเปเบเปเบชเปเบชเบฑเบเบเบฒเบ SIGKILL เปเบเบฑเบเบชเบฑเบเบเบฒเบเบเบตเปเปเบฎเบฑเบเปเบซเปเบเบฐเบเบงเบเบเบฒเบเบเบทเบเบเปเบฒเบเบฒเบ.
เบชเบฐเปเบเบฒเบฐ macOS
เปเบ macOS, เบเบฒเบเปเบญเบตเปเบเบฅเบฐเบเบปเบ kill เปเบ kernel 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);
}
...
}
เปเบเบตเบเบเบปเบง
เบงเบดเบเบตเบเบฒเบเบกเบฒเบเบเบฐเบเบฒเบเปเบเบเบฒเบเบชเปเบฒเบ daemon เปเบเบเบญเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบฅเบฐเบเบปเบเปเบฅเบฐเบเบงเบเบเบธเบกเบเบตเบงเบดเบเบเบญเบเบเบงเบเปเบเบปเบฒเปเบกเปเบเปเบเบตเบเบเบปเบง. เบเบฐเบฅเบธเบเบฒเบฎเบฑเบเบเบฒเบเบงเปเบฒเปเบซเบผเปเบเบเปเปเบกเบนเบเปเบกเปเบเบชเปเบฒเบฅเบฑเบ launchctl เบฎเบธเปเบเปเบเบปเปเบฒเปเบเบดเบ macOS 10.10, เบเบปเบงเบขเปเบฒเบเบฅเบฐเบซเบฑเบเปเบกเปเบเบชเบฐเบซเบเบญเบเปเบซเปเปเบเบทเปเบญเบเบธเบเบเบฐเบชเบปเบเบเบปเบงเบขเปเบฒเบ. launchctl เบเบตเปเบเบฑเบเบชเบฐเปเบซเบกเบชเบปเปเบเบชเบฑเบเบเบฒเบเปเบเบตเบเบเบปเบงเบเปเบฒเบ XPC, 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));
}
...
<>
เบเบฒเบเปเบเป hood, proc_terminate, เปเบเบดเบเบงเปเบฒเบเบฐเบกเบตเบเบทเปเบเบญเบเบกเบฑเบ, เบชเบฒเบกเบฒเบเบชเบปเปเบเบเปเปเบเบฝเบเปเบเป psignal เบเบฑเบ SIGTERM, เปเบเปเบเบฑเบ SIGKILL.
เบเบฒเบเบเปเบฒเบเบฒเบเบญเปเบญเบก - เบเปเบฒเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบญเบ
เบเปเบฅเบฐเบเบตเบเบตเปเบซเบเปเบฒเบชเบปเบเปเบเบซเบผเบฒเบเบชเบฒเบกเบฒเบเปเบซเบฑเบเปเบเปเปเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเบญเบทเปเบ
เปเบเบดเบเปเบกเปเบเบงเปเบฒเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบตเปเบชเบฒเบกเบฒเบเบเปเบฒเบเบฐเบเบงเบเบเบฒเบเปเบเบซเบเบถเปเบ, เปเบเปเบฅเบฐเบเบปเบเบเปเปเปเบเปเบเบงเบเบชเบญเบเบชเบดเบเบเบดเบเบญเบเบเบฐเบเบงเบเบเบฒเบเปเบเบซเบฒเบฅเบฐเบเบปเบเบขเปเบฒเบเบเบฝเบเบเป. เบเบงเบเบชเบญเบเบเบปเบงเบเบดเบ
เบเบฑเปเบเบเบฑเปเบ, เบเปเบฒเบเปเบฒเบ "เบเปเบฒเบเบฑเบ" เปเบเบเปเบฒเบเบฒเบเบเปเบฒเปเบเป CPU เบเบญเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบ (เบเบปเบงเบขเปเบฒเบ, เบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบฝเบเปเบเป 1 ns เบเปเบฒเปเบเบตเบเบเบฒเบ), เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเบเบฐเบเบงเบเบเบฒเบเปเบเปเปเบเบฅเบฐเบเบปเบ. เบเบฑเปเบเบเบฑเปเบ, malware เบชเบฒเบกเบฒเบเบเปเบฒเบเบฐเบเบงเบเบเบฒเบเปเบเปเปเบเบฅเบฐเบเบปเบ, เบฅเบงเบกเบเบฑเบเบเบฐเบเบงเบเบเบฒเบ antivirus. เบเบฑเบเบซเบเปเบฒเบชเบปเบเปเบเปเบกเปเบเบเบปเบเบเบฐเบเบปเบเบเบตเปเปเบเบตเบเบเบทเปเบเปเบเปเบงเบฅเบฒเบเบตเปเบเปเบฒเบเบฐเบเบงเบเบเบฒเบเบเบตเปเบกเบต pid 1 (launchctl) - kernel panic เปเบเปเบงเบฅเบฒเบเบตเปเบเบฐเบเบฒเบเบฒเบกเบเบฐเบกเบงเบเบเบปเบเบชเบฑเบเบเบฒเบ SIGKILL :)
เบงเบดเบเบตเบเบฒเบเปเบเปเปเบเบเบฑเบเบซเบฒ?
เบงเบดเบเบตเบเบตเปเบเบปเบเปเบเบเบปเบเบกเบฒเบเบตเปเบชเบธเบเปเบเบทเปเบญเบเปเบญเบเบเบฑเบเบเปเปเปเบซเปเบเบฐเบเบงเบเบเบฒเบเบเบทเบเบเปเบฒเปเบกเปเบเบเบฒเบเบเบปเบเปเบเบเบเบปเบงเบเบตเปเบซเบเปเบฒเบเบตเปเบขเบนเปเปเบเบเบฒเบเบฐเบฅเบฒเบเบเบฒเบเปเบเบฅเบฐเบเบปเบ. เปเบเปเบซเบเปเบฒเปเบชเบเบเบฒเบ, เบงเบดเบเบตเบเบฒเบเบเบตเปเปเบกเปเบเบเปเปเบชเปเบฒเบเบฑเบเบชเปเบฒเบฅเบฑเบเบซเบผเบฒเบเปเบซเบเบเบปเบ.
เบเปเบฒเบญเบดเบ, เบชเบฑเบเบเบฒเบฅเบฑเบเบเบตเปเบเบงเบเบเบธเบกเบชเบฐเบเบฒเบเบเบตเปเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบญเบ sysent เบเปเปเบเบฝเบเปเบเปเปเบเบฑเบเบชเปเบงเบเบเบปเบงเบเบญเบเบชเบฑเบเบเบฒเบฅเบฑเบเปเบเปเบ XNU, เปเบเปเบเปเปเบชเบฒเบกเบฒเบเบเบปเบเปเบซเบฑเบเบขเบนเปเปเบเบชเบฑเบเบเบฒเบฅเบฑเบเบเบญเบเปเบเปเบ. เบเปเบฒเบเบเบฐเบเปเบญเบเปเบเปเบงเบดเบเบตเบเบฒเบเบเบปเปเบเบซเบฒเปเบเบ heuristic, เปเบเบฑเปเบ: เบเบฒเบเบเบญเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเปเบเบเปเบเบทเปเบญเบเปเบซเบงเปเบฅเบฐเบเบฒเบเบเบญเบเบซเบฒเบเบปเบงเบเบตเปเปเบเบกเบฑเบ.
เบญเบฑเบเบเบตเบชเบญเบ, เปเบเบเบชเปเบฒเบเบเบญเบเบฅเบฒเบเบเบฒเบเปเบเบเบฒเบเบฐเบฅเบฒเบเปเบกเปเบเบเบถเปเบเบเบฑเบเบเบธเบเบเบตเป 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 เบญเบฐเบเบธเบเบฒเบเปเบซเปเบฅเบนเบเบเปเบฒเบญเบฐเบเบธเบเบฒเบเบซเบผเบฒเบเบเปเบฒเบฎเปเบญเบเบเปเปเบซเปเบเบฑเบเบเบฐเบเบงเบเบเบฒเบเบญเบทเปเบเป. เบเบฑเปเบเบเบฑเปเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเบฐเบเบฑเบเบชเบฑเบเบเบฒเบเปเบเปเบเบตเปเบเบฐเบเปเบฒเปเบเบตเบเบเบฒเบ, เบฅเบงเบกเบเบฑเบเบชเบฑเบเบเบฒเบ 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 เบชเบฒเบกเบฒเบเบฅเบปเบเบเบฐเบเบฝเบเบขเบนเปเปเบ kernel, เปเบเบดเปเบเบชเบฐเบซเบเบญเบเบงเบดเบเบตเบเบฒเบเบเปเบญเบเบเบฑเบเบชเบฑเบเบเบฒเบ (เบเบฐเปเบเบเบฒเบ proc_check_signal), เปเบเป API เบเปเปเปเบเปเบฎเบฑเบเบเบฒเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเบขเปเบฒเบเปเบเบฑเบเบเบฒเบเบเบฒเบ.
เบเบฒเบเบเบปเบเบเปเบญเบเบชเปเบงเบเบเบฐเบซเบเบฒเบ Kernel
เบเบญเบเปเบซเบเบทเบญเบเบฒเบเบเบฒเบเบเบปเบเบเปเบญเบเบเบฐเบเบงเบเบเบฒเบเปเบเบฅเบฐเบเบปเบ, เบเบฒเบเบเบปเบเบเปเบญเบเบชเปเบงเบเบเบฐเบซเบเบฒเบเปเบเปเบเบเบญเบเบกเบฑเบเปเบญเบ (kext) เบเบฑเบเบกเบตเบเบงเบฒเบกเบเปเบฒเปเบเบฑเบ. macOS เบชเบฐเบซเบเบญเบเบเบญเบเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเปเบเบทเปเบญเบเบฑเบเบเบฐเบเบฒเปเบเปเบงเบตเบญเบธเบเบฐเบเบญเบ IOKit เปเบเปเบขเปเบฒเบเบเปเบฒเบเบเบฒเบ. เบเบญเบเปเบซเบเบทเบญเบเบฒเบเบเบฒเบเบชเบฐเบซเบเบญเบเปเบเบทเปเบญเบเบกเบทเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบญเบธเบเบฐเบเบญเบ, IOKit เบชเบฐเบซเบเบญเบเบงเบดเบเบตเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบ stacking driver เปเบเบเปเบเปเบเบปเบงเบขเปเบฒเบเบเบญเบเบซเปเบญเบเบฎเบฝเบ C ++. เปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบตเปเบขเบนเปเปเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเปเบเบฐเบชเบฒเบกเบฒเบ "เบเบญเบเบซเบฒ" เบเบปเบงเบขเปเบฒเบเบเบตเปเบฅเบปเบเบเบฐเบเบฝเบเบเบญเบเบเบฑเปเบเบฎเบฝเบเปเบเบทเปเบญเบชเปเบฒเบเบเบงเบฒเบกเบชเปเบฒเบเบฑเบเบเบฑเบ kernel-userspace.
เปเบเบทเปเบญเบเบงเบเบซเบฒเบเบณเบเบงเบเบเบญเบ class instances เปเบเบฅเบฐเบเบปเบ, เบกเบต ioclasscount utility.
my_kext_ioservice = 1
my_kext_iouserclient = 1
เบชเปเบงเบเบเบฐเบซเบเบฒเบ kernel เบเบตเปเบเปเบญเบเบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบเบเบฑเบ driver stack เบเปเบญเบเบเบฐเบเบฒเบ class เบเบตเปเบชเบทเบเบเบญเบเบกเบฒเบเบฒเบ IOService, เบเบปเบงเบขเปเบฒเบ my_kext_ioservice เปเบเบเปเบฅเบฐเบเบตเบเบตเป. เบเบฒเบเปเบเบทเปเบญเบกเบเปเปเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบญเบเบเบนเปเปเบเปเปเบฎเบฑเบเปเบซเปเบเบฒเบเบชเปเบฒเบ instance เปเปเปเบเบญเบ class เบเบตเปเบชเบทเบเบเบญเบเบกเบฒเบเบฒเบ IOUserClient, เปเบเบเบปเบงเบขเปเบฒเบ my_kext_iouserclient.
เปเบกเบทเปเบญเบเบฐเบเบฒเบเบฒเบกเบเบปเบเปเบฅเบตเบเบเบฒเบเปเบซเบผเบเปเบเปเบงเบตเบเบฒเบเบฅเบฐเบเบปเบ (เบเปเบฒเบชเบฑเปเบ kextunload), เบเบฑเบเบเบฑเบ virtual "bool terminate (IOOptionBits options)" เบเบทเบเปเบญเบตเปเบเบงเปเบฒ. เบกเบฑเบเบเบฝเบเบเปเบเบตเปเบเบฐเบเบฑเบเบเบทเบ false เปเบเบเบฒเบเปเบเปเบเบทเปเบญเบขเบธเบเปเบเปเบงเบฅเบฒเบเบตเปเบเบฐเบเบฒเบเบฒเบก unload เปเบเบทเปเบญเบเบดเบเบเบฒเบเปเบเปเบเบฒเบ 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 flag, io_name_t description);โ. เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเบปเปเบเบเบทเบเบเปเปเบกเบนเบเบเบตเปเบเปเปเบเบทเบเบเปเบญเบเปเบเปเบงเบฅเบฒเบเบตเปเปเบเบซเบฒเบเปเบฒเบชเบฑเปเบ "เบชเบดเปเบเบชเบธเบ" เบเบปเบเบเปเบงเบฒเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเป "เบเบฒเบ", เบเบฑเปเบเปเบกเปเบ, เบเบฑเบเบเบฑเบ "clientDied" เบเปเปเปเบเปเบเบทเบเปเบญเบตเปเบ.
เบเบฒเบเบเบปเบเบเปเบญเบเปเบเบฅเป
เปเบเบทเปเบญเบเบปเบเบเปเบญเบเปเบเบฅเป, เบกเบฑเบเบเบฝเบเบเปเบเบตเปเบเบฐเปเบเป Kauth API, เปเบเบดเปเบเบเปเบงเบเปเบซเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเบเบฑเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบเบฅเป. Apple เปเบซเปเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบกเบตเบเบฒเบเปเบเปเบเปเบเบทเบญเบเบเปเบฝเบงเบเบฑเบเปเบซเบเบเบฒเบเบเปเบฒเบเปเปเบเบเบญเบเปเบเบ; เบชเปเบฒเบฅเบฑเบเบเบงเบเปเบฎเบปเบฒ, เบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบ KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA เปเบฅเบฐ KAUTH_VNODE_DELETE_CHILD เปเบกเปเบเบชเปเบฒเบเบฑเบ. เบงเบดเบเบตเบเบตเปเบเปเบฒเบเบเบตเปเบชเบธเบเบเบตเปเบเบฐเบเปเบฒเบเบฑเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบเบฅเปเปเบกเปเบเปเบเบเบฒเบกเปเบชเบฑเปเบเบเบฒเบ - เบเบงเบเปเบฎเบปเบฒเปเบเป API "vn_getpath" เปเบเบทเปเบญเปเบญเบปเบฒเปเบชเบฑเปเบเบเบฒเบเปเบเบซเบฒเปเบเบฅเปเปเบฅเบฐเบเบฝเบเบเบฝเบเบเปเบฒเบเปเบฒเบซเบเปเบฒเปเบชเบฑเปเบเบเบฒเบ. เปเบซเปเบชเบฑเบเปเบเบเบงเปเบฒเปเบเบทเปเบญเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบฒเบเบเปเบฝเบเบเบทเปเบเบญเบเปเบชเบฑเปเบเบเบฒเบเปเบเปเบเบตเปเบเบฅเป, เบฅเบฐเบเบปเบเบเปเปเปเบเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเปเบเบปเปเบฒเปเบเบดเบเปเบเปเบฅเบฐเปเบเบฅเป, เปเบเปเบงเปเบฒเบเบฝเบเปเบเปเบเบฑเบเปเบเปเบเบตเบเบปเบงเบกเบฑเบเปเบญเบเบเบตเปเบเบทเบเบเปเบฝเบเบเบทเป. เบกเบฑเบเปเบเบฑเบเบชเบดเปเบเบเปเบฒเปเบเบฑเบเบเบตเปเบเบฐเบเบฝเบเบเบฝเบเปเบชเบฑเปเบเบเบฒเบเบเบญเบเบเปเปเปเบกเปเปเบฅเบฐเบเปเบฒเบเบฑเบ KAUTH_VNODE_DELETE เบชเปเบฒเบฅเบฑเบเบกเบฑเบ.
เบเปเปเปเบชเบเบเบญเบเบงเบดเบเบตเบเบฒเบเบเบตเปเบญเบฒเบเบเบฐเปเบเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเปเปเบฒเบเปเบญเบเบงเปเบฒเบเปเบฒเบเบงเบเบเปเบฒเบเปเบฒเบซเบเปเบฒเปเบเบตเปเบกเบเบถเปเบ. เปเบเบทเปเบญเปเบซเปเปเบเปเปเบเบงเปเบฒเบเบฒเบเบเบฝเบเบเบฝเบเบเปเปเปเบเบปเปเบฒเบเบฑเบ O (prefix*length), เปเบเบดเปเบเบเปเบฒเบเปเบฒเบซเบเปเบฒเปเบกเปเบเบเปเบฒเบเบงเบเบเปเบฒเบเปเบฒเบซเบเปเบฒ, เบเบงเบฒเบกเบเบฒเบงเปเบกเปเบเบเบงเบฒเบกเบเบฒเบงเบเบญเบเบชเบฒเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเปเบเป automaton finite finite (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
- เบชเบฐเบเบฒเบเบฐเบชเบธเบเบเปเบฒเบเบเปเปเปเบเปเบเบฑเบเบฅเบธ, เปเบเปเปเบชเบฑเปเบเบเบฒเบ "เบชเบดเปเบเบชเบธเบเบฅเบปเบ" (เปเบเปเปเบเบดเบเบเบธเบเบชเบดเปเบเบชเบธเบ null) - เปเบชเบฑเปเบเบเบฒเบเปเบกเปเบเบเปเปเปเบกเป, เบกเบฑเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเปเบฒเบเบฑเบ KAUTH_VNODE_DELETE. เปเบซเปเบชเบฑเบเปเบเบเบงเปเบฒเบเปเบฒ vnode เปเบเบฑเบเปเบเบเปเบเบต, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบตเปเบก '/' เปเบเบเบญเบเบเปเบฒเบ, เบเปเบฒเบเปเปเบเบฑเปเบเบเบฑเปเบเบกเบฑเบเบญเบฒเบเบเบฐเบเปเบฒเบเบฑเบเบกเบฑเบเบขเบนเปเปเบเปเบเบฅเป "/foor/bar/t", เปเบเบดเปเบเบเปเปเบเบทเบเบเปเบญเบ.
- เบฅเบฑเบเบชเบธเบเบเปเบฒเบเบเปเปเปเบเปเบเบฑเบเบฅเบธ, เปเบชเบฑเปเบเบเบฒเบเบเปเปเปเบเปเบชเบดเปเบเบชเบธเบ. เบเปเปเบกเบตเบเบณเบเบณเปเปเบฒเบญเบฑเบเปเบเบเบปเบเบเบฑเบเบญเบฑเบเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเปเปเปเบเปเปเบเบฐเบเบณเบเปเปเบเบณเบเบฑเบ.
เบชเบฐเบซเบฅเบธเบ
เปเบเบปเปเบฒเบซเบกเบฒเบเบเบญเบเบเบฒเบเปเบเปเปเบเบเบงเบฒเบกเบเบญเบเปเบเบเบตเปเบเปเบฒเบฅเบฑเบเบเบฑเบเบเบฐเบเบฒเปเบกเปเบเปเบเบทเปเบญเปเบเบตเปเบกเบฅเบฐเบเบฑเบเบเบงเบฒเบกเบเบญเบเปเบเบเบญเบเบเบนเปเปเบเปเปเบฅเบฐเบเปเปเบกเบนเบเบเบญเบเบฅเบฒเบง. เปเบเบญเบตเบเบเปเบฒเบเบซเบเบถเปเบ, เปเบเบปเปเบฒเบซเบกเบฒเบเบเบตเปเปเบกเปเบเบเบฑเบเบฅเบธเปเบเปเปเบเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเบฐเบฅเบดเบเบเบฐเบเบฑเบเบเปเปเบง Acronis, เปเบเบดเปเบเบเบดเบเบเปเบญเบเปเบซเบงเปเปเบซเบผเบปเปเบฒเบเบฑเปเบเบเบตเปเบฅเบฐเบเบปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบญเบเบกเบฑเบเปเบญเบ "เบญเปเบญเบเปเบญ". เปเบเบเบฒเบเบเบปเบเบเบฑเบเบเปเบฒเบก, เบเบงเบเปเบฎเบปเบฒเบเปเปเบเบงเบเบฅเบฐเปเบฅเบตเบเบเบฒเบเบชเปเบฒเบเบเบงเบฒเบกเปเบเบฑเปเบกเปเบเบเบเปเบฒเบเบเบงเบฒเบกเบเบญเบเปเบเปเบซเบผเบปเปเบฒเบเบฑเปเบเบเบตเปเบชเบฒเบกเบฒเบเบเบฑเบเบเบธเบเปเบเปเปเบเบเปเบฒเบ OS, เปเบเบเบชเบฐเปเบเบฒเบฐเบเบฑเบเบเบฑเปเบเปเบเปเบเบฒเบเบเบดเบเบเปเบญเบเปเบซเบงเปเบเบฑเปเบเบเปเบฒเบงเปเบเบตเปเบกเบเบงเบฒเบกเบซเบกเบฑเปเบเบเบปเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบเบฑเบเบเบฐเบฅเบดเบเบเบฐเบเบฑเบ. เบเปเบญเบเปเบซเบงเปเปเบเปเบเบทเบเบฅเบฒเบเบเบฒเบเปเบซเปเบเบตเบกเบเบฒเบเบเบงเบฒเบกเบเบญเบเปเบเบเบฐเบฅเบดเบเบเบฐเบเบฑเบ Apple เปเบฅเบฐเปเบเปเบฎเบฑเบเบเบฒเบเปเบเปเปเบเปเบ macOS 10.14.5 (https://support.apple.com/en-gb/HT210119).
เบเบฑเบเบซเบกเบปเบเบเบตเปเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบเปเบเบฝเบเปเบเปเบเปเบฒเบซเบฒเบเบงเปเบฒเบเบปเบเบเบฐเปเบซเบเบเบเบญเบเบเปเบฒเบเปเบเปเบเบทเบเบเบดเบเบเบฑเปเบเบขเปเบฒเบเปเบเบฑเบเบเบฒเบเบเบฒเบเปเบเบปเปเบฒเปเบเปเบ kernel. เบเบฑเปเบเปเบกเปเบ, เบเปเปเบกเบตเบเปเบญเบเบซเบงเปเบฒเบเบเบฑเปเบเบเปเบฒเบงเบชเปเบฒเบฅเบฑเบเบเบญเบเปเบงเบเบฒเบเบเบญเบเปเบฅเบฐเบเบตเปเบเปเปเบเปเบญเบเบเบฒเบ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเบฒเบกเบเบตเปเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบดเปเบเปเบซเบฑเบเปเบเป, เปเบเบดเบเปเบกเปเบเบงเปเบฒเบเบฒเบเบเบปเบเบเปเบญเบเปเบเบเบเบฒเบเบเบตเปเบเบทเบเบเปเบญเบเบเบฒเบกเบเบปเบเบซเบกเบฒเบเปเบเบฑเปเบ: antivirus เปเบฅเบฐเบฅเบฐเบเบปเบเบชเปเบฒเบฎเบญเบเบเปเปเบกเบนเบเบฎเบฝเบเบฎเปเบญเบเปเบซเปเบกเบตเบเบฒเบเปเบฎเบฑเบเบงเบฝเบ. เปเบเปเบเบฝเบงเบเบตเปเบเบฐเบฅเบดเบเบเบฐเบเบฑเบ Acronis เปเปเป เบชเบณ เบฅเบฑเบ macOS เบเบฐเบกเบตเบเบฒเบเบเปเบญเบเบเบฑเบเปเบเบตเปเบกเปเบเบตเบกเบเปเปเบเบฒเบเบเบญเบเบญเบญเบเบเบฒเบเบฅเบฐเบเบปเบ.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com