Quebra de senha de ZIP de 30 anos permite revelar códigos criptográficos secretos da ANC na 'Operation Vula'
(blog.jgc.org)- Um ZIP com o código-fonte da ANC Operation Vula, armazenado desde 1991 e protegido por senha, foi descriptografado, tornando possível divulgar os códigos de comunicação secretos usados contra o regime do apartheid na África do Sul
- Esse código foi usado no fim dos anos 1980 para montar a rede clandestina interna da ANC na África do Sul, trocando mensagens criptografadas com one-time pad com computadores de 8 bits, tons DTMF, acopladores acústicos e PowerBASIC
- O ZipCrypto das primeiras versões do PKZIP era vulnerável a ataque de texto conhecido, e com o bkcrack foi possível recuperar a chave encontrando 12 bytes previsíveis de texto plano dentro do ZIP
- O ataque usou uma entrada Store não comprimida dentro de ALLBAS.ZIP, o cabeçalho PK de um ZIP interno e o primeiro nome de arquivo, COMKEY.BAS, obtendo após 23 minutos as chaves
98e0f009 48a0b11a c70f8499 - Os arquivos descriptografados RANDOM.BAS e TECOD.BAS foram compilados e executados no DOSBox, confirmando geração de dados aleatórios, criptografia e descriptografia de arquivos, uso de disco RAM e destruição do material de chave após o uso
Por que o código da Operation Vula ficou trancado
- A Operation Vula foi uma operação do fim dos anos 1980 para levar lideranças e suprimentos da ANC para dentro da África do Sul e construir uma rede clandestina que conectasse elementos de atuação interna
- Para comunicação segura, eram usadas máquinas de 8 bits, tons DTMF, acopladores acústicos, vários equipamentos e programas em PowerBASIC para trocar mensagens criptografadas com one-time pad
- Tim Jenkin, principal criador do sistema criptográfico, publicou o código original no Vulacode GitHub, e uma explicação detalhada está em Talking To Vula.pdf
- O motivo direto para o atraso na divulgação do código era um arquivo ZIP protegido por senha criado em 1991
- Ao deixar o Reino Unido e voltar para a África do Sul, Tim Jenkin reuniu todo o código-fonte em um ZIP e definiu uma senha
- Depois disso, já na África do Sul, não houve necessidade de abrir o código, e quando tentou acessá-lo de novo anos mais tarde, ele não lembrava mais a senha
- Um dos arquivos acessíveis era uma versão muito antiga, e o restante não podia ser extraído por causa da senha
Arquivos PKZIP antigos e ataque de texto conhecido
- Os arquivos recebidos eram ALLBAS.ZIP e CODMAY93.ZIP, ambos criados com versões iniciais do PKZIP e protegidos por senha
- Na época, o formato ZipCrypto do ZIP tinha um ataque de texto conhecido, e era possível usar a implementação open source bkcrack
- Esse ataque exige prever 12 bytes de texto plano em uma posição conhecida dentro do arquivo ZIP
- O ALLBAS.ZIP continha vários arquivos
.BAS,.INC,.ZIPe.EXE, e algumas entradas usavam o método de compressão Store- Entradas Store são arquivos já binários e, portanto, não comprimidos, o que permite prever o texto plano sem precisar reproduzir a compressão
- Havia também um arquivo ZIP armazenado como entrada Store, e como arquivos ZIP começam com um cabeçalho PK, ele era um bom candidato de texto plano
Encontrando um candidato de texto plano: o primeiro nome de arquivo do ZIP interno
- O alvo do ataque era o arquivo ZIP interno OLDCOD.ZIP, contido dentro de ALLBAS.ZIP
- O cabeçalho PK no início de um arquivo ZIP inclui o comprimento do nome do arquivo e o comprimento de campos extras, então, se o primeiro nome de arquivo fosse conhecido, seria possível montar o texto plano necessário para o ataque
- Se o nome do arquivo tivesse no mínimo 8 caracteres, seria possível obter os 12 bytes necessários somando a extensão como
.BASou.INC, o tamanho do nome do arquivo e os bytes do comprimento de campo extra - No pior caso, daria para fazer brute force em nomes de arquivo com até 8 caracteres formados por letras maiúsculas e números, mais a extensão, mas isso não foi necessário
- Tim Jenkin tinha outra versão do OLDCOD.ZIP e pôde informar que o primeiro arquivo ali era COMKEY.BAS
Recuperando a chave com bkcrack
- Foi escrito um pequeno programa em Perl para inserir COMKEY.BAS como candidato de texto plano, e o ataque foi executado no formato
bkcrack -C ALLBAS.ZIP -c OLDCOD.ZIP -p ... -o 26 -j 8 - Após 23 minutos, as chaves encontradas pelo bkcrack foram:
98e0f009 48a0b11a c70f8499
- Com a mesma chave, o ALLBAS.ZIP foi descriptografado para criar ALLBAS-DECRYPTED.ZIP, e a mesma chave também funcionou em CODMAY93.ZIP, gerando CODMAY93-DECRYPTED.ZIP
- Uma alternativa seria atacar outros ZIPs internos da mesma forma e, se isso ainda falhasse, tentar brute force dos nomes de arquivo
- Mais tarde, verificou-se que o candidato TECOD5.BAS encontrava a mesma chave em apenas 38 segundos, mostrando que a escolha adequada do texto plano afeta fortemente a velocidade do ataque
Executando o código descriptografado
- Os dois programas foram compilados e executados com PowerBASIC no DOSBox
- RANDOM.BAS: usado para criar discos de números aleatórios para uso como one-time pad
- TECOD.BAS: usado para criptografar e descriptografar mensagens enviadas por e-mail
- O código compilado e os executáveis gerados estão em jgc-vula-september-2024
- A compilação foi feita com PowerBASIC Compiler Version 3.00b; TECOD.BAS aparece com 2.575 instruções e 2.329 linhas, e RANDOM.BAS com 2.194 instruções e 1.940 linhas
- O RANDOM.EXE usava três métodos de algoritmo de geração de números aleatórios para criar dados aleatórios, sendo um deles baseado em uma chave aleatória digitada manualmente pelo usuário
- O TECOD.EXE era protegido por senha, e a senha embutida nesta versão, armazenada no código com a ordem dos caracteres embaralhada, era TIMBOBIMBO
- Tim Jenkin colocou essa senha no programa de forma simples, mas ofuscada
- A senha variava entre versões do programa distribuídas a diferentes membros da ANC
- Há um manual para quem quiser executar diretamente o programa em TECOD_HLP.pdf
Detalhes revelados sobre a forma de operação na época
- O exemplo de execução seguia o fluxo de gerar dados aleatórios para chaves com RANDOM.EXE em RANDATA.1, criptografar PLAIN.TXT para PLAIN.BIN e depois reverter o processo
- Todo o trabalho criptográfico foi projetado para ser executado em um disco RAM
- No exemplo de criptografia, os arquivos de programa
TECOD.EXEeTECOD.CNFficam no disquete A:, o disco de dados com os arquivos de chave fica em B:, e o disco RAM fica em R: - Na etapa de criptografia, o arquivo
RANDATA.1precisava ser renomeado para SNUM; na etapa de descriptografia, oRANDATA.1em B: precisava ter o nome RNUM - O programa incluía destruição do material de chave após o uso, verificação da distribuição dos bytes aleatórios gerados e ênfase no uso de disco RAM
1 comentários
Comentários do Hacker News
O que achei interessante no Vula é que a falta de usabilidade do sistema acabou sendo a causa de sua queda
Mesmo ativistas extremamente comprometidos, que enfrentavam um regime assassino pela liberdade, não conseguiam usar o sistema corretamente
Documentos eram deixados sem criptografia, as chaves eram fáceis de obter, e o software era tão trabalhoso que parte das comunicações importantes era enviada em texto puro
Todos sabemos como configurar e usar PGP corretamente é uma dor de cabeça e, no fim, segurança é usabilidade
Escrevi um pouco mais sobre o Vula aqui: https://shkspr.mobi/blog/2014/01/the-hardest-problem-in-encr...
Na maioria dos casos, a usabilidade atua no sentido de reduzir a segurança
Vi o gerador de números aleatórios para o one-time pad de segurança, e Melissa O'Neil provavelmente teria gostado. É quase um PCG
Ele usa o gerador congruencial linear (LCG)
Randdo sistema PowerBASIC para escolher uma entre as novas funçõesrand1-3, e duas delas usam LCGs diferenteshttps://github.com/Vulacode/RANDOM/blob/d6a1a1d694b22e6a115b...
Como os geradores pseudoaleatórios parecem ser semeados pelo gerador aleatório do sistema, no fim bastaria recuperar a seed inicial do LCG do sistema para fazer engenharia reversa do one-time pad
Não sei o tamanho da seed do LCG do sistema, mas, se for de 32 bits, acho que daria simplesmente para fazer força bruta no estado da seed e aplicar análise de entropia ao resultado para quebrá-lo em menos de uma hora
“Não crie sua própria cifra” é a primeira regra, mas, no fim dos anos 80, lidando com uma nova tecnologia bacana, isso talvez parecesse uma exceção
Todo o processo de queda do apartheid na África do Sul é bastante interessante. Eu quase não conhecia esse lado
Um fato interessante é que o movimento BDS (boicote, desinvestimento e sanções) começou ali, e, na época, muita gente achava que o apartheid nunca acabaria
Mas a pressão contínua, ao longo de muito tempo e em vários pontos de pressão, gerou grande estresse, e isso levou ao colapso
Também é bem interessante que esse trabalho tenha sido feito em um Toshiba T-100; é um computador bacana
Interessante. Na África do Sul, eles realmente passaram por muita coisa. Espero que o GNU de hoje consiga atrasar o relógio do fim do mundo
Recomendo Action Kommandant. Dá um vislumbre da vida de Ashley Kriel, mártir e orgulho de Bonteheuwel
Nas aulas de inglês do ensino médio, conheci Athol Fugard por meio de uma professora radical que deixou a África do Sul rumo ao Canadá para escapar da vigilância dos anos 80, e isso abriu minha visão
Desejo sorte também ao povo sul-africano. Um país com tanta gente talentosa e riqueza natural merece um tratamento muito melhor. Pelo menos a era da política rígida dentro do ANC parece ter chegado ao fim
Código Rust para força bruta: https://github.com/rhulha/ZipMcKracken
Operation Vula, computadores de 8 bits, tons DTMF, acopladores acústicos — interessanteA CIA/NSA percebeu indícios de que a Operation Vula estava sendo operada com o Philips PX-1000 comercial, que tinha DES embutido, e subornou a Philips para colocar um backdoor no produto: https://www.cryptomuseum.com/crypto/philips/px1000/
Em vez de DES com backdoor, ele usou one-time pads transportados em disquetes por tripulantes para cada uma das partes
Mesmo que um desses disquetes fosse apreendido na África do Sul, apenas as mensagens daquele destinatário ficariam expostas, e isso provavelmente acabaria sendo detectado em breve
Mas criar as chaves de um one-time pad com um gerador pseudoaleatório é uma abordagem ingênua
A essência de um one-time pad é usar uma chave verdadeiramente aleatória para obter segurança real. Com uma chave do tipo usado aqui, bastaria trocar a seed para gerá-la localmente, e assim não teria sido necessário colocar tripulantes em risco
Entendo que o desenvolvedor era autodidata e ainda estava aprendendo enquanto fazia, mas alguém lidando com segredos realmente importantes não deveria cometer esse tipo de erro
Dito isso, produzir grandes volumes de aleatoriedade verdadeira também não é fácil. No fim, provavelmente seria preciso criar um dispositivo de hardware próprio, já que a maioria dos equipamentos comerciais provavelmente estaria adulterada
Se você precisa quebrar uma senha ZIP “antiga” e conhece alguns caracteres dentro do arquivo, não há nada melhor do que isto: https://github.com/kimci86/bkcrack