Al final, siempre tenes que confiar en alguien

El otro día estaba leyendo el texto Reflections on Trusting Trust de Ken Thompson, el cual fue publicado hace bastante tiempo en 1984 pero que incluso al día de hoy me parece muy interesante ya que despierta muy buenas ideas para reflexionar sobre ellas. No voy a explicar todo el texto o ha realizar una traducción del mismo, pero si les quiero compartir la idea central del mismo y mis consideraciones.

Confiar en la confianza

En el texto, Ken Thompson nos plantea que, por más seguridad o confianza que queramos tener en un sistema, ya sea mi programa, mi sistema operativo, mi teléfono, etc. siempre llega un momento en que debemos simplemente confiar en otro.

Me explico, imaginemos que estamos creando nuestro programa “Hola Mundo”. Pero como somos muy complicados, queremos crearlo usando nuestro propio lenguaje de programación, con lo que hacemos este código, que guardaremos en un archivo llamado archivo.src:

#Comentario: Hola Mundo

Iniciar;

Imprimir "Hola Mundo";

Finalizar;

Ahora tenemos un problema, hice mi código, debo compilarlo. ¿Pero con qué lo compilo?, hagamos nuestro propio compilador. Para hacer sencilla la explicación, haremos el compilador en un lenguaje que ya existe, como C. Lo compilamos y obtenemos nuestro compilador funcionando.

Entonces, armo un nuevo compilador escrito en mi lenguaje inventado:

#Comentario: Compilador

Iniciar;

$codigofuente = archivo.src

$compilado=Compila $codigofuente;

Guarda $compilado en archivo.bin

Finalizar;

Entonces, ahora compilamos este segundo compilador con nuestro compilador escrito en C. Y obtenemos un compilador que, escrito en nuestro propio lenguaje, compila nuestro lenguaje. Así que si ahora le pasamos nuestro archivo.src, obtendremos el archivo.bin que si lo ejecutamos, nos dirá “Hola Mundo”.

Bien, ahora yo empiezo a enseñar a todo el mundo mi lenguaje y les doy el compilador. Se vuelve super-popular y todo el mundo ahora usa mi lenguaje y compila con mi compilador.

Pero no somos santos

Bien, imaginemos que no soy tan bueno como aparento, y en realidad el código de mi compilador era este:

#Comentario: Compilador
Iniciar;

$codigofuente = archivo.src

Agrega "puerta-trasera-envia-datos-a-mi" en $codigofuente

$compilado=Compila $codigofuente;

Guarda $compilado en archivo.bin

Finalizar;

Yo lo compilé, así que tengo un compilador que a cada cosa que compile, le agrega esa “puerta-trasera-envia-datos-a-mi”. Ahora compilo mi compilador original (código fuente sin puerta trasera) usando este compilador.  Listo tengo un compilador que posee esa puerta trasera, que a cada cosa que compile le agrega la puesta trasera y que como es el único compilador de mi lenguaje (porque eliminé los otros compiladores previos) cada archivo fuente que compile saldrá así. Incluso, el código fuente original del compilador está limpio, así que aunque quieran recompilarlo, obtendrán la puerta trasera. Como dijimos, todo el mundo usa mi lenguaje y mi compilador, todos los programas tiene mi puerta trasera.

Entonces

No importa cuanto auditen el código fuente, este está limpio ya que el compilador “madre” es el problema y hablando a nivel técnico, tal y como dice Thompson, se puede armar el código de forma que sea casi imposible de detectar.

Ahora, la gran pregunta es ¿Y si el creador de C o Java o el que venga hizo lo mismo? En la realidad, uno no puede confiar en ningún código o programa que uno mismo no haya desarrollado en su totalidad. Es decir, existe una cadena de confianza en donde terminamos confiando en el que desarrolló las herramientas que usaremos. Y debemos confiar. Siempre llega un punto, en que depositar tu confianza en otro es necesario.

¿Conocían el texto? ¿Habían pensado en esto?

Un comentario sobre “Al final, siempre tenes que confiar en alguien

  1. Pingback: Bitacoras.com

Los comentarios están cerrados.