← Todos os artigos

O código aberto em votação é necessário — mas ainda não é suficiente. Aqui está o resto.

O Condado de LA gastou uma década a construir o sistema de votação mais transparente do mundo — código aberto, de propriedade pública, independentemente auditável. A Suíça fez o mesmo. Os investigadores encontraram mesmo assim uma porta traseira escondida. Aqui está o que ambos os casos perderam.

É 21 de agosto de 2018, e um oficial do estado da Califórnia está de pé em frente a um microfone prestes a dizer algo que nunca foi dito antes na história do estado: o Condado de Los Angeles acabou de ter seu sistema de contagem de votos certificado — e pela primeira vez, o software que conta os votos pertence ao público.

Não a um fornecedor. Não a uma empresa privada protegida pela lei de segredos comerciais. Ao público.

O sistema chama-se VSAP — Voting Solutions for All People. Levou anos e dezenas de milhões de dólares a construir. Foi desenhado do zero para servir a maior jurisdição de votação dos Estados Unidos, substituindo máquinas proprietárias envelhecidas. E o seu código-fonte — as instruções reais que dizem ao computador como contar o seu voto — foi publicado para qualquer pessoa ler.

Isto é, genuinamente, um marco. E ainda não é suficiente.

Essa diferença — entre código aberto e contagem verificada — é sobre o que este artigo trata.


Por que o código-fonte secreto foi sempre a resposta errada

Para compreender por que o VSAP é importante, tem de compreender o que substituiu.

Durante décadas, o software que contava os votos americanos era um segredo comercial. Os fornecedores argumentavam que o seu código era propriedade intelectual proprietária. Os oficiais de eleições tinham de acreditar na sua palavra de que as máquinas funcionavam corretamente. Os investigadores que obtiveram máquinas por outros meios — como a equipa de Princeton que conseguiu uma Diebold AccuVote-TS e passou algumas semanas com ela em 2006 — descobriram que podiam instalar código de roubo de votos em menos de um minuto que se espalharia de máquina em máquina e alteraria cada registo interno para se manter consistente. A máquina reportaria a contagem manipulada com perfeita confiança.

O código era secreto. A manipulação era invisível.

Coffee County, Geórgia em 2021 mostrou a outra aresta dessa mesma espada: manter o código secreto não o mantém seguro. Uma equipa de perícia foi admitida no escritório de eleições e saiu com uma cópia de todo o sistema de votação Dominion — o Sistema de Gestão Eleitoral, os tablets de votação, os dispositivos de marcação de boletins, o scanner, tudo. O sigilo como estratégia de segurança é apenas tão forte quanto o colaborador mais cooperante na sala.

O código aberto quebra ambos os modos de falha. Não pode esconder um vírus de roubo de votos em código que todos podem ler. Não precisa roubar o segredo porque não existe um.

Mas no momento em que publica a fonte, move a pergunta. A pergunta já não é "o que é que o código diz?" A pergunta torna-se: "É o código que está realmente a funcionar na noite das eleições o mesmo código que está no GitHub?"

E essa pergunta revela-se muito difícil de responder.


A lição suíça: código aberto, falha escondida

Em 2019, a Swiss Post e o seu fornecedor espanhol Scytl fizeram algo que parecia o ouro da transparência. Publicaram o código-fonte completo do sistema de votação pela internet da Suíça antes do uso planeado em votos vinculativos federais. Investigadores independentes podiam ler cada linha.

A investigadora Sarah Jamie Lewis, Olivier Pereira, e Vanessa Teague aceitaram o desafio. O que encontraram dentro da criptografia não era um erro tipográfico. Não era um bug negligente. Era uma porta traseira — uma estrutura matemática enterrada na prova de embaralhamento da rede de mistura que permitia a quem tivesse certos valores secretos gerar uma transcrição de verificação que passaria em cada verificação enquanto tinha alterado os votos por baixo.

O sistema reivindicava oferecer "verificabilidade universal." Uma prova válida confirmaria que o embaralhamento estava correto. Mas se soubesse os valores da porta traseira, podia fazer essa prova passar para um embaralhamento que não estava correto de todo.

Chamaram o seu relatório Ceci n'est pas une preuve — "Isto não é uma prova." A Swiss Post e a Scytl reconheceram a descoberta. As autoridades suíças suspenderam o sistema. Uma década de trabalho, uma divulgação completa de código público — e a falha ainda estava lá, invisível até que criptógrafos externos escavassem a matemática.

Aqui está a lição que não aparece no comunicado de imprensa: o código-fonte aberto é necessário porque torna a inspeção independente possível. Não é suficiente porque a inspeção ainda tem de acontecer realmente, por pessoas qualificadas para encontrar o que procuram, e então as correções têm de ser aplicadas verificavelmente.

Publicar o código é o início da história, não o fim.


O problema da reprodutibilidade: do código à máquina em funcionamento

Vamos tornar isto concreto. Imagine que é um membro do conselho municipal do Condado de Los Angeles. Pode ler o código-fonte do VSAP. Encontra-o limpo. Está satisfeito de que o código está correto.

Chega a noite das eleições. Em algum lugar num armazém, uma máquina acorda e começa a contar boletins.

Como é que sabe que a máquina está a executar o código que leu?

A diferença entre "código-fonte" e "software em funcionamento" chama-se processo de compilação. O código-fonte é texto legível por humanos. Um computador executa binário compilado — instruções de máquina que um compilador produz a partir desse texto. O processo de compilação não é automático, óbvio, ou verificável à vista. Envolve escolhas: qual versão do compilador, que sinalizadores, quais dependências, em que ordem.

Se duas pessoas compilarem o mesmo código-fonte usando compiladores diferentes, muitas vezes produzem binários diferentes. E se os binários são diferentes, não pode dizer observando-os se a diferença é inocente (uma configuração de otimização diferente) ou maliciosa (uma instrução adicionada).

Isto não é uma preocupação teórica. Foi descrita com precisão letal na palestra de Ken Thompson de 1984 do Prêmio Turing, "Reflections on Trusting Trust." Thompson mostrou que podia inserir uma porta traseira num compilador que adicionaria invisibilmente código malicioso a qualquer programa que compilasse — incluindo futuras versões do próprio compilador — deixando nenhum traço em qualquer código-fonte que alguém pudesse ler.

A solução, desenvolvida durante a última década no mundo do software livre, chama-se compilações reproduzíveis. A ideia: se um processo de compilação é determinístico — mesmas entradas, mesmas saídas, sempre — então qualquer parte independente pode compilar a mesma fonte e comparar a impressão digital binária contra o que está realmente instalado na máquina. Se as impressões digitais correspondem, a máquina está a executar o que o código diz.

Se não correspondem, algo mudou entre o código e a máquina. Isto não é uma preocupação filosófica. Isto é uma falha de segurança.

Cobrimos isto em maior profundidade no nosso artigo sobre compilações reproduzíveis. A versão curta: sem elas, "código aberto" significa "pode ler a receita." Não significa "o que saiu do forno é o que a receita descreve."

A arquitetura de código aberto do VSAP é um passo em frente genuíno. Mas código aberto sem um processo de compilação documentado e reproduzível deixa uma diferença que nenhuma auditoria do código-fonte pode fechar.


Atestação: provar que a máquina é a máquina

As compilações reproduzíveis dizem-lhe se um binário corresponde à fonte. Atestação é o passo que liga uma máquina específica a um binário verificado específico num momento específico no tempo.

Pense nisso como uma cadeia de assinaturas. A jurisdição certifica um binário. O binário é assinado criptograficamente. Quando a máquina arranca no dia das eleições, mede o seu próprio estado de software e gera um relatório assinado — uma "medição" — que pode ser verificada contra o valor certificado. Se algo foi modificado, a medição não corresponderá. Isto não é exótico; é já como um smartphone moderno protege o seu processo de arranque.

Na prática atual do sistema de eleições, o equivalente é um hash — uma impressão digital — que supostamente é verificado contra a versão certificada antes da implementação. Mas "supostamente" está a fazer um trabalho pesado nessa frase. As verificações são frequentemente manuais, infrequentes, ou confiam numa cadeia de custódia que pode em si ter diferenças.

Considere o que aconteceu em Coffee County: todo o software do sistema foi copiado e distribuído por pessoas com acesso físico legítimo ao escritório. Os sistemas passaram as suas verificações pré-eleitorais. Uma comparação de hash depois do facto diria se o binário mudou na máquina que ficou no escritório. Não diria o que foi feito com a cópia que saiu.

A atestação não resolve o problema de ameaça interna sozinha. Mas significa que cada máquina, no arranque, pode ser pedida para provar o que está a executar — e a resposta pode ser verificada contra um registo público antes de um único voto ser contado.


Cadeia de custódia: a camada física que o código não pode substituir

Aqui está o que um sistema completamente auditável de código aberto parece às 2 da manhã na noite das eleições: um cartão de memória sai de um tabulador, vai para um saco selado assinado por observadores de múltiplos partidos, é registado num livro, transportado por duas pessoas que não são do mesmo partido, e chega a uma instalação central onde o seu selo é verificado antes dos dados serem lidos.

E aqui está o que parece quando essa cadeia se quebra: o Tribunal Constitucional Austríaco em 2016 anulou um segundo turno presidencial — não porque fraude fosse encontrada, mas porque em múltiplos distritos, boletins por correio tinham sido abertos e contados por pessoas não autorizadas fora da janela legalmente necessária, sem as testemunhas necessárias. Aproximadamente 77.000 votos foram afetados por violações de procedimento provadas, que excederam a margem vencedora de 30.000 votos. O tribunal não encontrou fraude. Anulou a eleição mesmo assim, porque os procedimentos que teriam tornado a fraude detetável não tinham sido seguidos — e uma manipulação não detetada é indistinguível de uma manipulação não detetada.

A mesma lógica aplica-se a uma máquina de votação com código-fonte perfeito e compilação reproduzível. Se o cartão de memória contendo resultados é tratado por uma única pessoa sem testemunhas antes de chegar à contagem, a cadeia de custódia está quebrada. A correção do código é irrelevante. Não pode provar que o cartão contém a saída que a máquina produziu.

A cadeia de custódia física não é um procedimento legado que a tecnologia substitui. É a âncora que conecta o mundo do software ao mundo físico. Sem ela, uma prova criptográfica perfeita da contagem flutua livremente de qualquer boletim físico que alguém possa verificar novamente.


Auditorias: a verificação que fecha o ciclo

O Tribunal Constitucional Federal Alemão colocou o princípio tão claramente quanto qualquer tribunal o fez: as etapas essenciais de uma eleição devem ser "examinável pelo cidadão de forma confiável e sem qualquer conhecimento especializado." O Tribunal disse isto em 2009, anulando o uso de computadores de votação Nedap na eleição federal de 2005. As máquinas armazenavam votos apenas em memória eletrónica. Nenhum registo independentemente verificável. Nenhuma verificação que um não-especialista pudesse executar. O tribunal descobriu isto inconstitucional — independentemente de as máquinas terem alguma vez funcionado mal.

O código-fonte aberto parcialmente satisfaz este requisito para cidadãos tecnicamente alfabetizados. Uma auditoria criptograficamente verificável satisfaz-a para todos.

A auditoria de contagem manual estatal de 2020 da Geórgia — aproximadamente 5 milhões de boletins presidenciais, examinados por 159 condados em menos de seis dias — confirmou a contagem de máquina a cerca de um décimo de por cento. Isto é um resultado significativo. Um boletim que o eleitor marcou com a mão, contado por uma pessoa que o eleitor poderia em princípio observar, verificado contra um total de máquina: isto é uma cadeia que um cidadão comum pode rastrear sem um diploma de criptografia.

Mas mesmo essa cadeia tem limites. O Colorado executou a primeira auditoria de risco limitante estatal em 2017, fornecendo confiança estatística de que o resultado reportado estava correto. Uma auditoria de risco limitante é mais rigorosa do que uma verificação de percentagem fixa: amostra mais boletins em corridas apertadas, menos em vitórias maciças, e fornece uma probabilidade definida de que um resultado errado teria sido apanhado. O Colorado continuou a apertar o seu limite de risco. Essa é a direção de viagem.

A lição de ambos: uma auditoria só funciona se há algo confiável para auditar. Um boletim que um eleitor marcou e poderia inspecionar é confiável. Um código QR que o eleitor não pode ler — que um tribunal federal encontrou em Curling v. Raffensperger "não fornece um registo de boletim verificável e auditável" porque o próprio código tabula o voto e o eleitor não pode verificá-lo — não é um trilho de auditoria. É uma máquina confiando em si mesma.

Código aberto + compilações reproduzíveis + atestação + cadeia de custódia converge nisto: um registo durável e legível por humanos que o eleitor pessoalmente verificou, que qualquer parte independente pode recontar, e cujo caminho da mão do eleitor até à contagem final é documentado em cada passo por múltiplas partes com interesses conflitantes.


A lista de verificação que ninguém completou totalmente

Aqui está a lista atual do que o "código aberto" lhe dá e o que não dá:

O que o código aberto lhe dá:

  • A capacidade para especialistas qualificados ler o código e encontrar bugs ou portas traseiras
  • A capacidade para comparar a lógica declarada da contagem contra o que deveria fazer
  • Remoção de argumentos de segredos comerciais que bloqueiam pesquisa de segurança
  • Uma fundação para compilações reproduzíveis e auditoria comunitária

O que o código aberto não lhe dá:

  • Prova de que o binário em funcionamento corresponde à fonte (requer compilações reproduzíveis)
  • Prova de que uma máquina específica está a executar o binário certificado (requer atestação)
  • Prova de que resultados não foram alterados entre a máquina e a contagem (requer cadeia de custódia)
  • Prova de que a contagem reflete os boletins na caixa (requer auditorias contra um registo de papel verificado pelo eleitor)

A Suíça publicou a sua fonte e ainda escondeu uma porta traseira — não porque a publicação foi inútil, mas porque a publicação sem revisão sustentada, especializada e adversarial deixou a armadilha sem disparar durante demasiado tempo. O Condado de Los Angeles publicou a sua fonte e merece crédito. A pergunta para a próxima década é se cada condado que usa VSAP pode verificar, independentemente, que o binário em cada máquina corresponde ao que a fonte diz, e que cada cartão de memória viajou uma cadeia ininterrupta da máquina até à contagem.

Transparência não é um único momento. É um processo que corre do repositório de código-fonte até ao saco selado na mesa às 2 da manhã.


O que realmente tornaria isto verificável

Se quisesse construir um sistema onde qualquer parte independente — não apenas um oficial, não apenas um fornecedor — pudesse verificar toda a cadeia de código até resultado certificado, ficaria assim:

Um: Código-fonte publicado num repositório versionado e imutável com um hash criptográfico para cada lançamento.

Dois: Um processo de compilação documentado e com script que qualquer parte pode reproduzir, produzindo um binário cujo hash corresponde ao hash certificado.

Três: Atestação pré-eleitoral: cada máquina, antes de processar um boletim, gera uma medição assinada do seu próprio estado de software. Essa medição é verificada contra o hash certificado e registada publicamente.

Quatro: Registos de papel verificados pelo eleitor — boletins que o eleitor pessoalmente inspecionou que refletem escolhas legíveis por humanos, não códigos de barras que o eleitor não pode ler.

Cinco: Auditorias de risco limitante rotineiras que amostra boletins de papel contra contagens de máquina, dimensionadas à margem da corrida, conduzidas por observadores de múltiplos partidos, com resultados publicados ao nível do colégio eleitoral.

Seis: Resultados legíveis por máquina ao nível do colégio eleitoral publicados no momento em que são certificados — não depois do facto, não num formato que requer um pedido de liberdade de informação, mas num ficheiro .csv ou .xml que qualquer pessoa pode descarregar e reconciliar contra as fitas do colégio eleitoral.

Nenhum destes passos é exótico. Todos eles existem em algum lugar na prática atual. Nenhuma jurisdição implementou todos eles de ponta a ponta, com verificação independente em cada ligação.

Essa é a diferença. Não "código aberto vs. código fechado." A diferença é entre publicar o código e tornar toda a cadeia — de fonte a máquina a boletim a contagem — independentemente verificável por qualquer pessoa que queira verificar.

Até essa cadeia estar completa e pública, "código aberto" é uma melhoria necessária. Não é uma resposta acabada.


Veja como esta diferença aparece em jurisdições de todo o mundo →

Leia a versão de 2 minutos sobre por que código aberto é necessário mas não suficiente →

Explore as diferenças específicas em compilações reproduzíveis e atestação →


Fontes