{"id":26486,"date":"2021-11-25T00:57:27","date_gmt":"2021-11-24T22:57:27","guid":{"rendered":"https:\/\/www.kaspersky.es\/blog\/?p=26486"},"modified":"2021-11-25T00:57:27","modified_gmt":"2021-11-24T22:57:27","slug":"trojan-source","status":"publish","type":"post","link":"https:\/\/www.kaspersky.es\/blog\/trojan-source\/26486\/","title":{"rendered":"Implantes invisibles en el c\u00f3digo fuente"},"content":{"rendered":"<p><span data-contrast=\"auto\">Los expertos de la Universidad de Cambridge\u00a0<\/span><a href=\"https:\/\/trojansource.codes\/trojan-source.pdf\" target=\"_blank\" rel=\"noopener nofollow\"><span data-contrast=\"none\">han descrito<\/span><\/a><span data-contrast=\"auto\">\u00a0una vulnerabilidad que, seg\u00fan afirman,\u00a0afecta a los compiladores m\u00e1s modernos.\u00a0Este\u00a0nuevo m\u00e9todo de ataque utiliza una funci\u00f3n leg\u00edtima de las herramientas de desarrollo en el que el c\u00f3digo fuente muestra una cosa, pero compila otra completamente distinta.\u00a0Todo\u00a0esto sucede mediante la magia de los caracteres de control Unicode.<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<div id=\"attachment_26489\" style=\"width: 1616px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-26489\" class=\"wp-image-26489 size-full\" src=\"https:\/\/media.kasperskydaily.com\/wp-content\/uploads\/sites\/88\/2021\/11\/24112425\/trojan-source-characters.jpg\" alt=\"Los caracteres de formato de direccionalidad Unicode relevantes para reordenar los ataques.\" width=\"1606\" height=\"355\"><p id=\"caption-attachment-26489\" class=\"wp-caption-text\">Los caracteres de formato de direccionalidad Unicode relevantes para reordenar los ataques. <a href=\"https:\/\/trojansource.codes\/trojan-source.pdf\" target=\"_blank\" rel=\"noopener nofollow\">Fuente<\/a><\/p><\/div>\n<p><span data-contrast=\"auto\">La mayor\u00eda de las veces, los caracteres de control no aparecen en la pantalla con el resto del c\u00f3digo (aunque algunos editores los muestran), pero modifican el texto de alguna\u00a0forma.\u00a0<\/span><a href=\"https:\/\/www.w3.org\/International\/articles\/inline-bidi-markup\/uba-basics\" target=\"_blank\" rel=\"noopener nofollow\"><span data-contrast=\"none\">En esta tabla<\/span><\/a><span data-contrast=\"auto\">\u00a0se incluyen los c\u00f3digos para el algoritmo bidireccional (bidi) Unicode, por ejemplo.\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Como probablemente ya sabr\u00e1s, algunos idiomas humanos se escriben de izquierda a derecha (por ejemplo, el espa\u00f1ol), otros de derecha a izquierda (por ejemplo, el \u00e1rabe). Cuando el c\u00f3digo contiene solo un idioma, no hay problema, pero cuando es necesario (por ejemplo, en el caso de una l\u00ednea contenga palabras en espa\u00f1ol y \u00e1rabe) el c\u00f3digo bidi especifica la direcci\u00f3n del texto.<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">En la investigaci\u00f3n, los autores utilizaron c\u00f3digos para, por ejemplo, mover el terminador de comentarios en el c\u00f3digo Python de la parte central de una l\u00ednea al final. Aplicaron un c\u00f3digo RLI para cambiar solo algunos caracteres, dejando el resto igual.\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<div id=\"attachment_26490\" style=\"width: 1760px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-26490\" class=\"wp-image-26490 size-full\" src=\"https:\/\/media.kasperskydaily.com\/wp-content\/uploads\/sites\/88\/2021\/11\/24112543\/trojan-source-example.jpg\" alt=\"Ejemplo de c\u00f3digo Python vulnerable que utiliza c\u00f3digos bidi.\" width=\"1750\" height=\"292\"><p id=\"caption-attachment-26490\" class=\"wp-caption-text\">Ejemplo de c\u00f3digo Python vulnerable que utiliza c\u00f3digos bidi. <a href=\"https:\/\/trojansource.codes\/trojan-source.pdf\" target=\"_blank\" rel=\"noopener nofollow\">Fuente<\/a><\/p><\/div>\n<p><span data-contrast=\"auto\">A la derecha est\u00e1 la versi\u00f3n que los programadores ven al revisar el c\u00f3digo fuente; a la izquierda se muestra c\u00f3mo el c\u00f3digo se ejecutar\u00e1. La mayor\u00eda de los compiladores ignora los caracteres de control. Cualquiera que revise el c\u00f3digo pensar\u00e1 que la quinta l\u00ednea es un comentario inofensivo, aunque en realidad, una sentencia de retorno anticipado escondida en su interior har\u00e1 que el programa se salte la operaci\u00f3n que carga los fondos de la cuenta bancaria. <\/span><span data-contrast=\"auto\">Es decir, en este ejemplo el programa bancario simulado dispensar\u00e1 el dinero, pero no lo deducir\u00e1 del saldo de la cuenta. <\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<h2><span data-contrast=\"none\">\u00bfPor qu\u00e9\u00a0resulta\u00a0peligroso?<\/span><span data-ccp-props='{\"201341983\":0,\"335559738\":40,\"335559739\":0,\"335559740\":259}'>\u00a0<\/span><\/h2>\n<p><span data-contrast=\"auto\">A simple vista, la vulnerabilidad parece muy sencilla. \u00bfQui\u00e9n insertar\u00eda caracteres invisibles con la esperanza de enga\u00f1ar a los auditores del c\u00f3digo fuente? No obstante, el problema se ha considerado lo suficientemente grave como para justificar un c\u00f3digo identificador de vulnerabilidades (<\/span><a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2021-42574\" target=\"_blank\" rel=\"noopener nofollow\"><span data-contrast=\"none\">CVE-2021-42574<\/span><\/a><span data-contrast=\"auto\">). Antes de publicar el art\u00edculo, los autores notificaron a los desarrolladores de los compiladores m\u00e1s comunes para darles tiempo para preparar\u00a0los\u00a0parches.\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">El informe describe las capacidades de ataque b\u00e1sicas. Las dos estrategias de ejecuci\u00f3n\u00a0consisten en\u00a0ocultar un comando dentro de los comentarios y algo en una l\u00ednea que, por ejemplo, aparezca en la pantalla. En teor\u00eda, es posible lograr el efecto opuesto: crear un c\u00f3digo que parezca un comando, pero\u00a0que realmente\u00a0forme\u00a0parte de un comentario y\u00a0acabe por no ejecutarse. Incluso es posible que existan m\u00e9todos m\u00e1s creativos para explotar esta debilidad.\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Por ejemplo, alguien podr\u00eda utilizar este truco\u00a0para llevar a cabo un sofisticado ataque de cadena de suministro donde un contratista suministre a una empresa un c\u00f3digo que parezca correcto, pero no funcione seg\u00fan lo planeado. Entonces, despu\u00e9s de que se libere el producto final, un externo podr\u00eda utilizar\u00a0esa\u00a0\u201cfuncionalidad alternativa\u201d para atacar a los clientes.\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<h2><span data-contrast=\"none\">Pero \u00bfes realmente tan peligroso?<\/span><span data-ccp-props='{\"201341983\":0,\"335559738\":40,\"335559739\":0,\"335559740\":259}'>\u00a0<\/span><\/h2>\n<p><span data-contrast=\"auto\">Poco despu\u00e9s de que se publicara\u00a0el art\u00edculo, el programador\u00a0Russ\u00a0Cox\u00a0<\/span><span data-contrast=\"none\">critic\u00f3<\/span><span data-contrast=\"auto\">\u00a0el ataque\u00a0Trojan\u00a0Source;\u00a0por decirlo de alguna forma, no se mostr\u00f3 muy\u00a0impresionado. Sus argumentos\u00a0fueron\u00a0los siguientes:\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">Para nada es un ataque nuevo.<\/span><span data-ccp-props='{\"134233279\":true,\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">Muchos editores de c\u00f3digo utilizan resaltado de sintaxis para mostrar el c\u00f3digo \u201cinvisible\u201d.<\/span><span data-ccp-props='{\"134233279\":true,\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"auto\">Los parches para los compiladores no son necesarios; basta con revisar cuidadosamente el c\u00f3digo para detectar errores accidentales o maliciosos.\u00a0<\/span><span data-ccp-props='{\"134233279\":true,\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-contrast=\"auto\">Bien es cierto que\u00a0el problema con los caracteres de control Unicode\u00a0lleva surgiendo desde\u00a0el\u00a0<\/span><a href=\"https:\/\/github.com\/golang\/go\/issues\/20209\" target=\"_blank\" rel=\"noopener nofollow\"><span data-contrast=\"none\">2017<\/span><\/a><span data-contrast=\"auto\">. Tampoco es nada nuevo un\u00a0problema similar con\u00a0los\u00a0<\/span><a href=\"https:\/\/es.wikipedia.org\/wiki\/Homoglifo\" target=\"_blank\" rel=\"noopener nofollow\"><span data-contrast=\"none\">homoglifos<\/span><\/a><span data-contrast=\"auto\">\u00a0(caracteres que parecen\u00a0iguales\u00a0pero tienen c\u00f3digos distintos)\u00a0y que tambi\u00e9n podr\u00eda servir para introducir c\u00f3digo desconocido m\u00e1s all\u00e1 de los verificadores manuales.\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Sin embargo, el an\u00e1lisis cr\u00edtico de Cox no niega la existencia del problema, sino que condena el informe como demasiado dram\u00e1tico, una descripci\u00f3n acertada de, por ejemplo, el art\u00edculo apocal\u00edptico del periodista Brian Krebs sobre\u00a0<\/span><a href=\"https:\/\/krebsonsecurity.com\/2021\/11\/trojan-source-bug-threatens-the-security-of-all-code\/\" target=\"_blank\" rel=\"noopener nofollow\"><span data-contrast=\"none\">Trojan Source<\/span><\/a><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">El problema es real, pero, por fortuna, la soluci\u00f3n es muy sencilla. Los parches que ya est\u00e1n disponibles o que est\u00e1n\u00a0a punto de\u00a0salir bloquear\u00e1n la compilaci\u00f3n de c\u00f3digo que contenga estos caracteres. (Como se indica, por ejemplo, en este\u00a0<\/span><a href=\"https:\/\/blog.rust-lang.org\/2021\/11\/01\/cve-2021-42574.html\" target=\"_blank\" rel=\"noopener nofollow\"><span data-contrast=\"none\">aviso de seguridad<\/span><\/a><span data-contrast=\"auto\">\u00a0de los desarrolladores del compilador Rust). Si utilizas tus propias herramientas de desarrollo de\u00a0<\/span><i><span data-contrast=\"auto\">software<\/span><\/i><span data-contrast=\"auto\">, te recomendamos a\u00f1adir una verificaci\u00f3n similar para caracteres ocultos, los cuales, normalmente, no deber\u00edan aparecer en los c\u00f3digos fuente.\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<h2><span data-contrast=\"none\">El peligro de los ataques\u00a0a la\u00a0cadena de suministro<\/span><span data-ccp-props='{\"201341983\":0,\"335559738\":40,\"335559739\":0,\"335559740\":259}'>\u00a0<\/span><\/h2>\n<p><span data-contrast=\"auto\">Muchas empresas subcontratan las labores de desarrollo a contratistas\u00a0o utilizan m\u00f3dulos de c\u00f3digo abierto ya hechos en sus proyectos. Esto siempre abre la puerta a ataques mediante la\u00a0<\/span><a href=\"https:\/\/encyclopedia.kaspersky.com\/glossary\/supply-chain\/\" target=\"_blank\" rel=\"noopener\"><span data-contrast=\"none\">cadena de suministro<\/span><\/a><span data-contrast=\"auto\">. Los ciberdelincuentes\u00a0pueden comprometer a un contratista o al c\u00f3digo incrustado en un proyecto de c\u00f3digo abierto\u00a0e introducir\u00a0c\u00f3digo malicioso en la versi\u00f3n final del\u00a0<\/span><i><span data-contrast=\"auto\">software<\/span><\/i><span data-contrast=\"auto\">. Las auditorias de c\u00f3digo normalmente revelan estas puertas traseras, pero,\u00a0si no, los usuarios finales podr\u00edan tener\u00a0<\/span><i><span data-contrast=\"auto\">software\u00a0<\/span><\/i><span data-contrast=\"auto\">de fuentes fiables y\u00a0aun\u00a0as\u00ed perder\u00a0sus\u00a0datos.\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Trojan Source es un ejemplo de un ataque mucho m\u00e1s elegante. En lugar de tratar de contrabandear megabytes de c\u00f3digo malicioso en un producto final, los atacantes pueden utilizar este enfoque para introducir un implante dif\u00edcil de detectar en una parte cr\u00edtica del\u00a0<\/span><i><span data-contrast=\"auto\">software\u00a0<\/span><\/i><span data-contrast=\"auto\">y explotarlo durante a\u00f1os.\u00a0<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<h2><span data-contrast=\"none\">C\u00f3mo mantenerse\u00a0a salvo<\/span><span data-ccp-props='{\"201341983\":0,\"335559738\":40,\"335559739\":0,\"335559740\":259}'>\u00a0<\/span><\/h2>\n<p><span data-contrast=\"auto\">Para protegerse contra los ataques del tipo Trojan Source:<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">Actualiza todos los compiladores de lenguaje de programaci\u00f3n que utilices (si se han liberado parches para estos).<\/span><span data-ccp-props='{\"134233279\":true,\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">Escribe tus propios\u00a0<\/span><i><span data-contrast=\"auto\">scripts<\/span><\/i><span data-contrast=\"auto\">\u00a0que detecten un rango limitado de caracteres\u00a0de\u00a0control en el c\u00f3digo fuente.<\/span><span data-ccp-props='{\"134233279\":true,\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-contrast=\"auto\">En t\u00e9rminos m\u00e1s generales, la lucha contra los ataques de cadena de suministro potenciales requiere tanto auditorias de c\u00f3digo manuales como una gama de pruebas automatizadas. Nunca est\u00e1 de m\u00e1s ver tu c\u00f3digo desde la perspectiva de los ciberdelincuentes para tratar de detectar ese sencillo error que pudiese quebrar todo el mecanismo de seguridad. Si no cuentas en interno con los recursos para este tipo de an\u00e1lisis, considera la opci\u00f3n de involucrar una serie de <a href=\"https:\/\/www.kaspersky.es\/enterprise-security\/cybersecurity-services?icid=es_kdailyplacehold_acq_ona_smm__onl_b2b_kasperskydaily_wpplaceholder_______\" target=\"_blank\" rel=\"noopener\">expertos\u00a0externos<\/a><\/span><span data-contrast=\"none\">.<\/span><span data-ccp-props='{\"201341983\":0,\"335559739\":160,\"335559740\":259}'>\u00a0<\/span><\/p>\n<input type=\"hidden\" class=\"category_for_banner\" value=\"kesb-top3\">\n","protected":false},"excerpt":{"rendered":"<p>Los investigadores de Cambridge describen el m\u00e9todo Trojan Source para insertar implantes ocultos en el c\u00f3digo fuente. <\/p>\n","protected":false},"author":665,"featured_media":26488,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2202,2754,2755],"tags":[2621,1474,784],"class_list":{"0":"post-26486","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-business","8":"category-enterprise","9":"category-smb","10":"tag-cadena-de-suministro","11":"tag-desarrollo","12":"tag-vulnerabilidades"},"hreflang":[{"hreflang":"es","url":"https:\/\/www.kaspersky.es\/blog\/trojan-source\/26486\/"},{"hreflang":"en-in","url":"https:\/\/www.kaspersky.co.in\/blog\/trojan-source\/23678\/"},{"hreflang":"en-ae","url":"https:\/\/me-en.kaspersky.com\/blog\/trojan-source\/19130\/"},{"hreflang":"ar","url":"https:\/\/me.kaspersky.com\/blog\/trojan-source\/9584\/"},{"hreflang":"en-us","url":"https:\/\/usa.kaspersky.com\/blog\/trojan-source\/25764\/"},{"hreflang":"en-gb","url":"https:\/\/www.kaspersky.co.uk\/blog\/trojan-source\/23819\/"},{"hreflang":"es-mx","url":"https:\/\/latam.kaspersky.com\/blog\/trojan-source\/23457\/"},{"hreflang":"it","url":"https:\/\/www.kaspersky.it\/blog\/trojan-source\/26051\/"},{"hreflang":"ru","url":"https:\/\/www.kaspersky.ru\/blog\/trojan-source\/31982\/"},{"hreflang":"tr","url":"https:\/\/www.kaspersky.com.tr\/blog\/trojan-source\/10311\/"},{"hreflang":"x-default","url":"https:\/\/www.kaspersky.com\/blog\/trojan-source\/42987\/"},{"hreflang":"pt-br","url":"https:\/\/www.kaspersky.com.br\/blog\/trojan-source\/18579\/"},{"hreflang":"pl","url":"https:\/\/plblog.kaspersky.com\/trojan-source\/15568\/"},{"hreflang":"de","url":"https:\/\/www.kaspersky.de\/blog\/trojan-source\/27789\/"},{"hreflang":"ja","url":"https:\/\/blog.kaspersky.co.jp\/trojan-source\/32001\/"},{"hreflang":"nl","url":"https:\/\/www.kaspersky.nl\/blog\/trojan-source\/27870\/"},{"hreflang":"ru-kz","url":"https:\/\/blog.kaspersky.kz\/trojan-source\/24631\/"},{"hreflang":"en-au","url":"https:\/\/www.kaspersky.com.au\/blog\/trojan-source\/29994\/"},{"hreflang":"en-za","url":"https:\/\/www.kaspersky.co.za\/blog\/trojan-source\/29798\/"}],"acf":[],"banners":"","maintag":{"url":"https:\/\/www.kaspersky.es\/blog\/tag\/vulnerabilidades\/","name":"vulnerabilidades"},"_links":{"self":[{"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/posts\/26486","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/users\/665"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/comments?post=26486"}],"version-history":[{"count":5,"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/posts\/26486\/revisions"}],"predecessor-version":[{"id":26499,"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/posts\/26486\/revisions\/26499"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/media\/26488"}],"wp:attachment":[{"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/media?parent=26486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/categories?post=26486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kaspersky.es\/blog\/wp-json\/wp\/v2\/tags?post=26486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}