Esteganografia por arquivos: ocultando dados diretamente em setores

Breve introdução

A esteganografia, caso alguém não se lembre, está escondendo informações em alguns contêineres. Por exemplo, em imagens (discutidas aqui и aqui). Você também pode ocultar dados nas tabelas de serviço do sistema de arquivos (isso foi escrito sobre aqui), e até mesmo em pacotes de serviço do protocolo TCP. Infelizmente, todos esses métodos têm uma desvantagem: para “inserir” informações imperceptivelmente em um contêiner, são necessários algoritmos astutos que levem em consideração as peculiaridades da estrutura interna do contêiner. E surgem problemas com a resistência do contêiner à manipulação: por exemplo, se você editar levemente a imagem, as informações ocultas serão perdidas.

É possível, de alguma forma, prescindir de algoritmos astutos e manipulações sutis de dados e ainda garantir a funcionalidade do contêiner e um nível aceitável de segurança de dados ocultos? Olhando para o futuro, direi: sim, você pode! Vou até oferecer um utilitário.

Detalhes sangrentos do método

A ideia básica é tão simples quanto uma pancada na testa: há áreas no disco nas quais o sistema operacional nunca grava (ou grava em casos raros). Para evitar a necessidade de procurar essas áreas usando algoritmos astutos, usaremos redundância - ou seja, duplicaremos nossas informações ocultas muitas e muitas vezes em todos os setores do disco. Então, além de todo esse esplendor, você pode criar as partições necessárias, formatar sistemas de arquivos, gravar arquivos e instalar sistemas operacionais - mesmo assim, parte dos dados secretos será salva e poderá ser recuperada, e a duplicação repetida nos ajudará junte o todo original a partir das peças.

A vantagem deste método é óbvia: não dependemos do formato do arquivo, nem mesmo do tipo de sistema de arquivos utilizado.

As desvantagens também são, penso eu, óbvias:

  • Os dados secretos só podem ser alterados reescrevendo completamente todo o disco, seguido da recriação do conteúdo visível ao usuário. No entanto, você não pode usar software que recrie o disco a partir de uma imagem: ele também recriará os dados secretos anteriores.
  • Quanto maior o volume de dados secretos, maior a probabilidade de perda de algumas informações.
  • A recuperação de dados do disco pode demorar muito. De vários minutos a vários dias (os discos modernos são grandes).

Agora vamos passar aos detalhes.

É claro que se você simplesmente espalhar dados secretos por todo o disco, eles ficarão ocultos apenas a olho nu. Se você equipar seu olhar com, digamos, um editor de disco, os dados aparecerão em toda a sua glória. Portanto, seria uma boa ideia criptografar os dados para que não apareçam. Criptografaremos de forma simples, mas com bom gosto: usando o algoritmo aes256-cbc. Pediremos ao usuário a chave de criptografia e deixaremos que ele crie uma boa senha.

A próxima questão é como podemos distinguir dados “bons” de dados ruins. Aqui nos ajudará uma soma de verificação, mas não simples, mas SHA1. E o que? É bom o suficiente para o git, então também servirá para nós. Decidido: fornecemos a cada informação armazenada uma soma de verificação e, se após a descriptografia ela corresponder, significa que a descriptografia foi bem-sucedida.

Você também precisará do número do fragmento e do comprimento total dos dados secretos. O número do fragmento serve para controlar quais peças já deciframos e quais sobraram. O comprimento total será útil para nós no processamento do último fragmento, para não gravar dados desnecessários (ou seja, preenchimento). Bem, como ainda temos um cabeçalho, adicionaremos o nome do arquivo secreto lá. Será útil após a descriptografia, para não adivinhar como abri-lo.

Testando o método na prática

Para verificar, vamos usar o meio mais comum - uma unidade flash. Encontrei um antigo com capacidade de 1 GB, bastante adequado para experimentos. Se você, como eu, teve a ideia de não se preocupar com mídia física, mas testá-la em um arquivo - uma imagem de disco, direi imediatamente: não vai funcionar. Ao formatar esse “disco”, o Linux cria o arquivo novamente e todos os setores não utilizados serão preenchidos com zeros.

Por ser uma máquina com Linux, infelizmente, tive que usar uma estação meteorológica no Raspberry Pi 3 que estava na varanda, não tem muita memória lá, então não vamos esconder arquivos grandes. Limitamo-nos a um tamanho máximo de 10 megabytes. Também não faz sentido ocultar arquivos muito pequenos: o utilitário grava dados no disco em clusters de 4 KB. Portanto, a seguir nos limitaremos a um arquivo de 3 KB - ele cabe em um desses clusters.

Iremos simular o pen drive em etapas, verificando após cada etapa se as informações ocultas são legíveis:

  1. Formatação rápida no formato FAT16 com tamanho de cluster de 16 KB. Isso é o que o Windows 7 oferece para fazer com uma unidade flash que não possui um sistema de arquivos.
  2. Encher o pen drive com todo tipo de lixo em 50%.
  3. Encher o pen drive com todo tipo de lixo em 100%.
  4. Formatação “longa” no formato FAT16 (sobrescrevendo tudo).

Os dois primeiros testes, como esperado, terminaram com vitória completa: o utilitário conseguiu extrair com sucesso 10 megabytes de dados secretos da unidade flash. Mas depois que a unidade flash ficou lotada com arquivos, ocorreu uma falha:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Como você pode ver, apenas 158 clusters foram descriptografados com sucesso (632 kilobytes de dados brutos, o que dá 636424 bytes de carga útil). É claro que não há como obter 10 megabytes aqui e, ainda assim, entre esses clusters há claramente duplicatas. Você não pode recuperar nem 1 megabyte dessa maneira. Mas podemos garantir que recuperaremos 3 kilobytes de dados secretos de uma unidade flash, mesmo depois de formatada e gravada em sua capacidade máxima. No entanto, experimentos mostram que é perfeitamente possível extrair um arquivo de 120 kilobytes de tal unidade flash.

O último teste, infelizmente, mostrou que todo o pen drive foi sobrescrito:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

Nem um único aglomerado sobreviveu... Triste, mas não trágico! Antes de formatar, vamos tentar criar uma partição no pen drive, e já nela um sistema de arquivos. Aliás, ele veio de fábrica exatamente com essa formatação, então não estamos fazendo nada suspeito.
É bastante esperado que o espaço disponível no pen drive tenha diminuído ligeiramente.

Também é bastante esperado que 10 megabytes não possam ser ocultados em um disco completamente cheio. Mas agora o número de clusters descriptografados com sucesso mais que dobrou!

Total clusters read: 250752, decrypted: 405

Infelizmente, é impossível montar um megabyte a partir de pedaços, mas duzentos kilobytes são fáceis.

Pois bem, a notícia da última, 4ª verificação, desta vez é alegre: a formatação completa desse pen drive não levou à destruição de todas as informações! 120 kilobytes de dados secretos cabem perfeitamente no espaço não utilizado.

Tabela de resumo do teste:

Esteganografia por arquivos: ocultando dados diretamente em setores

Um pouco de teorização: sobre espaço livre e setores não utilizados

Se você já dividiu seu disco rígido em partições, deve ter notado que nem sempre é possível alocar todo o espaço livre do disco. A primeira seção sempre começa com algum recuo (geralmente 1 megabyte ou 2048 setores). Atrás da última seção, acontece também que resta uma pequena “cauda” de setores não utilizados. E às vezes há lacunas entre as seções, embora raramente.

Em outras palavras, existem setores no disco que não podem ser acessados ​​durante a operação normal do disco, mas os dados podem ser gravados nesses setores! E isso significa ler também. Ajustado pelo fato de haver também uma tabela de partições e um código de bootloader, que estão localizados na área vazia no início do disco.

Vamos fazer uma pausa nas seções por um tempo e olhar para o disco de uma perspectiva aérea, por assim dizer. Aqui temos uma partição vazia no disco. Vamos criar um sistema de arquivos nele. Podemos dizer que alguns setores do disco permanecem não apagados?

E-e-e - rufar de tambores! A resposta quase sempre será sim! Na verdade, na maioria dos casos, a criação de um sistema de arquivos se resume a gravar apenas alguns blocos de informações de serviço no disco e, caso contrário, o conteúdo da partição não muda.

E também - de forma puramente empírica - podemos assumir que o sistema de arquivos nem sempre pode ocupar todo o espaço que lhe é atribuído até o último setor. Por exemplo, um sistema de arquivos FAT16 com tamanho de cluster de 64 kilobytes obviamente não pode ocupar completamente uma partição com tamanho não múltiplo de 64 kilobytes. No final de tal seção deverá haver uma “cauda” de vários setores, inacessíveis para armazenar dados do usuário. No entanto, esta suposição não pôde ser confirmada experimentalmente.

Portanto, para maximizar o espaço disponível para o esteganograma, você precisa usar um sistema de arquivos com tamanho de cluster maior. Você também pode criar uma partição, mesmo que não seja necessário (em uma unidade flash, por exemplo). Não há necessidade de criar seções vazias ou deixar áreas não alocadas - isso atrairá a atenção dos cidadãos interessados.

Utilitário para experimentos

Você pode tocar no código-fonte do utilitário aqui

Para construir, você precisará do Qt versão 5.0 ou superior e do OpenSSL. Se algo não funcionar, talvez seja necessário editar o arquivo steganodisk.pro.

Você pode alterar o tamanho do cluster de 4 KB para, digamos, 512 bytes (em secretfile.h). Ao mesmo tempo, o custo das informações de serviço aumentará: o cabeçalho e a soma de verificação ocupam 68 bytes fixos.

Você precisa executar o utilitário, é claro, com direitos de usuário root e com cautela. Não haverá perguntas antes de substituir o arquivo ou dispositivo especificado!

Aproveite.

Fonte: habr.com

Adicionar um comentário