Cuando comenzamos a descubrir el apasionante mundo de la seguridad informática hay algunos conceptos que revolucionan nuestra manera de concebir las cosas. Al menos fue mi caso. Afortunadamente aún no pierdo la capacidad de asombro, pero sin duda una de las ideas que mas me hizo pensar en la existencia de la confianza no fueron los malos amigos, sino los backdoors (puertas traseras). Creo que nadie podría dejar de sorprenderse cuando se le ocurre por vez primera que un programa de computadora podría tener la posibilidad de ser accedido de manera subrepticia (y por supuesto, no documentada) si previamente se le incluía una rutina dedicada para tal fin. Mi primer reacción en los '90, fue correr a escribir un código (en assembler) dentro de un programa propio, que hiciera exactamente eso.

Lo que no sabía era que mucho tiempo antes, había sido expuesta una prueba de concepto sobre esto mismo, por el mismísimo co-creador del sistema operativo UNIX y del lenguaje C: Ken Thompson. Este científico de la computación, dio un famoso discurso al recibir el premio Turing Award en 1984, donde presentó el tema de la confianza como necesidad indispensable de la seguridad, titulando curiosamente su charla "Confiando en la confianza".

La prueba proponía lo siguiente:

  • Tomar el patrón del código fuente del programa login (utilizado para iniciar sesión en entornos UNIX).
  • Modificar el código fuente del propio compilador, de manera que al darse cuenta de que está compilando el programa login, le inserte en su rutina de validación un password válido de manera estática (hardcoded) sólo conocido por el creador.
  • Modificar además el código del compilador para que al detectar que está compilando el propio código del compilador, inserte el código que permita detectar el patrón de login, y además inserte el código que genera este mismo código (o sea, el fragmento de sí mismo que corresponde a este ultimo párrafo).
  • Compilar el compilador modificado, volver a tomar el código limpio y compilarlo con el compilador modificado (binario compilado previamente).

¿Que obtenemos con todo esto? Un compilador que permite insertar un generador de backdoors al compilar otro compilador, o un backdoor al compilar login, pero que en su código fuente no tenía dicho código. Brillante.

Para realizar esto el programador debió hacer uso de una estrategia de programación que permite mostrar en la salida un código equivalente a su propio código fuente. En términos de ciencias de la computación, esto se suele denominar quine. La historia de los quines se remonta a los comienzos de la programación, y siempre se buscó competir por escribir el quine más corto posible, que dada su complejidad, no suele ser tarea sencilla en todos los lenguajes.

En conclusión, la prueba de concepto formulada anteriormente se la conoce como The Ken Thompson Hack, y podemos considerarla como el primer intento real de crear un backdoor para acceder a un sistema sin que el usuario lo sepa. De hecho, en caso de propagarse un backdoor así el resultado sería caótico, puesto que todas las herramientas tanto de diagnóstico como de debugging, de volcado de memoria, desensambladores, etc. serían creados con el compilador modificado y no habría herramientas del todo limpias. Y aquí viene el llamamiento a la confianza. Dicen que quienes escriben software de seguridad solo utilizan herramientas que ellos mismos hayan creado, pero ¿esto aplica al propio compilador? Lo cierto es que este ataque teórico apareció in the wild 25 años después, cuando el virus Induc (detectado por ESET NOD32 como Win32/Induc.A virus). azotó a los desarrolladores de Delphi. Esto demostró una vez más la persistencia de las ideas en el tiempo, y que debemos estar atentos a los distintos peligros pese a que hayan pasado de moda.

Federico Pacheco
Education & Research Manager

detectado por ESET NOD32 como Win32/Induc.A virus.