Durante o Teste Público de Segurança do Sistema Eletrônico de Votação de 2017, encontramos vulnerabilidades que permitiam execução de código arbitrário na Urna Eletrônica.
Slides de palestras técnicas 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.
Assim como o software original da urna, o simulador do software de votação é um software de 32 bits. Por isso, caso o seu sistema seja de 64 bits, você precisa instalar as bibliotecas de 32 bits para conseguir executá-lo. Por exemplo, caso você utilize Debian ou Ubuntu, execute os seguintes comandos:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libqt5multimedia5:i386
Para executar o simulador do software de votação, entre no diretório exploit
e execute make test_cli
para iniciar o simulador modo texto, ou make test_gui
para iniciar o simulador gráfico.
Para infectar a biblioteca, instale o pwntools e execute make exploit_cli
para comprometer o simulador modo texto, ou make exploit_gui
para comprometer o simulador modo gráfico.
Depois disso, ao executar novamente o simulador do software de votação, você observará que os votos foram alterados.
Se quiser restaurar o comportamento original, execute make restore
.
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.