𝗖𝗕𝗖 𝗕𝗶𝘁 𝗙𝗹𝗶𝗽𝗽𝗶𝗻𝗴 𝗘𝘅𝗽𝗹𝗶𝗰𝗮𝗱𝗼

A criptografia não significa que seus dados estão protegidos contra adulteração.

Muitos desenvolvedores cometem este erro. Eles pensam que, se um invasor não consegue ler os dados, ele não pode alterá-los. Isso está errado. A criptografia trata o sigilo e a integridade como duas tarefas distintas.

O ataque CBC Bit Flipping prova isso. Um invasor pode alterar seus dados sem conhecer sua chave secreta.

Veja como funciona:

O AES não criptografa os dados em uma única peça grande. Ele divide os dados em blocos de 16 bytes. No modo CBC, esses blocos são encadeados. A saída criptografada do primeiro bloco se mistura ao texto simples do segundo bloco.

Esse encadeamento cria uma vulnerabilidade durante a descriptografia. Para obter o texto original do Bloco 2, o servidor o descriptografa e o combina com o texto cifrado do Bloco 1.

Um invasor pode explorar isso:

O invasor não precisa ler a mensagem. Ele apenas inverte os bits para alterar o resultado final.

Considere um aplicativo web antigo que utiliza cookies criptografados para sessões. Um cookie pode conter: userid=994;role=user;

Um invasor intercepta esse cookie e inverte bits no texto cifrado. Ele envia várias requisições até que o servidor aceite uma. Como o servidor apenas verifica se os dados podem ser descriptografados, ele processa o texto modificado. De repente, a string descriptografada é: userid=994;role=admi;

O invasor agora tem acesso de administrador. Ele nunca leu a chave ou o cookie original.

O erro é assumir que a criptografia garante a integridade.

Para corrigir isso, use Criptografia Autenticada (Authenticated Encryption), como o AES-GCM. Ele cria uma tag criptográfica. Essa tag funciona como um selo. Se um invasor alterar apenas um bit, o selo se rompe. O servidor rejeita os dados imediatamente.

Se você precisar usar CBC, utilize uma arquitetura Encrypt-then-MAC. Crie um código de autenticação para o texto cifrado e verifique-o antes de iniciar a descriptografia.

Dados secretos nem sempre são dados confiáveis. Sempre comprove que seus dados não foram alterados antes de usá-los para tomar decisões.

Explicação do Bit-Flipping em CBC: Por que a criptografia sozinha não garante a integridade

Muitas pessoas acreditam que, se os dados estão criptografados, eles estão seguros. No entanto, existe uma distinção crucial entre confidencialidade e integridade.

A criptografia, por si só, fornece confidencialidade. Mas, sem mecanismos adicionais, ela pode não fornecer integridade. É aqui que entra o ataque de bit-flipping em modos de operação como o CBC (Cipher Block Chaining).

O que é o modo CBC?

No modo CBC, cada bloco de texto simples é combinado via operação XOR com o bloco de texto cifrado anterior antes de ser criptografado. O primeiro bloco é combinado com um Vetor de Inicialização (IV).

A fórmula para a criptografia de um bloco $i$ é: $C_i = E_k(P_i \oplus C_{i-1})$

E a fórmula para a descriptografia é: $P_i = D_k(C_i) \oplus C_{i-1}$

Onde:

A Vulnerabilidade: O Ataque de Bit-Flipping

Observe a fórmula de descriptografia: $P_i = D_k(C_i) \oplus C_{i-1}$

Note que o bloco de texto simples $P_i$ depende diretamente do bloco de texto cifrado anterior $C_{i-1}$. Se um atacante alterar um bit em $C_{i-1}$, esse mesmo bit será alterado no bloco de texto simples $P_i$ após a descriptografia.

Embora a alteração em $C_{i-1}$ corrompa completamente o bloco de texto simples $P_{i-1}$ (tornando-o ruído aleatório), o atacante pode manipular $C_{i-1}$ de forma precisa para alterar o conteúdo de $P_i$ de maneira previsível.

Exemplo Prático

Imagine que um sistema armazena informações de permissão de usuário em um formato de texto simples: user=guest;role=user

Suponha que este texto seja criptografado usando o modo CBC. O atacante não consegue ler o conteúdo, mas ele sabe (por tentativa e erro ou por conhecimento do formato do sistema) que a string role=user aparece em um determinado bloco.

Se o atacante quiser mudar o papel de user para admin, ele pode realizar o seguinte:

  1. Identificar o bloco de texto cifrado $C_{i-1}$ que afeta o bloco de texto simples $P_i$ onde está escrito role=user.
  2. Calcular a diferença entre o valor atual (user) e o valor desejado (admin).
  3. Aplicar essa diferença (via XOR) ao bloco $C_{i-1}$ correspondente.

Quando o sistema descriptografar o bloco $P_i$, o resultado não será mais role=user, mas sim role=admin.

O resultado: O atacante conseguiu alterar o conteúdo da mensagem sem saber a chave de criptografia e sem quebrar a criptografia em si.

Como prevenir ataques de bit-flipping?

Para garantir que os dados não foram alterados, você não deve confiar apenas na criptografia. Você precisa de autenticação.

1. Usar um MAC (Message Authentication Code)

Um MAC é um pequeno código gerado a partir da mensagem e de uma chave secreta. Ao enviar a mensagem, você envia o texto cifrado junto com o MAC. O receptor calcula o MAC do texto cifrado recebido e o compara com o MAC enviado. Se eles não coincidirem, a mensagem foi alterada.

Uma abordagem comum é o Encrypt-then-MAC:

  1. Criptografe o texto simples para obter o texto cifrado.
  2. Calcule o MAC sobre o texto cifrado.
  3. Envie o texto cifrado + o MAC.

2. Usar Criptografia Autenticada (AEAD)

A maneira mais moderna e recomendada é utilizar modos de criptografia que já incluem autenticação nativamente, conhecidos como AEAD (Authenticated Encryption with Associated Data).

Exemplos de algoritmos AEAD incluem:

Esses modos garantem tanto a confidencialidade quanto a integridade de forma eficiente e segura, tornando os ataques de bit-flipping impossíveis, pois qualquer alteração no texto cifrado fará com que a verificação de autenticação falhe, e a mensagem será descartada antes mesmo de ser processada.

Conclusão

A criptografia protege seus dados contra olhares curiosos, mas não protege contra mãos maliciosas que tentam modificar o que você escreveu. Sempre que estiver implementando criptografia, pergunte-se: "Eu também estou garantindo a integridade desses dados?". Se a resposta for não, você pode estar vulnerável a ataques de bit-flipping.