- Se descifró un ZIP con contraseña que almacenaba desde 1991 el código fuente de Operation Vula del ANC, lo que permite publicar el código de comunicación secreta usado contra el régimen del apartheid en Sudáfrica
- Este código se usó a fines de la década de 1980 para construir la red clandestina interna del ANC en Sudáfrica, e intercambiaba mensajes cifrados con libreta de un solo uso usando computadoras de 8 bits, tonos DTMF, acopladores acústicos y PowerBASIC
- ZipCrypto de las primeras versiones de PKZIP era vulnerable a ataques de texto plano conocido, y con bkcrack se recuperó la clave encontrando 12 bytes predecibles de texto plano dentro del ZIP
- El ataque usó entradas sin comprimir Store dentro de ALLBAS.ZIP, el encabezado PK del ZIP interno y el nombre del primer archivo, COMKEY.BAS; 23 minutos después obtuvo la clave
98e0f009 48a0b11a c70f8499 - Los archivos descifrados RANDOM.BAS y TECOD.BAS se compilaron y ejecutaron en DOSBox, confirmando cómo generaban datos aleatorios, cifraban y descifraban archivos, usaban un disco RAM y destruían el material de claves tras usarlo
Por qué el código de Operation Vula estaba bloqueado
- Operation Vula fue una operación de fines de la década de 1980 para introducir a la dirigencia y materiales del ANC dentro de Sudáfrica, y construir una red clandestina que conectara a los elementos activos dentro del país
- Para una comunicación segura, se intercambiaban mensajes cifrados con libreta de un solo uso mediante computadoras de 8 bits, tonos DTMF, acopladores acústicos, varios equipos y programas en PowerBASIC
- Tim Jenkin, quien creó la mayor parte del sistema criptográfico, publicó el código original en Vulacode GitHub, y hay una explicación detallada en Talking To Vula.pdf
- La razón directa por la que la publicación del código se demoró fue un archivo ZIP cifrado creado en 1991
- Cuando Tim Jenkin dejó el Reino Unido para regresar a Sudáfrica, empaquetó todo el código fuente en un ZIP y le puso una contraseña
- Después, en Sudáfrica, no necesitó abrir el código, y cuando años más tarde intentó abrirlo de nuevo, no recordaba la contraseña
- Uno de los archivos accesibles era una versión muy temprana, y el resto no podía extraerse por la contraseña
Archivos PKZIP antiguos y ataque de texto plano conocido
- Los archivos recibidos eran ALLBAS.ZIP y CODMAY93.ZIP; ambos habían sido creados con una versión temprana de PKZIP y tenían contraseña
- En el ZipCrypto del formato ZIP de esa época existía un ataque de texto plano conocido, y podía usarse la implementación open source bkcrack
- Este ataque requiere predecir 12 bytes de texto plano en una ubicación conocida dentro del archivo ZIP
- ALLBAS.ZIP contenía varios archivos
.BAS,.INC,.ZIPy.EXE, y algunas entradas aparecían con el método de compresión Store- Las entradas Store son archivos que no se comprimen porque ya son binarios, por lo que se puede predecir el texto plano sin tener que acertar el resultado de una compresión
- El propio archivo ZIP también estaba incluido como una entrada Store, y como los archivos ZIP tienen un encabezado PK al inicio, era un buen candidato de texto plano
Búsqueda del candidato de texto plano: el primer nombre de archivo del ZIP interno
- El objetivo del ataque fue el archivo ZIP interno OLDCOD.ZIP incluido dentro de ALLBAS.ZIP
- El encabezado PK del inicio de un archivo ZIP contiene la longitud del nombre de archivo, la longitud del campo extra, etc.; por eso, si se conocía el primer nombre de archivo, se podía construir el texto plano necesario para el ataque
- Si el nombre de archivo tenía al menos 8 caracteres, junto con una extensión como
.BASo.INCy los bytes de tamaño del nombre de archivo y longitud del campo extra, se podían obtener los 12 bytes necesarios - En el peor caso, se podía hacer fuerza bruta con combinaciones de mayúsculas y números, usando nombres de hasta 8 caracteres más extensión, pero en la práctica no fue necesario
- Tim Jenkin tenía otra versión de OLDCOD.ZIP y pudo informar que el primer archivo dentro era COMKEY.BAS
Recuperación de la clave con bkcrack
- Para usar COMKEY.BAS como candidato de texto plano, se escribió un programa simple en Perl, y se ejecutó el ataque con una forma como
bkcrack -C ALLBAS.ZIP -c OLDCOD.ZIP -p ... -o 26 -j 8 - 23 minutos después, la clave encontrada por bkcrack fue la siguiente
98e0f009 48a0b11a c70f8499
- Con la misma clave se descifró ALLBAS.ZIP para crear ALLBAS-DECRYPTED.ZIP, y la misma clave también funcionó con CODMAY93.ZIP, generando CODMAY93-DECRYPTED.ZIP
- También existían alternativas: atacar otros ZIP internos con el mismo método y, si eso fallaba, intentar fuerza bruta sobre nombres de archivo
- Un candidato TECOD5.BAS verificado más tarde encontró la misma clave en 38 segundos, lo que muestra que la elección de un texto plano adecuado influye mucho en la velocidad del ataque
Ejecución del código descifrado
- Los dos programas se compilaron y ejecutaron con PowerBASIC en DOSBox
- RANDOM.BAS: se usaba para crear discos de números aleatorios destinados a la libreta de un solo uso
- TECOD.BAS: se usaba para cifrar y descifrar mensajes que se enviarían por correo electrónico
- El código compilado y los ejecutables generados están en jgc-vula-september-2024
- Se compiló con PowerBASIC Compiler Version 3.00b; TECOD.BAS aparece con 2,575 sentencias y 2,329 líneas, y RANDOM.BAS con 2,194 sentencias y 1,940 líneas
- RANDOM.EXE usaba tres tipos de algoritmos generadores de números aleatorios para generar datos aleatorios, uno de ellos basado en una clave aleatoria ingresada directamente por el usuario
- TECOD.EXE estaba protegido con contraseña, y la contraseña incorporada en esta versión era TIMBOBIMBO, almacenada en el código con los caracteres desordenados
- Tim Jenkin puso esta contraseña dentro del programa de una forma simple pero ofuscada
- La contraseña variaba entre las versiones del programa entregadas a distintos miembros del ANC
- El manual para quienes quieran ejecutarlo directamente está en TECOD_HLP.pdf
Detalles revelados sobre la forma de operación de la época
- La ejecución de ejemplo consistía en crear con RANDOM.EXE datos aleatorios para claves en RANDATA.1, cifrar PLAIN.TXT para convertirlo en PLAIN.BIN, y luego revertir el proceso
- Todas las operaciones criptográficas estaban diseñadas para ejecutarse en un disco RAM
- En el ejemplo de cifrado, los archivos de programa
TECOD.EXEyTECOD.CNFestán en el disquete A:, el disco de datos con el archivo de clave está en B:, y el disco RAM está en R: - En la etapa de cifrado había que renombrar el archivo
RANDATA.1a SNUM, y en la etapa de descifrado elRANDATA.1de B: debía llamarse RNUM - El programa incluía acciones para destruir el material de claves después de usarlo, verificar la distribución de los bytes aleatorios generados y enfatizar el uso del disco RAM
1 comentarios
Comentarios de Hacker News
Lo interesante de Vula es que la falta de usabilidad del sistema terminó siendo la causa de su caída
Incluso activistas muy comprometidos, enfrentándose a un régimen asesino por la libertad, no pudieron usar bien el sistema
Dejaban documentos sin cifrar, las claves eran fáciles de obtener, y como el software era demasiado engorroso, parte de las comunicaciones importantes se enviaban en texto plano
Todos sabemos lo fastidioso que es configurar y usar correctamente PGP, y al final la seguridad es usabilidad
Un texto que escribí un poco más sobre Vula: https://shkspr.mobi/blog/2014/01/the-hardest-problem-in-encr...
La usabilidad, en la mayoría de los casos, tiende a reducir la seguridad
Vi el generador de números aleatorios para el one-time pad de seguridad, y a Melissa O'Neil probablemente le habría gustado. Está casi cerca de PCG
Usa el generador congruencial lineal
Rand(LCG) del sistema PowerBASIC para elegir uno de tres nuevos conjuntos de funcionesrand1-3, y dos de ellos usan LCG distintoshttps://github.com/Vulacode/RANDOM/blob/d6a1a1d694b22e6a115b...
Como los generadores pseudoaleatorios parecen estar sembrados con el generador aleatorio del sistema, al final bastaría con recuperar la semilla inicial del LCG del sistema para hacer ingeniería inversa del one-time pad
No sé el tamaño de la semilla del LCG del sistema, pero si fuera de 32 bits, da la impresión de que podrías simplemente probar todas las semillas por fuerza bruta y aplicar análisis de entropía al resultado para romperlo en menos de una hora
“No inventes tu propia criptografía” es la primera regla, pero si estabas trabajando con nueva tecnología fascinante a fines de los 80, quizá habría parecido una excepción
Todo el tema del colapso del apartheid en Sudáfrica es bastante interesante. Casi no conocía este aspecto
Como dato curioso, el movimiento BDS (boicot, desinversión y sanciones) empezó aquí, y en ese momento muchos pensaban que el apartheid nunca terminaría
Pero durante mucho tiempo se aplicó presión de forma constante en varios puntos, generando un gran estrés, y eso terminó llevándolo al colapso
También es bastante interesante que este trabajo se hiciera en una Toshiba T-100, una computadora genial
Interesante. Sudáfrica de verdad ha pasado por muchísimo. Ojalá el GNU actual ayude a alejar el reloj del apocalipsis
Una recomendación es Action Kommandant. Da una mirada a la vida de Ashley Kriel, mártir y orgullo de Bonteheuwel
En clases de inglés de secundaria conocí a Athol Fugard gracias a una profesora radical que había escapado de Sudáfrica a Canadá en los 80, evadiendo la vigilancia, y eso me abrió los ojos
También les deseo suerte a los sudafricanos. Un país con tanta gente talentosa y tanta riqueza natural merece muchísimo más. Al menos parece que la era de la política rígida dentro del ANC ya terminó
Código en Rust para fuerza bruta: https://github.com/rhulha/ZipMcKracken
Operation Vula, computadoras de 8 bits, tonos DTMF y acopladores acústicos: qué interesanteLa CIA/NSA detectó indicios de que Operation Vula operaba con el Philips PX-1000 comercial con DES integrado, y sobornó a Philips para meter una puerta trasera al producto: https://www.cryptomuseum.com/crypto/philips/px1000/
En vez de DES con puerta trasera, usó one-time pads que una azafata llevaba en disquetes a cada parte
Aunque capturaran uno de esos disquetes en Sudáfrica, solo quedarían expuestos los mensajes de ese destinatario, y de todos modos probablemente sería detectado pronto
Pero generar las claves de un one-time pad con un generador pseudoaleatorio es un enfoque ingenuo
La idea central del one-time pad es usar claves verdaderamente aleatorias para obtener seguridad real. Con el tipo de clave usado aquí, habría bastado con intercambiar la semilla y generarlas localmente, y así no habrían puesto en riesgo a las azafatas
Entiendo que el desarrollador fuera autodidacta y aprendiera mientras lo hacía, pero si manejas secretos realmente importantes, no deberías cometer errores así
Dicho eso, producir grandes cantidades de números realmente aleatorios tampoco es fácil. Al final probablemente tendrías que construir tu propio dispositivo de hardware, y es muy probable que la mayoría del equipo comercial estuviera manipulado
Si tienes que romper una contraseña ZIP “antigua” y conoces algunas letras dentro del archivo, no hay nada mejor que esto: https://github.com/kimci86/bkcrack