Comparando imagens ISO

Comparando imagens ISO
Para configurar e manter dispositivos de computação, os distribuidores Linux fornecem regularmente as imagens ISO para seus lançamentos. Isso simplifica manter nossos sistemas atualizados com a ajuda de uma compilação completa de software que realmente se encaixa, em circunstâncias ideais.

Imagine que você tem várias dessas imagens ISO armazenadas localmente. Como você descobre que as imagens ISO recuperadas são autênticas? Neste artigo, mostramos como verificar a integridade e a autenticidade de uma imagem ISO que já foi baixada antes e como descobrir quais são as diferenças entre o conteúdo real de duas imagens ISO. Isso ajuda você a verificar o processo de construção da imagem ISO e permite que você veja o que pode ter mudado entre duas construções ou lançamentos disponíveis.

Formatos de imagem

O formato das imagens de disco tem sua própria história [11]. O padrão comum é ISO 9660 [12] que descreve o conteúdo de um disco óptico como um todo. Em uso está a extensão do arquivo .ISO para identificar um arquivo de imagem (cópia clonada).

O formato ISO 9660 original vem com várias limitações, como 8 níveis de diretório, bem como o comprimento dos nomes de arquivos. Essas limitações foram reduzidas pela introdução de várias extensões como Rock Ridge [13] (preservação de permissões POSIX e nomes mais longos), Joliet [14] (armazenamento de nomes Unicode em UCS-2) e extensões Apple ISO 9660 [15] Isso introduziu o suporte ao HFS.

Para obter mais detalhes sobre um arquivo de imagem, use o comando 'arquivo' seguido pelo nome do arquivo de dados da seguinte forma:

.Listagem 1: Exibindo os detalhes para um arquivo ISO

$ arquivo *.ISO
Debian-10.1.0-AMD64-NETINST.Setor de inicialização ISO: DOS/MBR;
Partição 2: id = 0xef, start-chs (0x3ff, 254,63), end chs (0x3ff, 254,63),
STEDETOR 3808, 5664 Setores
Xubuntu-18.04.3-DESKTOP-AMD64.Setor de inicialização ISO: DOS/MBR;
Partição 2: id = 0xef, start-chs (0x3ff, 254,63), end chs (0x3ff, 254,63),
startector 11688, 4928 setores $

Verificando os arquivos iso baixados

Provedores de software confiáveis ​​sempre oferecem duas coisas para download - a imagem ISO real e a soma de verificação da imagem para fazer uma verificação de integridade para o arquivo baixado. O último permite que você confirme que seu arquivo local é uma cópia exata do arquivo presente nos servidores de download, e nada deu errado durante o download. Em caso de erro durante o download, o arquivo local está corrompido e pode desencadear problemas aleatórios durante a instalação [16].

Além disso, caso a imagem ISO tenha sido comprometida (como aconteceu com o Linux Mint no início de 2016 [17]), as duas somas de cheques não corresponderem. Você pode calcular as somas de verificação usando 'md5sum' (depreciado, não mais recomendado) e 'sha256sum' da seguinte forma:

.Listagem 2: Calculando a soma de verificação para arquivos ISO

$ md5sum *.ISO
B931EF8736C98704BCF519160B50FD83 Debian-10.1.0-AMD64-NETINST.ISO
0C268A465D5F48A30E5B12676E9F1B36 Xubuntu-18.04.3-DESKTOP-AMD64.ISO
$ sha256sum *.ISO
7915FDB77A0C2623B4481FC5F0A8052330DEFE1CDE1E0834FF233818DC6F301E Debian-10.1.0-AMD64-NETINST.ISO
3C9E537EE1CF64088251E56B4CA1694944AD59126F298F24A78CD43AF152B5B3 XUBUNTU-18.04.3-DESKTOP-AMD64.ISO
$

Você pode invocar a comparação entre o arquivo de soma de verificação fornecido e a imagem ISO armazenada localmente, conforme exibido na Listagem 3. A saída de OK no final de uma linha sinaliza que as duas somas de verificação são as mesmas.

.Listagem 3: Compare Summas de verificação fornecidas

$ SHA256SUM -CHECK SHA256SUM.TXT Xubuntu-18.04.3-DESKTOP-AMD64.ISO: OK
$

Comparando dois arquivos ISO armazenados localmente

Pode acontecer que você tenha baixado dois arquivos ISO e gostaria de descobrir se eles são totalmente iguais. O comando 'sha256sum' é útil novamente, e recomendamos que você encapsule esta verificação em um script de shell. Na Listagem 4, você vê um script de acordo com o Bash que combina os quatro comandos 'sha256sum', 'corte', 'uniq' e 'wc' para separar a primeira coluna para todas as linhas de saída, mesclá -las, caso sejam idênticas e conte o número de linhas que permanecem. Se os dois (ou mais) arquivos ISO forem iguais, suas somas de verificação são idênticas, apenas uma única linha permanecerá e o script bash produzirá a mensagem "Os arquivos são os mesmos", eventualmente: eventualmente:

.Listagem 4: Comparando automaticamente as somas de verificação de arquivos ISO usando 'sha256sum'

#!/BIN/BASH
Se ['SHA256SUM *.iso | corte -d "-f1 | uniq | wc -l 'eq 1]
então
eco "os arquivos são iguais"
outro
eco "os arquivos não são idênticos"
fi

Caso o script retorne que os dois arquivos sejam diferentes, você pode estar interessado na posição exata da desigualdade. Uma comparação de ordem de byte pode ser feita usando o comando 'cmp' que gera o primeiro byte que difere entre os arquivos:

.Listagem 5: Veja as diferenças entre dois ou mais arquivos usando 'cmp'

$ cmp *.ISO
Debian-10.1.0-AMD64-NETINST.ISO Xubuntu-18.04.3-DESKTOP-AMD64.ISO Differ: Byte 433, Linha 4
$

Comparando o conteúdo real

Até agora, fizemos uma comparação de ordem de byte e agora teremos uma olhada mais de perto - no conteúdo real dos arquivos ISO a serem comparados entre si. Neste ponto.
O comando 'diff' ajuda a comparar um diretório usando os dois switches '-r' (abreviação de '-recursivos') e '-q' (curta para '-brief') seguidos pelos dois diretórios a serem comparados entre si. Como visto em

Listagem 6, 'Diff' relatórios quais são exclusivos do diretório e se um arquivo com o mesmo nome foi alterado.

.Listagem 6: Comparando dois diretórios usando 'diff'

$ diff -qr t1/ t2/
Somente em T1/: BLABLA.conf.
Os arquivos T1/nsswitch.conf e t2/nsswitch.conf são diferentes.
Somente em T2/: PWD.conf.
$

Para comparar duas imagens ISO, basta montar os dois arquivos de imagem para separar diretórios e ir a partir daí.
Uma saída mais colorida na linha de comando é fornecida pelo 'Colordiff' [1,2] e 'Icdiff' [18,19] [18,19] [18,19]. A Figura 1 mostra a saída de 'iCdiff' em que as diferenças entre os dois arquivos de 'NssSwitch.conf 'são destacados em verde ou vermelho.

Figura 1: Comparando dois diretórios usando 'iCdiff'

As ferramentas gráficas para uma comparação de diretórios incluem 'fldiff' [5], 'xxdiff' [6] e 'Dirdiff' [7]. 'xxdiff' foi inspirado por 'fldiff', e é por isso que eles parecem bastante semelhantes. As entradas com conteúdo semelhante vêm com um fundo branco ou cinza, e as entradas que diferem vêm com um fundo amarelo-luz, em vez disso. As entradas com fundo amarelo ou verde brilhante são exclusivas de um diretório.

Figura 2: Comparando dois diretórios usando 'fldiff'

'xxdiff' exibe as diferenças de arquivo em uma janela separada clicando em uma entrada (consulte a Figura 3).

Figura 3: Comparando dois diretórios usando 'xxdiff'

O próximo candidato é 'Dirdiff'. Ele se baseia no topo da funcionalidade de 'xxdiff' e pode comparar até cinco diretórios. Os arquivos que existem em qualquer diretório estão marcados com um X. É interessante.

Figura 4: Comparando dois diretórios usando 'Dirdiff'

Comparar arquivos compactados e imagens ISO inteiras é a próxima etapa. Enquanto o comando 'adiff' do pacote 'Atool' [10] já pode ser conhecido por você, daremos uma olhada no comando 'difoscope' [8,9], em vez disso. Ele se descreve como “uma ferramenta para chegar ao fundo do que torna os arquivos ou diretórios diferentes. Ele descompacta recursivamente arquivos de vários tipos e transforma vários formatos binários em formas mais legíveis humanas para compará -las ”. A origem da ferramenta é o Projeto Reproduzível Construções [19,20], que é “um conjunto de práticas de desenvolvimento de software que criam um caminho de forma independente da fonte para o código binário”. Entre outros, ele suporta os seguintes formatos de arquivo:

* Arquivos Android APK e imagens de inicialização
* Arquivos de banco de dados Berkeley DB
* Imagens do sistema de arquivos CoreBoot CBFS
* Debian .Buildinfo e .Altera arquivos
* Pacotes de origem Debian (.dsc)
* Binários de elfo
* Repositórios Git
* ISO 9660 CD Imagens
* MacOS Binários
* Chaves públicas do OpenSsh
* Arquivos de pacote OpenWrt (.ipk)
* Mensagens assinadas/criptografadas do PGP
* Documentos PDF e PostScript
* RPM Arquivos Cebra

A Figura 5 mostra a saída de 'difoscope' ao comparar duas versões diferentes de pacotes debianos - você verá exatamente as alterações que foram feitas. Isso inclui os dois nomes de arquivos e o conteúdo.

Figura 5: Comparando dois pacotes debian usando 'difoscope' (trecho)

Listagem 7 mostra a saída de 'difoscope' ao comparar duas imagens ISO com um tamanho de 1.9g cada. Nesse caso, as duas imagens ISO pertencem ao Linux Mint Release 19.2 enquanto um arquivo de imagem foi recuperado de um servidor francês e o outro de um servidor austríaco (daí as letras 'FR' e 'AT'). Em segundos 'difoscope' afirma que os dois arquivos são totalmente idênticos.

.Listagem 7: Comparando duas imagens ISO usando 'difoscope'

$ difoscope linuxmint-19.2-XFCE-64bit.fr.ISO Linuxmint-19.2-XFCE-64bit.no.ISO
| #####################################################D ### | 100% tempo: 0:00:00
$

Para olhar para os bastidores, ajuda a chamar de 'difoscópio' com as duas opções '-debug' e '-Text-' para ambos os resultados mais detalhados do terminal. Isso permite que você aprenda o que a ferramenta está fazendo. Listagem 8 mostra a saída de acordo.

.Listagem 8: nos bastidores de 'difoscope'

$ difoscope - -debug --text -linuxmint -19.2-XFCE-64bit.fr.ISO
Linuxmint-19.2-XFCE-64bit.no.ISO
2019-10-03 13:45:51 D: Difoscope.Principal: Iniciando difoscópio 78
2019-10-03 13:45:51 D: Difoscope.Local: normalizando a localidade, fuso horário, etc.
2019-10-03 11:45:51 D: Difoscope.Principal: Comparação inicial
2019-10-03 11:45:51 D: Difoscope.Progresso: Registro < diffoscope.progress.ProgressBar object at 0x7f4b26310588> Como observador de progresso
2019-10-03 11:45:52 D: Difoscope.Comparadores: carregado 50 classes de comparador64bit.fr.iso eta:-:-:--
2019-10-03 11:45:52 D: Difoscope.comparadores.útil.especializar: arquivo não identificado. Magic diz: setor de inicialização do DOS/MBR; Partição 2: id = 0xef, start-chs (0x3ff, 254,63), end-chs (0x3ff, 254,63), startector 652, 4672 setores
2019-10-03 11:45:52 D: Difoscope.comparadores.útil.especializar: arquivo não identificado. Magic diz: setor de inicialização do DOS/MBR; Partição 2: id = 0xef, start-chs (0x3ff, 254,63), end-chs (0x3ff, 254,63), startector 652, 4672 setores
2019-10-03 11:45:52 D: Difoscope.comparadores.útil.Compare: Comparando Linuxmint-19.2-XFCE-64bit.fr.ISO (FileSystemFile) e Linuxmint-19.2-XFCE-64bit.no.ISO (FileSystemFile)
2019-10-03 11:45:52 D: Difoscope.comparadores.útil.Arquivo: Binário.has_same_content: < Linuxmint-19.2-XFCE-64bit.fr.iso> < Linuxmint-19.2-XFCE-64bit.no.iso>
2019-10-03 11:45:53 D: Difoscope.comparadores.útil.Compare: has_same_content_as retornou true; pulando mais comparações
| #####################################################D ### | 100% tempo: 0:00:01
2019-10-03 11:45:53 D: Difoscope.TEMPFILES: LIMPANÇA 0 ARQUIVOS DE TEMP
2019-10-03 11:45:53 D: Difoscope.TEMPFILES: LIMPANÇA 0 DIRETORIAS TEMPORÁRIAS
$

Bem, até agora, tão bom. Os próximos testes foram feitos em imagens de diferentes lançamentos e com diferentes tamanhos de arquivo. Todos eles resultaram em um erro interno que remonta ao comando 'diff' que fica sem memória interna. Parece que existe um limite de tamanho de arquivo de cerca de 50m. É por isso que eu construí duas imagens menores de 10m cada e entreguei a 'difoscope' para uma comparação. A Figura 6 mostra o resultado. A saída é uma estrutura de árvore que contém o arquivo 'nswitch.conf 'com as diferenças destacadas.

Figura 6: Comparando duas imagens ISO usando 'difoscope'

Além disso, uma versão HTML da saída pode ser fornecida. A Figura 7 mostra a saída como um arquivo html em um webbrowser. É possível através do interruptor

'-HTML Saída.html '.

Figura 7: Comparando duas imagens ISO usando 'difoscope' (saída HTML)

Caso você não goste do estilo de saída, ou gostaria de combiná-lo com a identidade corporativa da sua empresa, você pode personalizar a saída pelo seu próprio arquivo CSS usando o Switch '-CSS Style.CSS que carrega o estilo do arquivo CSS referenciado.

Conclusão

Encontrar diferenças entre dois diretórios ou mesmo imagens ISO inteiras é um pouco complicado. As ferramentas mostradas acima ajudam você a dominar esta tarefa. Então, feliz hacking!

Obrigado
O autor gostaria de agradecer a Axel Beckert por sua ajuda ao preparar o artigo.

Links e referências

* [1] Colordiff
* [2] Colordiff, Pacote Debian,
* [3] diffutils
* [4] Difutils, Pacote Debian,
* [5] Fldiff
* [6] xxdiff
* [7] Dirdiff
* [8] Difoscope
* [9] Difoscope, Pacote Debian
* [10] Atool, Pacote Debian
* [11] https: // www.Winiso.com/artigos/formulários de arquivo de imagem comum.HTML (atualmente offline)
* [12] ISO 9660, Wikipedia
* [13] Rock Ridge, Wikipedia
* [14] Joliet, Wikipedia
* [15] Extensões da Apple ISO 9660, Wikipedia
* [16] Como verificar imagens ISO, Mint Linux
* [17] Cuidado com ISOs hackeados se você baixou o Linux Mint em 20 de fevereiro!
* [18] ICDIFF
* [19] ICDIFF, Pacote Debian
* [20] O projeto de construção reprodutível
* [21] O projeto de construção reproduzível, Wiki Debian