{"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\/es\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","title":{"rendered":"C\u00f3mo proteger procesos y extensiones del n\u00facleo en macOS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00a1Hola, Habr! Hoy quisiera hablar sobre c\u00f3mo se pueden proteger los procesos de los ataques de los ciberdelincuentes en macOS. Por ejemplo, esto es \u00fatil para un antivirus o un sistema de copias de seguridad, especialmente considerando que en macOS existen varias maneras de 'matar' un proceso. Lee sobre esto y los m\u00e9todos de protecci\u00f3n a continuaci\u00f3n.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/acronis\/blog\/497714\/\"><img decoding=\"async\" alt=\"C\u00f3mo proteger procesos y extensiones del n\u00facleo en 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\u00e9todo cl\u00e1sico para 'matar' un proceso<\/h3>\n<p>\nLa forma bien conocida de 'matar' un proceso es enviar una se\u00f1al SIGKILL al proceso. A trav\u00e9s de bash, se puede ejecutar los comandos est\u00e1ndar 'kill -SIGKILL PID' o 'pkill -9 NAME' para realizar la operaci\u00f3n. El comando 'kill' es conocido desde los tiempos de UNIX y est\u00e1 disponible no solo en macOS, sino tambi\u00e9n en otros sistemas similares a UNIX.<\/p>\n<p>Al igual que en sistemas similares a UNIX, macOS permite interceptar cualquier se\u00f1al enviada a un proceso, excepto dos: SIGKILL y SIGSTOP. En este art\u00edculo, abordaremos principalmente la se\u00f1al SIGKILL, como la se\u00f1al que provoca la eliminaci\u00f3n de un proceso.<\/p>\n<h3>Especificidades de macOS<br \/>\n<\/h3>\n<p>\nEn macOS, la llamada al sistema kill en el n\u00facleo XNU invoca la funci\u00f3n psignal(SIGKILL, \u2026). Veamos qu\u00e9 otras acciones del usuario en userspace pueden invocar la funci\u00f3n psignal. Excluiremos las llamadas a la funci\u00f3n psignal en los mecanismos internos del n\u00facleo (aunque tambi\u00e9n pueden ser no triviales, pero dejaremos eso para otro art\u00edculo \ud83d\ude42 \u2014 verificaci\u00f3n de firma, errores de memoria, manejo de salida\/terminaci\u00f3n, violaciones de protecci\u00f3n de archivos, etc. <\/p>\n<p>Comenzaremos la revisi\u00f3n con la funci\u00f3n y la correspondiente llamada al sistema <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/kern_sig.c#L1672\">terminate_with_payload<\/a><\/noindex>. Se observa que, adem\u00e1s de la llamada cl\u00e1sica a kill, existe un enfoque alternativo que es espec\u00edfico del sistema operativo macOS y no se encuentra en BSD. Los principios de operaci\u00f3n de ambas llamadas al sistema tambi\u00e9n son similares. Se trata de llamadas directas a la funci\u00f3n del n\u00facleo psignal. Tambi\u00e9n notemos que antes de matar un proceso se realiza una verificaci\u00f3n de 'cansignal': si el proceso puede enviar una se\u00f1al a otro proceso, el sistema no permite que cualquier aplicaci\u00f3n mate procesos del sistema, por ejemplo.<\/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() pendr\u00e1 un SIGKILL en el hilo especificado o\n\t\t * retornar\u00e1 si el hilo y\/o tarea ya est\u00e1n terminando. De cualquier manera,\n\t\t * el hilo actual no regresar\u00e1 al espacio de usuarios.\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 forma est\u00e1ndar de crear demonios al inicio del sistema y controlar su tiempo de vida es mediante launchd. Cabe destacar que los c\u00f3digos fuente presentados son para una versi\u00f3n antigua de launchctl antes de macOS 10.10, los ejemplos de c\u00f3digo se presentan como ilustraci\u00f3n. El launchctl moderno env\u00eda se\u00f1ales a launchd a trav\u00e9s de XPC, la l\u00f3gica de launchctl se ha trasladado a \u00e9l.<\/p>\n<p>Veamos c\u00f3mo se detienen las aplicaciones. Antes de enviar la se\u00f1al SIGTERM, se intenta detener la aplicaci\u00f3n mediante la llamada al sistema '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, \"No se pudo terminar el trabajo: %d: %s\", error, strerror(error));\n\t\tjob_log(j, LOG_NOTICE | LOG_CONSOLE, \"Usando opci\u00f3n de reserva para terminar el trabajo...\");\n\t\terror = kill2(j-&gt;p, SIGTERM);\n\t\tif (error) {\n\t\t\tjob_log(j, LOG_ERR, \"No se pudo enviar se\u00f1al al trabajo: %d: %s\", error, strerror(error));\n\t\t} \n...\n<\/code><\/pre>\n<p>\nBajo el cap\u00f3, proc_terminate, a pesar de su nombre, puede enviar no solo psignal con SIGTERM, sino tambi\u00e9n SIGKILL.<\/p>\n<h3>Asesinato indirecto: restricci\u00f3n de recursos<\/h3>\n<p>\nSe puede observar un caso m\u00e1s interesante en otra llamada al sistema <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L652\">process_policy<\/a><\/noindex>. El uso est\u00e1ndar de esta llamada al sistema son las restricciones de recursos de las aplicaciones, por ejemplo, para un indexador, la limitaci\u00f3n en la cuota de tiempo de CPU y memoria, para que el sistema no se ralentice significativamente por las acciones de almacenamiento en cach\u00e9 del archivo. Si una aplicaci\u00f3n alcanza la limitaci\u00f3n de recursos, como se puede ver en la funci\u00f3n proc_apply_resource_actions, se env\u00eda una se\u00f1al SIGKILL al proceso.<\/p>\n<p>A pesar de que esta llamada al sistema puede potencialmente llevar a la muerte del proceso, el sistema no verific\u00f3 adecuadamente los derechos del proceso que realiza la llamada. De hecho, la verificaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/kern\/process_policy.c#L267\">exist\u00eda<\/a><\/noindex>, pero es suficiente usar el flag alternativo PROC_POLICY_ACTION_SET para eludir esta condici\u00f3n.<\/p>\n<p>Desde aqu\u00ed, si \"limitar\" la cuota de uso de CPU de una aplicaci\u00f3n (por ejemplo, permitir que solo se ejecute 1 ns), se puede llevar a cabo la eliminaci\u00f3n de cualquier proceso en el sistema. As\u00ed, un malware puede eliminar cualquier proceso en el sistema, incluido el del antivirus. Tambi\u00e9n es interesante el efecto que se produce al eliminar un proceso con pid 1 (launchctl): p\u00e1nico del kernel al intentar manejar la se\u00f1al SIGKILL \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"C\u00f3mo proteger procesos y extensiones del n\u00facleo en macOS\" src=\"\/wp-content\/uploads\/2020\/04\/46adadb9b3f28b78f0b9df410e601bb9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>\u00bfC\u00f3mo resolver el problema?<\/h3>\n<p>\nLa forma m\u00e1s directa de prohibir la eliminaci\u00f3n de un proceso es reemplazar el puntero a la funci\u00f3n en la tabla de llamadas al sistema. Desafortunadamente, este m\u00e9todo no es trivial por muchas razones.<\/p>\n<p>Primero, el s\u00edmbolo que corresponde a la posici\u00f3n sysent en la memoria no solo es un s\u00edmbolo privado del n\u00facleo XNU, sino que tampoco se puede encontrar en los s\u00edmbolos del n\u00facleo. Tendremos que utilizar m\u00e9todos heur\u00edsticos para la b\u00fasqueda, como la desensambladura din\u00e1mica de la funci\u00f3n y la b\u00fasqueda del puntero en ella.<\/p>\n<p>En segundo lugar, la estructura de las entradas en la tabla depende de las banderas con las que se compil\u00f3 el n\u00facleo. Si se declara la bandera CONFIG_REQUIRES_U32_MUNGING, el tama\u00f1o de la estructura se ver\u00e1 alterado: se a\u00f1adir\u00e1 un campo adicional. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/a449c6a3b8014d9406c2ddbdc81795da24aa7443\/bsd\/sys\/sysent.h#L45\">sy_arg_munge32<\/a><\/noindex>. Es necesario realizar una verificaci\u00f3n adicional sobre con qu\u00e9 bandera se compil\u00f3 el n\u00facleo, como opci\u00f3n, comparar los punteros a funciones con los conocidos.<\/p>\n<pre><code class=\"cpp\">struct sysent {         \n        \/* tabla de llamadas al sistema *\/\n        sy_call_t       *sy_call;       \/* funci\u00f3n de implementaci\u00f3n *\/\n#if CONFIG_REQUIRES_U32_MUNGING || (__arm__ &amp;&amp; (__BIGGEST_ALIGNMENT__ &gt; 4))\n        sy_munge_t      *sy_arg_munge32; \/* modificador de argumentos de llamada al sistema para procesos de 32 bits *\/\n#endif\n        int32_t         sy_return_type; \/* tipos de retorno de llamadas al sistema *\/\n        int16_t         sy_narg;        \/* n\u00famero de argumentos *\/\n        uint16_t        sy_arg_bytes;   \/* Tama\u00f1o total de argumentos en bytes para\n                                         * llamadas al sistema de 32 bits\n                                         *\/\n};\n<\/code><\/pre>\n<p>\nAfortunadamente, en las versiones modernas de macOS, Apple proporciona una nueva API para trabajar con procesos. La API de Seguridad de Endpoint permite a los clientes autorizar muchas solicitudes a otros procesos. As\u00ed, se pueden bloquear cualquier se\u00f1al a los procesos, incluida la se\u00f1al SIGKILL mediante la API mencionada anteriormente.<\/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 manera similar, en el n\u00facleo se puede registrar una Pol\u00edtica MAC, que proporciona un m\u00e9todo de protecci\u00f3n contra se\u00f1ales (policy proc_check_signal), sin embargo, la API no se admite oficialmente.<\/p>\n<h3>Protecci\u00f3n de la extensi\u00f3n del n\u00facleo<\/h3>\n<p>\nAdem\u00e1s de la protecci\u00f3n de los procesos en el sistema, es necesaria la protecci\u00f3n de la propia extensi\u00f3n del n\u00facleo (kext). macOS proporciona a los desarrolladores un marco para el desarrollo c\u00f3modo de controladores de dispositivos IOKit. Adem\u00e1s de ofrecer herramientas para trabajar con dispositivos, IOKit proporciona m\u00e9todos de apilamiento de controladores (driver stacking) mediante instancias de clases en C++. Una aplicaci\u00f3n en el espacio de usuario podr\u00e1 \"encontrar\" una instancia registrada de la clase para establecer una conexi\u00f3n kernel-espacio de usuario.<\/p>\n<p>Para detectar la cantidad de instancias de clases en el sistema, existe la utilidad ioclasscount.<\/p>\n<pre><code class=\"cpp\">my_kext_ioservice = 1\nmy_kext_iouserclient = 1\n<\/code><\/pre>\n<p>\nCualquier extensi\u00f3n del n\u00facleo que desee registrarse en la pila de controladores debe declarar una clase heredada de IOService, por ejemplo, my_kext_ioservice en este caso. La conexi\u00f3n de aplicaciones de usuario provoca la creaci\u00f3n de una nueva instancia de clase que hereda de IOUserClient, en este caso my_kext_iouserclient.<\/p>\n<p>Al intentar descargar el controlador del sistema (comando kextunload), se llama a la funci\u00f3n virtual \"bool terminate(IOOptionBits options)\". Basta con devolver false en la llamada a la funci\u00f3n terminate al intentar descargar para prohibir kextunload.<\/p>\n<pre><code class=\"cpp\">bool Kext::terminate(IOOptionBits options)\n{\n\n  if (!IsUnloadAllowed)\n  {\n    \/\/ La descarga no est\u00e1 permitida, devolviendo false\n    return false;\n  }\n\n  return super::terminate(options);\n}\n\n<\/code><\/pre>\n<p>\nLa bandera IsUnloadAllowed puede ser establecida por IOUserClient al cargarse. Al haber una restricci\u00f3n en la descarga, el comando kextunload devolver\u00e1 la siguiente salida:<\/p>\n<pre><code class=\"cpp\">admin@admins-Mac drivermanager % sudo kextunload .\/test.kext\nContrase\u00f1a:\n(kernel) No se puede eliminar kext my.kext.test; los servicios no se pudieron terminar - 0xe00002c7.\nFallo al descargar my.kext.test - (iokit\/common) funci\u00f3n no soportada.\n<\/code><\/pre>\n<p>\nSe debe realizar una protecci\u00f3n similar para IOUserClient. Las instancias de clases se pueden descargar mediante la funci\u00f3n IOKitLib del espacio de usuario \"IOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);\". Se puede devolver false en la llamada al comando \"terminate\" mientras la aplicaci\u00f3n del espacio de usuario no \"muera\", es decir, hasta que se llame a la funci\u00f3n \"clientDied\".<\/p>\n<h3>Protecci\u00f3n de archivos<\/h3>\n<p>\nPara proteger los archivos, es suficiente usar la API Kauth, que permite restringir el acceso a los archivos. Apple proporciona a los desarrolladores notificaciones sobre diversos eventos en el scope; para nosotros, son importantes las operaciones KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA y KAUTH_VNODE_DELETE_CHILD. Es m\u00e1s sencillo restringir el acceso a los archivos seg\u00fan la ruta: utilizamos la API \u201cvn_getpath\u201d para obtener la ruta al archivo y realizamos la comparaci\u00f3n del prefijo de la ruta. Cabe destacar que, para optimizar el renombramiento de las rutas de las carpetas con archivos, el sistema no autoriza el acceso a cada archivo, sino solo a la carpeta misma que ha sido renombrada. Es necesario comparar la ruta del padre y restringir KAUTH_VNODE_DELETE para ella.<\/p>\n<p><img decoding=\"async\" alt=\"C\u00f3mo proteger procesos y extensiones del n\u00facleo en macOS\" src=\"\/wp-content\/uploads\/2020\/04\/409cf53d1cdbeee6a6f56f5c90574bf6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn inconveniente de este enfoque puede ser el bajo rendimiento a medida que aumenta la cantidad de prefijos. Para que la comparaci\u00f3n no sea O(prefix*length), donde prefix es el n\u00famero de prefijos y length es la longitud de la cadena, se puede utilizar un aut\u00f3mata finito determinista (AFD) construido a partir de los prefijos. <\/p>\n<p>Consideremos un m\u00e9todo para construir un AFD para este conjunto de prefijos. Inicializamos los cursores al inicio de cada prefijo. Si todos los cursores apuntan al mismo s\u00edmbolo, aumentamos cada cursor en uno y recordamos que la longitud de la cadena id\u00e9ntica ha crecido en uno. Si hay dos cursores y los s\u00edmbolos que apuntan son diferentes, dividimos los cursores en grupos seg\u00fan el s\u00edmbolo al que est\u00e1n apuntando y repetimos el algoritmo para cada grupo.<\/p>\n<p>En el primer caso (todas las letras bajo los cursores son iguales), obtenemos un estado del AFD que tiene solo una transici\u00f3n por la cadena id\u00e9ntica. En el segundo caso, obtenemos una tabla de transiciones de tama\u00f1o 256 (n\u00famero de s\u00edmbolos y el m\u00e1ximo de grupos) hacia los siguientes estados, obtenidos en la llamada recursiva de la funci\u00f3n.<\/p>\n<p>Consideremos un ejemplo. Para el conjunto de prefijos (\u201c\/foo\/bar\/tmp\/\u201d, \u201c\/var\/db\/foo\/\u201d, \u201c\/foo\/bar\/aba\/\u201d, \u201cfoo\/bar\/aac\/\u201d), se puede obtener el siguiente AFD. En la ilustraci\u00f3n, se indican solo las transiciones que conducen a otros estados; las otras transiciones no ser\u00e1n finales.<\/p>\n<p><img decoding=\"async\" alt=\"C\u00f3mo proteger procesos y extensiones del n\u00facleo en macOS\" src=\"\/wp-content\/uploads\/2020\/04\/6f5c4734ee6c677749f2f7b55307549d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAl atravesar los estados del AFD, pueden surgir 3 casos.<\/p>\n<ol>\n<li>Se ha alcanzado un estado final: el camino est\u00e1 protegido, restringimos las operaciones KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA y KAUTH_VNODE_DELETE_CHILD.<\/li>\n<li>No se alcanz\u00f3 el estado final, pero el camino \"termin\u00f3\" (se alcanz\u00f3 el terminador nulo) \u2014 el camino es padre, es necesario restringir KAUTH_VNODE_DELETE. Notemos que si el vnode es una carpeta, se debe agregar al final \u2018\/\u2019, de lo contrario puede realizarse una restricci\u00f3n al archivo \u201c\/foor\/bar\/t\u201d, lo cual es incorrecto.<\/li>\n<li>No se alcanz\u00f3 el estado final, el camino no ha terminado. Ninguno de los prefijos coincide, no se introducen restricciones.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Conclusi\u00f3n<\/h3>\n<p>\nEl objetivo de las soluciones de seguridad que se est\u00e1n desarrollando es aumentar el nivel de seguridad del usuario y sus datos. Por un lado, este objetivo se logra mediante el desarrollo del producto Acronis, que cierra aquellas vulnerabilidades donde el propio sistema operativo es \"d\u00e9bil\". Por otro lado, no se deben descuidar los aspectos de seguridad que se pueden mejorar en el lado del sistema operativo, ya que cerrar este tipo de vulnerabilidades aumenta nuestra propia resistencia como producto. La vulnerabilidad fue reportada al Apple Product Security Team y fue corregida en macOS 10.14.5 (https:\/\/support.apple.com\/en-gb\/HT210119).<\/p>\n<p><img decoding=\"async\" alt=\"C\u00f3mo proteger procesos y extensiones del n\u00facleo en macOS\" src=\"\/wp-content\/uploads\/2020\/04\/98cd51cb47a81e8262a87bc792d59455.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTodo esto solo se puede hacer si su utilidad ha sido oficialmente instalada en el n\u00facleo. Es decir, para software externo y no deseado no hay tales lagunas. Sin embargo, como pueden ver, incluso para proteger programas leg\u00edtimos, como antivirus y sistemas de respaldo, hay que esforzarse. Pero a partir de ahora, los nuevos productos de Acronis para macOS tendr\u00e1n una protecci\u00f3n adicional contra la descarga del sistema.<br \/>\n<br \/>Fuente: <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\/es\/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=\"es_ES\" \/>\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\/es\/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\udd47C\u00f3mo proteger procesos y extensiones del n\u00facleo en macOS | ProHoster","description":"\u00a1Hola, Habr! Hoy me gustar\u00eda hablar sobre c\u00f3mo proteger los procesos contra las incursiones de los atacantes en macOS.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/kak-zashhishhat-proczessy-i-rasshireniya-yadra-v-macos","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/78514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=78514"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/78514\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/78515"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=78514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=78514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=78514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}