Sí, si uno descarga y compila ciegamente el código fuente, ese código podría contener una vulnerabilidad que, si se ejecuta, podría dañar el sistema. Además, es posible que no sea necesario ejecutar explícitamente el binario resultante. En su clásico de 1984 Reflexiones sobre Trusting Trust , Ken Thompson demostró cómo se puede hacer para crear un código C que, cuando se compila, explota el compilador y el servidor en el que reside ese compilador.
Hay algunas formas de defenderse contra esto. En 2006, Bruce Schneier publicó en su blog un detalle bastante bueno de un artículo de David A. Wheeler. En defensa contra el ejemplo específico de Thompson. El papel en sí todavía está en su momento, a mi entender.
El papel de Wheeler es muy interesante, pero está enfocado en las entrañas del diseño del compilador, y esta pregunta parece estar más enfocada en las precauciones del usuario final que en el diseño del compilador o incluso en la programación de sistemas. En general, hay dos formas en que entendemos el riesgo que implica compilar un fragmento de código específico:
- Autenticar el código como una pieza de código verdadera, sin restricciones, escrita por alguien en quien hemos elegido confiar.
- Examinando detenidamente el contenido del código en sí, y entendiendo a fondo lo que hace.
El segundo caso, una auditoría exhaustiva del código, es una tarea enorme, larga y que requiere muchos recursos. Casi nunca sucede realmente para las bases de código de tamaño no trivial, porque es simplemente demasiado costoso. Con mucha más frecuencia, estamos viendo el primer caso: confiar en el codificador y validar que el código no ha sido manipulado entre el codificador y el consumidor.
En 2015, publiqué un artículo para LinuxJournal sobre cómo el código generalmente pasa del desarrollador al usuario de Linux. Cadena de Custodia ya ha sido reeditado por mi empleador fuera del paywall de LinuxJournal. Está muy enfocado en la ruta que atraviesa la administración de paquetes, pero si lo lee con atención, se dará cuenta de que las partes aplicables a un mantenedor de paquetes que compila el código obtenido en algún lugar de Internet también son aplicables a un usuario final que lo haga.
Por supuesto, al final, como han señalado otros, estas comprobaciones de integridad solo sirven para algo si la infraestructura de los desarrolladores no se ha visto comprometida, si el desarrollador estaba bien programado, etc.