Usando Assinaturas Digitais para Verificar Integridade de Arquivos Binários no Linux
Introdução
Em um mundo onde dados podem ser interceptados ou alterados, confiança na autenticidade de arquivos recebidos é primordial. Por exemplo, se o Usuário A envia um arquivo binário ao Usuário B via email, como B pode ter certeza de que o arquivo não foi adulterado? Assinaturas digitais (AD) fornecem uma solução confiável ao vincular os dados às credenciais únicas do remetente.
- A assinatura deve ser derivada da mensagem assinada.
- Deve incorporar a informação única do remetente.
- Criação deve ser direta.
- Deve ser computacionalmente inviável forjar.
- O tamanho da assinatura deve permanecer pequeno.
Este artigo demonstra uma implementação prática de AD para verificar a integridade de binários ELF de 64 bits no Linux. A abordagem usa um esquema de assinatura direta (sem árbitro terceirizado) e depende de uma chave privada para assinar e um certificado público para verificação.
Exemplo de Implementação de AD
Implementar a assinatura envolve os seguintes passos:
- Gerar um hash MD5 do binário de origem.
- Criar uma chave privada e um certificado público auto-assinado.
- Assinar o binário:
- Criptografar o hash MD5 com a chave privada.
- Armazenar o hash criptografado em uma nova seção
.sigdo arquivo ELF. - Salvar o certificado em
~/.sshpara verificação posterior.
Todo o processo pode ser automatizado usando openssl, objcopy e md5sum. Abaixo está um script de exemplo, sign_elf.sh, que automatiza a assinatura de binários ELF. (O código-fonte sem números de linha aparece ao final deste artigo.)
#!/bin/bash
KEY_DIR="$HOME/.ssh"
PRIVATE_KEY="$KEY_DIR/priv.key"
CERTIFICATE="$KEY_DIR/pub.crt"
SUBJECT="/C=BR/ST=Sao Paulo/L=Sao Paulo/O=MinhaEmpresa/OU=DEV/CN=www.minhaempresa.com"
if [ "$#" = "0" ]; then
echo "Uso: sign_elf.sh [arquivos ELF]"
exit 1
fi
[ ! -d "$KEY_DIR" ] && mkdir "$KEY_DIR"
# Gerar chave privada e certificado
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"
for ELF_BIN in "$@"; do
ELF_BASE_NAME="${ELF_BIN##*/}"
ELF_BIN_SIGNATURE="$ELF_BASE_NAME.sha256"
ELF_BIN_MD5="$ELF_BASE_NAME.md5"
if [ ! -f "$ELF_BIN" ]; then
echo "Erro: arquivo não encontrado $ELF_BIN"
exit 103
fi
# Remover seção .sig existente
objcopy --remove-section=.sig "$ELF_BIN"
# Adicionar seção .sig de 512 bytes preenchida com zeros
rm -f dummy.txt
touch dummy.txt
truncate --size=512 dummy.txt
objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload,readonly "$ELF_BIN"
# Calcular hash MD5 do binário (com seção .sig)
md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5"
# Assinar o hash MD5 com a chave privada
openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
# Verificar a assinatura imediatamente (opcional)
openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
# Embutir o hash criptografado na seção .sig
objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN"
# Exibir conteúdo da seção .sig para inspeção
objdump -sj .sig "$ELF_BIN"
done
rm -f dummy.txt
ls -ls ~/.ssh
Detalhamento do Script
Linha 19 – Geração do Certificado
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"
reqcria uma solicitação de assinatura de certificado.-nodesproduz uma chave privada em texto plano.-x509gera um certificado auto-assinado.-sha256seleciona SHA-256 para hashing.-newkey rsa:4096gera chave RSA de 4096 bits.- O campo
SUBJECTsegue formato RFC 5280, ex.:/C=BR/ST=.../CN=....
Após este passo, ~/.ssh/priv.key contém a chave privada e ~/.ssh/pub.crt o certificado. A chave privada criptografa dados; o certificado contém a chave pública necessária para verificação.
Loop sobre arquivos ELF
Cada binário especificado na linha de comando é processado sequencialmente. O script garante que qualquer seção .sig pré-existente seja removida antes de assinar novamente.
Gerenciamento de Seção
- A seção
.sigexistente é removida comobjcopy --remove-section=.sig. - Um arquivo placeholder de 512 bytes é criado e adicionado como seção
.sigsomente leitura, não carregável.
Cálculo do Hash
md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5"
MD5 é computado sobre o binário, incluindo a seção .sig placeholder, e armazenado em binary_name.md5.
Assinando o Hash
openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
O hash MD5 é criptografado com a chave privada, produzindo um arquivo de assinatura (ex.: binary_name.sha256).
Verificação (Opcional)
openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
Esta etapa confirma que a assinatura corresponde ao hash usando a chave pública extraída do certificado.
Embutindo a Assinatura
objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN"
O hash criptografado substitui o placeholder, finalizando o binário ELF assinado.
Executar o script em um conjunto de arquivos ELF produzirá binários assinados que podem ser distribuídos com segurança. O destinatário pode verificar integridade extraindo a seção .sig, descriptografando-a com o certificado público e comparando o hash resultante a um hash recém-computado do arquivo recebido.
Tecnologia da Internet das Coisas
- Impulsionando Sinergias IoT: Como o CoC de Conectividade da Bosch Molda um Futuro Conectado
- Preparando Suas Operações de Manufatura para IA com IoT
- Gêmeos Digitais: Desbloqueando IoT de Edge Inteligente na Manufatura – Parte 2
- Manutenção Preditiva: Aproveitando a Indústria 4.0 para Produção Ininterrupta
- Sua Fábrica Está Pronta para IoT? Um Guia Prático
- Seguros Digitais: 5 Tendências Revolucionando Como Compramos e Gerenciamos Coberturas
- Western Digital Lança Armazenamento 3D NAND 64-Camadas Rugged para Industrial IoT e Edge Computing
- Western Digital Lança Armazenamento 3D NAND 64-Camadas Rugged para IoT Industrial
- Por que Computação em Nuvem é Essencial para Armazenar Dados de IoT
- Aproveite a Indústria 4.0: Estratégias Comprovadas para Construir um Roteiro Digital Vencedor