{"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\/de\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","title":{"rendered":"Wie man Prozesse und Kernel-Erweiterungen in macOS sch\u00fctzt","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, Habr! Heute m\u00f6chte ich dar\u00fcber sprechen, wie man Prozesse in macOS vor Angriffen durch Eindringlinge sch\u00fctzt. Dies ist beispielsweise n\u00fctzlich f\u00fcr Antivirenprogramme oder Backup-Systeme, insbesondere im Hinblick darauf, dass es unter macOS mehrere M\u00f6glichkeiten gibt, einen Prozess \"zu killen\". Dar\u00fcber und \u00fcber die Schutzmethoden lesen Sie im Folgenden.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/acronis\/blog\/497714\/\"><img decoding=\"async\" alt=\"Wie man Prozesse und Kernel-Erweiterungen in macOS sch\u00fctzt\" 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>Klassischer Weg, um einen Prozess zu killen<\/h3>\n<p>\nDer allgemein bekannte Weg, einen Prozess zu killen, besteht darin, dem Prozess das SIGKILL-Signal zu senden. \u00dcber Bash kann man die Standardbefehle \"kill -SIGKILL PID\" oder \"pkill -9 NAME\" verwenden, um den Prozess zu beenden. Der Befehl \"kill\" ist seit den Tagen von UNIX bekannt und steht nicht nur unter macOS, sondern auch unter anderen UNIX-\u00e4hnlichen Systemen zur Verf\u00fcgung.<\/p>\n<p>\u00c4hnlich wie in UNIX-\u00e4hnlichen Systemen erm\u00f6glicht es macOS, alle Signale an einen Prozess abzufangen, mit Ausnahme von zwei: SIGKILL und SIGSTOP. In diesem Artikel wird in erster Linie das Signal SIGKILL betrachtet, da es den Prozessterminierung ausl\u00f6st.<\/p>\n<h3>Spezifikationen von macOS<br \/>\n<\/h3>\n<p>\nIn macOS ruft der Systemaufruf kill im XNU-Kernel die Funktion psignal(SIGKILL, \u2026) auf. Lassen Sie uns untersuchen, welche weiteren Benutzeraktionen im Userspace die Funktion psignal ausl\u00f6sen k\u00f6nnen. Wir schr\u00e4nken die Aufrufe der Funktion psignal in den internen Mechanismen des Kernels ein (obwohl sie nicht trivial sein k\u00f6nnen, lassen wir sie f\u00fcr einen anderen Artikel \ud83d\ude42 \u2013 \u00dcberpr\u00fcfung der Signatur, Speicherfehler, Bearbeitung von exit\/terminate, Dateischutzverletzungen usw.). <\/p>\n<p>Beginnen wir die \u00dcbersicht mit der Funktion und dem entsprechenden Systemaufruf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/kern_sig.c#L1672\">terminate_with_payload<\/a><\/noindex>. Es ist ersichtlich, dass es neben dem klassischen Aufruf kill einen alternativen Ansatz gibt, der spezifisch f\u00fcr das Betriebssystem macOS ist und in BSD nicht vorkommt. Die Funktionsweise beider Systemaufrufe ist ebenfalls \u00e4hnlich. Sie stellen direkte Aufrufe der Kernel-Funktion psignal dar. Zudem sei erw\u00e4hnt, dass vor dem T\u00f6ten eines Prozesses \u00fcberpr\u00fcft wird, ob \"cansignal\" \u2013 das bedeutet, ob ein Prozess einem anderen Prozess ein Signal senden kann; das System erlaubt es nicht, dass eine Anwendung Systemprozesse t\u00f6tet.<\/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() wird ein SIGKILL an den angegebenen Thread senden oder\n\t\t * zur\u00fcckgeben, wenn der Thread und\/oder die Aufgabe bereits beendet wird. So oder so,\n\t\t * der aktuelle Thread wird nicht in den Benutzerraum zur\u00fcckkehren.\n\t\t *\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>\nDer Standardweg, um beim Systemstart Daemons zu erstellen und ihre Lebensdauer zu steuern, ist launchd. Ich m\u00f6chte darauf hinweisen, dass die Quellcodes f\u00fcr eine \u00e4ltere Version von launchctl vor macOS 10.10 bereitgestellt werden, die Codebeispiele dienen nur zur Veranschaulichung. Das moderne launchctl sendet Signale an launchd \u00fcber XPC, die Logik von launchctl wurde dorthin \u00fcbertragen.<\/p>\n<p>Schauen wir uns an, wie genau Anwendungen gestoppt werden. Vor dem Senden des Signals SIGTERM wird versucht, die Anwendung \u00fcber den Systemaufruf 'proc_terminate' zu stoppen.<\/p>\n<pre><code class=\"cpp\">...\n\tfehler = proc_terminate(j-&gt;p, &amp;sig);\n\tif (fehler) {\n\t\tjob_log(j, LOG_ERR | LOG_CONSOLE, \"Konnte den Job nicht beenden: %d: %s\", fehler, strerror(fehler));\n\t\tjob_log(j, LOG_NOTICE | LOG_CONSOLE, \"Verwende Fallback-Option zur Beendigung des Jobs...\");\n\t\terror = kill2(j-&gt;p, SIGTERM);\n\t\tif (fehler) {\n\t\t\tjob_log(j, LOG_ERR, \"Konnte das Signal f\u00fcr den Job nicht senden: %d: %s\", fehler, strerror(fehler));\n\t\t} \n...\n<\/code><\/pre>\n<p>\nUnter der Haube kann proc_terminate, trotz seines Namens, nicht nur psignal mit SIGTERM senden, sondern auch SIGKILL.<\/p>\n<h3>Indirekte T\u00f6tung \u2013 Ressourcenbeschr\u00e4nkung<\/h3>\n<p>\nEin interessanterer Fall kann in einem anderen Systemaufruf gesehen werden <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L652\">process_policy<\/a><\/noindex>. Die Standardverwendung dieses Systemaufrufs besteht darin, Ressourcen f\u00fcr Anwendungen zu beschr\u00e4nken, zum Beispiel f\u00fcr den Indexierer eine Begrenzung der zul\u00e4ssigen CPU- und Speicherkapazit\u00e4t, um sicherzustellen, dass das System durch Dateicaching nicht erheblich verlangsamt wird. Wenn die Anwendung die Ressourcenbeschr\u00e4nkung erreicht hat, kann man in der Funktion proc_apply_resource_actions sehen, wird das Signal SIGKILL an den Prozess gesendet.<\/p>\n<p>Obwohl dieser Systemaufruf potenziell Prozesse beenden kann, hat das System die Berechtigungen des aufrufenden Prozesses nicht ausreichend gepr\u00fcft. Tats\u00e4chlich gab es eine \u00dcberpr\u00fcfung, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L267\">es gab<\/a><\/noindex>, aber es reicht aus, das alternative Flag PROC_POLICY_ACTION_SET zu verwenden, um diese Bedingung zu umgehen.<\/p>\n<p>Von hier aus, wenn Sie die CPU-Nutzungsquote f\u00fcr die Anwendung 'beschr\u00e4nken' (zum Beispiel nur 1 ns zulassen), k\u00f6nnen Sie jeden Prozess im System beenden. So kann schadhafter Code jeden Prozess im System beenden, einschlie\u00dflich des Antivirenprozesses. Auch interessant ist der Effekt, der beim Beenden des Prozesses mit der PID 1 (launchctl) auftritt - ein Kernel-Panic beim Versuch, das SIGKILL-Signal zu verarbeiten \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Wie man Prozesse und Kernel-Erweiterungen in macOS sch\u00fctzt\" src=\"\/wp-content\/uploads\/2020\/04\/46adadb9b3f28b78f0b9df410e601bb9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Wie l\u00f6st man das Problem?<\/h3>\n<p>\nDer direkteste Weg, um das Beenden eines Prozesses zu verhindern, besteht darin, den Zeiger auf die Funktion in der Systemaufruf-Tabelle zu \u00e4ndern. Leider ist dieser Ansatz aus mehreren Gr\u00fcnden nicht trivial.<\/p>\n<p>Erstens ist das Symbol, das f\u00fcr die Position von sysent im Speicher verantwortlich ist, nicht nur ein privates Symbol des XNU-Kernels, sondern kann auch nicht in den Symbolen des Kernels gefunden werden. Daher m\u00fcssen heuristische Suchmethoden verwendet werden, wie zum Beispiel das dynamische Disassemblieren der Funktion und das Suchen des Zeigers darin.<\/p>\n<p>Zweitens h\u00e4ngt die Struktur der Eintr\u00e4ge in der Tabelle von den Flags ab, mit denen der Kernel kompiliert wurde. Wenn das Flag CONFIG_REQUIRES_U32_MUNGING deklariert ist, \u00e4ndert sich die Gr\u00f6\u00dfe der Struktur - ein zus\u00e4tzliches Feld wird hinzugef\u00fcgt. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/sys\/sysent.h#L45\">sy_arg_munge32<\/a><\/noindex>. Es ist notwendig, zus\u00e4tzliche \u00dcberpr\u00fcfungen durchzuf\u00fchren, um zu bestimmen, mit welchem Flag der Kernel kompiliert wurde, zum Beispiel indem man die Zeiger auf die Funktionen mit bekannten vergleicht.<\/p>\n<pre><code class=\"cpp\">struct sysent {         \n        \/* system call table *\/\n        sy_call_t       *sy_call;       \/* implementing function *\/\n#if CONFIG_REQUIRES_U32_MUNGING || (__arm__ &amp;&amp; (__BIGGEST_ALIGNMENT__ &gt; 4))\n        sy_munge_t      *sy_arg_munge32; \/* system call arguments munger for 32-bit process *\/\n#endif\n        int32_t         sy_return_type; \/* system call return types *\/\n        int16_t         sy_narg;        \/* number of args *\/\n        uint16_t        sy_arg_bytes;   \/* Total size of arguments in bytes for\n                                         * 32-bit system calls\n                                         *\/\n};\n<\/code><\/pre>\n<p>\nGl\u00fccklicherweise bietet Apple in modernen Versionen von macOS eine neue API zur Arbeit mit Prozessen an. Die Endpoint Security API erm\u00f6glicht es Clients, viele Anfragen an andere Prozesse zu autorisieren. So k\u00f6nnen alle Signale an Prozesse, einschlie\u00dflich des SIGKILL-Signals, mithilfe der oben erw\u00e4hnten API blockiert werden.<\/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>\nAnalog kann im Kernel eine MAC-Policy registriert werden, die eine Methode zum Schutz vor Signalen (policy proc_check_signal) bereitstellt. Diese API wird jedoch nicht offiziell unterst\u00fctzt.<\/p>\n<h3>Schutz der Kernel-Erweiterung<\/h3>\n<p>\nZus\u00e4tzlich zum Schutz der Prozesse im System ist auch der Schutz der Kernel-Erweiterung (kext) unbedingt erforderlich. macOS stellt Entwicklern ein Framework zur Verf\u00fcgung, das die Entwicklung von IOKit-Ger\u00e4tetreibern erleichtert. Neben den Werkzeugen zum Umgang mit Ger\u00e4ten erm\u00f6glicht IOKit auch Methoden zum Stapeln von Treibern (driver stacking) mittels Instanzen von C++-Klassen. Eine Anwendung im Userspace kann eine registrierte Klasseninstanz \u201efinden\u201c, um eine Verbindung zwischen Kernel und Userspace herzustellen.<\/p>\n<p>Zur Ermittlung der Anzahl von Klasseninstanzen im System gibt es das Dienstprogramm ioclasscount.<\/p>\n<pre><code class=\"cpp\">my_kext_ioservice = 1\nmy_kext_iouserclient = 1\n<\/code><\/pre>\n<p>\nJede Kernel-Erweiterung, die sich im Treiberstapel registrieren m\u00f6chte, muss eine Klasse deklarieren, die von IOService abgeleitet ist, zum Beispiel my_kext_ioservice in diesem Fall. Die Verbindung von Benutzeranwendungen f\u00fchrt zur Erstellung einer neuen Klasseninstanz, die von IOUserClient abgeleitet ist, in diesem Beispiel my_kext_iouserclient.<\/p>\n<p>Beim Versuch, den Treiber aus dem System zu entladen (Befehl kextunload), wird die virtuelle Funktion \u201ebool terminate(IOOptionBits options)\u201c aufgerufen. Es gen\u00fcgt, false im Aufruf der Funktion terminate zur\u00fcckzugeben, um das kextunload zu verhindern.<\/p>\n<pre><code class=\"cpp\">bool Kext::terminate(IOOptionBits options)\n{\n\n  if (!IsUnloadAllowed)\n  {\n    \/\/ Entladen ist nicht erlaubt, false zur\u00fcckgeben\n    return false;\n  }\n\n  return super::terminate(options);\n}\n\n<\/code><\/pre>\n<p>\nDas Flag IsUnloadAllowed kann beim Laden durch IOUserClient gesetzt werden. Bei einer Beschr\u00e4nkung auf das Entladen gibt der Befehl kextunload die folgende Ausgabe zur\u00fcck:<\/p>\n<pre><code class=\"cpp\">admin@admins-Mac drivermanager % sudo kextunload .\/test.kext\nPasswort:\n(kernel) Konnte kext my.kext.test nicht entfernen; Dienste konnten nicht beendet werden - 0xe00002c7.\nKonnte my.kext.test nicht entladen - (iokit\/common) nicht unterst\u00fctzte Funktion.\n<\/code><\/pre>\n<p>\nEinen \u00e4hnlichen Schutz muss auch f\u00fcr IOUserClient erfolgen. Klasseninstanzen k\u00f6nnen mittels der Userspace-Funktion IOKitLib \u201eIOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);\u201c entladen werden. Man kann false im Aufruf des Befehls \u201eterminate\u201c zur\u00fcckgeben, solange die Userspace-Anwendung nicht \u201estirbt\u201c, das hei\u00dft, der Aufruf der Funktion \u201eclientDied\u201c nicht erfolgt.<\/p>\n<h3>Dateischutz<\/h3>\n<p>\nZum Schutz von Dateien reicht es aus, die Kauth-API zu verwenden, die den Zugriff auf Dateien einschr\u00e4nkt. Apple bietet Entwicklern Benachrichtigungen \u00fcber verschiedene Ereignisse im Scope an; f\u00fcr uns sind die Operationen KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA und KAUTH_VNODE_DELETE_CHILD von Bedeutung. Der Zugriff auf Dateien l\u00e4sst sich am einfachsten \u00fcber den Pfad einschr\u00e4nken \u2013 wir verwenden die API \"vn_getpath\", um den Pfad zur Datei zu ermitteln, und f\u00fchren einen Vergleich des Pfadpr\u00e4fixes durch. Es ist zu beachten, dass das System zur Optimierung der Umbenennung von Ordnerpfaden mit Dateien nicht den Zugriff auf jede Datei autorisiert, sondern nur auf den Ordner, der umbenannt wurde. Es muss ein Vergleich des \u00fcbergeordneten Pfades erfolgen, und KAUTH_VNODE_DELETE muss f\u00fcr diesen eingeschr\u00e4nkt werden.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man Prozesse und Kernel-Erweiterungen in macOS sch\u00fctzt\" src=\"\/wp-content\/uploads\/2020\/04\/409cf53d1cdbeee6a6f56f5c90574bf6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEin Nachteil dieses Ansatzes kann die geringe Leistung bei steigender Anzahl von Pr\u00e4fixen sein. Damit der Vergleich nicht O(prefix*length) ergibt, wobei prefix die Anzahl der Pr\u00e4fixe und length die L\u00e4nge der Zeichenkette ist, kann ein deterministischer endlicher Automat (DEA) genutzt werden, der auf den Pr\u00e4fixen basiert. <\/p>\n<p>Betrachten wir, wie ein DEA f\u00fcr dieses Set von Pr\u00e4fixen aufgebaut wird. Wir initialisieren Zeiger am Anfang jedes Pr\u00e4fixes. Wenn alle Zeiger auf dasselbe Symbol zeigen, erh\u00f6hen wir jeden Zeiger um ein Zeichen und merken uns, dass die L\u00e4nge der identischen Zeichenkette um eins gr\u00f6\u00dfer ist. Wenn zwei Zeiger existieren, deren Symbole unterschiedlich sind, teilen wir die Zeiger in Gruppen nach dem Symbol, auf das sie zeigen, und wiederholen den Algorithmus f\u00fcr jede Gruppe.<\/p>\n<p>Im ersten Fall (alle Symbole unter den Zeigern sind identisch) erhalten wir einen Zustand des DEA, der nur einen \u00dcbergang \u00fcber die identische Zeichenkette hat. Im zweiten Fall erhalten wir eine \u00dcbergangstabelle mit der Gr\u00f6\u00dfe 256 (Anzahl der Symbole und maximale Anzahl der Gruppen) f\u00fcr die folgenden Zust\u00e4nde, die durch rekursive Funktionsaufrufe erhalten werden.<\/p>\n<p>Betrachten wir ein Beispiel. F\u00fcr das Set von Pr\u00e4fixen (\"\/foo\/bar\/tmp\/\", \"\/var\/db\/foo\/\", \"\/foo\/bar\/aba\/\", \"foo\/bar\/aac\/\") kann folgender DEA ermittelt werden. In der Abbildung sind nur die \u00dcberg\u00e4nge dargestellt, die zu anderen Zust\u00e4nden f\u00fchren; andere \u00dcberg\u00e4nge werden kein Endzustand sein.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man Prozesse und Kernel-Erweiterungen in macOS sch\u00fctzt\" src=\"\/wp-content\/uploads\/2020\/04\/6f5c4734ee6c677749f2f7b55307549d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBeim Durchlaufen der Zust\u00e4nde des DEA kann es drei F\u00e4lle geben.<\/p>\n<ol>\n<li>Ein finales Zustand wurde erreicht \u2013 der Pfad ist gesch\u00fctzt; wir schr\u00e4nken die Operationen KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA und KAUTH_VNODE_DELETE_CHILD ein.<\/li>\n<li>Der finale Zustand wurde nicht erreicht, aber der Weg \"endete\" (der Null-Termin wurde erreicht) \u2014 der Weg ist \u00fcbergeordnet, es m\u00fcssen Einschr\u00e4nkungen f\u00fcr KAUTH_VNODE_DELETE vorgenommen werden. Beachten Sie, dass, wenn das vnode ein Ordner ist, ein \u2018\/\u2019 am Ende hinzugef\u00fcgt werden muss, andernfalls kann die Einschr\u00e4nkung auf die Datei \"\/foor\/bar\/t\" angewendet werden, was falsch ist.<\/li>\n<li>Der finale Zustand wurde nicht erreicht, der Weg ist nicht zu Ende. Keiner der Pr\u00e4fixe entspricht dem gegebenen, keine Einschr\u00e4nkungen werden eingef\u00fchrt.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Fazit<\/h3>\n<p>\nZiel der entwickelten Sicherheitsl\u00f6sungen ist es, das Sicherheitsniveau des Nutzers und seiner Daten zu erh\u00f6hen. Einerseits wird dieses Ziel durch die Entwicklung des Softwareprodukts Acronis erreicht, das die Schwachstellen schlie\u00dft, wo das Betriebssystem selbst \"schwach\" ist. Andererseits sollten auch die Sicherheitsaspekte nicht vernachl\u00e4ssigt werden, die auf der Seite des Betriebssystems verbessert werden k\u00f6nnen, zumal das Schlie\u00dfen solcher Schwachstellen unsere eigene Widerstandsf\u00e4higkeit als Produkt erh\u00f6ht. Die Schwachstelle wurde an das Apple Product Security Team gemeldet und in macOS 10.14.5 behoben (https:\/\/support.apple.com\/en-gb\/HT210119).<\/p>\n<p><img decoding=\"async\" alt=\"Wie man Prozesse und Kernel-Erweiterungen in macOS sch\u00fctzt\" src=\"\/wp-content\/uploads\/2020\/04\/98cd51cb47a81e8262a87bc792d59455.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAll dies kann nur dann durchgef\u00fchrt werden, wenn Ihr Dienstprogramm offiziell im Kern installiert wurde. Das hei\u00dft, f\u00fcr externe und unerw\u00fcnschte Software gibt es keine solchen Schlupfl\u00f6cher. Allerdings, wie Sie sehen k\u00f6nnen, muss selbst der Schutz legitimer Programme wie Antiviren- und Backup-Systemen hart erarbeitet werden. Aber jetzt werden die neuen Produkte von Acronis f\u00fcr macOS zus\u00e4tzlichen Schutz vor dem Entladen aus dem System haben.<br \/>\n<br \/>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Wie man Prozesse und Kernel-Erweiterungen in macOS sch\u00fctzt | ProHoster","description":"Hallo, Habr! Heute m\u00f6chte ich dar\u00fcber sprechen, wie man Prozesse vor Angriffen von Angreifern in macOS sch\u00fctzt.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/78514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=78514"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/78514\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/78515"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=78514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=78514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=78514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}