{"id":78514,"date":"2020-04-20T01:42:32","date_gmt":"2020-04-19T23:42:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos"},"modified":"2020-04-20T01:42:32","modified_gmt":"2020-04-19T23:42:32","slug":"kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","title":{"rendered":"Hur man skyddar processer och k\u00e4rnf\u00f6rl\u00e4ngningar i macOS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej, Habr! Idag skulle jag vilja prata om hur man kan skydda processer fr\u00e5n intr\u00e5ng av illasinnade anv\u00e4ndare i macOS. Detta \u00e4r s\u00e4rskilt anv\u00e4ndbart f\u00f6r antivirusprogram eller backup-system, s\u00e4rskilt med tanke p\u00e5 att det finns flera s\u00e4tt att \"d\u00f6da\" en process under macOS. L\u00e4s mer om detta och metoderna f\u00f6r skydd nedan.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/acronis\/blog\/497714\/\"><img decoding=\"async\" alt=\"Hur man skyddar processer och k\u00e4rnf\u00f6rl\u00e4ngningar i macOS\" src=\"\/wp-content\/uploads\/2020\/04\/621276e5dd7c90dd48c34c94f3b37cf2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Klassiskt s\u00e4tt att \"d\u00f6da\" en process<\/h3>\n<p>\nEtt v\u00e4lk\u00e4nt s\u00e4tt att \"d\u00f6da\" en process \u00e4r att skicka en SIGKILL-signal till processen. Via bash kan man anv\u00e4nda de standardm\u00e4ssiga kommandona \"kill -SIGKILL PID\" eller \"pkill -9 NAME\" f\u00f6r att d\u00f6da. Kommandot \"kill\" har funnits sedan UNIX-tiden och \u00e4r tillg\u00e4ngligt inte bara i macOS utan \u00e4ven i andra UNIX-liknande system.<\/p>\n<p>Precis som i UNIX-liknande system till\u00e5ter macOS att f\u00e5nga upp alla signaler till en process f\u00f6rutom tv\u00e5 - SIGKILL och SIGSTOP. Denna artikel kommer fokusera p\u00e5 signalen SIGKILL, vilken \u00e4r den signal som orsakar att processen d\u00f6das.<\/p>\n<h3>Specifika egenskaper f\u00f6r macOS<br \/>\n<\/h3>\n<p>\n\u0412 macOS \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 kill \u0432 \u044f\u0434\u0440\u0435 XNU \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e psignal(SIGKILL,&#8230;). \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0435\u0449\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 userspace \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e psignal. \u041e\u0442\u0441\u0435\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 psignal \u0432 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u0445 \u044f\u0434\u0440\u0430 (\u0445\u043e\u0442\u044f \u0438 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438, \u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0438\u0445 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \ud83d\ude42 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438, \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 exit\/terminate, \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0449\u0438\u0442\u044b \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0442.\u043f. <\/p>\n<p>Vi b\u00f6rjar \u00f6versikten med funktionen och det motsvarande systemanropet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/kern_sig.c#L1672\">terminate_with_payload<\/a><\/noindex>. Det \u00e4r tydligt att f\u00f6rutom det klassiska kill-anropet finns det ett alternativt tillv\u00e4gag\u00e5ngss\u00e4tt som \u00e4r specifikt f\u00f6r operativsystemet macOS och som inte f\u00f6rekommer i BSD. Principerna f\u00f6r hur b\u00e5da systemanropen fungerar \u00e4r ocks\u00e5 liknande. De utg\u00f6r direkta anrop av k\u00e4rnfunktionen psignal. L\u00e5t oss ocks\u00e5 notera att innan en process d\u00f6das g\u00f6rs en kontroll av \u201ccansignal\u201d \u2013 om processen kan skicka en signal till en annan process, till\u00e5ter systemet inte att n\u00e5gon applikation d\u00f6dar systemprocesser till exempel.<\/p>\n<pre><code class=\"cpp\">static int\nterminate_with_payload_internal(struct proc *cur_proc, int target_pid, uint32_t reason_namespace,\n\t\t\t\tuint64_t reason_code, user_addr_t payload, uint32_t payload_size,\n\t\t\t\tuser_addr_t reason_string, uint64_t reason_flags)\n{\n...\n\ttarget_proc = proc_find(target_pid);\n...\n\tif (!cansignal(cur_proc, cur_cred, target_proc, SIGKILL)) {\n\t\tproc_rele(target_proc);\n\t\treturn EPERM;\n\t}\n...\n\tif (target_pid == cur_proc-&gt;p_pid) {\n\t\t\td\/*\n\t\t * psignal_thread_with_reason() kommer att l\u00e4gga en SIGKILL i k\u00f6 f\u00f6r den specificerade tr\u00e5den eller\n\t\t * \u00e5terv\u00e4nda om tr\u00e5den och\/eller uppgiften redan h\u00e5ller p\u00e5 att avslutas. P\u00e5 ett eller annat s\u00e4tt,\n\t\t * kommer den aktuella tr\u00e5den inte att \u00e5terv\u00e4nda till anv\u00e4ndarutrymmet.\n\t\t * \/\n\t\tpsignal_thread_with_reason(target_proc, current_thread(), SIGKILL, signal_reason);\n\t} else {\n\t\tpsignal_with_reason(target_proc, SIGKILL, signal_reason);\n\t}\n...\n}\n<\/code><\/pre>\n<p><\/p>\n<h3>launchd<\/h3>\n<p>\nDet standardiserade s\u00e4ttet att skapa daemoner vid systemstart och styra deras livstid \u00e4r launchd. Jag p\u00e5pekar att k\u00e4llkoden som ges \u00e4r f\u00f6r en gammal version av launchctl f\u00f6re macOS 10.10, kodexemplen ges enbart som illustration. Den moderna launchctl skickar signaler till launchd via XPC, logiken f\u00f6r launchctl har flyttats dit.<\/p>\n<p>L\u00e5t oss titta p\u00e5 hur stopp av applikationer verkligen utf\u00f6rs. Innan en SIGTERM-signal skickas f\u00f6rs\u00f6ker systemanropet \u201cproc_terminate\u201d att stoppa applikationen.<\/p>\n<pre><code class=\"cpp\">&lt;launchctl src\/core.c&gt;\n...\n\terror = proc_terminate(j-&gt;p, &amp;sig);\n\tif (error) {\n\t\tjob_log(j, LOG_ERR | LOG_CONSOLE, &quot;Could not terminate job: %d: %s&quot;, error, strerror(error));\n\t\tjob_log(j, LOG_NOTICE | LOG_CONSOLE, &quot;Using fallback option to terminate job...&quot;);\n\t\terror = kill2(j-&gt;p, SIGTERM);\n\t\tif (error) {\n\t\t\tjob_log(j, LOG_ERR, &quot;Could not signal job: %d: %s&quot;, error, strerror(error));\n\t\t} \n...\n&lt;&gt;\n<\/code><\/pre>\n<p>\nUnder huven kan proc_terminate, trots sitt namn, skicka inte bara psignal med SIGTERM, utan ocks\u00e5 SIGKILL.<\/p>\n<h3>Indirekt d\u00f6dande \u2014 resursbegr\u00e4nsning<\/h3>\n<p>\nEtt mer intressant fall kan ses i ett annat systemanrop <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L652\">process_policy<\/a><\/noindex>. Det standardiserade anv\u00e4ndandet av detta systemanrop \u00e4r resursbegr\u00e4nsningar f\u00f6r applikationer, exempelvis f\u00f6r indexerare begr\u00e4nsning av kvoten f\u00f6r processortid och minne, s\u00e5 att systemet inte avsev\u00e4rt f\u00f6rdr\u00f6js av filens cachenoteringar. Om applikationen n\u00e5r resursbegr\u00e4nsningen, som man kan se fr\u00e5n funktionen proc_apply_resource_actions, s\u00e5 skickas en SIGKILL-signal till processen.<\/p>\n<p>Trots att detta systemanrop potentiellt kan utf\u00f6ra d\u00f6dande av processen, har systemet inte korrekt kontrollerat r\u00e4ttigheterna f\u00f6r den process som kallar systemanropet. Faktum \u00e4r att kontrollen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L267\">existerade<\/a><\/noindex>, men det \u00e4r tillr\u00e4ckligt att anv\u00e4nda det alternativa flaggan PROC_POLICY_ACTION_SET f\u00f6r att kringg\u00e5 detta villkor.<\/p>\n<p>Om man \"begr\u00e4nsar\" CPU-anv\u00e4ndningen av en applikation (till exempel genom att till\u00e5ta att endast 1 ns k\u00f6rs), kan man d\u00f6da vilket process som helst i systemet. En skadlig programvara kan d\u00f6da vilken process som helst, inklusive antivirusprocessen. Det \u00e4r ocks\u00e5 intressant att notera effekten av att d\u00f6da processen med pid 1 (launchctl) \u2014 kernel panic uppst\u00e5r n\u00e4r man f\u00f6rs\u00f6ker hantera signalen SIGKILL \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Hur man skyddar processer och k\u00e4rnf\u00f6rl\u00e4ngningar i macOS\" src=\"\/wp-content\/uploads\/2020\/04\/46adadb9b3f28b78f0b9df410e601bb9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Hur l\u00f6ser man problemet?<\/h3>\n<p>\nDet mest uppenbara s\u00e4ttet att f\u00f6rhindra d\u00f6dandet av en process \u00e4r att ers\u00e4tta pekaren till funktionen i systemanropstabellen. Tyv\u00e4rr \u00e4r detta tillv\u00e4gag\u00e5ngss\u00e4tt inte trivialt av m\u00e5nga anledningar.<\/p>\n<p>F\u00f6r det f\u00f6rsta \u00e4r symbolen som ansvarar f\u00f6r sysent-positionen i minnet inte bara en privat symbol i XNU-k\u00e4rnan, utan kan ocks\u00e5 inte hittas bland k\u00e4rnsymbolerna. Man m\u00e5ste anv\u00e4nda heuristiska s\u00f6kmetoder, till exempel dynamisk disassemblage av funktionen och leta efter pekaren d\u00e4r.<\/p>\n<p>F\u00f6r det andra beror strukturen f\u00f6r poster i tabellen p\u00e5 flaggorna med vilka k\u00e4rnan har byggts. Om flaggan CONFIG_REQUIRES_U32_MUNGING har deklarerats, kommer storleken p\u00e5 strukturen att \u00e4ndras \u2014 ett extra f\u00e4lt l\u00e4ggs till. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/sys\/sysent.h#L45\">sy_arg_munge32<\/a><\/noindex>. Det \u00e4r n\u00f6dv\u00e4ndigt att utf\u00f6ra en ytterligare kontroll av vilket flagga k\u00e4rnan har kompilerats med, som ett alternativ kan man j\u00e4mf\u00f6ra pekarna till funktionerna med k\u00e4nda.<\/p>\n<pre><code class=\"cpp\">struct sysent {         \/* system call table *\/\n        sy_call_t       *sy_call;       \/* implementing function *\/\n#if CONFIG_REQUIRES_U32_MUNGING || (__arm__ &amp;&amp; (__BIGGEST_ALIGNMENT__ &gt; 4))\n        sy_munge_t      *sy_arg_munge32; \/* system call arguments munger for 32-bit process *\/\n#endif\n        int32_t         sy_return_type; \/* system call return types *\/\n        int16_t         sy_narg;        \/* number of args *\/\n        uint16_t        sy_arg_bytes;   \/* Total size of arguments in bytes for\n                                         * 32-bit system calls\n                                         *\/\n};\n<\/code><\/pre>\n<p>\nLyckligtvis erbjuder Apple i moderna versioner av macOS ett nytt API f\u00f6r arbete med processer. Endpoint Security API till\u00e5ter klienter att godk\u00e4nna m\u00e5nga f\u00f6rfr\u00e5gningar till andra processer. P\u00e5 s\u00e5 s\u00e4tt kan man blockera alla signaler till processer, inklusive signalen SIGKILL genom det ovan n\u00e4mnda API:t.<\/p>\n<pre><code class=\"cpp\">#include &lt;bsm\/libbsm.h&gt;\n#include &lt;EndpointSecurity\/EndpointSecurity.h&gt;\n#include &lt;unistd.h&gt;\n\nint main(int argc, const char * argv[]) {\n    es_client_t* cli = nullptr;\n    {\n        auto res = es_new_client(&amp;cli, ^(es_client_t * client, const es_message_t * message) {\n            switch (message-&gt;event_type) {\n                case ES_EVENT_TYPE_AUTH_SIGNAL:\n                {\n                    auto&amp; msg = message-&gt;event.signal;\n                    auto target = msg.target;\n                    auto&amp; token = target-&gt;audit_token;\n                    auto pid = audit_token_to_pid(token);\n                    printf(&quot;signal '%d' sent to pid '%d'n&quot;, msg.sig, pid);\n                    es_respond_auth_result(client, message, pid == getpid() ? ES_AUTH_RESULT_DENY : ES_AUTH_RESULT_ALLOW, false);\n                }\n                    break;\n                default:\n                    break;\n            }\n        });\n    }\n\n    {\n        es_event_type_t evs[] = { ES_EVENT_TYPE_AUTH_SIGNAL };\n        es_subscribe(cli, evs, sizeof(evs) \/ sizeof(*evs));\n    }\n\n    printf(&quot;%dn&quot;, getpid());\n    sleep(60); \/\/ could be replaced with other waiting primitive\n\n    es_unsubscribe_all(cli);\n    es_delete_client(cli);\n\n    return 0;\n}\n<\/code><\/pre>\n<p>\nP\u00e5 liknande s\u00e4tt kan man i k\u00e4rnan registrera en MAC Policy, som tillhandah\u00e5ller en metod f\u00f6r skydd mot signaler (policy proc_check_signal), men API:t st\u00f6ds inte officiellt.<\/p>\n<h3>Skydd av k\u00e4rntill\u00e4gg<\/h3>\n<p>\nF\u00f6rutom att skydda processerna i systemet \u00e4r skyddet av sj\u00e4lva k\u00e4rnexpansionen (kext) ocks\u00e5 n\u00f6dv\u00e4ndigt. macOS erbjuder ett ramverk f\u00f6r utvecklare f\u00f6r att enkelt kunna utveckla enhetsdrivrutiner med IOKit. F\u00f6rutom att tillhandah\u00e5lla verktyg f\u00f6r att arbeta med enheter m\u00f6jligg\u00f6r IOKit metoder f\u00f6r att stapla drivrutiner (driver stacking) med hj\u00e4lp av instanser av C++-klasser. Applikationen i userspace kan \"hitta\" en registrerad klassinstans f\u00f6r att etablera en koppling mellan kernel och userspace.<\/p>\n<p>F\u00f6r att uppt\u00e4cka antalet klassinstanser i systemet finns det ett verktyg som heter ioclasscount.<\/p>\n<pre><code class=\"cpp\">my_kext_ioservice = 1\nmy_kext_iouserclient = 1\n<\/code><\/pre>\n<p>\nVarje k\u00e4rnexpansion som vill registrera sig i drivrutinsstapeln m\u00e5ste deklarera en klass som \u00e4rver fr\u00e5n IOService, som i exemplet my_kext_ioservice. Anslutningen av anv\u00e4ndarapplikationer medf\u00f6r skapandet av en ny klassinstans som \u00e4rver fr\u00e5n IOUserClient, i exemplet my_kext_iouserclient.<\/p>\n<p>Vid f\u00f6rs\u00f6k att avlasta drivrutinen fr\u00e5n systemet (kommandot kextunload) anropas den virtuella funktionen \"bool terminate(IOOptionBits options)\". Det r\u00e4cker med att returnera false vid anropet av terminate-funktionen f\u00f6r att f\u00f6rhindra kextunload.<\/p>\n<pre><code class=\"cpp\">bool Kext::terminate(IOOptionBits options)\n{\n\n  if (!IsUnloadAllowed)\n  {\n    \\\/\\\/ Avlastning \u00e4r inte till\u00e5ten, returnerar false\n    return false;\n  }\n\n  return super::terminate(options);\n}\n\n<\/code><\/pre>\n<p>\nFlaggan IsUnloadAllowed kan st\u00e4llas in av IOUserClient vid laddning. Vid begr\u00e4nsningar f\u00f6r avlastning kommer kommandot kextunload att returnera f\u00f6ljande utdata:<\/p>\n<pre><code class=\"cpp\">admin@admins-Mac drivermanager % sudo kextunload .\\\/test.kext\nL\u00f6senord:\n(kernel) Kan inte ta bort kext my.kext.test; tj\u00e4nster kunde inte avslutas - 0xe00002c7.\nMisslyckades med att avlasta my.kext.test - (iokit\\\/common) otill\u00e5ten funktion.\n<\/code><\/pre>\n<p>\nEn liknande skydds\u00e5tg\u00e4rd kr\u00e4vs ocks\u00e5 f\u00f6r IOUserClient. Klassinstanser kan avlastas med anv\u00e4ndarutrymmesfunktionen IOKitLib \"IOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);\". Det g\u00e5r att returnera false vid anropet av kommandot \"terminate\" s\u00e5 l\u00e4nge anv\u00e4ndarutrymmesapplikationen inte \"d\u00f6r\", dvs. tills funktionen \"clientDied\" anropas.<\/p>\n<h3>Skydd av filer<\/h3>\n<p>\nF\u00f6r att skydda filer r\u00e4cker det att anv\u00e4nda Kauth API, vilket m\u00f6jligg\u00f6r begr\u00e4nsad \u00e5tkomst till filer. Apple erbjuder utvecklare notifikationer om olika h\u00e4ndelser i scopet, f\u00f6r oss \u00e4r viktiga operationer KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA och KAUTH_VNODE_DELETE_CHILD. Att begr\u00e4nsa \u00e5tkomst till filer \u00e4r enklast att g\u00f6ra efter s\u00f6kv\u00e4g \u2014 vi anv\u00e4nder API:et \"vn_getpath\" f\u00f6r att h\u00e4mta s\u00f6kv\u00e4gen till filen och g\u00f6r en j\u00e4mf\u00f6relse av prefixet. Observera att f\u00f6r att optimera omd\u00f6pning av s\u00f6kv\u00e4gar till mappar med filer, auktoriserar systemet inte \u00e5tkomst till varje fil, utan endast till den mapp som d\u00f6pts om. Det \u00e4r n\u00f6dv\u00e4ndigt att j\u00e4mf\u00f6ra den \u00f6verordnade s\u00f6kv\u00e4gen och begr\u00e4nsa KAUTH_VNODE_DELETE f\u00f6r den.<\/p>\n<p><img decoding=\"async\" alt=\"Hur man skyddar processer och k\u00e4rnf\u00f6rl\u00e4ngningar i macOS\" src=\"\/wp-content\/uploads\/2020\/04\/409cf53d1cdbeee6a6f56f5c90574bf6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn nackdel med detta tillv\u00e4gag\u00e5ngss\u00e4tt kan vara l\u00e5g prestanda n\u00e4r antalet prefix \u00f6kar. F\u00f6r att undvika att j\u00e4mf\u00f6relsen blir O(prefix*length), d\u00e4r prefix \u00e4r antal prefix och length \u00e4r str\u00e4ngens l\u00e4ngd, kan vi anv\u00e4nda en deterministisk \u00e4ndlig automat (DEA) byggd p\u00e5 prefix. <\/p>\n<p>L\u00e5t oss \u00f6verv\u00e4ga metoden f\u00f6r att bygga DEA f\u00f6r denna upps\u00e4ttning av prefix. Initiera pekarna i b\u00f6rjan av varje prefix. Om alla pekare pekar p\u00e5 samma symbol, \u00f6ka varje pekare med en symbol och kom ih\u00e5g att l\u00e4ngden p\u00e5 den gemensamma str\u00e4ngen \u00f6kar med en. Om det finns tv\u00e5 pekare med olika symboler, dela pekarna i grupper efter symbolen de pekar p\u00e5 och upprepa algoritmen f\u00f6r varje grupp.<\/p>\n<p>I det f\u00f6rsta fallet (n\u00e4r alla symboler under pekarna \u00e4r desamma) f\u00e5r vi ett DEA-tillst\u00e5nd som har en enda \u00f6verg\u00e5ng f\u00f6r den gemensamma str\u00e4ngen. I det andra fallet f\u00e5r vi en \u00f6verg\u00e5ngstabell av storlek 256 (antal symboler och maximalt antal grupper) f\u00f6r de f\u00f6ljande tillst\u00e5nden, erh\u00e5llna genom rekursivt anrop av funktionen.<\/p>\n<p>L\u00e5t oss \u00f6verv\u00e4ga ett exempel. F\u00f6r upps\u00e4ttningen av prefix (\u201c\/foo\/bar\/tmp\/\u201d, \u201c\/var\/db\/foo\/\u201d, \u201c\/foo\/bar\/aba\/\u201d, \u201cfoo\/bar\/aac\/\u201d) kan vi f\u00e5 f\u00f6ljande DEA. I bilden visas endast \u00f6verg\u00e5ngarna som leder till andra tillst\u00e5nd, andra \u00f6verg\u00e5ngar kommer inte att vara slutgiltiga.<\/p>\n<p><img decoding=\"async\" alt=\"Hur man skyddar processer och k\u00e4rnf\u00f6rl\u00e4ngningar i macOS\" src=\"\/wp-content\/uploads\/2020\/04\/6f5c4734ee6c677749f2f7b55307549d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e4r vi passerar genom DEA-tillst\u00e5nden kan tre fall uppst\u00e5.<\/p>\n<ol>\n<li>Det slutliga tillst\u00e5ndet har uppn\u00e5tts \u2014 v\u00e4gen \u00e4r skyddad, vi begr\u00e4nsar operationerna KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA och KAUTH_VNODE_DELETE_CHILD.<\/li>\n<li>Det slutgiltiga tillst\u00e5ndet n\u00e5ddes inte, men v\u00e4gen \"slutade\" (nollterminator n\u00e5ddes) \u2014 v\u00e4gen \u00e4r \u00f6verordnad, KAUTH_VNODE_DELETE m\u00e5ste begr\u00e4nsas. Observera att om vnode \u00e4r en mapp m\u00e5ste \"\\\/\" l\u00e4ggas till i slutet, annars kan det begr\u00e4nsas till filen \"\\\/foor\\\/bar\\\/t\", vilket \u00e4r felaktigt.<\/li>\n<li>Det slutgiltiga tillst\u00e5ndet n\u00e5ddes inte, v\u00e4gen slutade inte. Inga av prefixen matchar detta, vi inf\u00f6r inga begr\u00e4nsningar.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Slutsats<\/h3>\n<p>\nSyftet med de utvecklade s\u00e4kerhetsl\u00f6sningarna \u00e4r att h\u00f6ja niv\u00e5n p\u00e5 anv\u00e4ndars\u00e4kerhet och deras data. \u00c5 ena sidan uppn\u00e5s detta syfte genom att utveckla programvaran Acronis, som t\u00e4cker de s\u00e5rbarheter d\u00e4r operativsystemet sj\u00e4lv \u00e4r \"svagt\". \u00c5 andra sidan b\u00f6r man inte f\u00f6rbise de s\u00e4kerhetsaspekter som kan f\u00f6rb\u00e4ttras p\u00e5 OS-sidan, s\u00e4rskilt eftersom st\u00e4ngning av s\u00e5dana s\u00e5rbarheter \u00f6kar v\u00e5r egen motst\u00e5ndskraft som produkt. S\u00e5rbarheten rapporterades av Apple Product Security Team och \u00e5tg\u00e4rdades i macOS 10.14.5 (https:\/\/support.apple.com\/en-gb\/HT210119).<\/p>\n<p><img decoding=\"async\" alt=\"Hur man skyddar processer och k\u00e4rnf\u00f6rl\u00e4ngningar i macOS\" src=\"\/wp-content\/uploads\/2020\/04\/98cd51cb47a81e8262a87bc792d59455.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAllt detta kan endast g\u00f6ras om din verktyg var officiellt installerad i k\u00e4rnan. Det vill s\u00e4ga f\u00f6r extern och o\u00f6nskad mjukvara finns inga s\u00e5dana bakd\u00f6rrar. Men som du ser, \u00e4ven f\u00f6r skydd av legitima program som antivirus och backup-system, kr\u00e4vs det \u00e5tg\u00e4rder. Men nu kommer nya produkter fr\u00e5n Acronis f\u00f6r macOS att ha extra skydd mot avlastning fr\u00e5n systemet.<br \/>\n<br \/>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/acronis\/blog\/497714\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043e\u0442 \u043f\u043e\u0441\u044f\u0433\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u043e\u0432 \u0432 macOS. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0430\u043d\u0442\u0438\u0432\u0438\u0440\u0443\u0441\u0430 \u0438\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0441\u0432\u0435\u0442\u0435 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u043f\u043e\u0434 macOS \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u201c\u0443\u0431\u0438\u0442\u044c\u201d \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0437\u0430\u0449\u0438\u0442\u044b \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u201c\u0443\u0431\u0438\u0442\u044c\u201d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0412\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":78515,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-78514","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043e\u0442 \u043f\u043e\u0441\u044f\u0433\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u043e\u0432 \u0432 macOS.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u0437\u0430\u0449\u0438\u0449\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u044f\u0434\u0440\u0430 \u0432 macOS | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043e\u0442 \u043f\u043e\u0441\u044f\u0433\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u043e\u0432 \u0432 macOS.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-19T23:42:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-19T23:42:32+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Hur man skyddar processer och k\u00e4rntill\u00e4gg i macOS | ProHoster","description":"Hej, Habr! Idag skulle jag vilja prata om hur man kan skydda processer fr\u00e5n angrepp av illvilliga akt\u00f6rer i macOS.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u0437\u0430\u0449\u0438\u0449\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u044f\u0434\u0440\u0430 \u0432 macOS | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043e\u0442 \u043f\u043e\u0441\u044f\u0433\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u043e\u0432 \u0432 macOS.","og:url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-19T23:42:32+00:00","article:modified_time":"2020-04-19T23:42:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"78514","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:56:36","updated":"2022-09-28 22:19:40","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/78514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=78514"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/78514\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/78515"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=78514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=78514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=78514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}