Uma breve introdução
A esteganografia, se alguém não se lembra, é a ocultação de informações em determinados contêineres. Por exemplo, em imagens (discutido e ). Também é possível esconder dados em tabelas auxiliares do sistema de arquivos (isso foi mencionado ), e até mesmo . Infelizmente, todos esses métodos têm uma desvantagem: para "incorporar" informações em um contêiner de forma discreta, são necessários algoritmos engenhosos que considerem as particularidades internas do contêiner. Além disso, surgem problemas com a resistência do contêiner a manipulações: por exemplo, se você editar um pouco a imagem, a informação oculta se perde.
É possível evitar algoritmos complexos e manipulações sutis com os dados, e ainda garantir a funcionalidade do contêiner e um nível aceitável de preservação dos dados ocultos? Antecipando-me, posso dizer que sim, é possível! E até ofereço uma utilidade.
Os cruéis detalhes do método
A ideia principal é simples como um golpe de clava na cabeça: há áreas no disco em que o sistema operacional nunca grava (ou grava em raras ocasiões). Para evitar a busca por essas áreas com algoritmos engenhosos, vamos usar a redundância — ou seja, vamos duplicar nossa informação oculta muitas, muitas vezes em todos os setores do disco. Em seguida, diretamente sobre toda essa beleza, é possível criar as partições necessárias, formatar sistemas de arquivos, gravar arquivos e instalar sistemas operacionais — uma parte dos dados secretos ainda será preservada e poderá ser recuperada, e a duplicação múltipla nos ajudará a compor o todo a partir de fragmentos.
A vantagem desse método é óbvia: não dependemos do formato de arquivos, nem mesmo do tipo de sistema de arquivos utilizado.
As desvantagens também são, creio eu, evidentes:
- Os dados secretos só poderão ser alterados com a regravação completa de todo o disco, seguida da recriação do conteúdo visível para o usuário. Nesse caso, não se pode usar software que recrie o disco a partir de uma imagem: ele recriará também os dados secretos anteriores.
- Quanto maior o volume de dados secretos, maior a probabilidade de perda de parte da informação.
- A extração de dados do disco pode levar muito tempo. De alguns minutos a vários dias (discos modernos são maiores).
Agora vamos aos detalhes.
É evidente que se apenas espalharmos dados secretos por todo o disco, eles estarão apenas ocultos a olho nu. Se tivermos um olhar mais atento, como um editor de disco, os dados aparecerão em toda sua glória. Portanto, seria bom criptografar os dados para que não se tornem visíveis. Vamos criptografá-los de uma maneira simples, mas elegante: usando o algoritmo aes256-cbc. Vamos perguntar ao usuário a chave de criptografia, deixando que ele crie uma boa senha.
A próxima questão é como distinguir os dados "corretos" dos corrompidos. Aqui, uma soma de verificação pode nos ajudar, e não uma qualquer, mas uma SHA1. Por quê? Para o git, ela é boa o suficiente, então, para nós, também servirá. Decidido: fornecemos a cada fragmento de informação armazenado uma soma de verificação, e se, após a descriptografia, ela coincidir, significa que a descriptografia foi bem-sucedida.
Além disso, será necessário o número do fragmento e o comprimento total dos dados secretos. O número do fragmento é para rastrear quais pedaços já descriptografamos e quais ainda faltam. O comprimento total nos será útil ao processar o último fragmento, para não escrever dados a mais (ou seja, padding). E já que estamos criando um cabeçalho, vamos adicionar o nome do arquivo secreto. Isso será útil após a descriptografia, para que não fiquemos adivinhando como abri-lo.
Vamos testar o método na prática
Para a verificação, vamos usar o meio mais comum — um pen drive. Eu encontrei um antigo de 1 GB, que é perfeitamente adequado para experimentos. Se você, assim como eu, pensou em evitar mídias físicas e testar em um arquivo — uma imagem de disco, eu já aviso: não funcionará. Ao formatar esse "disco", o Linux recria o arquivo, e todos os setores não utilizados serão preenchidos com zeros.
Infelizmente, tive que usar uma estação meteorológica velha de Raspberry Pi 3 como máquina com Linux. O espaço de memória não é muito, então não vamos esconder arquivos grandes. Vamos limitar a um tamanho máximo de 10 megabytes. Arquivos muito pequenos também não valem a pena esconder: a ferramenta grava dados no disco em clusters de 4 KB. Portanto, vamos limitar a um arquivo de 3 KB — ele cabe em um desses clusters.
Vamos testar o pen drive em etapas, verificando após cada etapa se a informação oculta pode ser lida:
- Formatação rápida no formato FAT16 com tamanho de cluster de 16 KB. Isso é o que o Windows 7 oferece fazer com um pen drive que não tem sistema de arquivos.
- Preenchimento do pen drive com diversos dados aleatórios em 50%.
- Preenchimento do pen drive com diversos dados aleatórios em 100%.
- Formatação 'lenta' no formato FAT16 (com regravação total).
Os dois primeiros testes terminaram, como esperado, com uma vitória completa: o utilitário conseguiu extrair com sucesso 10 megabytes de dados secretos do pen drive. No entanto, após o pen drive ter sido preenchido até a capacidade máxima, ocorreu uma falha:
Total de clusters lidos: 250752, descriptografados: 158
ERRO: não é possível escrever secretFile incompleto
Como vemos, conseguiu-se decifrar apenas 158 clusters (632 kilobytes de dados brutos, resultando em 636424 bytes de carga útil). É claro que 10 megabytes não poderiam ser alcançados, e entre esses clusters certamente existem duplicados. Mesmo 1 megabyte não pode ser recuperado dessa forma. No entanto, é garantido que 3 kilobytes de dados secretos podem ser recuperados do pen drive mesmo após ser formatado e preenchido. Contudo, experiências mostram que é perfeitamente possível extrair um arquivo com 120 kilobytes desse tipo de pen drive.
O último teste, infelizmente, mostrou que o pen drive foi totalmente regravado:
$ sudo .\/steganodisk -p senha \/dev\/sda
Tamanho do dispositivo: 250752 clusters
250700 99%
Total de clusters lidos: 250752, descriptografados: 0
ERRO: não é possível escrever secretFile incompleto
Nenhum cluster foi mantido... É triste, mas não é trágico! Vamos tentar criar uma partição no pen drive antes da formatação e, em seguida, adicionar o sistema de arquivos. A propósito, ele veio da fábrica com esse tipo de formatação, então não estamos fazendo nada suspeito.
Era bastante previsível que o espaço disponível no pen drive diminuiu um pouco.
Também era esperado que 10 megabytes não pudessem ser escondidos em um disco completamente cheio. Mas agora a quantidade de clusters decifrados aumentou mais do que o dobro!
Total de clusters lidos: 250752, decifrados: 405
Infelizmente, não será possível juntar megabytes a partir de fragmentos, mas duzentos kilobytes podem ser facilmente recuperados.
E a notícia da última verificação, a 4ª, é alegre: a formatação completa desse pen drive não resultou na destruição de toda a informação! 120 kilobytes de dados secretos se encaixaram perfeitamente no espaço não utilizado.
Tabela resumo dos testes:

Um pouco de teoria: sobre espaço livre e setores não utilizados
Se você já dividiu um disco rígido em partições, pode ter notado que nem sempre é possível alocar todo o espaço livre no disco. A primeira partição sempre começa com um pequeno recuo (geralmente é 1 megabyte, ou 2048 setores). Após a última partição, também pode haver uma pequena "cauda" de setores não utilizados. Além disso, entre as partições, às vezes, ficam lacunas, embora raramente.
Em outras palavras, existem setores no disco que não podem ser acessados durante o uso habitual do disco, mas os dados podem ser gravados nesses setores! E isso significa que também podem ser lidos. Com a ressalva de que ainda existem a tabela de partições e o código de inicialização, que estão localizados na área vazia no início do disco.
Vamos nos afastar por um momento das partições e observar o disco de uma perspectiva, por assim dizer, de pássaro. Temos uma partição vazia no disco. Vamos criar um sistema de arquivos nela. Podemos dizer que alguns setores do disco permaneceram não apagados?
E-e-e — uma bateria de tambores! A resposta será praticamente sempre — sim! Pois na maioria dos casos, a criação de um sistema de arquivos se resume a gravar apenas alguns blocos de informações de controle no disco, enquanto o restante do conteúdo da partição não muda.
Além disso — empiricamente — pode-se supor que o sistema de arquivos nem sempre pode ocupar todo o espaço alocado até o último setor. Por exemplo, um sistema de arquivos FAT16 com um tamanho de cluster de 64 kilobytes claramente não conseguirá ocupar completamente uma partição cujo tamanho não seja um múltiplo de 64 kilobytes. No final dessa partição, deve haver uma "cauda" de vários setores, indisponíveis para armazenar dados do usuário. No entanto, experimentalmente, essa suposição não pôde ser confirmada.
Portanto, para maximizar o espaço disponível para uma esteganografia, é necessário usar um sistema de arquivos com um tamanho de cluster maior. Também é possível criar uma partição, mesmo que isso não seja necessário (em um pen drive, por exemplo). Não é necessário criar partições vazias ou deixar áreas não alocadas — isso atraíra a atenção de cidadãos curiosos.
Utilitário para experimentos
Os fontes do utilitário podem ser explorados
Para compilar, será necessário o Qt versão 5.0 ou superior e o OpenSSL. Se algo não compilar, pode ser necessário ajustar o arquivo steganodisk.pro.
É possível alterar o tamanho do cluster de 4 KB para, digamos, 512 bytes (no secretfile.h). Isso aumentará os custos com informações de controle: o cabeçalho e a soma de verificação ocupam fixos 68 bytes.
A ferramenta deve ser executada, naturalmente, com permissões de usuário root, e com cautela. Não haverá perguntas antes de sobrescrever o arquivo ou dispositivo especificado!
Aproveite.
Fonte: habr.com
