{"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\/nl\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","title":{"rendered":"Hoe processen en kernelextensies in macOS te beschermen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, Habr! Vandaag wil ik het hebben over hoe je processen kunt beschermen tegen aanvallen van kwaadwillenden in macOS. Dit is bijvoorbeeld nuttig voor antivirusprogramma's of back-upsystemen, vooral gezien het feit dat er in macOS verschillende manieren zijn om een proces te 'doden'. Lees verder voor meer informatie over dit onderwerp en beschermingstechnieken.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/acronis\/blog\/497714\/\"><img decoding=\"async\" alt=\"Hoe processen en kernelextensies in macOS te beschermen\" 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>De klassieke manier om een proces te 'doden'<\/h3>\n<p>\nEen bekende manier om een proces te 'doden' is door een SIGKILL-signaal naar het proces te sturen. Via bash kun je standaardcommando's zoals 'kill -SIGKILL PID' of 'pkill -9 NAME' gebruiken om dit te doen. Het 'kill'-commando is al bekend sinds de tijd van UNIX en is beschikbaar, niet alleen in macOS, maar ook op andere UNIX-achtige systemen.<\/p>\n<p>Net als in UNIX-achtige systemen, staat macOS het onderscheppen van alle signalen naar een proces toe, behalve twee: SIGKILL en SIGSTOP. In dit artikel zullen we ons voornamelijk richten op het SIGKILL-signaal, dat het doden van een proces in gang zet.<\/p>\n<h3>Specifiek voor macOS<br \/>\n<\/h3>\n<p>\nIn macOS roept de systeemaanroep kill in de XNU-kernel de functie psignal(SIGKILL,&#8230;) aan. Laten we eens kijken welke andere acties van de gebruiker in de gebruikersruimte de functie psignal kunnen aanroepen. We zullen de aanroepen van de functie psignal in de interne mechanismen van de kernel uitsluiten (hoewel deze ook niet triviaal kunnen zijn, laten we ze voor een ander artikel \ud83d\ude42 \u2014 handtekeningcontrole, geheugenfouten, verwerking van exit\/terminate, beveiligingsinbreuk op bestanden, enz.) <\/p>\n<p>Laten we beginnen met een overzicht van de functie en de bijbehorende systeemaanroep <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/kern_sig.c#L1672\">terminate_with_payload<\/a><\/noindex>. Het is duidelijk dat naast de klassieke kill-aanroep er een alternatieve aanpak bestaat die specifiek is voor het besturingssysteem macOS en niet voorkomt in BSD. De werkprincipes van beide systeemaanroepen zijn ook vergelijkbaar. Ze zijn directe aanroepen van de kernelfunctie psignal. Laten we ook opmerken dat v\u00f3\u00f3r het doden van een proces er een controle 'cansignal' wordt uitgevoerd \u2013 kan het proces een signaal naar een ander proces sturen? Het systeem staat het niet toe dat een willekeurige applicatie systeemprocessen kan doden.<\/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\n\t\t\/*\n\t\t * psignal_thread_with_reason() zal een SIGKILL naar de opgegeven thread versturen of\n\t\t * terugkeren als de thread en\/of taak al aan het be\u00ebindigen is. Hoe dan ook, de\n\t\t * huidige thread zal niet terugkeren naar de gebruikersruimte.\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>\nDe standaardmethode voor het cre\u00ebren van daemonprocessen bij het opstarten van het systeem en het beheren van hun levensduur is launchd. Ik wil opmerken dat de bronbestanden betrekking hebben op een oude versie van launchctl v\u00f3\u00f3r macOS 10.10, en de codevoorbeelden dienen ter illustratie. De moderne launchctl verstuurt signalen naar launchd via XPC, de logica van launchctl is daarin overgenomen.<\/p>\n<p>Laten we bekijken hoe applicaties precies worden gestopt. Voordat het SIGTERM-signaal wordt verzonden, probeert het systeem de applicatie te stoppen met de systeemaanroep \u201cproc_terminate\u201d.<\/p>\n<pre><code class=\"cpp\">...\n\terror = proc_terminate(j-&gt;p, &amp;sig);\n\tif (error) {\n\t\tjob_log(j, LOG_ERR | LOG_CONSOLE, \"Kon taak niet be\u00ebindigen: %d: %s\", error, strerror(error));\n\t\tjob_log(j, LOG_NOTICE | LOG_CONSOLE, \"Gebruik fallbackoptie om taak te be\u00ebindigen...\");\n\t\terror = kill2(j-&gt;p, SIGTERM);\n\t\tif (error) {\n\t\t\tjob_log(j, LOG_ERR, \"Kon taak niet signaleren: %d: %s\", error, strerror(error));\n\t\t} \n...\n<\/code><\/pre>\n<p>\nOndanks zijn naam kan proc_terminate, onder de motorkap, niet alleen psignal met SIGTERM versturen, maar ook SIGKILL.<\/p>\n<h3>Indirecte be\u00ebindiging \u2014 beperking op middelen<\/h3>\n<p>\nEen interessanter geval kan worden gezien in een andere systeemaanroep <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L652\">process_policy<\/a><\/noindex>. Standaard gebruik van deze systeemaanroep is het beperken van de middelen van applicaties, bijvoorbeeld voor een indexeerprogramma de beperking op de quotum van de verwerkte tijd en het geheugen, zodat het systeem niet aanzienlijk vertraagd wordt door het cachen van bestanden. Als de applicatie de beperking op middelen bereikt, zoals te zien is in de functie proc_apply_resource_actions, wordt het proces een SIGKILL-signaal verzonden.<\/p>\n<p>Hoewel deze systeemaanroep potentieel processen kan be\u00ebindigen, heeft het systeem de rechten van het proces dat de systeemaanroep doet niet adequaat gecontroleerd. In feite bestond de controle <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L267\">voordien<\/a><\/noindex>, maar het is voldoende om de alternatieve vlag PROC_POLICY_ACTION_SET te gebruiken om deze voorwaarde te omzeilen.<\/p>\n<p>Als we hier de CPU-gebruikquota voor een toepassing \u201cbeperken\u201d (bijvoorbeeld alleen 1 ns toestaan), kunnen we elk proces in het systeem be\u00ebindigen. Zo kan malware elk proces op het systeem be\u00ebindigen, inclusief dat van antivirussoftware. Ook interessant is het effect bij het be\u00ebindigen van het proces met pid 1 (launchctl) \u2014 kernel panic bij het proberen een SIGKILL-signaal te verwerken \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Hoe processen en kernelextensies in macOS te beschermen\" src=\"\/wp-content\/uploads\/2020\/04\/46adadb9b3f28b78f0b9df410e601bb9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Hoe het probleem op te lossen?<\/h3>\n<p>\nDe meest directe manier om een proces te verbieden te worden be\u00ebindigd, is door de functiepointer in de systeemaanroep-tabel te vervangen. Helaas is deze methode om verschillende redenen niet triviaal.<\/p>\n<p>Ten eerste is het symbool dat verantwoordelijk is voor de locatie van sysent in het geheugen niet alleen een privaat symbool van de XNU-kernel, maar kan het ook niet worden gevonden in de symbolen van de kernel. We moeten heuristische zoekmethoden gebruiken, zoals dynamische disassemblage van de functie en het zoeken naar de pointer daarin.<\/p>\n<p>Ten tweede hangt de structuur van de vermeldingen in de tabel af van de vlaggen waarmee de kernel is samengesteld. Als de vlag CONFIG_REQUIRES_U32_MUNGING is gedefinieerd, zal de grootte van de structuur veranderen \u2014 er wordt een extra veld toegevoegd. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/sys\/sysent.h#L45\">sy_arg_munge32<\/a><\/noindex>. Er moet een extra controle worden uitgevoerd op de vlag waarmee de kernel is gecompileerd; als alternatief kunnen de pointer naar functies vergeleken worden met bekende.<\/p>\n<pre><code class=\"cpp\">struct sysent {         \/* systeemaanroep tabel *\/\n        sy_call_t       *sy_call;       \/* uitvoerende functie *\/\n#if CONFIG_REQUIRES_U32_MUNGING || (__arm__ &amp;&amp; (__BIGGEST_ALIGNMENT__ &gt; 4))\n        sy_munge_t      *sy_arg_munge32; \/* systeemaanroep-argumenten munger voor 32-bits proces *\/\n#endif\n        int32_t         sy_return_type; \/* systeemaanroep-returntypes *\/\n        int16_t         sy_narg;        \/* aantal argumenten *\/\n        uint16_t        sy_arg_bytes;   \/* Totale grootte van argumenten in bytes voor\n                                         * 32-bits systeemaanroepen\n                                         *\/\n};\n<\/code><\/pre>\n<p>\nGelukkig biedt Apple in de moderne versies van macOS een nieuwe API voor procesbeheer. De Endpoint Security API stelt klanten in staat om veel verzoeken aan andere processen te autoriseren. Zo kunnen alle signalen naar processen worden geblokkeerd, inclusief het SIGKILL-signaal met behulp van de eerder genoemde API.<\/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>\nOp dezelfde manier kan in de kernel een MAC-beleid worden geregistreerd, dat een beschermingsmethode tegen signalen biedt (policy proc_check_signal), maar deze API wordt niet officieel ondersteund.<\/p>\n<h3>Bescherming van de kernelextensie<\/h3>\n<p>\nNaast de bescherming van processen in het systeem is ook de bescherming van de kernelextensie (kext) noodzakelijk. macOS biedt ontwikkelaars een framework voor het gemakiger ontwikkelen van IOKit apparaatstuurprogramma's. Naast middelen voor het werken met apparaten, biedt IOKit methoden voor driver stacking via instanties van C++ klassen. Een applicatie in de userspace kan een geregistreerde klasseninstantie 'vinden' om verbinding te maken tussen de kernel en de userspace.<\/p>\n<p>Voor het detecteren van het aantal klasseninstanties in het systeem is er de utiliteit ioclasscount.<\/p>\n<pre><code class=\"cpp\">my_kext_ioservice = 1\nmy_kext_iouserclient = 1\n<\/code><\/pre>\n<p>\nElke kernelextensie die zich wil registreren in de driver stack, moet een klasse defini\u00ebren die is afgeleid van IOService, bijvoorbeeld my_kext_ioservice in dit geval. Het aansluiten van gebruikersapplicaties resulteert in het cre\u00ebren van een nieuwe instantie van een klasse, die is afgeleid van IOUserClient, in ons voorbeeld my_kext_iouserclient.<\/p>\n<p>Bij het proberen om een driver uit het systeem te ontladen (commando kextunload) wordt de virtuele functie \u201cbool terminate(IOOptionBits options)\u201d aangeroepen. Het is voldoende om false terug te geven bij het aanroepen van de terminate functie bij een ontlaadpoging om kextunload te verbieden.<\/p>\n<pre><code class=\"cpp\">bool Kext::terminate(IOOptionBits options)\n{\n\n  if (!IsUnloadAllowed)\n  {\n    \/\/ Ontladen is niet toegestaan, false retourneren\n    return false;\n  }\n\n  return super::terminate(options);\n}\n\n<\/code><\/pre>\n<p>\nDe vlag IsUnloadAllowed kan door IOUserClient worden ingesteld tijdens de laadtijd. Bij ontlaadbeperkingen zal het commando kextunload de volgende uitvoer retourneren:<\/p>\n<pre><code class=\"cpp\">admin@admins-Mac drivermanager % sudo kextunload .\\\/test.kext\nWachtwoord:\n(kernel) Kan kext my.kext.test niet verwijderen; diensten konden niet be\u00ebindigd worden - 0xe00002c7.\nNiet gelukt om my.kext.test te ontladen - (iokit\/common) niet-ondersteunde functie.\n<\/code><\/pre>\n<p>\nEen soortgelijke bescherming moet ook voor IOUserClient worden uitgevoerd. Instanties van klassen kunnen worden ontladen via de userspace functie IOKitLib \u201cIOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);\u201d. Men kan false retourneren bij het aanroepen van het commando \u201cterminate\u201d totdat de userspace applicatie 'sterft', dat wil zeggen totdat de functie \u201cclientDied\u201d wordt aangeroepen.<\/p>\n<h3>Bestandsbescherming<\/h3>\n<p>\nOm bestanden te beschermen, is het voldoende om de Kauth API te gebruiken, die toegang tot bestanden kan beperken. Apple biedt ontwikkelaars notificaties over verschillende gebeurtenissen in de scope; voor ons zijn de operaties KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA en KAUTH_VNODE_DELETE_CHILD belangrijk. Toegang tot bestanden kan het beste op basis van het pad worden beperkt \u2014 we gebruiken de API \u201cvn_getpath\u201d om het pad naar het bestand te verkrijgen en vergelijken het padprefix. Merk op dat het systeem, om het hernoemen van mappen met bestanden te optimaliseren, niet elke bestandstoegang autoriseert, maar alleen toegang tot de map die is hernoemd. We moeten het bovenliggende pad vergelijken en KAUTH_VNODE_DELETE daarvoor beperken.<\/p>\n<p><img decoding=\"async\" alt=\"Hoe processen en kernelextensies in macOS te beschermen\" src=\"\/wp-content\/uploads\/2020\/04\/409cf53d1cdbeee6a6f56f5c90574bf6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEen nadeel van deze aanpak kan de lage prestaties zijn bij een toenemend aantal prefixen. Om ervoor te zorgen dat de vergelijking niet gelijk is aan O(prefix*length), waarbij prefix het aantal prefixen is en length de lengte van de string, kan een deterministische eindige automaat (DEA) worden gebruikt, gebouwd op basis van de prefixen. <\/p>\n<p>Laten we de manier bekijken om een DEA te construeren voor deze set prefixen. We initialiseren cursors aan het begin van elke prefix. Als alle cursors op hetzelfde teken wijzen, verhogen we elke cursor met \u00e9\u00e9n teken en onthouden we dat de lengte van de gelijke string met \u00e9\u00e9n is toegenomen. Als er twee cursors zijn met verschillende symbolen, splitsen we de cursors in groepen op basis van het teken waarop ze wijzen en herhalen we het algoritme voor elke groep.<\/p>\n<p>In het eerste geval (wanneer alle symbolen onder de cursors gelijk zijn) krijgen we een DEA-toestand die slechts \u00e9\u00e9n overgang heeft voor de gelijke string. In het tweede geval krijgen we een overgangstabel van 256 (aantal symbolen en maximaal aantal groepen) naar de volgende toestanden, verkregen bij een recursieve functieaanroep.<\/p>\n<p>Laten we een voorbeeld bekijken. Voor de set prefixen (\u201c\/foo\/bar\/tmp\/\u201d, \u201c\/var\/db\/foo\/\u201d, \u201c\/foo\/bar\/aba\/\u201d, \u201cfoo\/bar\/aac\/\u201d) kan de volgende DEA worden verkregen. In de afbeelding worden alleen de overgangen weergegeven die naar andere toestanden leiden; andere overgangen zijn geen eindige.<\/p>\n<p><img decoding=\"async\" alt=\"Hoe processen en kernelextensies in macOS te beschermen\" src=\"\/wp-content\/uploads\/2020\/04\/6f5c4734ee6c677749f2f7b55307549d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTijdens het doorgaan door de DEA-toestanden kunnen er 3 gevallen zijn.<\/p>\n<ol>\n<li>Het eindtoestand is bereikt \u2014 het pad is beveiligd, we beperken de operaties KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA en KAUTH_VNODE_DELETE_CHILD.<\/li>\n<li>De finale status is niet bereikt, maar het pad \u2018eindigde\u2019 (er werd een null-terminator bereikt) \u2014 het pad is parent, KAUTH_VNODE_DELETE moet worden beperkt. Opmerkelijk is dat als de vnode een map is, er een \u2018\/\u2019 aan het einde moet worden toegevoegd, anders kan er een beperking plaatsvinden naar het bestand \u2018\/foor\/bar\/t\u2019, wat onjuist is.<\/li>\n<li>De finale status is niet bereikt, het pad is niet ge\u00ebindigd. Geen van de prefixen komt overeen met wat er is gegeven, we voeren geen beperkingen in.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Conclusie<\/h3>\n<p>\nHet doel van de ontwikkelde beveiligingsoplossingen is het verhogen van het beveiligingsniveau voor de gebruiker en zijn gegevens. Enerzijds wordt dit doel bereikt door de ontwikkeling van de Acronis-software die de kwetsbaarheden afdekt waar het besturingssysteem zelf \u2018zwak\u2019 is. Anderzijds moet ook de verbetering van die beveiligingsaspecten die aan de OS-kant verbeterd kunnen worden niet worden verwaarloosd, vooral omdat het dichten van dergelijke kwetsbaarheden onze eigen weerbaarheid als product verhoogt. De kwetsbaarheid werd gerapporteerd aan het Apple Product Security Team en is verholpen in macOS 10.14.5 (https:\/\/support.apple.com\/en-gb\/HT210119).<\/p>\n<p><img decoding=\"async\" alt=\"Hoe processen en kernelextensies in macOS te beschermen\" src=\"\/wp-content\/uploads\/2020\/04\/98cd51cb47a81e8262a87bc792d59455.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDit kan alleen worden gedaan als uw hulpprogramma officieel in de kernel is ge\u00efnstalleerd. Dit betekent dat er geen achterdeurtjes zijn voor externe en ongewenste software. Echter, zoals u ziet, zelfs voor de bescherming van legitieme programma's, zoals antivirus en back-upsysteem, moet er moeite worden gedaan. Maar nu zullen de nieuwe Acronis-producten voor macOS extra bescherming hebben tegen uitloading uit het systeem.<br \/>\n<br \/>Bron: <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.3 - 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\/nl\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Hoe processen en kernel-extensies te beschermen in macOS | ProHoster","description":"Hallo, Habr! Vandaag wil ik het hebben over hoe processen te beschermen tegen aanvallen van kwaadwillenden in macOS.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/78514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=78514"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/78514\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/78515"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=78514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=78514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=78514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}