Me pehea te tiaki i nga tukanga me nga toronga kernel i runga i te macOS

Kia ora, Habr! I tenei ra e hiahia ana ahau ki te korero me pehea e taea ai e koe te tiaki i nga tukanga mai i nga whakaeke a nga kaiwhai i te macOS. Hei tauira, he pai tenei mo te wheori, he punaha taapiri ranei, ina koa i raro i te macOS he maha nga huarahi hei "whakamate" i tetahi mahi. Pānuihia mo tenei me nga tikanga tiaki i raro i te tapahi.

Me pehea te tiaki i nga tukanga me nga toronga kernel i runga i te macOS

Ko te huarahi tawhito ki te "whakamate" i tetahi tukanga

Ko te huarahi rongonui ki te "whakamate" i tetahi tukanga ko te tuku tohu SIGKILL ki te tukanga. Na roto i te bash ka taea e koe te karanga i te paerewa "kill -SIGKILL PID" ranei "pkill -9 NAME" ki te patu. Ko te whakahau "whakamate" kua mohiotia mai i nga ra o UNIX me te waatea kaore i runga i te macOS anake, engari i etahi atu punaha rite UNIX.

Pērā i ngā pūnaha rite UNIX, ka taea e te macOS te haukoti i nga tohu ki tetahi mahi engari e rua - SIGKILL me SIGSTOP. Ko tenei tuhinga ka aro nui ki te tohu SIGKILL hei tohu e mate ai tetahi tukanga.

macOS motuhake

I runga i te macOS, ka karanga te punaha patu i roto i te pata XNU ki te mahi psignal(SIGKILL,...). Me ngana ki te kite he aha etahi atu mahi a te kaiwhakamahi i te mokowāmahi ka taea te karanga e te mahi tohu tohu. Kia whakakorehia nga waea ki te mahi tohu tohu i roto i nga tikanga o roto o te kernel (ahakoa he kore noa iho, ka waiho mo tetahi atu tuhinga 🙂 - hainatanga hainatanga, hapa mahara, putanga / whakamutua te whakahaere, nga takahi tiaki kōnae, aha atu. .

Me timata te arotake me te mahi me te waea punaha e pa ana whakamutu_me_utu. Ka taea te kite i tua atu i te piiraa whakamate matarohia, he huarahi rerekee e pa ana ki te punaha whakahaere macOS kaore e kitea i BSD. He rite ano nga tikanga whakahaere o nga waea punaha e rua. He waea tika ki te tohu mahi kernel. Kia mahara ano i mua i te patu i tetahi tukanga, ka mahia he tirotiro "kanohi" - mena ka taea e te tukanga te tuku tohu ki tetahi atu tukanga; kaore te punaha e tuku i tetahi tono ki te patu i nga tukanga punaha, hei tauira.

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);
	}
...
}

whakarewahia

Ko te huarahi paerewa ki te hanga daemons i te tiimata o te punaha me te whakahaere i o raatau oranga ka whakarewahia. Kia mahara ko nga puna mo te putanga tawhito o launchctl tae noa ki te macOS 10.10, ka whakaratohia nga tauira waehere mo nga kaupapa whakaata. Ka tukuna e te launchctl hou nga tohu whakarewa ma XPC, kua nekehia te arorau launchctl ki reira.

Kia titiro tatou me pehea te aukati i nga tono. I mua i te tuku i te tohu SIGTERM, ka ngana te tono kia mutu ma te whakamahi i te waea punaha "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));
		} 
...
<>

I raro i te hood, proc_terminate, ahakoa tona ingoa, ka taea te tuku tohu kore noa me SIGTERM, engari ano hoki a SIGKILL.

Whakamate Autaki - Tepe Rauemi

Ka kitea he keehi pai ake i tetahi atu waea punaha kaupapa_mahi. Ko te whakamahi noa o tenei waea punaha ko te whakawhāiti i nga rauemi tono, penei i te kaitaupū ki te whakawhāiti i te wa PTM me nga motunga mahara kia kore ai e tino whakaroa te punaha e nga mahi keteroki konae. Mena kua eke tetahi tono ki tona rohe rauemi, ka kitea mai i te mahi proc_apply_resource_actions, ka tukuna he tohu SIGKILL ki te mahi.

Ahakoa ka taea e tenei waea punaha te patu i tetahi tukanga, kaore te punaha i ata tirotiro i nga tika o te tukanga e karanga ana i te waea punaha. Tino arowhai i noho, engari he nui ki te whakamahi i te haki rereke PROC_POLICY_ACTION_SET ki te karo i tenei ahuatanga.

No reira, ki te "whakawhāitihia" e koe te motunga whakamahi CPU o te tono (hei tauira, kia 1 ns anake te whakahaere), ka taea e koe te patu i tetahi tukanga i roto i te punaha. Na, ka taea e te malware te patu i tetahi tukanga i runga i te punaha, tae atu ki te tukanga wheori. He mea whakamere hoki te paanga ka puta i te wa e patu ana i te mahi me te pid 1 (launchctl) - karekau te panic i te wa e ngana ana ki te tukatuka i te tohu SIGKILL :)

Me pehea te tiaki i nga tukanga me nga toronga kernel i runga i te macOS

Me pehea te whakatau i te raru?

Ko te huarahi tino ngawari ki te aukati i te mate o te tukanga ko te whakakapi i te atatohu mahi i te ripanga waea punaha. Kia aroha mai, ko tenei tikanga ehara i te mea iti mo nga take maha.

Tuatahi, ko te tohu e whakahaere ana i te waahi mahara o te sysent ehara i te mea motuhake ki te tohu pata XNU, engari kaore e kitea i roto i nga tohu kernel. Me whakamahi koe i nga tikanga rapu heuristic, penei i te wetewete i te mahi me te rapu tohu tohu kei roto.

Tuarua, ko te hanganga o nga urunga kei te ripanga e whakawhirinaki ana ki nga haki i whakahiatotia ai te kernel. Mena ka whakaatuhia te haki CONFIG_REQUIRES_U32_MUNGING, ka huri te rahi o te hanganga - ka taapirihia he mara taapiri sy_arg_munge32. He mea tika kia mahia he tirotiro taapiri hei whakatau ko wai te haki i whakahiatohia te kakano, hei rereke ranei, tirohia nga tohu tohu mahi ki nga mea e mohiotia ana.

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
                                         */
};

Waimarie, i nga putanga hou o macOS, ka whakaratohia e Apple he API hou mo te mahi me nga tukanga. Ko te Endpoint Security API ka taea e nga kiritaki te whakamana i nga tono maha ki etahi atu tukanga. Na, ka taea e koe te aukati i nga tohu ki nga mahi, tae atu ki te tohu SIGKILL, ma te whakamahi i te API kua whakahuahia ake nei.

#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;
}

Waihoki, ka taea te rehita i tetahi Kaupapahere MAC ki te kernel, e whakarato ana i te tikanga tiaki tohu (policy proc_check_signal), engari kaore i te tautokohia te API.

Parenga toronga Kernel

I tua atu i te tiaki i nga tukanga i roto i te punaha, he mea tika ano te tiaki i te toronga kernel ake (kext). Ka whakaratohia e te macOS he anga mo nga kaiwhakawhanake kia ngawari te whakawhanake i nga taraiwa taputapu IOKit. I tua atu i te whakarato taputapu mo te mahi me nga taputapu, ka whakaratohia e IOKit nga tikanga mo te taraiwa taraiwa ma te whakamahi i nga tauira o nga akomanga C++. Ka taea e tetahi tono kei te mokowākaiwhakamahi te "kitea" he tauira kua rehitatia o te karaehe hei whakatu i tetahi hononga mokowhiti-kaiwhakamahi.

Hei kite i te maha o nga tauira karaehe i roto i te punaha, kei reira te whaipainga ioclasscount.

my_kext_ioservice = 1
my_kext_iouserclient = 1

Ko nga toronga kernel e hiahia ana ki te rehita ki te taraiwa taraiwa me whakaatu he karaehe ka riro mai i te IOService, hei tauira my_kext_ioservice i tenei keehi. Ko te hono atu ki nga tono kaiwhakamahi ka hanga he tauira hou o te karaehe ka riro mai i a IOUserClient, hei tauira my_kext_iouserclient.

I te wa e ngana ana ki te wetewete i tetahi taraiwa mai i te punaha (kextunload whakahau), ka kiia te mahi mariko "whakamutua bool (kowhiringa IOOptionBits)". He nui ki te whakahoki teka i runga i te waea ki te whakamutu i te wa e ngana ana ki te wetewete ki te whakakore i te kextunload.

bool Kext::terminate(IOOptionBits options)
{

  if (!IsUnloadAllowed)
  {
    // Unload is not allowed, returning false
    return false;
  }

  return super::terminate(options);
}

Ko te haki IsUnloadAllowed ka taea te whakarite e te IOUserClient ina uta ana. Ina he rohe tango, ka whakahokia e te whakahau kextunload te putanga e whai ake nei:

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.

He rite tonu te tiaki mo IOUserClient. Ka taea te tango i nga tauira o nga karaehe ma te whakamahi i te mahinga mokowāmahi IOKitLib "IOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);". Ka taea e koe te whakahoki teka i te wa e karanga ana koe i te whakahau "mutu" tae noa ki te "mate" te tono mokowākaiwhakamahi, ara, kaore i te karangahia te mahi "clientDied".

Parenga kōnae

Hei tiaki i nga konae, he nui noa te whakamahi i te Kauth API, ka taea e koe te aukati i te uru ki nga konae. Ka whakawhiwhia e Apple ki nga kaiwhakawhanake nga whakamohiotanga mo nga momo huihuinga i roto i te whānuitanga; mo matou, he mea nui nga mahi KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA me KAUTH_VNODE_DELETE_CHILD. Ko te huarahi ngawari ki te aukati i te uru ki nga konae ma te ara - ka whakamahi matou i te API "vn_getpath" ki te tiki i te ara ki te konae me te whakataurite i te tohu tohu ara. Kia mahara ki te arotau i te whakaingoatanga o nga ara kōpaki konae, kaore te punaha e whakamana i te uru ki ia konae, engari ki te kōpaki ake kua whakaingoatia. He mea tika ki te whakataurite i te ara matua me te aukati i te KAUTH_VNODE_DELETE mo reira.

Me pehea te tiaki i nga tukanga me nga toronga kernel i runga i te macOS

Ko te kino o tenei huarahi he iti te mahi i te mea ka piki ake te maha o nga prefix. Hei whakarite kia kore e rite te whakatairite ki te O(prefix*roa), ko te prefix ko te maha o nga prefix, ko te roa te roa o te aho, ka taea e koe te whakamahi i te automaton mutunga (DFA) i hangaia e nga prefix.

Me whakaaro tatou ki tetahi tikanga mo te hanga DFA mo tetahi huinga prefix. Ka arawhiti tatou i nga pehu i te timatanga o ia prefix. Mena ka tohu nga pehu katoa ki te ahua kotahi, ka whakanuia ia pehu ki te tohu kotahi ka mahara he nui ake te roa o te raina kotahi ma te kotahi. Mena e rua nga pehu he rereke nga tohu, wehewehea nga pehu ki nga roopu i runga i te tohu e tohuhia ana ka tukuna ano te algorithm mo ia roopu.

I te keehi tuatahi (he rite nga tohu katoa i raro i nga pehu), ka whiwhi tatou i te ahua DFA kotahi noa te whakawhiti i te raina kotahi. I te take tuarua, ka whiwhi tatou i te ripanga o nga whakawhitinga o te rahi 256 (te maha o nga tohu me te maha o nga roopu) ki nga ahuatanga o muri mai ka whiwhi ma te karanga i te mahi.

Ka titiro tatou ki tetahi tauira. Mo te huinga prefix (“/foo/bar/tmp/”, “/var/db/foo/”, “/foo/bar/aba/”, “foo/bar/aac/”) ka taea e koe te tiki i nga mea e whai ake nei DFA. Ko te whika e whakaatu ana i nga whakawhitinga e ahu atu ana ki etahi atu whenua; ko etahi atu whakawhitinga karekau e mutu.

Me pehea te tiaki i nga tukanga me nga toronga kernel i runga i te macOS

I te wa e haere ana i nga whenua DKA, e 3 pea nga keehi.

  1. Kua tae ki te ahua whakamutunga - kua parea te ara, ka whakawhāitihia nga mahi KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA me KAUTH_VNODE_DELETE_CHILD
  2. Ko te ahua whakamutunga kaore i tae, engari ko te huarahi "kua mutu" (kua tae te mutunga kore) - he matua te ara, he mea tika ki te whakaiti i te KAUTH_VNODE_DELETE. Kia mahara mena he kōpaki te vnode, me taapiri he '/' ki te mutunga, ki te kore ka whakawhāitihia ki te konae “/foor/bar/t”, he he.
  3. Ko te ahua whakamutunga kaore i tae, kaore te huarahi i mutu. Kaore tetahi o nga prefix e rite ana ki tenei, kaore matou e whakauru i nga here.

mutunga

Ko te whainga o nga otinga haumarutanga e whakawhanakehia ana ko te whakanui ake i te taumata o te haumarutanga o te kaiwhakamahi me ana raraunga. I tetahi taha, ka tutuki tenei whainga ma te whanaketanga o te hua rorohiko Acronis, e kati ana i aua whakaraeraetanga kei te "ngoikore" te punaha whakahaere. I tetahi atu taha, kaua tatou e wareware ki te whakapakari i nga waahanga haumaru ka taea te whakapai ake i te taha OS, ina koa na te kati i nga whakaraeraetanga ka piki ake to maatau ake hei hua. I panuitia te whakaraeraetanga ki te Roopu Haumarutanga Hua a Apple, kua whakatikahia ki te macOS 10.14.5 (https://support.apple.com/en-gb/HT210119).

Me pehea te tiaki i nga tukanga me nga toronga kernel i runga i te macOS

Ka taea tenei katoa mena kua whakauruhia to taputapu ki roto i te kernel. Arā, karekau he pokanoa pera mo te rorohiko o waho me te kore e hiahiatia. Heoi, ka kite koe, me mahi tonu te tiaki i nga kaupapa tika penei i te wheori wheori me nga punaha. Engari inaianei ko nga hua Acronis hou mo te macOS ka whai whakamarumaru atu ki te tango mai i te punaha.

Source: will.com

Tāpiri i te kōrero