El ciberataque que a Poe se la hubiera puesto gorda
El hackeo a XZ Utils y los "principios de búsqueda" que permiten a un CPSer formular mejores hipótesis
Hace poco más de un mes, el 29 de marzo, se descubrió una vulnerabilidad en xz Utils, la librería más usada para comprimir datos en sistemas Linux y UNIX.
Una puerta trasera inyectada por hackers maliciosos que estuvo a punto de afectar a millones de usuarios, incluidas las distribuciones más populares de Linux: Ubuntu, Debian y Fedora.
Fue calificada con la máxima puntuación CVSS (amenaza crítica), porque es un atentado contra la cadena de suministro que podría haber otorgado un rango de ataque brutal, quizás el más amplio de la historia de la informática..
Para ponerlo en perspectiva, Linux se usa para gestionar la mayoría de los servidores públicos de Internet, y una parte creciente de los servidores de empresas privadas y corporaciones.
Si no se hubiera descubierto a tiempo, habría sido catastrófico para el mundo.
Pero ninguno de los devs de la comunidad que supervisaba el código dio la alarma.
Y no dieron la alarma porque al parecer nadie lo advirtió.
De hecho, solo se descubrió por accidente, gracias al sentido arácnido de un usuario hipersofisticado que notó una demora de 0.5 segundos en el inicio de sesión de su máquina.
El ataque fue una operación de ingeniería social que duró años y tiene todos los ribetes de un culebrón friki (si te interesa puedes escuchar la historia en Tierra de Hackers, un podcast fantástico).
Pero en lo que quiero concentrarme aquí es en las maniobras inesperadas con las que el atacante logró ocultar el código malicioso mientras trabajaba a la vista de todos.
Algunos datos para situarnos:
xz Utils es una suite de herramientas para comprimir datos sin sufrir pérdidas y se usa en innumerables procesos en los entornos Linux y también en los sistemas operativos basados en UNIX como el iOS.
Es un proyecto de código abierto creado y mantenido por el desarrollador Lasse Collin.
Jia Tan es el alias de una cuenta de GitHub que fue involucrándose de a poco con el proyecto, y que con los años obtuvo permisos de commit (para hacer cambios en el código del repositorio) y, eventualmente, de gestión de versiones.
Se especula que se trata de un grupo organizado, aunque una sola persona es perfectamente capaz de llevar a cabo una operación de ingeniería social de este calibre si está lo suficientemente motivada.
La puerta trasera se fue inyectando en múltiples commits. El ataque es muy complejo, con varias idas y vueltas, como este infográfico deja entrever:
Pero hagamos foco en 3 puntos clave del ataque:
1
En vez de poner el código malicioso en la librería principal del proyecto, el atacante inyectó la puerta trasera como parte de la batería de tests (las pruebas que se ejecutan cada vez que se instala la librería en un sistema para asegurarse de que todo funciona a la perfección y a la que Jia Tan había contribuido en reiteradas ocasiones).
Es una jugada muy astuta, porque por norma general los ficheros relacionados con las pruebas no se suelen mirar tan al detalle. La mayoría de devs se los saltan porque es la parte aburrida, la parte protocolar que siempre es igual.
En un proyecto de código abierto no hay jefes que te obliguen a hacer nada que no quieras hacer. Y por más comprometido que esté un contribuidor con un proyecto, es improbable que desee trastear con los ficheros de prueba.
Y sin un análisis detallado, no resulta nada fácil detectar la presencia de código ofuscado, y menos aún comprender su funcionamiento.
2
Para poder volar bajo el radar el mayor tiempo posible, la inyección del código malicioso debía ser lo más selectiva posible. El objetivo era infectar las distribuciones reales de Linux, no alarmar a los usuarios expertos ni a los investigadores de seguridad.
Si el ataque iba a tener alguna chance de éxito, el atacante debía asegurarse de que el incidente no se pudiera reproducir en un entorno controlado.
Para eso, se aprovecharon de una característica de Git, el software de control de versiones: poder ignorar la presencia de ciertos ficheros.
El atacante determinó que fuera la presencia de un fichero especifico lo que disparara la inyección del código malicioso durante la compilación.
Este fichero se añadió luego a ".gitignore", haciéndolo inaccesible a las operaciones regulares de gestión de versiones del repositorio.
De esta manera, únicamente estaría presente (y configurado como un gatillo) durante el proceso de compilación del paquete de una distribución Linux.
Que es, naturalmente, cuando se puede hacer daño de verdad.
3
En uno de sus últimos commits, la cuenta Jia Tan vuelve a modificar el código de pruebas, esta vez con el objetivo de desactivar el landlock, una catacterística de seguridad del kernel de Linux que limita el alcance y los recursos a los que un programa puede acceder y que, de permitir que se active durante la compilación, bloquearía cualquier importación de código ajeno, haciendo imposible el ataque.
¿Cómo es posible que un cambio tan bestia no llamara la atención de nadie?
Porque, en realidad, el landlock no se ha tocado en ninguna parte de la maniobra.
Si alguien revisa el sistema todo sigue allí, intacto, tan disponible como siempre.
Lo que el atacante ha hecho es introducir intencionadamente un error de sintaxis en el código.
Más específicamente, un "."
Y he aquí el detalle genial:
Al incluir ese punto es inevitable que se produzca un error, y que por defecto se asuma que el error indica que la protección de landlock está ausente del sistema.
De este modo se interrumpe la verificación, haciendo imposible la detección de landlock, que dará siempre false, lo que efectivamente deshabilita la protección y permite importar libremente el código malicioso.
Principios de búsqueda
En La carta robada, el estupendo cuento de Poe, el detective Auguste Dupin le explica al narrador cómo hizo para encontrar y recuperar el documento que un audaz ministro había sustraído a un miembro de la realeza con el fin de conservarlo en su poder y utilizarlo como instrumento de chantaje.
El narrador quería saber por qué, a pesar de haber tenido acceso a la mansión del ministro (incluida su oficina) en varias oportunidades y de haber utilizado las herramientas más sofisticadas para revisar la casa, el prefecto de la policía de Paris y sus hombres no habían encontrado absolutamente nada.
¿Acaso no habían actuado de la manera más profesional?
"Las medidas adoptadas no solamente eran las mejores en su género, sino que habían sido llevadas a la más absoluta perfección," ratificó Dupin.
Pero... ¿y entonces?
"Su defecto residía en que eran inaplicables al caso y al hombre en cuestión."
Dupin entonces se explaya en la lógica de adoptar un principio de búsqueda adecuado a la situación.
“El principio que rige una búsqueda se basa a su vez en una serie de nociones sobre el ingenio humano, a las cuales se ha acostumbrado el prefecto en la prolongada rutina de su tarea.”
Y luego lo grafica con un ejemplo genial:
"¿Ha observado usted alguna vez, entre las muestras de las tiendas, cuáles atraen la atención en mayor grado?
-Jamás se me ocurrió pensarlo -dije.
-Hay un juego de adivinación -continuó Dupin- que se juega con un mapa.
Uno de los participantes pide al otro que encuentre una palabra dada: el nombre de una ciudad, un río, un Estado o un imperio; en suma, cualquier palabra que figure en la abigarrada y complicada superficie del mapa.
Por lo regular, un novato en el juego busca confundir a su oponente proponiéndole los nombres escritos con los caracteres más pequeños, mientras que el buen jugador escogerá aquellos que se extienden con grandes letras de una parte a otra del mapa."
De acuerdo con el principio de búsqueda del prefecto, la carta estaba escondida en algún sitio recóndito e inaccesible.
“¿No ha advertido que el prefecto da por sentado que todo hombre esconde una carta, si no exactamente en un agujero practicado en la pata de una silla, por lo menos en algún agujero o rincón sugerido por la misma línea de pensamiento que inspira la idea de esconderla en un agujero hecho en la pata de una silla?”
Que NO estuviera escondida en absoluto, eso era algo que estaba fuera del alcance de su principio de búsqueda.
David Perkins, doctor en Matemáticas e Inteligencia Artificial por el Instituto de Tecnología de Massachusetts y profesor de Harvard, reporta el resultado de unas pruebas en las que se ponía a sujetos ante desafíos creativos y se los dividía en grupos.
Mientras que al primero se lo instruía para improvisar durante la actividad y olvidarse de la calidad en favor de la cantidad, al segundo grupo se le pedía focalizarse únicamente en soluciones de alta calidad.
Los investigadores encontraron que el primer grupo, el de cantidad sobre calidad, producía un mayor número de soluciones de calidad, pero con un promedio de calidad más baja que el otro grupo.
En este caso el énfasis en la calidad parecía perjudicar el rendimiento.
Sin embargo, en pruebas posteriores los investigadores introdujeron una pequeña modificación: al grupo de sujetos al que se les pedía exclusivamente soluciones de calidad, se le pidió también cumplir con ciertos estándares.
Por ejemplo, en un problema donde debían inventar títulos de historias, se especificó que los títulos debían ser imaginativos, creativos e inusuales.
Al especificar un criterio de búsqueda, por más mínimo que fuera, los resultados fueron completamente diferentes: buenas soluciones con un promedio de calidad altísima.
Volviendo al cuento de Poe, al comentar sobre el fracaso de la investigación policial, Dupin dice:
"Sólo tienen en cuenta sus propias ideas ingeniosas y, al buscar alguna cosa oculta, se fijan solamente en los métodos que ellos hubieran empleado para ocultarla."
El fallo, como explica Dupin al narrador, fue enamorarse de un método.
Al prefecto le faltó la flexibilidad cognitiva necesaria para apartar la "cantidad de recursos altamente ingeniosos" que le sirvieron bien en oportunidades anteriores, pero que en la presente ocasión sencillamente no valían.
Suelen ser esos mismos recursos los que tienden a volverse una especie de lecho de Procusto, en el que nos empeñamos en encajar nuestros designios.
Aberraciones de la lente
Así pues, es muy fácil y tentador caer en una ceguera metodológica.
El filósofo de la mente Daniel Dennett, un auténtico especialista en detectar e invertir premisas erróneas, pone un ejemplo extraído del campo de la química prebiótica.
En su libro From bacteria to Bach and back, comenta que durante años los investigadores no pudieron hallar la solución al problema de cómo había surgido el ribonucleótido del ARN.
Hasta que los químicos Matthew Powner y John Sutherland se dieron cuenta de algo que los otros químicos pasaron por alto: suponer que las bases nitrogenadas se unen directamente con la ribosa solo porque esa es la manera más eficiente, la distancia más corta entre dos puntos, era un error.
Dar por sentado que la vía más eficiente es la respuesta a todos los casos es una de las premisas del método dominante en esta rama de la ciencia: la ingeniería inversa.
Pero aquella suposición metodológica, útil y conveniente en la mayoría de los casos, aquí no hizo otra cosa que ocultar la solución. Una y otra vez, durante décadas, la investigación había ignorado la vía indirecta: que el ribonucleótido surge a partir de un precursor común.
De manera que los pasos intermedios solo habían parecido necesarios bajo la lente del método de ingeniería inversa. Una vez ampliado el principio de búsqueda, la solución les estaba mirando a la cara.
Karl Popper afirma que no hay metodologías exclusivas, solo hay problemas que resolver.
Y muchas veces el problema no es el problema en sí, el problema es que las soluciones están ocultas por artefactos de la lente que usamos para focalizar el problema.
Ser conscientes de esta situación es una ventaja.
Michel Polanyi señala que la conciencia humana tiene un "carácter vectorial": se mueve desde los particulares subsidiarios hacia el objetivo focal.
"Cuando movemos el martillo no sentimos realmente el mango golpeando nuestra mano sino la cabeza del martillo golpeando el clavo, aunque de alguna manera estamos alerta a la sensación de nuestra mano que sostiene la herramienta. Esta sensación nos guía al sostener el mango correctamente y poder realizar así nuestra tarea."
Polanyi diferencia estos dos tipos de atención: el foco, que en este caso sería el clavo, y los instrumentos subsidiarios (el mango del martillo, las sensaciones de nuestra mano, de nuestro brazo, son instrumentos por los que fluye la conciencia).
En cualquier momento podemos modificar el foco, transformando un subsidiario en foco, o al reves, atravesando el foco para convertirlo en subsidiario de un nuevo foco.
John Vervaeke, el filósofo y científico cognitivo de la University of Toronto, lo explica como escalar la atención desde la opacidad (foco) hacia la transparencia (subsidiario), y viceversa.
¿Qué quiere decir esto en términos prácticos?
Que tenemos la opción de cambiar el sentido y dirección de nuestra atención a voluntad.
Que podemos desplazar la conciencia desde el foco a través de los numerosos subsidiarios, desautomatizando la cognición.
Podemos ser conscientes del objeto de búsqueda, pero también de los distintos instrumentos que utilizamos para la búsqueda, de las lentes de esos instrumentos, de los artefactos o aberraciones presentes en las lentes, de los marcos de esas lentes, etc.
Y el mismo recorrido puede hacerse desde nuestro foco actual de búsqueda hacia fuera, hacia el mundo, atravesándolo, cogiendo elementos que están en el fondo y colocándolos al frente, considerando patrones que no habíamos reconocido antes y cambiando su relevancia para volverlos el nuevo foco de nuestras búsquedas.
Esto nos permite capturar patrones diferentes, más grandes, que nos permiten ir más profundo, movernos con más sentido hacia el mundo.
Los problemas chungos son chungos, entre otras cosas, porque no admiten principios de búsqueda convencionales.
Para generar hipótesis en condiciones de incertidumbre conviene salirse de los parámetros habituales de búsqueda y formular unos principios de búsqueda más sensibles a su contexto, con capacidad de ampliar el marco del problema, explorando otros campos de posibilidades.
Un principio de búsqueda sirve para tener claro aquello que está influyendo en el problema desde un sitio que a nadie se le hubiera ocurrido considerar como parte del contexto.
Como aspirante a CPSer intento aprender a formular y seguir reformulando un principio de búsqueda que potencie un razonamiento contextual efectivo, y no acabar errando el tiro "por ser demasiado profundo o demasiado superficial para el caso."
Como poeta y matemático es capaz de razonar bien, dice Dupin refiriéndose al ministro que inventó la maniobra que engañó al prefecto y a sus hombres. Sin embargo como mero matemático, añade planteando un escenario contrafactual, probablemente no habría hecho más que recurrir al principio de búsqueda más lógico. Y entonces sí que habría quedado a merced del prefecto.
Pero en el cuento la policía de Paris queda atrapada en su lógica y el cheque de la recompensa acaba en manos de Dupin, cuyas medidas se habían adaptado a las verdaderas capacidades del ministro, "teniendo en cuenta las circunstancias que le rodeaban".
Es probable que la próxima vez el cheque acabe en manos de Jia Tan.
Si te ha gustado el newsletter te agradecería que lo compartas con tu audiencia.
Para más de esto, puedes seguirme en Twitter: