{"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\/hr\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","title":{"rendered":"Kako za\u0161tititi procese i pro\u0161irenja jezgre u macOS-u","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Pozdrav, Habr! Danas bih razgovarao o tome kako za\u0161tititi procese od napada zlonamjernika na macOS-u. Na primjer, to je korisno za antivirusne programe ili sustave za izradu sigurnosnih kopija, pogotovo u svjetlu \u010dinjenice da u macOS-u postoji nekoliko na\u010dina kako \"ubiti\" proces. O tome i o metodama za\u0161tite pro\u010ditajte u nastavku.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/acronis\/blog\/497714\/\"><img decoding=\"async\" alt=\"Kako za\u0161tititi procese i pro\u0161irenja jezgre u macOS-u\" 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>Klasi\u010dan na\u010din \"ubijanja\" procesa<\/h3>\n<p>\nSvima poznati na\u010din \"ubijanja\" procesa je slanje SIGKILL signala procesu. Kroz bash mo\u017eete pozvati standardne \"kill -SIGKILL PID\" ili \"pkill -9 NAME\" za ubijanje. Komanda \"kill\" poznata je jo\u0161 od vremena UNIX-a i dostupna je ne samo u macOS-u, nego i na drugim UNIX-like sustavima.<\/p>\n<p>Tako\u0111er, kao i na UNIX-like sustavima, macOS omogu\u0107uje presretanje svih signala prema procesu osim dva \u2014 SIGKILL i SIGSTOP. U ovom \u010dlanku prvenstveno \u0107e se razmatrati SIGNAL SIGKILL, kao signal koji uzrokuje ubijanje procesa.<\/p>\n<h3>Specifi\u010dnost macOS-a<br \/>\n<\/h3>\n<p>\nU macOS sustav poziv sustava kill u jezgru XNU poziva funkciju psignal(SIGKILL,&#8230;). Poglemo koje sve akcije korisnika u userspace mogu pozvati funkciju psignal. Isklju\u010dit \u0107emo pozive funkcije psignal u unutarnjim mehanizmima jezgre (iako oni mogu biti komplicirani, ali ostavit \u0107emo ih za drugi \u010dlanak \ud83d\ude42 \u2014 provjera potpisa, gre\u0161ke u memoriji, obrada exit\/terminate, kr\u0161enje za\u0161tite datoteka itd. <\/p>\n<p>Zapo\u010dnimo pregled s funkcijom i odgovaraju\u0107im sustavnim pozivom <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/kern_sig.c#L1672\">terminate_with_payload<\/a><\/noindex>. Vidljivo je da, osim klasi\u010dnog poziva kill, postoji alternativni pristup specifi\u010dan za operacijski sustav macOS, koji se ne susre\u0107e u BSD-u. Principi rada oba sustavna poziva tako\u0111er su sli\u010dni. Oni predstavljaju izravne pozive funkciji jezgre psignal. Tako\u0111er, obratimo pa\u017enju na to da se prije ubijanja procesa provodi provjera \"cansignal\" \u2013 mo\u017ee li proces poslati signal drugom procesu, sustav ne dopu\u0161ta nikakvoj aplikaciji da ubija sustavne procese.<\/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() \u0107e postaviti SIGKILL na odre\u0111enu nit ili\n\t\t * \u0107e se vratiti ako je nit i\/ili zadatak ve\u0107 u postupku zavr\u0161avanja. U svakom slu\u010daju,\n\t\t * trenutna nit se ne\u0107e vratiti u korisni\u010dki prostor.\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>\nStandardni na\u010din kreiranja demona prilikom pokretanja sistema i kontroliranja njihovog vremena trajanja je launchd. Napominjem da su izvorni kodovi u prikazu starije verzije launchctl pre macOS-a 10.10, a primeri koda su dati kao ilustracija. Savremeni launchctl \u0161alje signale launchd-u putem XPC-a, a logika launchctl je preba\u010dena na njega.<\/p>\n<p>Pogledajmo kako se zapravo zaustavljaju aplikacije. Pre slanja signala SIGTERM, aplikacija se poku\u0161ava zaustaviti pomo\u0107u sistemskog poziva \"proc_terminate\".<\/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, \"Nije mogu\u0107e prekinuti posao: %d: %s\", error, strerror(error));\n\t\tjob_log(j, LOG_NOTICE | LOG_CONSOLE, \"Koristimo opciju rezervi za prekid posla...\");\n\t\terror = kill2(j-&gt;p, SIGTERM);\n\t\tif (error) {\n\t\t\tjob_log(j, LOG_ERR, \"Nije mogu\u0107e poslati signal poslu: %d: %s\", error, strerror(error));\n\t\t} \n...\n<\/code><\/pre>\n<p>\nIspod haube, proc_terminate, uprkos svom nazivu, mo\u017ee slati ne samo psignal sa SIGTERM, ve\u0107 i SIGKILL.<\/p>\n<h3>Neizravno ubijanje \u2014 ograni\u010denje na resurse<\/h3>\n<p>\nZanimljiviji slu\u010daj mo\u017ee se videti u drugom sistemskom pozivu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L652\">process_policy<\/a><\/noindex>. Standardna upotreba ovog sistemskog poziva \u2014 ograni\u010davanje resursa aplikacija, na primer, za indeksator ograni\u010denje na kvotu procesorskog vremena i memorije, kako se sistem ne bi zna\u010dajno usporio usled radnji ke\u0161iranja datoteka. Ako aplikacija dostigne ograni\u010denje resursa, kao \u0161to se mo\u017ee videti iz funkcije proc_apply_resource_actions, procesu se \u0161alje signal SIGKILL.<\/p>\n<p>Iako ovaj sistemski poziv mo\u017ee potencijalno izvr\u0161iti ubijanje procesa, sistem nije adekvatno proveravao prava procesa koji poziva sistemski poziv. U stvarnosti provera <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L267\">je postojala<\/a><\/noindex>, ali dovoljna je alternativna zastavica PROC_POLICY_ACTION_SET za zaobila\u017eenje ovog uslova.<\/p>\n<p>Ako se ovdje \"ograni\u010di\" kvota kori\u0161tenja CPU-a aplikacijom (primjerice, omogu\u0107iti da se izvr\u0161ava samo 1 ns), mogu\u0107e je ubiti bilo koji proces u sustavu. Na taj na\u010din, zlonamjerni program mo\u017ee ubiti bilo koji proces u sustavu, uklju\u010duju\u0107i i proces antivirusnog programa. Tako\u0111er je zanimljiv efekt koji se ostvaruje prilikom ubijanja procesa s pid 1 (launchctl) \u2014 kernel panic prilikom poku\u0161aja obrade signala SIGKILL \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Kako za\u0161tititi procese i pro\u0161irenja jezgre u macOS-u\" src=\"\/wp-content\/uploads\/2020\/04\/46adadb9b3f28b78f0b9df410e601bb9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Kako rije\u0161iti problem?<\/h3>\n<p>\nNajizravniji na\u010din da se zabraniti ubijanje procesa je zamjena pokaziva\u010da na funkciju u tablici sustavnih poziva. Na\u017ealost, ova metoda nije trivijalna iz mnogih razloga.<\/p>\n<p>Prvo, simbol koji odgovara za poziciju sysent u memoriji nije samo privatni simbol XNU jezgre, ve\u0107 ga nije mogu\u0107e prona\u0107i u simbolima jezgre. Morat \u0107emo koristiti heuristi\u010dke metode tra\u017eenja, poput dinami\u010dkog disasembliiranja funkcije i pretra\u017eivanja pokaziva\u010da u njoj.<\/p>\n<p>Drugo, struktura zapisa u tablici ovisi o flagovima s kojima je jezgra sastavljena. Ako je deklariran flag CONFIG_REQUIRES_U32_MUNGING, tada \u0107e veli\u010dina strukture biti promijenjena \u2014 dodano je dodatno polje. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/sys\/sysent.h#L45\">sy_arg_munge32<\/a><\/noindex>. Potrebno je provesti dodatnu provjeru na tome s kojim je flagom jezgra kompilirana, kao alternativa uporediti pokaziva\u010de na funkcije s poznatim.<\/p>\n<pre><code class=\"cpp\">struct sysent {         \n        \/* tablica sistemskih poziva *\/\n        sy_call_t       *sy_call;       \/* implementiraju\u0107a funkcija *\/\n#if CONFIG_REQUIRES_U32_MUNGING || (__arm__ &amp;&amp; (__BIGGEST_ALIGNMENT__ &gt; 4))\n        sy_munge_t      *sy_arg_munge32; \/* korisnici argumenata sistemskih poziva za 32-bitne procese *\/\n#endif\n        int32_t         sy_return_type; \/* tipovi povratka sistema poziva *\/\n        int16_t         sy_narg;        \/* broj argumenata *\/\n        uint16_t        sy_arg_bytes;   \/* Ukupna veli\u010dina argumenata u bajtovima za 32-bitne sistemske pozive *\/\n};\n<\/code><\/pre>\n<p>\nSre\u0107om, u modernim verzijama macOS-a, Apple pru\u017ea novo API za rad s procesima. Endpoint Security API omogu\u0107ava korisnicima autoriziranje mnogih zahtjeva prema drugim procesima. Na taj na\u010din, mogu\u0107e je blokirati sve signale prema procesima, uklju\u010duju\u0107i signal SIGKILL pomo\u0107u ranije spomenutog API-ja.<\/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>\nSli\u010dno tome, u jezgri se mo\u017ee registrirati MAC Policy, koja pru\u017ea metodu za\u0161tite od signala (policy proc_check_signal), no API se slu\u017ebeno ne podr\u017eava.<\/p>\n<h3>Za\u0161tita pro\u0161irenja jezgre<\/h3>\n<p>\nOsim za\u0161tite procesa u sustavu, nu\u017ena je i za\u0161tita samog pro\u0161irenja jezgre (kext). macOS pru\u017ea programerima okvir za jednostavni razvoj IOKit ure\u0111ajnih upravlja\u010da. Osim dono\u0161enja sredstava za rad s ure\u0111ajima, IOKit osigurava metode za stakiranje upravlja\u010da (driver stacking) putem instanci C++ klasa. Aplikacija u userspace-u \u0107e mo\u0107i \u201cprona\u0107i\u201d registriranu instancu klase kako bi uspostavila vezu izme\u0111u kernela i userspace-a.<\/p>\n<p>Za otkrivanje broja instanci klasa u sustavu postoji alat ioclasscount.<\/p>\n<pre><code class=\"cpp\">my_kext_ioservice = 1\nmy_kext_iouserclient = 1\n<\/code><\/pre>\n<p>\nSvako pro\u0161irenje jezgre koje \u017eeli registrirati se u stog upravlja\u010da mora izjaviti klasu naslije\u0111enu od IOService, na primjer, my_kext_ioservice u ovom slu\u010daju. Povezivanje korisni\u010dkih aplikacija uzrokuje stvaranje nove instance klase koja naslje\u0111uje IOUserClient, u primjeru my_kext_iouserclient.<\/p>\n<p>Prilikom poku\u0161aja isklju\u010divanja upravlja\u010da iz sustava (komanda kextunload) poziva se virtualna funkcija \u201cbool terminate(IOOptionBits options)\u201d. Dovoljno je vratiti false na pozivu funkcije terminate prilikom poku\u0161aja isklju\u010divanja kako bi se zabranio kextunload.<\/p>\n<pre><code class=\"cpp\">bool Kext::terminate(IOOptionBits options)\n{\n\n  if (!IsUnloadAllowed)\n  {\n    \/\/ Isklju\u010denje nije dozvoljeno, vra\u0107anje false\n    return false;\n  }\n\n  return super::terminate(options);\n}\n\n<\/code><\/pre>\n<p>\nZastavica IsUnloadAllowed mo\u017ee biti postavljena od strane IOUserClient tijekom u\u010ditavanja. Ako je isklju\u010denje ograni\u010deno, komanda kextunload \u0107e vratiti sljede\u0107i izlaz:<\/p>\n<pre><code class=\"cpp\">admin@admins-Mac drivermanager % sudo kextunload .\/test.kext\nLozinka:\n(kernel) Ne mogu ukloniti kext my.kext.test; usluge nisu uspjele prekinuti - 0xe00002c7.\nNeuspje\u0161no isklju\u010divanje my.kext.test - (iokit\/common) nepodr\u017eana funkcija.\n<\/code><\/pre>\n<p>\nSli\u010dnu za\u0161titu potrebno je provesti i za IOUserClient. Instance klasa mogu se isklju\u010diti pomo\u0107u userspace funkcije IOKitLib \u201cIOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);\u201d. Mo\u017ee se vratiti false na pozivu komande \u201cterminate\u201d dok korisni\u010dka aplikacija ne \u201cumre\u201d, tj. dok ne do\u0111e do poziva funkcije \u201cclientDied\u201d.<\/p>\n<h3>Za\u0161tita datoteka<\/h3>\n<p>\nZa za\u0161titu datoteka dovoljno je koristiti Kauth API, koji omogu\u0107ava ograni\u010davanje pristupa datotekama. Apple pru\u017ea programerima obavijesti o raznim doga\u0111ajima unutar scope-a, a za nas su va\u017ene operacije KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA i KAUTH_VNODE_DELETE_CHILD. Ograni\u010davanje pristupa datotekama najjednostavnije je po putu \u2014 koristimo API \u201cvn_getpath\u201d za dobivanje puta do datoteke i obavljamo usporedbu prefiksa puta. Primijetimo da, radi optimizacije preimenovanja putanja mapa s datotekama, sustav ne autorizira pristup svakoj datoteci, ve\u0107 samo samoj mapi koja je preimenovana. Potrebno je provesti usporedbu roditeljskog puta i ograni\u010diti KAUTH_VNODE_DELETE za nju.<\/p>\n<p><img decoding=\"async\" alt=\"Kako za\u0161tititi procese i pro\u0161irenja jezgre u macOS-u\" src=\"\/wp-content\/uploads\/2020\/04\/409cf53d1cdbeee6a6f56f5c90574bf6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNedostatak ovog pristupa mo\u017ee biti niska u\u010dinkovitost s porastom broja prefiksa. Da bi usporedba bila manje od O(prefix*length), gdje je prefix \u2014 broj prefiksa, a length \u2014 duljina niza, mo\u017eemo koristiti deterministi\u010dki kona\u010dni automat (DKA) izgra\u0111en na osnovu prefiksa. <\/p>\n<p>Razmotrimo na\u010din izgradnje DKA za ovaj skup prefiksa. Inicijaliziramo kursor na po\u010detak svakog prefiksa. Ako svi kursori pokazuju na isti simbol, pove\u0107avamo svaki kursor za jedan simbol i bilje\u017eimo da je duljina istog niza ve\u0107a za jedan. Ako postoji dva kursora, simbole ispod kojih su razli\u010diti, dijelimo kursore u grupe prema simbolu na koji pokazuju i ponavljamo algoritam za svaku grupu.<\/p>\n<p>U prvom slu\u010daju (svi simboli ispod kursora su isti) dobivamo stanje DKA koje ima samo jedan prijelaz po istom nizu. U drugom slu\u010daju, dobivamo tablicu prijelaza veli\u010dine 256 (broj simbola i maksimalan broj grupa) u sljede\u0107a stanja koja se dobivaju rekurzivnim pozivom funkcije.<\/p>\n<p>Razmotrimo primjer. Za skup prefiksa (\u201c\/foo\/bar\/tmp\/\u201d, \u201c\/var\/db\/foo\/\u201d, \u201c\/foo\/bar\/aba\/\u201d, \u201cfoo\/bar\/aac\/\u201d) mo\u017eemo dobiti sljede\u0107i DKA. Na slici su prikazani samo prijelazi koji vode u druga stanja, drugi prijelazi ne \u0107e biti zavr\u0161ni.<\/p>\n<p><img decoding=\"async\" alt=\"Kako za\u0161tititi procese i pro\u0161irenja jezgre u macOS-u\" src=\"\/wp-content\/uploads\/2020\/04\/6f5c4734ee6c677749f2f7b55307549d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPri prolasku kroz stanja DKA mogu se javiti 3 slu\u010daja.<\/p>\n<ol>\n<li>Postignuto je zavr\u0161no stanje \u2014 putanja je za\u0161ti\u0107ena, ograni\u010davamo operacije KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA i KAUTH_VNODE_DELETE_CHILD.<\/li>\n<li>Nije postignuto kona\u010dno stanje, ali je put \"zavr\u0161io\" (postignut je nulti terminator) \u2014 put je roditeljski, potrebno je ograni\u010diti KAUTH_VNODE_DELETE. Napominjemo da, ako je vnode direktorij, treba dodati \u2018\/\u2019 na kraj, ina\u010de mo\u017ee do\u0107i do ograni\u010denja na datoteku \"\/foor\/bar\/t\", \u0161to nije ispravno.<\/li>\n<li>Nije postignuto kona\u010dno stanje, put nije zavr\u0161io. Nijedan od prefiksa se ne poklapa sa ovim, ne postavljamo ograni\u010denja.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Zaklju\u010dak<\/h3>\n<p>\nCilj razvijanih sigurnosnih re\u0161enja je pove\u0107anje nivoa sigurnosti korisnika i njegovih podataka. S jedne strane, ovaj cilj se ostvaruje razvojem softverskog proizvoda Acronis, koji zatvara one ranjivosti gde je sama operativna sistema \"slaba\". S druge strane, ne treba zanemariti ni ja\u010danje onih aspekata sigurnosti koje mo\u017eemo pobolj\u0161ati na strani OS, pogotovo \u0161to zatvaranje takvih ranjivosti pove\u0107ava na\u0161u vlastitu otpornost kao proizvoda. Ranjivost je prijavljena Apple Product Security Team-u i ispravljena je u macOS 10.14.5 (https:\/\/support.apple.com\/en-gb\/HT210119).<\/p>\n<p><img decoding=\"async\" alt=\"Kako za\u0161tititi procese i pro\u0161irenja jezgre u macOS-u\" src=\"\/wp-content\/uploads\/2020\/04\/98cd51cb47a81e8262a87bc792d59455.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSve to se mo\u017ee u\u010diniti samo ako je va\u0161a alatka zvani\u010dno instalirana u jezgru. Drugim re\u010dima, za eksterni i ne\u017eeljeni softver nema takvih rupa. Me\u0111utim, kao \u0161to vidite, \u010dak i za za\u0161titu legitimnih programa, poput antivirusnog softvera i sistema za pravljenje rezervnih kopija, potrebno je dosta truda. No, sada \u0107e novi Acronis proizvodi za macOS imati dodatnu za\u0161titu od izra\u017eavanja iz sistema.<br \/>\n<br \/>Izvor: <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\/hr\/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=\"hr_HR\" \/>\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\/hr\/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\udd47Kako \u0161tititi procese i pro\u0161irenja jezgra u macOS | ProHoster","description":"Pozdrav, Habr! Danas bih \u017eeleo da razgovaram o tome kako mo\u017eemo za\u0161tititi procese od napada zlonamernih korisnika u macOS.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/78514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=78514"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/78514\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/78515"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=78514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=78514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=78514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}