Durante o Teste Público de Segurança do Sistema Eletrônico de Votação de 2017, encontramos uma vulnerabilidade que permitia execução de código arbitrário na Urna Eletrônica.
- Slides da palestra técnica com nossos relatos dos testes.
O cartão de carga da urna utiliza o sistema de arquivos ueminix
(customizado pelo TSE),
que ofusca o conteúdo dos arquivos cifrando-os com AES-XTS.
Disponibilizamos aqui dois utilitários relacionados a esse sistema de arquivos:
-
encall.py: cifra os arquivos originais, criando um diretório
enc
com os arquivos cifrados. -
decall.py: decifra os arquivos do diretório
enc
, criando um diretóriodec
com todos os arquivos decifrados.
Note que é necessário fornecer a imagem do disco (dsk.img
), por dois motivos:
-
O padding da cifra não pode ser lido diretamente a partir do espaço de usuário, portanto lemos da imagem de disco.
-
Uma das chaves do AES-XTS está contida no segundo setor da partição, e é recuperada pelos próprios utilitários.
A outra chave do AES-XTS pode ser recuperada do código do ueminix
no kernel, e deve ser
configurada diretamente no código fonte dos utilitários (variável key1
). Sem acesso ao
código fonte, essa chave poderia ser obtida através de engenharia reversa do bootloader e
do kernel decifrado (ver
relatório feito pelo TSE).
O arquivo exploit.py ilustra o ataque que propomos para alterar votos na urna. Infectamos a biblioteca hkdf com um código que, por sua vez, infecta o espaço de memória do executável vota (software de votação).
Os trechos de código do hkdf e do vota replicam a estrutura do software original da urna eletrônica, permitindo simular o ataque em um modelo simplificado muito próximo do sistema real.
Para executar o simulador do software de votação, entre no diretório exploit
e execute:
make test
Para infectar a biblioteca, instale o pwntools e execute:
make exploit
Depois disso, ao executar novamente o simulador do software de votação, você observará que os votos foram alterados.
Um ataque real seguiria o seguinte fluxo:
- Obteríamos a imagem com o conteúdo de uma mídia de carga
- Faríamos engenharia reversa no bootloader e no kernel decifrado para obter a chave que cifra/decifra os outros arquivos da mídia de carga
- Decifraríamos o sistema de arquivos
- Executaríamos o exploit para infectar o arquivo
libhkdf.so
original - Cifraríamos novamente para gerar uma mídia de carga modificada
Nossa equipe é composta por membros do ELT, time interinstitucional que participa de competições de CTF. Conheça também o Pwn2Win, competição organizada anualmente por nós.