
Portable, hardwaregestützte WebAuthn-Anmeldedaten mittels TPM 2.0. Ein deterministischer Elternschlüssel, abgeleitet von einem Master-Seed, ermöglicht geräteübergreifende Portabilität der Anmeldedaten. Private Signaturschlüssel verlassen nie das TPM. Beinhaltet Browsererweiterung und CLI.
⚠️ Früher Proof of Concept. Dieses Projekt wurde nicht gründlich getestet oder auditiert. Verwenden Sie es nicht für etwas anderes als Experimente.
Tragbare, hardwaregestützte WebAuthn/Passkey-Anmeldeinformationen, die mit TPM 2.0 auf mehreren Geräten funktionieren.
Traditionelle TPM-Anmeldeinformationen sind an das Gerät gebunden, das sie erstellt hat. Dieses Projekt macht sie portabel, indem es einen deterministischen Elternschlüssel (abgeleitet von einem Master-Seed) in das TPM jedes Geräts importiert. Von einem TPM verschlüsselte Credential-Blobs können dann von jedem anderen TPM geladen und verwendet werden, das mit demselben Seed bereitgestellt wurde. Private Signaturschlüssel werden vom TPM für jede Anmeldeinformation zufällig generiert und existieren außerhalb der Hardware niemals im Klartext.
Der Master-Seed wird pro Gerät nur während der Bereitstellung benötigt. Danach finden alle kryptografischen Vorgänge vollständig innerhalb des TPM statt.
Eine Browsererweiterung überschreibt navigator.credentials und leitet WebAuthn-Aufrufe über Native Messaging an ein Python-Backend weiter, das direkt mit dem TPM kommuniziert. Bei der Registrierung erstellt das TPM einen neuen Signaturschlüssel unter dem portablen Elternschlüssel und gibt einen verschlüsselten Blob zurück. Bei der Authentifizierung lädt es den Blob erneut, entschlüsselt ihn intern und signiert die Challenge.
Linux (Debian/Ubuntu):
sudo apt install tpm2-tools python3-tpm2-pytss python3-cryptography
Windows:
pip install cryptography
Windows kommuniziert mit dem TPM über TBS (TPM Base Services) mittels ctypes, daher sind keine zusätzlichen nativen Pakete erforderlich.
Die Browsererweiterung kommuniziert mit native_host.py über Native Messaging. Sie müssen ein Manifest registrieren, das Firefox mitteilt, wo sich der Host befindet.
Erstellen Sie die Datei ~/.mozilla/native-messaging-hosts/webauthn_tpm_portable.json:
{
"name": "webauthn_tpm_portable",
"description": "WebAuthn TPM Portable Credentials Backend",
"path": "/absolute/path/to/native_host.py",
"type": "stdio",
"allowed_extensions": [
"[email protected]"
]
}
Ersetzen Sie path durch den absoluten Pfad zu native_host.py. Stellen Sie sicher, dass es ausführbar ist (chmod +x native_host.py).
Unter Windows wird das Native-Messaging-Manifest über die Windows-Registrierung registriert. Siehe die Firefox Native Messaging Dokumentation für Details.
cd extension
npm install
npm run build
Dann in Firefox:
about:debugging#/runtime/this-firefoxextension/dist (z.B. manifest.json)Öffnen Sie das Popup der Erweiterung und fügen Sie entweder einen vorhandenen Seed ein oder klicken Sie auf "Generieren", um einen neuen zu erstellen, und klicken Sie dann auf "Bereitstellen". Wenn Sie einen neuen Seed generieren, bewahren Sie ihn sicher auf. Sie benötigen ihn, um weitere Geräte bereitzustellen, und ein Verlust bedeutet, dass Sie keine neuen Geräte einrichten können (vorhandene Anmeldeinformationen auf bereits bereitgestellten Geräten funktionieren weiterhin).
Die Bereitstellung kann auch über die CLI erfolgen:
./webauthn_cli.py provision --generate
# or with an existing seed:
./webauthn_cli.py provision <seed_hex>
./webauthn_cli.py test
Dies erstellt eine Anmeldeinformation, signiert eine Challenge und verifiziert die Signatur.
webauthn_cli.py [--backend=BACKEND] <command> [args]
Befehle:
Backends (ausgewählt mit --backend oder der Umgebungsvariable WEBAUTHN_BACKEND):
| Backend | Beschreibung |
|---|---|
tpm | Plattformübergreifendes TPM via Raw-Befehle (Standard) |
linux | Nur Linux, verwendet die Bibliothek tpm2-pytss |
soft | Reine Software, kein TPM erforderlich (zum Testen) |
Signaturschlüssel für Anmeldeinformationen werden im TPM generiert und verlassen es niemals im Klartext. Der verschlüsselte Blob in der Credential-ID ist ohne Zugriff auf ein bereitgestelltes TPM nutzlos. Im Gegensatz zu softwarebasierten Credential-Speichern sind private Schlüssel während der Authentifizierung niemals im Host-Speicher vorhanden, was vor Cold-Boot-Angriffen und malwarebasierter Schlüsselextraktion schützt.
TPM2_Duplicate (das theoretisch Schlüssel exportieren könnte) wird blockiert, da Anmeldeinformationen mit einer leeren authPolicy erstellt werden, was eine Duplizierung selbst bei vollem Systemzugriff unmöglich macht.
Schadsoftware, die auf einem bereitgestellten System läuft, kann das TPM bitten, Challenges zu signieren, da es keine Benutzerüberprüfung gibt (kein Tastendruck oder Biometrie). Sie kann die Schlüssel nicht extrahieren, aber sie kann sie nutzen, solange sie aktiv ist. Dies ist eine geringere Angriffsfläche als bei softwarebasierten Credential-Speichern, bei denen Malware Schlüssel direkt stehlen kann.
Der Master-Seed ist die Vertrauenswurzel. Wenn er kompromittiert wird, kann ein Angreifer sein eigenes TPM bereitstellen und alle erhaltenen Credential-Blobs verwenden. Wenn er verloren geht und alle bereitgestellten Geräte nicht verfügbar sind, sind Anmeldeinformationen nicht wiederherstellbar. Bewahren Sie ihn auf wie einen Hardware-Wallet-Wiederherstellungssatz: offline, an einem sicheren Ort, idealerweise mit Redundanz (z.B. auf mehrere Orte verteilt).
Das Projekt enthält drei austauschbare Backends:
webauthn_tpm_portable.py ist das primäre Backend. Es konstruiert TPM-Befehle auf Byte-Ebene und funktioniert sowohl unter Linux (/dev/tpmrm0) als auch unter Windows (TBS API via ctypes).
webauthn_tpm_linux.py verwendet die Python-Bibliothek tpm2-pytss und funktioniert nur unter Linux.
webauthn_soft.py ist eine reine Software-Implementierung, die dasselbe Credential-Format ohne TPM emuliert. Nützlich zum Testen und Entwickeln, bietet jedoch keinen Hardwareschutz.
"Permission denied" auf /dev/tpmrm0:
Fügen Sie Ihren Benutzer zur Gruppe tss hinzu und melden Sie sich erneut an: sudo usermod -aG tss $USER
tpm2-pytss Importfehler:
Versuchen Sie sudo apt install python3-tpm2-pytss oder pip install --upgrade tpm2-pytss --break-system-packages.
Erweiterung verbindet sich nicht mit nativem Host:
Überprüfen Sie, ob der path im Native-Messaging-Manifest ein absoluter Pfad ist, der auf native_host.py zeigt. Öffnen Sie die Browserkonsole in Firefox (Strg+Umschalt+J), um Fehler von der Erweiterung zu überprüfen.
MIT
| Befehl | Beschreibung |
|---|
status | Überprüfen, ob das TPM bereitgestellt ist |
provision --generate | Einen zufälligen Seed generieren und bereitstellen |
provision <seed_hex> | Mit einem vorhandenen Seed bereitstellen |
create <rp_id> | Eine Anmeldeinformation für eine vertrauende Partei erstellen |
sign <cred_id> <rp_id> <challenge> | Eine Challenge signieren |
verify <cred_id> <rp_id> <challenge> <sig> | Eine Signatur verifizieren |
clear | Den portablen Elternschlüssel aus dem TPM entfernen |
test | Einen vollständigen Erstellen/Signieren/Verifizieren-Zyklus ausführen |