{"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\/pl\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","title":{"rendered":"Jak chroni\u0107 procesy i rozszerzenia j\u0105dra w macOS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107, Habr! Dzi\u015b chcia\u0142bym porozmawia\u0107 o tym, jak mo\u017cna chroni\u0107 procesy przed atakami z\u0142o\u015bliwych u\u017cytkownik\u00f3w w macOS. Jest to przydatne dla oprogramowania antywirusowego lub systemu kopii zapasowej, zw\u0142aszcza w \u015bwietle faktu, \u017ce w macOS istnieje kilka sposob\u00f3w na \"zabicie\" procesu. O tym oraz o metodach ochrony przeczytasz poni\u017cej.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/acronis\/blog\/497714\/\"><img decoding=\"async\" alt=\"Jak chroni\u0107 procesy i rozszerzenia j\u0105dra w 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>Klasyczny spos\u00f3b na \"zabicie\" procesu<\/h3>\n<p>\nWszyscy znaj\u0105 spos\u00f3b na \"zabicie\" procesu \u2014 wys\u0142anie sygna\u0142u SIGKILL do procesu. Przez bash mo\u017cna wywo\u0142a\u0107 standardowe \u201ekill -SIGKILL PID\u201d lub \u201epkill -9 NAZWA\u201d w celu zabicia. Komenda \u201ekill\u201d znana jest ju\u017c od czas\u00f3w UNIX i dost\u0119pna nie tylko w macOS, ale i w innych systemach podobnych do UNIX.<\/p>\n<p>Podobnie jak w systemach podobnych do UNIX, macOS pozwala przechwytywa\u0107 wszelkie sygna\u0142y do procesu z wyj\u0105tkiem dw\u00f3ch \u2014 SIGKILL i SIGSTOP. W tym artykule przede wszystkim om\u00f3wimy sygna\u0142 SIGKILL, jako sygna\u0142 prowadz\u0105cy do zabicia procesu.<\/p>\n<h3>Specyfika macOS<br \/>\n<\/h3>\n<p>\nW systemie macOS systemowe wywo\u0142anie kill w j\u0105drze XNU wywo\u0142uje funkcj\u0119 psignal(SIGKILL,&#8230;). Przyjrzyjmy si\u0119, jakie inne dzia\u0142ania u\u017cytkownika w przestrzeni u\u017cytkownika mog\u0105 wywo\u0142a\u0107 funkcj\u0119 psignal. Odrzucamy wywo\u0142ania funkcji psignal w wewn\u0119trznych mechanizmach j\u0105dra (chocia\u017c one r\u00f3wnie\u017c mog\u0105 by\u0107 niebanalne, ale zostawimy je na inn\u0105 artyku\u0142 \ud83d\ude42 \u2014 weryfikacja podpisu, b\u0142\u0119dy pami\u0119ci, obs\u0142uga exit\/terminate, naruszenie ochrony plik\u00f3w itd. <\/p>\n<p>Zacznijmy przegl\u0105d od funkcji i odpowiedniego wywo\u0142ania systemowego <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/kern_sig.c#L1672\">terminate_with_payload<\/a><\/noindex>. Wida\u0107, \u017ce opr\u00f3cz klasycznego wywo\u0142ania kill istnieje alternatywne podej\u015bcie, kt\u00f3re jest specyficzne dla systemu operacyjnego macOS i nie wyst\u0119puje w BSD. Zasady dzia\u0142ania obu wywo\u0142a\u0144 systemowych s\u0105 r\u00f3wnie\u017c zbli\u017cone. Stanowi\u0105 one bezpo\u015brednie wywo\u0142ania funkcji j\u0105dra psignal. Zwr\u00f3\u0107my r\u00f3wnie\u017c uwag\u0119, \u017ce przed zabiciem procesu wykonywana jest kontrola \u201ecansignal\u201d \u2013 czy proces mo\u017ce wys\u0142a\u0107 sygna\u0142 innemu procesowi, system nie pozwala \u017cadnej aplikacji na zabijanie proces\u00f3w systemowych na przyk\u0142ad.<\/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() will pend a SIGKILL on the specified thread or\n\t\t * return if the thread and\/or task are already terminating. Either way, the\n\t\t * current thread won't return to userspace.\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>\nStandardowym sposobem tworzenia demon\u00f3w przy uruchamianiu systemu i kontrolowania ich czasu \u017cycia jest launchd. Zwracam uwag\u0119, \u017ce podane \u017ar\u00f3d\u0142a dotycz\u0105 starej wersji launchctl sprzed macOS 10.10, a przyk\u0142ady kodu s\u0105 podane w celach ilustracyjnych. Nowoczesny launchctl wysy\u0142a sygna\u0142y do launchd za po\u015brednictwem XPC, logika launchctl zosta\u0142a w nim przeniesiona.<\/p>\n<p>Zobaczmy, jak dok\u0142adnie odbywa si\u0119 zatrzymanie aplikacji. Przed wys\u0142aniem sygna\u0142u SIGTERM, aplikacj\u0119 pr\u00f3buje si\u0119 zatrzyma\u0107 za pomoc\u0105 wywo\u0142ania systemowego \u201eproc_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, \"Nie mo\u017cna zako\u0144czy\u0107 zadania: %d: %s\", error, strerror(error));\n\t\tjob_log(j, LOG_NOTICE | LOG_CONSOLE, \"U\u017cycie opcji zapasowej, aby zako\u0144czy\u0107 zadanie...\");\n\t\terror = kill2(j-&gt;p, SIGTERM);\n\t\tif (error) {\n\t\t\tjob_log(j, LOG_ERR, \"Nie mo\u017cna sygnalizowa\u0107 zadania: %d: %s\", error, strerror(error));\n\t\t} \n...\n<\/code><\/pre>\n<p>\nPod mask\u0105 proc_terminate, mimo swojej nazwy, mo\u017ce wysy\u0142a\u0107 nie tylko psignal z SIGTERM, ale tak\u017ce SIGKILL.<\/p>\n<h3>Po\u015brednie zabijanie \u2014 ograniczenia zasob\u00f3w<\/h3>\n<p>\nBardziej interesuj\u0105cy przypadek mo\u017cna zobaczy\u0107 w innym wywo\u0142aniu systemowym <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L652\">process_policy<\/a><\/noindex>. Standardowym zastosowaniem tego wywo\u0142ania systemowego s\u0105 ograniczenia zasob\u00f3w aplikacji, na przyk\u0142ad dla indeksatora ograniczenie na czas procesora i pami\u0119\u0107, aby system nie spowolni\u0142 si\u0119 znacz\u0105co z powodu dzia\u0142a\u0144 zwi\u0105zanych z buforowaniem pliku. Je\u015bli aplikacja osi\u0105gnie limit zasob\u00f3w, jak mo\u017cna zobaczy\u0107 w funkcji proc_apply_resource_actions, to proces otrzymuje sygna\u0142 SIGKILL.<\/p>\n<p>Mimo \u017ce to wywo\u0142anie systemowe mo\u017ce potencjalnie powodowa\u0107 zabicie procesu, system nie sprawdza\u0142 odpowiednio uprawnie\u0144 procesu, kt\u00f3ry wywo\u0142uje to wywo\u0142anie systemowe. W rzeczywisto\u015bci sprawdzenie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L267\">istnia\u0142o<\/a><\/noindex>, ale wystarczy u\u017cy\u0107 alternatywnego flagu PROC_POLICY_ACTION_SET, aby obej\u015b\u0107 ten warunek.<\/p>\n<p>Je\u015bli ograniczysz kwot\u0119 u\u017cycia CPU przez aplikacj\u0119 (na przyk\u0142ad pozwalaj\u0105c na wykonanie tylko 1 ns), mo\u017cesz zabi\u0107 dowolny proces w systemie. W ten spos\u00f3b z\u0142o\u015bliwe oprogramowanie mo\u017ce zabi\u0107 ka\u017cdy proces w systemie, w tym proces antywirusowy. Zadziwiaj\u0105cy jest r\u00f3wnie\u017c efekt, kt\u00f3ry uzyskuje si\u0119 przy zabijaniu procesu z pid 1 (launchctl) \u2014 kernel panic podczas pr\u00f3by przetworzenia sygna\u0142u SIGKILL \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Jak chroni\u0107 procesy i rozszerzenia j\u0105dra w macOS\" src=\"\/wp-content\/uploads\/2020\/04\/46adadb9b3f28b78f0b9df410e601bb9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Jak rozwi\u0105za\u0107 problem?<\/h3>\n<p>\nNajprostszym sposobem na zabronienie zabicia procesu jest podmiana wska\u017anika na funkcj\u0119 w tabeli wywo\u0142a\u0144 systemowych. Niestety, metoda ta jest do\u015b\u0107 skomplikowana z wielu powod\u00f3w.<\/p>\n<p>Po pierwsze, symbol odpowiedzialny za po\u0142o\u017cenie sysent w pami\u0119ci jest nie tylko prywatnym symbolem j\u0105dra XNU, ale tak\u017ce nie mo\u017ce by\u0107 znaleziony w symbolach j\u0105dra. Nale\u017cy zastosowa\u0107 heurystyczne metody wyszukiwania, na przyk\u0142ad dynamiczne dezasemblowanie funkcji i wyszukiwanie wska\u017anika w niej.<\/p>\n<p>Po drugie, struktura rekord\u00f3w w tabeli zale\u017cy od flag, z kt\u00f3rymi zosta\u0142o zbudowane j\u0105dro. Je\u015bli zadeklarowano flag\u0119 CONFIG_REQUIRES_U32_MUNGING, to rozmiar struktury ulegnie zmianie \u2014 zostanie dodane dodatkowe pole. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/sys\/sysent.h#L45\">sy_arg_munge32<\/a><\/noindex>. Nale\u017cy przeprowadzi\u0107 dodatkow\u0105 kontrol\u0119, z jak\u0105 flag\u0105 zosta\u0142o skompilowane j\u0105dro, na przyk\u0142ad por\u00f3wnuj\u0105c wska\u017aniki na funkcje z tymi znanymi.<\/p>\n<pre><code class=\"cpp\">struct sysent {         \n        \/* tabela wywo\u0142a\u0144 systemowych *\/\n        sy_call_t       *sy_call;       \/* funkcja implementuj\u0105ca *\/\n#if CONFIG_REQUIRES_U32_MUNGING || (__arm__ &amp;&amp; (__BIGGEST_ALIGNMENT__ &gt; 4))\n        sy_munge_t      *sy_arg_munge32; \/* przetwarzane argumenty wywo\u0142ania systemowego dla proces\u00f3w 32-bitowych *\/\n#endif\n        int32_t         sy_return_type; \/* typy zwracane przez wywo\u0142ania systemowe *\/\n        int16_t         sy_narg;        \/* liczba argument\u00f3w *\/\n        uint16_t        sy_arg_bytes;   \/* Ca\u0142kowity rozmiar argument\u00f3w w bajtach dla wywo\u0142a\u0144 systemowych 32-bitowych *\/\n};\n<\/code><\/pre>\n<p>\nNa szcz\u0119\u015bcie w nowoczesnych wersjach macOS Apple udost\u0119pnia nowe API do pracy z procesami. Endpoint Security API umo\u017cliwia klientom autoryzacj\u0119 wielu zapyta\u0144 do innych proces\u00f3w. Mo\u017cna zablokowa\u0107 wszelkie sygna\u0142y do proces\u00f3w, w tym sygna\u0142 SIGKILL, za pomoc\u0105 wspomnianego powy\u017cej 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>\nPodobnie w j\u0105drze mo\u017cna zarejestrowa\u0107 polityk\u0119 MAC, kt\u00f3ra udost\u0119pnia metod\u0119 ochrony przed sygna\u0142ami (policy proc_check_signal), jednak API nie jest oficjalnie wspierane.<\/p>\n<h3>Ochrona rozszerzenia j\u0105dra<\/h3>\n<p>\nOpr\u00f3cz ochrony proces\u00f3w w systemie, niezb\u0119dna jest tak\u017ce ochrona samego rozszerzenia j\u0105dra (kext). macOS zapewnia programistom ramy do wygodnego tworzenia sterownik\u00f3w urz\u0105dze\u0144 IOKit. Opr\u00f3cz dostarczania narz\u0119dzi do pracy z urz\u0105dzeniami, IOKit zapewnia metody stakowania sterownik\u00f3w (driver stacking) za pomoc\u0105 instancji klas C++. Aplikacja w przestrzeni u\u017cytkownika b\u0119dzie mog\u0142a \u201eznale\u017a\u0107\u201d zarejestrowan\u0105 instancj\u0119 klasy w celu nawi\u0105zania po\u0142\u0105czenia mi\u0119dzy j\u0105drem a przestrzeni\u0105 u\u017cytkownika.<\/p>\n<p>Aby wykry\u0107 liczb\u0119 instancji klas w systemie, istnieje narz\u0119dzie ioclasscount.<\/p>\n<pre><code class=\"cpp\">my_kext_ioservice = 1\nmy_kext_iouserclient = 1\n<\/code><\/pre>\n<p>\nKa\u017cde rozszerzenie j\u0105dra, kt\u00f3re chce zarejestrowa\u0107 si\u0119 w stosie sterownik\u00f3w, musi zadeklarowa\u0107 klas\u0119 dziedzicz\u0105c\u0105 z IOService, na przyk\u0142ad my_kext_ioservice w tym przypadku. Pod\u0142\u0105czenie aplikacji u\u017cytkownika powoduje utworzenie nowej instancji klasy, kt\u00f3ra dziedziczy po IOUserClient, w przyk\u0142adzie my_kext_iouserclient.<\/p>\n<p>Podczas pr\u00f3by usuni\u0119cia sterownika z systemu (polecenie kextunload) wywo\u0142ywana jest wirtualna funkcja \u201ebool terminate(IOOptionBits options)\u201d. Wystarczy zwr\u00f3ci\u0107 false na wywo\u0142aniu funkcji terminate podczas pr\u00f3by usuni\u0119cia, aby zabroni\u0107 kextunload.<\/p>\n<pre><code class=\"cpp\">bool Kext::terminate(IOOptionBits options)\n{\n\n  if (!IsUnloadAllowed)\n  {\n    \/\/ Usuni\u0119cie nie jest dozwolone, zwracam false\n    return false;\n  }\n\n  return super::terminate(options);\n}\n\n<\/code><\/pre>\n<p>\nFlaga IsUnloadAllowed mo\u017ce by\u0107 ustawiana przez IOUserClient podczas \u0142adowania. Przy ograniczeniu na \u0142adowanie polecenie kextunload zwr\u00f3ci nast\u0119puj\u0105cy wynik:<\/p>\n<pre><code class=\"cpp\">admin@admins-Mac drivermanager % sudo kextunload .\/test.kext\nHas\u0142o:\n(kernel) Nie mo\u017cna usun\u0105\u0107 kext my.kext.test; us\u0142ugi nie zako\u0144czy\u0142y dzia\u0142ania - 0xe00002c7.\nNie uda\u0142o si\u0119 usun\u0105\u0107 my.kext.test - (iokit\/common) funkcja nieobs\u0142ugiwana.\n<\/code><\/pre>\n<p>\nPodobn\u0105 ochron\u0119 nale\u017cy wprowadzi\u0107 r\u00f3wnie\u017c dla IOUserClient. Instancje klas mo\u017cna usun\u0105\u0107 za pomoc\u0105 funkcji przestrzeni u\u017cytkownika IOKitLib \u201eIOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);\u201d. Mo\u017cna zwraca\u0107 false na wywo\u0142aniu polecenia \u201eterminate\u201d, dop\u00f3ki aplikacja u\u017cytkownika nie \u201eumrze\u201d, to znaczy nie zostanie wywo\u0142ana funkcja \u201eclientDied\u201d.<\/p>\n<h3>Ochrona plik\u00f3w<\/h3>\n<p>\nAby zabezpieczy\u0107 pliki, wystarczy u\u017cy\u0107 API Kauth, kt\u00f3re pozwala ogranicza\u0107 dost\u0119p do plik\u00f3w. Apple dostarcza deweloperom powiadomienia o r\u00f3\u017cnych zdarzeniach w zakresie, a dla nas wa\u017cne s\u0105 operacje KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA i KAUTH_VNODE_DELETE_CHILD. Naj\u0142atwiej ogranicza\u0107 dost\u0119p do plik\u00f3w na podstawie \u015bcie\u017cki \u2014 u\u017cywamy API \u201evn_getpath\u201d do uzyskania \u015bcie\u017cki do pliku i por\u00f3wnujemy prefiks \u015bcie\u017cki. Zauwa\u017cmy, \u017ce w celu optymalizacji zmiany nazw \u015bcie\u017cek folder\u00f3w z plikami, system nie autoryzuje dost\u0119pu do ka\u017cdego pliku, lecz tylko do samego folderu, kt\u00f3ry zosta\u0142 przemianowany. Nale\u017cy por\u00f3wnywa\u0107 rodzicielsk\u0105 \u015bcie\u017ck\u0119 i ogranicza\u0107 KAUTH_VNODE_DELETE dla niej.<\/p>\n<p><img decoding=\"async\" alt=\"Jak chroni\u0107 procesy i rozszerzenia j\u0105dra w macOS\" src=\"\/wp-content\/uploads\/2020\/04\/409cf53d1cdbeee6a6f56f5c90574bf6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWad\u0105 tego podej\u015bcia mo\u017ce by\u0107 niska wydajno\u015b\u0107 przy wzro\u015bcie liczby prefiks\u00f3w. Aby por\u00f3wnanie nie by\u0142o r\u00f3wne O(prefiks*length), gdzie prefiks to liczba prefiks\u00f3w, a length to d\u0142ugo\u015b\u0107 ci\u0105gu, mo\u017cna wykorzysta\u0107 deterministyczny automat sko\u0144czony (DKA) zbudowany na podstawie prefiks\u00f3w. <\/p>\n<p>Rozwa\u017cmy spos\u00f3b budowy DKA dla danego zestawu prefiks\u00f3w. Inicjalizujemy kursory na pocz\u0105tku ka\u017cdego prefiksu. Je\u015bli wszystkie kursory wskazuj\u0105 na ten sam symbol, zwi\u0119kszamy ka\u017cdy kursor o jeden symbol i zapami\u0119tujemy, \u017ce d\u0142ugo\u015b\u0107 wsp\u00f3lnego ci\u0105gu jest wi\u0119ksza o jednostk\u0119. Je\u015bli istniej\u0105 dwa kursory, kt\u00f3rych symbole s\u0105 r\u00f3\u017cne, dzielimy kursory na grupy wed\u0142ug symbolu, na kt\u00f3ry wskazuj\u0105 i powtarzamy algorytm dla ka\u017cdej grupy.<\/p>\n<p>W pierwszym przypadku (wszystkie symbole pod kursorami s\u0105 takie same) uzyskujemy stan DKA, kt\u00f3ry ma tylko jedno przej\u015bcie dla tego samego ci\u0105gu. W drugim przypadku uzyskujemy tabel\u0119 przej\u015b\u0107 o rozmiarze 256 (liczba symboli i maksymalna liczba grup) do kolejnych stan\u00f3w, uzyskanych przy rekursywnym wywo\u0142aniu funkcji.<\/p>\n<p>Rozwa\u017cmy przyk\u0142ad. Dla zestawu prefiks\u00f3w (\"\/foo\/bar\/tmp\/\", \"\/var\/db\/foo\/\", \"\/foo\/bar\/aba\/\", \"foo\/bar\/aac\/\") mo\u017cna uzyska\u0107 nast\u0119puj\u0105cy DKA. Na rysunku pokazano tylko przej\u015bcia prowadz\u0105ce do innych stan\u00f3w, inne przej\u015bcia nie b\u0119d\u0105 ko\u0144cowe.<\/p>\n<p><img decoding=\"async\" alt=\"Jak chroni\u0107 procesy i rozszerzenia j\u0105dra w macOS\" src=\"\/wp-content\/uploads\/2020\/04\/6f5c4734ee6c677749f2f7b55307549d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPodczas przechodzenia przez stany DKA mog\u0105 wyst\u0105pi\u0107 3 przypadki.<\/p>\n<ol>\n<li>Osi\u0105gni\u0119to stan ko\u0144cowy \u2014 \u015bcie\u017cka jest chroniona, ograniczamy operacje KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA i KAUTH_VNODE_DELETE_CHILD.<\/li>\n<li>Nie osi\u0105gni\u0119to ostatecznego stanu, ale \u015bcie\u017cka \u201ezako\u0144czy\u0142a si\u0119\u201d (osi\u0105gni\u0119to zero-terminator) \u2014 \u015bcie\u017cka jest rodzicielska, konieczne jest ograniczenie KAUTH_VNODE_DELETE. Zauwa\u017cmy, \u017ce je\u015bli vnode jest folderem, nale\u017cy doda\u0107 na ko\u0144cu \u2018\/\u2019, w przeciwnym razie mo\u017ce by\u0107 wymuszone ograniczenie do pliku \u201c\/foor\/bar\/t\u201d, co jest niepoprawne.<\/li>\n<li>Nie osi\u0105gni\u0119to ostatecznego stanu, \u015bcie\u017cka si\u0119 nie zako\u0144czy\u0142a. \u017baden z prefiks\u00f3w nie odpowiada podanym, nie wprowadzamy ogranicze\u0144.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Podsumowanie<\/h3>\n<p>\nCelem opracowywanych rozwi\u0105za\u0144 zabezpiecze\u0144 jest zwi\u0119kszenie poziomu bezpiecze\u0144stwa u\u017cytkownika i jego danych. Z jednej strony cel ten jest realizowany poprzez rozw\u00f3j produktu Acronis, kt\u00f3ry zamyka te luki, gdzie sama system operacyjny jest \u201es\u0142aby\u201d. Z drugiej strony nie nale\u017cy zaniedbywa\u0107 wzmocnienia tych aspekt\u00f3w bezpiecze\u0144stwa, kt\u00f3re mo\u017cna poprawi\u0107 po stronie systemu operacyjnego, tym bardziej \u017ce zamkni\u0119cie podobnych luk zwi\u0119ksza nasz\u0105 w\u0142asn\u0105 odporno\u015b\u0107 jako produktu. Luka zosta\u0142a zg\u0142oszona przez zesp\u00f3\u0142 zabezpiecze\u0144 produkt\u00f3w Apple i zosta\u0142a naprawiona w macOS 10.14.5 (https:\/\/support.apple.com\/en-gb\/HT210119).<\/p>\n<p><img decoding=\"async\" alt=\"Jak chroni\u0107 procesy i rozszerzenia j\u0105dra w macOS\" src=\"\/wp-content\/uploads\/2020\/04\/98cd51cb47a81e8262a87bc792d59455.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo wszystko mo\u017cna zrobi\u0107 tylko pod warunkiem, \u017ce Twoje narz\u0119dzie zosta\u0142o oficjalnie zainstalowane w j\u0105drze. Oznacza to, \u017ce dla zewn\u0119trznego i niepo\u017c\u0105danego oprogramowania nie ma takich luk. Jednak, jak widzisz, nawet dla ochrony legalnych program\u00f3w, takich jak oprogramowanie antywirusowe i system kopii zapasowych, trzeba si\u0119 napracowa\u0107. Ale za to nowe produkty Acronis dla macOS b\u0119d\u0105 mia\u0142y dodatkow\u0105 ochron\u0119 przed wy\u0142adowaniem z systemu.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Jak chroni\u0107 procesy i rozszerzenia j\u0105dra w macOS | ProHoster","description":"Cze\u015b\u0107, Habr! Dzi\u015b chcia\u0142bym porozmawia\u0107 o tym, jak mo\u017cna chroni\u0107 procesy przed atakami z\u0142o\u015bliwych u\u017cytkownik\u00f3w w macOS.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/78514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=78514"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/78514\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/78515"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=78514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=78514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=78514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}