Digitale Signaturen zur Verifikation der Integrität binärer Dateien unter Linux
Einführung
In einer Welt, in der Daten abgefangen oder verändert werden können, ist Vertrauen in die Authentizität empfangener Dateien paramount. Wenn User A eine Binärdatei per E-Mail an User B sendet – wie kann B sicher sein, dass die Datei nicht manipuliert wurde? Digitale Signaturen (DS) bieten eine zuverlässige Lösung, indem sie Daten an die einzigartigen Credentials des Absenders binden.
- Die Signatur muss von der signierten Nachricht abgeleitet sein.
- Sie sollte die einzigartigen Informationen des Absenders enthalten.
- Erstellung sollte unkompliziert sein.
- Fälschung muss rechnerisch infeasibel sein.
- Signaturgröße sollte klein bleiben.
Dieser Artikel demonstriert eine praktische DS-Implementierung zur Verifikation der Integrität von 64-Bit ELF Binaries unter Linux. Der Ansatz nutzt ein direktes Signaturschema (kein Drittpartei-Arbiter) und verlässt sich auf einen Private Key zum Signieren und ein Public Certificate zur Verifikation.
DS Implementierungsbeispiel
Die Signaturimplementierung umfasst folgende Schritte:
- MD5 Hash der Quell-Binärdatei generieren.
- Private Key und selbstsigniertes Public Certificate erstellen.
- Binärdatei signieren:
- MD5 Hash mit Private Key verschlüsseln.
- Verschlüsselten Hash in neue
.sigSection der ELF Datei speichern. - Certificate in
~/.sshfür spätere Verifikation speichern.
Der gesamte Prozess kann mit openssl, objcopy und md5sum gescriptet werden. Unten ein Beispielscript sign_elf.sh, das das Signieren von ELF Binaries automatisiert. (Der Quellcode ohne Zeilennummern findet sich am Artikelende.)
#!/bin/bash
KEY_DIR="$HOME/.ssh"
PRIVATE_KEY="$KEY_DIR/priv.key"
CERTIFICATE="$KEY_DIR/pub.crt"
SUBJECT="/C=DE/ST=Bayern/L=Muenchen/O=Example/OU=DEV/CN=www.example.com"
if [ "$#" = "0" ]; then
echo "Usage: sign_elfs.sh [ELF files]"
exit 1
fi
[ ! -d "$KEY_DIR" ] && mkdir "$KEY_DIR"
# Private Key und Certificate generieren
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 "Error: no such file $ELF_BIN"
exit 103
fi
# Existierende .sig Section entfernen
objcopy --remove-section=.sig "$ELF_BIN"
# 512-Byte Zero-filled .sig Section hinzufügen
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"
# MD5 Hash der Binary (mit .sig Section) berechnen
md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5"
# MD5 Hash mit Private Key signieren
openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
# Signatur sofort verifizieren (optional)
openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
# Verschlüsselten Hash in .sig Section einbetten
objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN"
# Inhalt der .sig Section zur Inspektion anzeigen
objdump -sj .sig "$ELF_BIN"
done
rm -f dummy.txt
ls -ls ~/.ssh
Detaillierte Script-Erläuterung
Zeile 19 – Certificate Generierung
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"
reqerstellt einen Certificate Signing Request.-nodeserzeugt einen Plain-Text Private Key.-x509outputs a self-signed certificate.-sha256wählt SHA-256 für Hashing.-newkey rsa:4096generiert einen 4096-Bit RSA Key.- Das
SUBJECTFeld folgt RFC 5280 Format, z.B./C=DE/ST=…/CN=….
Nach diesem Schritt hält ~/.ssh/priv.key den Private Key und ~/.ssh/pub.crt das Certificate. Der Private Key verschlüsselt Daten; das Certificate enthält den Public Key für Verifikation.
Schleife über ELF Files
Jede auf der Kommandozeile spezifizierte Binary wird sequenziell verarbeitet. Das Script stellt sicher, dass jede vorexistierende .sig Section vor Neu-Signierung entfernt wird.
Section Management
- Die existierende
.sigSection wird mitobjcopy --remove-section=.sigentfernt. - Eine 512-Byte Platzhalterdatei wird erstellt und als read-only, non-loadable
.sigSection hinzugefügt.
Hash Berechnung
md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5"
MD5 wird über die Binary inklusive Platzhalter .sig Section berechnet und in binary_name.md5 gespeichert.
Hash Signieren
openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
Der MD5 Hash wird mit dem Private Key verschlüsselt, was eine Signaturdatei erzeugt (z.B. binary_name.sha256).
Verifikation (Optional)
openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
Dieser Schritt bestätigt, dass die Signatur zum Hash passt, using den Public Key aus dem Certificate.
Signatur Einbetten
objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN"
Der verschlüsselte Hash ersetzt den Platzhalter, finalisiert die signierte ELF Binary.
Das Ausführen des Scripts auf einer Menge ELF Files produziert signierte Binaries, die sicher verteilt werden können. Der Empfänger kann Integrität verifizieren, indem er die .sig Section extrahiert, mit dem Public Certificate entschlüsselt und den resultierenden Hash mit einem frisch berechneten Hash der empfangenen Datei vergleicht.
Internet der Dinge-Technologie
- IoT-Synergien treiben: Wie Boschs Connectivity CoC eine vernetzte Zukunft formt
- Fertigungsabläufe mit IoT auf KI vorbereiten
- Digital Twins: Intelligentes Edge-IoT in der Fertigung freisetzen – Teil 2
- Predictive Maintenance: Industry 4.0 für unterbrechungsfreie Produktion nutzen
- Ist Ihre Fertigungsstätte bereit für IoT? Ein praktischer Leitfaden
- Digital Insurance: 5 Trends, die Versicherungsabschluss und -management revolutionieren
- Western Digital startet robuste 64-Layer 3D NAND Storage für Industrial IoT und Edge Computing
- Western Digital launcht robuste 64-Layer 3D NAND Storage für Industrial IoT
- Warum Cloud Computing für die Speicherung von IoT-Daten unverzichtbar ist
- Industrie 4.0 nutzen: Bewährte Strategien für eine gewinnende digitale Roadmap