#!/coding/blatt
Sammelsurium mit Schwerpunkten Linux & IT-Sicherheit

IT-Sicherheit: Software-Signaturen überprüfen & verifizieren

Aus Sicherheitsgründen sollte Software immer nur aus vertrauenswürdigen Quellen bezogen werden. Des Weiteren empfiehlt es sich, nur signierte Software einzusetzen und diese vor der Installation immer zu verifizieren. Wie genau eine solche Verifikation basierend auf PGP-Signaturen funktioniert, erfahrt ihr in diesem Beitrag. Als Anschauungsbeispiel dient hierfür die signierte F-Droid-App (alternativer Android-App-Store).

Folgende Software wurde verwendet:
  • GPG (GnuPG) v.2.2.19

Warum Software-Signaturen verifizieren?

Zu den Zielen von signierter Software und deren Überprüfbarkeit zählen:

  • Integrität: Es kann sichergestellt werden, dass die Software nicht manipuliert wurde.
  • Authentizität: Es kann sichergestellt werden, dass die Software, die angeblich von "A" (Person, Unternehmen, Projektteam etc) stammt, auch wirklich von "A" stammt.
Begriffsdefinition Digitale Signatur

Ohne zu sehr ins Detail zu gehen: Bei der digitalen Signatur handelt es sich um ein asymmetrisches Kryptosystem, welches auf öffentlichen und privaten Schlüsseln basiert. Dabei kann Person "A" mit dem eigenen privaten Schlüssel, den auch nur Person "A" kennt, eine Signatur für die eigene Software (bzw. beliebige digitale Daten) berechnen. Andere Personen können dann unter Zuhilfenahme des öffentlichen Schlüssels prüfen, ob die Signatur zu der heruntergeladenen Software passt.

F-Droid-App verifizieren

Am Beispiel der F-Droid-App soll der Vorgang der Verifikation von Software-Signaturen veranschaulicht werden. Hierzu ruft die F-Droid-Website auf. Direkt auf der Startseite findet ihr einen Download-Link für die aktuelle F-Droid-App:

F-Droid: App & PGP-Signatur herunterladen

Zusätzlich findet ihr noch einen Link für die entsprechende PGP-Signatur, die ihr auch herunterladet. In eurem Download-Verzeichnis sollten sich nun die folgenden zwei Dateien befinden:

  • F-Droid.apk
  • F-Droid.apk.asc

Die Datei F-Droid.apk.asc enthält die Signatur der F-Droid.apk-Datei. Die Signatur wurde mit dem privaten PGP-Schlüssel des F-Droid-Teams erstellt. Zum Überprüfen, ob die Signatur zur Software/App passt, benötigen wir den öffentlichen PGP-Key des F-Droid-Teams. Diesen findet ihr in der F-Droid-Doku: F-Droid: Release Channels and Signing Keys

Im konkreten Fall benötigen wir den Public-Key für die offiziellen Binary-Releases:

F-Droid: PGP-Signing-Keys

Oftmals findet ihr den öffentlichen Schlüssel (Public-Key) auch direkt auf der Website des jeweiligen Projekts und könnt diesen herunterladen und bei euch importieren. Alternativ könnt ihr den Schlüssel aber auch von einem Keyserver herunterladen und importieren. Per GPG würde das dann wie folgt funktionieren:

gpg --keyid-format long --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x37D2C98789D8311948394E3E41E7044E1DBA2E89
gpg: Schlüssel 41E7044E1DBA2E89: Öffentlicher Schlüssel "F-Droid <admin@f-droid.org>" importiert
gpg: Anzahl insgesamt bearbeiteter Schlüssel: 1
gpg:               importiert: 1
Terminal / Konsole

Nachdem der öffentliche Schlüssel in eurem lokalen Schlüsselbund importiert wurde, kann nun die F-Droid-App verifiziert werden:

gpg --with-fingerprint --verify F-Droid.apk.asc F-Droid.apk
gpg: Signatur vom Di 27 Okt 2020 08:09:30 CET
gpg:                mittels RSA-Schlüssel 802A9799016112346E1FEFF47A029E54DD5DCE7A
gpg: Korrekte Signatur von "F-Droid <admin@f-droid.org>" [unbekannt]
gpg: WARNUNG: Dieser Schlüssel trägt keine vertrauenswürdige Signatur!
gpg:          Es gibt keinen Hinweis, daß die Signatur wirklich dem vorgeblichen Besitzer gehört.
Haupt-Fingerabdruck  = 37D2 C987 89D8 3119 4839  4E3E 41E7 044E 1DBA 2E89
     Unter-Fingerabdruck  = 802A 9799 0161 1234 6E1F  EFF4 7A02 9E54 DD5D CE7A
Terminal / Konsole

War die Verifikation erfolgreich, dann steht in der Ausgabe Korrekte Signatur von [..]. Wenn das nicht der Fall ist, dann solltet ihr die entsprechende Software nicht installieren, weil sie ggf. (schadhaft) manipuliert wurde.

Ihr solltet auch noch einmal die Fingerabdrücke vergleichen. In diesem Fall stimmen Haupt-Fingerabdruck und der zum Signieren verwendete Unter-Fingerabdruck mit denen in der F-Droid-Doku überein. Somit könnt ihr die F-Droid-App nun ruhigen Gewissens auf eurem Android-Gerät installieren.

Signierte Software ist also immer sicher?

Nein. Natürlich kann jeder seine Software signieren. Einen Malware-Hersteller hindert nichts daran seine Malware zu signieren und zum Download anzubieten. Letztendlich müsst ihr dem Software-Hersteller, sei es eine einzelne Person, ein Unternehmen, ein mehrköpfiges Open-Source-Projektteam usw. vertrauen, dass dieser keine schadhafte Software vertreibt.

Aus diesem Grund ist es auch wichtig, sicherzustellen, dass die verwendeten öffentlichen Schlüssel bzw. Fingerabdrücke vertrauensvoll sind. Im Zusammenhang mit PGP können hierfür bspw. folgende Punkte hilfreich sein:

  • OpenPGP - Web of Trust verwenden
  • Web Key Directory (WKD) verwenden
  • Fingerabdruck bzw. Schlüssel mit mehreren verschiedenen Keyservern abgleichen
  • per Suchmaschine nach dem Fingerabdruck suchen und sicherstellen, dass z.B. nicht vor dem Fingerabdruck und dem dazugehörigen öffentlichen Schlüssel gewarnt wird

Fazit

Wenn ihr Software irgendwo herunterladet und installiert, dann solltet ihr ausschließlich auf signierte Software aus vertrauenswürdigen Quellen setzen. Verwendet ihr eine Linux-Distribution, wie z.B. Ubuntu, und nutzt zur Installation von Software nur die Standard-Paket-Repositories und das Standard-Paket-Managementtool (bei Ubuntu z.B. apt), dann erfolgt die Verifikation automatisch im Hintergrund.