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 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.
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.