2 pontos por GN⁺ 2024-09-08 | 1 comentários | Compartilhar no WhatsApp
  • 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, .ZIP e .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 .BAS ou .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.EXE e TECOD.CNF ficam 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.1 precisava ser renomeado para SNUM; na etapa de descriptografia, o RANDATA.1 em 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

 
GN⁺ 2024-09-08
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...

    • Imagine perder a chave de casa e nunca mais conseguir entrar em casa
      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) Rand do sistema PowerBASIC para escolher uma entre as novas funções rand1-3, e duas delas usam LCGs diferentes
    https://github.com/Vulacode/RANDOM/blob/d6a1a1d694b22e6a115b...

    • Esse método de geração de one-time pad parece bem ruim. Parece perfeitamente possível recuperar o estado de seed dos diferentes geradores, e LCGs são muito fáceis de fazer engenharia reversa
      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
    • Há também o fato de que o programador original escreveu isso enquanto aprendia criptografia e BASIC na 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
    • Naturalmente, é totalmente insuficiente para uso como um one-time pad de verdade
  • 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

    • Fico feliz por conhecer o nome de Ashley Kriel. A vida e os diversos talentos de colegas talentosos que estiveram com o ANC muitas vezes ficam ofuscados, então eu tinha bastante interesse em aprender sobre essas pessoas
      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 — interessante
    A 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/

    • Tim Jenkins contornou esse problema usando seu próprio sistema e sua própria cifra
      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
    • Usar qualquer tecnologia comercial de criptografia geralmente deve ser considerado o fim da linha
      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

    • O artigo inteiro não é justamente sobre esse programa?