Como corromper um arquivo de maneira controlada?

23

Eu escrevi uma função que verifica se há um arquivo corrompido usando uma soma de verificação CRC.

Para testá-lo, acabei de abrir o arquivo e embaralhar o conteúdo com um editor hexadecimal. O problema é que não acredito que esta seja a maneira correta de gerar um arquivo corrompido.

Existe alguma outra maneira de criar uma "corrupção controlada", para que não seja totalmente aleatória, mas simule o que acontece com arquivos corrompidos reais? Eu nunca tive que corromper algo de propósito, então não tenho muita certeza de como fazê-lo, além da mistura aleatória de dados em um arquivo.

rataplan
fonte
Que ferramenta está sendo usada para "arquivar", por corrompido, você quer dizer o conteúdo de um dos arquivos no arquivo ou o próprio arquivo?
Drav Sloan
Estou usando o tar como formato de arquivo. Eu gostaria de corromper apenas o conteúdo do arquivo; portanto, o próprio arquivo ainda é reconhecido como arquivo tar. Minha função extrai o arquivo; Tenho um caso em que o arquivo está corrompido, mas quero verificar o que acontece quando o arquivo dentro do arquivo está corrompido.
rataplan 10/08/2015

Respostas:

22

Também não testei muito , mas aqui estão duas idéias:

Escreva alguns zeros no meio do arquivo. Use ddcom conv=notrunc. Isso grava um único byte (tamanho do bloco = 1 contagem = 1):

dd if=/dev/zero of=file_to_fuzz.zip bs=1 count=1 seek=N conv=notrunc

Usar /dev/urandomcomo fonte também é uma opção.

Como alternativa, faça vários furos de 4k com fallocate --punch-hole. Você pode até fallocate --collapse-rangecortar uma página sem deixar um buraco com zero. (Isso mudará o tamanho do arquivo).

Um download retomado no local errado corresponderia ao --collapse-rangecenário. Um torrent incompleto corresponderá ao punch-holecenário. (Arquivo esparso ou extensões pré-alocadas, lidas como zero em qualquer lugar que ainda não tenha sido gravado.)

Uma RAM ruim (no sistema do qual você baixou o arquivo) pode causar corrupção e as unidades ópticas também podem corromper arquivos (o ECC nem sempre é forte o suficiente para se recuperar perfeitamente de arranhões ou desbotamento do corante).

Os setores de DVD (blocos ECC) são 2048B , mas podem ocorrer erros de byte único ou até de bit único. Algumas unidades provavelmente fornecerão os dados incorretos incorretos, em vez de um erro de leitura para o setor, especialmente se você ler no modo bruto ou com o nome.

Peter Cordes
fonte
1
Por causa de como os discos rígidos funcionam, o preenchimento zero em um bloco 4K alinhado em 4K ou em bloco de 512 bytes alinhado a 512 bytes é o mais realista.
Mark
@ Mark: Ah, se você está pensando em corrupção induzida por HD, sim. Uma RAM ruim no computador de alguém pode virar um pouco no meio de um arquivo. Da mesma forma, uma ida e volta de / para um disco óptico ruim pode zerar um pedaço menor (os códigos de ECC do DVD funcionam em um tamanho de pedaço diferente).
Peter Cordes
10

As outras respostas parecem principalmente preocupadas com erros de hardware. Deixe-me listar algumas corrupções causadas por software:

  • LF substituído por CRLF.
  • CR removido. (Mesmo que não seja seguido por LF)
  • Bytes nulos extras inseridos.
  • "Marca de pedido de bytes" Unicode extra inserida.
  • Conjunto de caracteres convertido de UTF-8 para Latin-1 ou vice-versa.
  • Caractere EOF do DOS (# 1A) excluído, mesmo quando não estiver no final do arquivo.

Essas coisas são bastante inofensivas ao acontecer com arquivos de texto, mas geralmente mortais quando aplicadas a arquivos binários.

Stig Hemmer
fonte
Oh, bons! Também as conversões para o outro lado, é claro. O cabeçalho PNG tem algum grande erro check-in para este tipo de situação: w3.org/TR/PNG-Rationale.html#R.PNG-file-signature
Dewi Morgan
7

Use ddpara truncar o arquivo ou tente um editor binário como hexereditar e introduzir algumas corrupções.

Exemplo de arquivo de truncamento usando dd

Crie um arquivo de 5 MB

# dd if=/dev/zero of=foo bs=1M count=5
5+0 records in
5+0 records out
5242880 bytes (5.2 MB) copied, 0.0243189 s, 216 MB/s
# ls -l foo
-rw-r--r-- 1 root root 5242880 Aug 12 20:13 foo
#

Truncar 10 bytes do final

# dd if=foo of=foo-corrupted bs=1 count=5242870
5242870+0 records in
5242870+0 records out
5242870 bytes (5.2 MB) copied, 23.7826 s, 220 kB/s
# ls -l foo foo-corrupted
-rw-r--r-- 1 root root 5242880 Aug 12 20:13 foo
-rw-r--r-- 1 root root 5242870 Aug 12 20:14 foo-corrupted
#

Página de manual Hexer

HEXER(1)                              General Commands Manual                             HEXER(1)

NAME
   hexer - binary file editor

SYNOPSIS
   hexer [options] [file [...]]

DESCRIPTION
   hexer  is  a  multi-buffer  editor  for  viewing  and  manipulating binary files.  It can't
   (shouldn't) be used for editing block devices, because it tries to load the whole file into
   a  buffer (it should work for diskettes).  The most important features of hexer are:  multi
   buffers, multi level undo, command line editing with completion, binary regular expressions
   (see  below).   The  user  interface  is  kept similar to vi, so if you know how to use vi,
   you'll get started easily.
Steve
fonte
Obrigado Steve. isso simularia o que acontece em um cenário de caso real? Como você está copiando um arquivo da rede e ele fica corrompido? Acredito que um download malsucedido pode ser simulado com dd, para truncar o arquivo. Isso seria preciso?
Rataplan
2
Sim, ao truncar o arquivo usando dd, isso simularia um cenário do mundo real onde apenas parte do arquivo é criada. E editar usando hexer para introduzir algum conteúdo falso simularia outro tipo de corrupção. Como um aparte que md5sumpode valer a pena examinar, ele calcula a soma de verificação md5 para um arquivo.
steve
1
@newbiez, truncar simula aleatoriamente uma falha de rede, enquanto truncar em um limite de 4Kb ou 512 bytes simula uma falha de disco.
Mark
como você realmente trunca o arquivo usando dd?
Edward Torvalds
@edward torvalds - dd truncate example added
steve
2

Sugestão:

Comece a gravar em um arquivo e interrompa a execução antes de terminar. Isso pode ocorrer durante cortes de energia e outros cenários.

Cenário da vida real:

Certa vez, danifiquei um arquivo zip tentando copiar mais dados do que caberia no meio. O Windows (este era o Windows 7 no modo de segurança ftr) tentou concluir a ação antes de descobrir se havia espaço suficiente e, quando o descobriu, o arquivo estava pela metade e, portanto, corrompido. Espero que eles tenham corrigido esse problema em versões posteriores do Windows ou que isso fosse apenas uma coisa do modo de segurança.

Pharap
fonte
2

Outro tipo comum de corrupção é a manipulação de bits: onde um único bit (ou vários bits) é alternado em um fluxo de dados.

Portanto, um byte 1111 0000pode se tornar, digamos, 1111 0010ou 1011 0000ou 1110 1100ou o que for.

Os sistemas de soma de verificação de paridade e contagem de problemas têm problemas com coisas como 1110 1000onde há um número igual de conjuntos e desabilitados, pois a paridade e o número de unidades permanecem os mesmos.

Portanto, substituir todas as instâncias de um caractere aleatório pelo inverso, digamos 0x57 a 0x75 ('9' a 'K') ou vice-versa, pode não ser detectável. Para sistemas que possuem mysql, o comando "replace" existe apenas para esse propósito:

replace K 9 < goodInputFile > corruptedOutputFile

Você também pode tentar trocar as letras K e 9, o que será um teste particularmente bom se as duas aparecerem o mesmo número de vezes no arquivo:

replace K 9 9 K < goodInputFile > corruptedOutputFile

Use man replacepara mais informações.

Dewi Morgan
fonte
0

Alterações aleatórias nos dados de teste corrompidos não são uma boa abordagem, pois você não pode reproduzir a amostra para executar novamente os testes.

Eu ficaria feliz com apenas 3 amostras, mudando apenas 1 bit no primeiro byte, no último byte e em qualquer byte do meio. Mas apenas 1 bit, não o byte inteiro.

Mas a melhor amostra de teste seria aquela em que você poderia gerar amostras alterando cada bit do arquivo do primeiro ao último byte. Isso não pode ser (normalmente) obtido com as ferramentas usuais, você precisa criar uma (eu acho).

Com essa abordagem, você isola muitas possibilidades, incluindo endianess, se o seu algoritmo é baseado em um tipo de endianess. Em outras mãos, uma amostra grande pode consumir muito tempo para processar.

Por fim, alguns exemplos de truncamento ou adição de bytes concluirão seus testes.

Luciano
fonte