{"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\/fr\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","title":{"rendered":"Comment prot\u00e9ger les processus et les extensions du noyau dans macOS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bonjour, Habr ! Aujourd'hui, j'aimerais parler de la mani\u00e8re de prot\u00e9ger les processus contre les intrusions malveillantes sous macOS. Par exemple, cela est utile pour un antivirus ou un syst\u00e8me de sauvegarde, notamment en raison du fait qu'il existe plusieurs moyens de \"tuer\" un processus sous macOS. Vous pouvez lire sur ce sujet et les m\u00e9thodes de protection ci-dessous.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/acronis\/blog\/497714\/\"><img decoding=\"async\" alt=\"Comment prot\u00e9ger les processus et les extensions du noyau dans 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>M\u00e9thode classique pour \"tuer\" un processus<\/h3>\n<p>\nLa m\u00e9thode bien connue pour \"tuer\" un processus consiste \u00e0 envoyer le signal SIGKILL au processus. Via bash, on peut utiliser les commandes standards \"kill -SIGKILL PID\" ou \"pkill -9 NAME\" pour le faire. La commande \"kill\" existe depuis l'\u00e9poque des UNIX et est accessible non seulement sous macOS, mais aussi dans d'autres syst\u00e8mes de type UNIX.<\/p>\n<p>Tout comme dans les syst\u00e8mes de type UNIX, macOS permet d'intercepter tous les signaux envoy\u00e9s \u00e0 un processus, sauf deux : SIGKILL et SIGSTOP. Cet article examinera principalement le signal SIGKILL, comme signal qui d\u00e9clenche la destruction d'un processus.<\/p>\n<h3>Sp\u00e9cificit\u00e9s de macOS<br \/>\n<\/h3>\n<p>\nDans macOS, l'appel syst\u00e8me kill dans le noyau XNU appelle la fonction psignal(SIGKILL, \u2026). Voyons quelles autres actions de l'utilisateur en userspace peuvent d\u00e9clencher la fonction psignal. Nous excluons les appels \u00e0 la fonction psignal dans les m\u00e9canismes internes du noyau (bien qu'ils puissent \u00eatre non triviaux, nous les r\u00e9servons pour un autre article \ud83d\ude42 \u2014 v\u00e9rification de signature, erreurs de m\u00e9moire, traitement de exit\/terminate, violation de protection des fichiers, etc. <\/p>\n<p>Commen\u00e7ons notre tour d'horizon avec la fonction et l'appel syst\u00e8me correspondant <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/kern_sig.c#L1672\">terminate_with_payload<\/a><\/noindex>. Il est \u00e9vident que, en plus de l'appel classique \u00e0 kill, il existe une approche alternative qui est sp\u00e9cifique au syst\u00e8me d'exploitation macOS et qui ne se rencontre pas dans BSD. Les principes de fonctionnement des deux appels syst\u00e8me sont \u00e9galement similaires. Ils repr\u00e9sentent des appels directs \u00e0 la fonction du noyau psignal. Notons \u00e9galement qu'avant de tuer un processus, un contr\u00f4le \"cansignal\" est effectu\u00e9 \u2013 peut-on envoyer un signal d'un processus \u00e0 un autre, le syst\u00e8me ne permet pas \u00e0 n'importe quelle application de tuer des processus syst\u00e8me, par exemple.<\/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\tt \/*\n\t\t * psignal_thread_with_reason() pend un SIGKILL sur le thread sp\u00e9cifi\u00e9 ou\n\t\t * retourne si le thread ou la t\u00e2che sont d\u00e9j\u00e0 en cours de terminaison. Dans tous les cas, le\n\t\t * thread actuel ne reviendra pas \u00e0 l'espace utilisateur.\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>\nLa m\u00e9thode standard pour cr\u00e9er des d\u00e9mons au d\u00e9marrage du syst\u00e8me et contr\u00f4ler leur dur\u00e9e de vie est launchd. Je tiens \u00e0 souligner que les sources fournies concernent une ancienne version de launchctl avant macOS 10.10, les exemples de code sont donn\u00e9s \u00e0 titre d'illustration. L'actuel launchctl envoie des signaux \u00e0 launchd via XPC, et la logique de launchctl a \u00e9t\u00e9 transf\u00e9r\u00e9e en lui.<\/p>\n<p>Examinons comment les applications sont effectivement arr\u00eat\u00e9es. Avant d'envoyer le signal SIGTERM, l'application essaie d'\u00eatre arr\u00eat\u00e9e \u00e0 l'aide de l'appel syst\u00e8me \"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, \"Impossible de terminer l'emploi : %d : %s\", error, strerror(error));\n\t\tjob_log(j, LOG_NOTICE | LOG_CONSOLE, \"Utilisation de l'option de secours pour terminer l'emploi...\");\n\t\terror = kill2(j-&gt;p, SIGTERM);\n\t\tif (error) {\n\t\t\tjob_log(j, LOG_ERR, \"Impossible de signaler l'emploi : %d : %s\", error, strerror(error));\n\t\t} \n...\n<\/code><\/pre>\n<p>\nSous le capot, proc_terminate, malgr\u00e9 son nom, peut envoyer non seulement psignal avec SIGTERM, mais aussi SIGKILL.<\/p>\n<h3>Meurtre indirect - limitation sur les ressources<\/h3>\n<p>\nUn cas plus int\u00e9ressant peut \u00eatre vu dans un autre appel syst\u00e8me <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L652\">process_policy<\/a><\/noindex>. L'utilisation standard de cet appel syst\u00e8me est la limitation des ressources des applications, par exemple pour un indexeur, une limitation sur le quota de temps processeur et de m\u00e9moire, afin que le syst\u00e8me ne ralentisse pas de mani\u00e8re significative \u00e0 cause des actions de mise en cache de fichiers. Si l'application atteint la limitation des ressources, comme on peut le voir dans la fonction proc_apply_resource_actions, un signal SIGKILL est envoy\u00e9 au processus.<\/p>\n<p>Bien que cet appel syst\u00e8me puisse potentiellement provoquer la mort d'un processus, le syst\u00e8me ne v\u00e9rifiait pas ad\u00e9quatement les droits du processus appelant l'appel syst\u00e8me. En r\u00e9alit\u00e9, la v\u00e9rification <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L267\">existait<\/a><\/noindex>, mais il suffit d'utiliser le drapeau alternatif PROC_POLICY_ACTION_SET pour contourner cette condition.<\/p>\n<p>\u00c0 partir de l\u00e0, si vous \"limitez\" le quota d'utilisation du CPU par l'application (par exemple, en permettant uniquement 1 ns d'ex\u00e9cution), cela peut aboutir \u00e0 la terminaison de n'importe quel processus dans le syst\u00e8me. De cette mani\u00e8re, un logiciel malveillant peut tuer n'importe quel processus sur le syst\u00e8me, y compris celui de l'antivirus. L'effet int\u00e9ressant se produit \u00e9galement lors de la terminaison d'un processus avec pid 1 (launchctl) \u2014 un panic du noyau au moment de tenter de traiter le signal SIGKILL \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Comment prot\u00e9ger les processus et les extensions du noyau dans macOS\" src=\"\/wp-content\/uploads\/2020\/04\/46adadb9b3f28b78f0b9df410e601bb9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Comment r\u00e9soudre le probl\u00e8me ?<\/h3>\n<p>\nLe moyen le plus direct d'emp\u00eacher la terminaison d'un processus est de remplacer le pointeur de fonction dans la table des appels syst\u00e8me. Malheureusement, cette m\u00e9thode est non triviale pour de nombreuses raisons.<\/p>\n<p>Tout d'abord, le symbole qui correspond \u00e0 la position de sysent en m\u00e9moire est non seulement un symbole priv\u00e9 du noyau XNU, mais il ne peut \u00e9galement pas \u00eatre trouv\u00e9 parmi les symboles du noyau. Il faudra utiliser des m\u00e9thodes heuristiques de recherche, comme le d\u00e9sassemblage dynamique de la fonction et la recherche de pointeur \u00e0 l'int\u00e9rieur.<\/p>\n<p>Deuxi\u00e8mement, la structure des enregistrements dans la table d\u00e9pend des drapeaux avec lesquels le noyau a \u00e9t\u00e9 compil\u00e9. Si le drapeau CONFIG_REQUIRES_U32_MUNGING est d\u00e9clar\u00e9, la taille de la structure sera modifi\u00e9e \u2014 un champ suppl\u00e9mentaire sera ajout\u00e9. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/sys\/sysent.h#L45\">sy_arg_munge32<\/a><\/noindex>. Il est n\u00e9cessaire de faire une v\u00e9rification suppl\u00e9mentaire pour s'assurer avec quel drapeau le noyau a \u00e9t\u00e9 compil\u00e9, par exemple, en comparant les pointeurs de fonction avec ceux connus.<\/p>\n<pre><code class=\"cpp\">struct sysent {         \n        \/* table des appels syst\u00e8me *\/\n        sy_call_t       *sy_call;       \/* fonction d'impl\u00e9mentation *\/\n#if CONFIG_REQUIRES_U32_MUNGING || (__arm__ &amp;&amp; (__BIGGEST_ALIGNMENT__ &gt; 4))\n        sy_munge_t      *sy_arg_munge32; \/* modificateur des arguments d'appel syst\u00e8me pour processus 32 bits *\/\n#endif\n        int32_t         sy_return_type; \/* types de retour d'appels syst\u00e8me *\/\n        int16_t         sy_narg;        \/* nombre d'arguments *\/\n        uint16_t        sy_arg_bytes;   \/* Taille totale des arguments en octets pour\n                                         * appels syst\u00e8me 32 bits\n                                         *\/\n};\n<\/code><\/pre>\n<p>\nHeureusement, dans les versions modernes de macOS, Apple fournit une nouvelle API pour travailler avec les processus. L'API de s\u00e9curit\u00e9 des endpoints permet aux clients d'autoriser de nombreuses requ\u00eates vers d'autres processus. Ainsi, il est possible de bloquer tous les signaux vers les processus, y compris le signal SIGKILL gr\u00e2ce \u00e0 l'API mentionn\u00e9e ci-dessus.<\/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>\nDe m\u00eame, un MAC Policy peut \u00eatre enregistr\u00e9 dans le noyau, fournissant une m\u00e9thode de protection contre les signaux (policy proc_check_signal), mais l'API n'est pas officiellement support\u00e9e.<\/p>\n<h3>Protection de l'extension du noyau<\/h3>\n<p>\nEn plus de prot\u00e9ger les processus dans le syst\u00e8me, une protection de l'extension du noyau (kext) elle-m\u00eame est \u00e9galement n\u00e9cessaire. macOS fournit aux d\u00e9veloppeurs un cadre pour un d\u00e9veloppement facile de pilotes de p\u00e9riph\u00e9riques via IOKit. En plus de fournir des moyens de travailler avec des p\u00e9riph\u00e9riques, IOKit offre des m\u00e9thodes de empilement de pilotes (driver stacking) par le biais d'instances de classes C++. Une application en espace utilisateur pourra \u00ab trouver \u00bb une instance de classe enregistr\u00e9e pour \u00e9tablir une connexion entre le noyau et l'espace utilisateur.<\/p>\n<p>Pour d\u00e9tecter le nombre d'instances de classes dans le syst\u00e8me, il existe l'utilitaire ioclasscount.<\/p>\n<pre><code class=\"cpp\">my_kext_ioservice = 1\nmy_kext_iouserclient = 1\n<\/code><\/pre>\n<p>\nToute extension de noyau cherchant \u00e0 s'enregistrer dans la pile de pilotes doit d\u00e9clarer une classe h\u00e9rit\u00e9e de IOService, par exemple, my_kext_ioservice dans ce cas. La connexion d'applications utilisateur provoque la cr\u00e9ation d'une nouvelle instance de classe, qui h\u00e9rite de IOUserClient, dans l'exemple my_kext_iouserclient.<\/p>\n<p>Lors de la tentative de d\u00e9chargement d'un pilote du syst\u00e8me (commande kextunload), la fonction virtuelle \u00ab bool terminate(IOOptionBits options) \u00bb est appel\u00e9e. Il suffit de retourner false lors de l'appel de la fonction terminate durant la tentative de d\u00e9chargement pour interdire kextunload.<\/p>\n<pre><code class=\"cpp\">bool Kext::terminate(IOOptionBits options)\n{\n\n  if (!IsUnloadAllowed)\n  {\n    \/\/ Le d\u00e9chargement n'est pas autoris\u00e9, retour de false\n    return false;\n  }\n\n  return super::terminate(options);\n}\n\n<\/code><\/pre>\n<p>\nLe drapeau IsUnloadAllowed peut \u00eatre d\u00e9fini par IOUserClient lors du chargement. Lorsqu'il y a une restriction de chargement, la commande kextunload renverra la sortie suivante :<\/p>\n<pre><code class=\"cpp\">admin@admins-Mac drivermanager % sudo kextunload .\/test.kext\nMot de passe :\n(kernel) Impossible de supprimer kext my.kext.test ; les services n'ont pas pu se terminer - 0xe00002c7.\n\u00c9chec du d\u00e9chargement de my.kext.test - (iokit\/common) fonction non prise en charge.\n<\/code><\/pre>\n<p>\nUne protection similaire doit \u00eatre mise en \u0153uvre \u00e9galement pour IOUserClient. Les instances de classes peuvent \u00eatre d\u00e9charg\u00e9es \u00e0 l'aide de la fonction en espace utilisateur IOKitLib \u00ab IOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description); \u00bb. On peut retourner false lors de l'appel de la commande \u00ab terminate \u00bb tant que l'application en espace utilisateur n'est pas \u00ab morte \u00bb, c'est-\u00e0-dire qu'il n'y aura pas d'appel \u00e0 la fonction \u00ab clientDied \u00bb.<\/p>\n<h3>Protection des fichiers<\/h3>\n<p>\nPour prot\u00e9ger les fichiers, il suffit d'utiliser l'API Kauth, qui permet de restreindre l'acc\u00e8s aux fichiers. Apple fournit aux d\u00e9veloppeurs des notifications sur divers \u00e9v\u00e9nements dans le scope, pour nous, les op\u00e9rations KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA et KAUTH_VNODE_DELETE_CHILD sont importantes. Il est plus simple de limiter l'acc\u00e8s aux fichiers par chemin - nous utilisons l'API \u00ab vn_getpath \u00bb pour obtenir le chemin du fichier et effectuons une comparaison avec le pr\u00e9fixe du chemin. Notons que pour optimiser le renommage des chemins des dossiers contenant des fichiers, le syst\u00e8me n'autorise pas l'acc\u00e8s \u00e0 chaque fichier, mais uniquement au dossier qui a \u00e9t\u00e9 renomm\u00e9. Il est n\u00e9cessaire de comparer le chemin parent et de restreindre KAUTH_VNODE_DELETE pour celui-ci.<\/p>\n<p><img decoding=\"async\" alt=\"Comment prot\u00e9ger les processus et les extensions du noyau dans macOS\" src=\"\/wp-content\/uploads\/2020\/04\/409cf53d1cdbeee6a6f56f5c90574bf6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn inconv\u00e9nient de cette approche peut \u00eatre une faible performance lorsque le nombre de pr\u00e9fixes augmente. Pour que la comparaison ne soit pas \u00e9gale \u00e0 O(prefix * length), o\u00f9 prefix est le nombre de pr\u00e9fixes et length la longueur de la cha\u00eene, on peut utiliser un automate fini d\u00e9terministe (AFD) construit \u00e0 partir des pr\u00e9fixes. <\/p>\n<p>Consid\u00e9rons la mani\u00e8re de construire un AFD pour cet ensemble de pr\u00e9fixes. Nous initialisons des curseurs au d\u00e9but de chaque pr\u00e9fixe. Si tous les curseurs pointent vers le m\u00eame caract\u00e8re, nous d\u00e9pla\u00e7ons chaque curseur de un caract\u00e8re et retenons que la longueur de la cha\u00eene identique augmente d'une unit\u00e9. Si deux curseurs existent et que les caract\u00e8res sous eux sont diff\u00e9rents, nous divisons les curseurs en groupes selon le caract\u00e8re vers lequel ils pointent, puis nous r\u00e9p\u00e9tons l'algorithme pour chaque groupe.<\/p>\n<p>Dans le premier cas (tous les caract\u00e8res sous les curseurs sont identiques), nous obtenons un \u00e9tat de l'AFD qui a uniquement une transition par cha\u00eene identique. Dans le deuxi\u00e8me cas, nous obtenons une table de transitions de taille 256 (nombre de caract\u00e8res et nombre maximum de groupes) vers les \u00e9tats suivants, obtenu lors de l'appel r\u00e9cursif de la fonction.<\/p>\n<p>Consid\u00e9rons un exemple. Pour l'ensemble de pr\u00e9fixes (\u201c\/foo\/bar\/tmp\/\u201d, \u201c\/var\/db\/foo\/\u201d, \u201c\/foo\/bar\/aba\/\u201d, \u201cfoo\/bar\/aac\/\u201d), on peut obtenir l'AFD suivant. Sur l'image, seules les transitions menant \u00e0 d'autres \u00e9tats sont indiqu\u00e9es, les autres transitions ne seront pas finales.<\/p>\n<p><img decoding=\"async\" alt=\"Comment prot\u00e9ger les processus et les extensions du noyau dans macOS\" src=\"\/wp-content\/uploads\/2020\/04\/6f5c4734ee6c677749f2f7b55307549d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLors du passage par les \u00e9tats de l'AFD, trois cas peuvent se pr\u00e9senter.<\/p>\n<ol>\n<li>Un \u00e9tat final a \u00e9t\u00e9 atteint - le chemin est prot\u00e9g\u00e9, nous limitons les op\u00e9rations KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA et KAUTH_VNODE_DELETE_CHILD.<\/li>\n<li>L'\u00e9tat final n'a pas \u00e9t\u00e9 atteint, mais le chemin \"s'est termin\u00e9\" (un terminateur nul a \u00e9t\u00e9 atteint) - le chemin est parent, il est n\u00e9cessaire de restreindre KAUTH_VNODE_DELETE. Notons que si le vnode est un dossier, il faut ajouter \u2018\/\u2019 \u00e0 la fin, sinon une restriction pourrait s'appliquer au fichier \u201c\/foor\/bar\/t\u201d, ce qui est incorrect.<\/li>\n<li>L'\u00e9tat final n'a pas \u00e9t\u00e9 atteint, le chemin ne s'est pas termin\u00e9. Aucun des pr\u00e9fixes ne correspond, aucune restriction n'est appliqu\u00e9e.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Conclusion<\/h3>\n<p>\nL'objectif des solutions de s\u00e9curit\u00e9 en d\u00e9veloppement est d'augmenter le niveau de s\u00e9curit\u00e9 de l'utilisateur et de ses donn\u00e9es. D'une part, cet objectif est assur\u00e9 par le d\u00e9veloppement du produit Acronis, qui comble les vuln\u00e9rabilit\u00e9s l\u00e0 o\u00f9 le syst\u00e8me d'exploitation lui-m\u00eame est \"faible\". D'autre part, il ne faut pas n\u00e9gliger le renforcement des aspects de s\u00e9curit\u00e9 qui peuvent \u00eatre am\u00e9lior\u00e9s du c\u00f4t\u00e9 de l'OS, d'autant plus que la fermeture de telles vuln\u00e9rabilit\u00e9s renforce notre propre r\u00e9silience en tant que produit. La vuln\u00e9rabilit\u00e9 a \u00e9t\u00e9 signal\u00e9e par l'Apple Product Security Team et a \u00e9t\u00e9 corrig\u00e9e dans macOS 10.14.5 (https:\/\/support.apple.com\/en-gb\/HT210119).<\/p>\n<p><img decoding=\"async\" alt=\"Comment prot\u00e9ger les processus et les extensions du noyau dans macOS\" src=\"\/wp-content\/uploads\/2020\/04\/98cd51cb47a81e8262a87bc792d59455.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTout cela ne peut \u00eatre fait que si votre utilitaire a \u00e9t\u00e9 officiellement install\u00e9 dans le noyau. Cela signifie qu'il n'y a pas de failles pour les logiciels externes et ind\u00e9sirables. Cependant, comme vous le voyez, m\u00eame pour prot\u00e9ger des programmes l\u00e9gitimes, tels que les antivirus et les syst\u00e8mes de sauvegarde, il faut travailler dur. Mais maintenant, les nouveaux produits Acronis pour macOS b\u00e9n\u00e9ficieront d'une protection suppl\u00e9mentaire contre le d\u00e9chargement du syst\u00e8me.<br \/>\n<br \/>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Comment prot\u00e9ger les processus et les extensions du noyau dans macOS | ProHoster","description":"Bonjour, Habr ! Aujourd'hui, j'aimerais parler de la mani\u00e8re de prot\u00e9ger les processus contre les attaques malveillantes dans macOS.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/78514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=78514"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/78514\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/78515"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=78514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=78514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=78514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}