Im Gegensatz zu den meisten meiner Technikartikel, die ich zuerst selbst schreibe und anschliessend mit einem LLM überarbeite, wurde dieser Artikel grösstenteils von einem LLM verfasst. Ich habe mithilfe eines LLM eine Lösung gefunden, überprüft, dass sie funktioniert, und dessen Antwort zu diesem Artikel ausgearbeitet.
Das Verfahren wurde auf meinem CanoKey Canary mit der Firmware 3.0.3-0-g30917b92 getestet.
1. Die benötigten Werkzeuge vorbereiten
Unter Debian oder Ubuntu:
$ sudo apt install python3-usb libusb-1.0-0
Verwende anschliessend dieses Skript, um Befehle zu senden:
#!/usr/bin/env python3
import time
import usb.core
import usb.util
VID = 0x20A0
PID = 0x42D4
INTERFACE = 1
def apdu(device: usb.core.Device, command: str) -> bytes:
data = bytes.fromhex(command)
# Send command APDU.
device.ctrl_transfer(
0x41, # Host-to-device | Vendor | Interface
0x00, # CMD
0x0000,
INTERFACE,
data,
)
# Wait for execution to finish.
while True:
status = device.ctrl_transfer(
0xC1, # Device-to-host | Vendor | Interface
0x02, # STAT
0x0000,
INTERFACE,
1,
)
if bytes(status)[0] == 0x00:
break
time.sleep(0.05)
# Retrieve response APDU.
response = device.ctrl_transfer(
0xC1,
0x01, # RESP
0x0000,
INTERFACE,
1500,
)
return bytes(response)
def main() -> None:
device = usb.core.find(idVendor=VID, idProduct=PID)
if device is None:
raise SystemExit("CanoKey 20A0:42D4 not found")
print(f"Found {VID:04X}:{PID:04X}")
while True:
command = input("> ")
if command == "":
break
response = apdu(device, command)
print(f"< {response.hex(' ').upper()}")
if __name__ == "__main__":
main()
2. Das Admin-Applet auswählen
Die Anwendungskennung (AID) des Admin-Applets lautet F000000000. Sende:
00 A4 04 00 05 F0 00 00 00 00
Erwartete Antwort:
90 00
Diese Antwort bedeutet, dass das Admin-Applet erfolgreich ausgewählt wurde.
3. Den Wiederholungszähler der Admin-PIN ausschöpfen
Dieser Schritt ist Teil des dokumentierten Verfahrens zum Zurücksetzen auf Werkseinstellungen, wenn du dich nicht für einen normalen Reset authentifizieren kannst.
Prüfe zuerst den Zähler mit:
00 20 00 00
Die anfängliche Antwort sollte lauten:
63 C3
Das bedeutet, dass noch drei Versuche übrig sind.
Sende die folgende APDU dreimal mit einer absichtlich falschen PIN:
00 20 00 00 06 30 30 30 30 30 30
Die PIN-Bytes entsprechen 000000. Die erwarteten Antworten sind:
63 C2(Noch zwei Versuche übrig)63 C1(Noch ein Versuch übrig)69 83(Die PIN ist gesperrt)
Wichtig: Schöpfe die Versuche nicht aus, wenn du die bestehende PIN weiterhin normal verwenden musst. Bei diesem Verfahren ermöglicht die absichtliche Sperrung der PIN den Reset aus dem gesperrten Zustand heraus.
4. Den Befehl zum Zurücksetzen auf Werkseinstellungen senden
Verwende das WebUSB-Skript erneut und wähle das Admin-Applet aus, bevor du die Reset-APDU sendest:
00 A4 04 00 05 F0 00 00 00 00
00 50 00 00 05 52 45 53 45 54
Die zweite APDU ist der Befehl zum Zurücksetzen auf Werkseinstellungen:
00 50 00 00 05 RESET
RESET ist hier die fünf Byte lange ASCII-Zeichenfolge 52 45 53 45 54. CanoKey definiert diesen Befehl als INS=50; die Admin-PIN muss bereits gesperrt sein.
5. Den LED-Signalen folgen
Wenn du den Befehl sendest, beginnt der CanoKey zu blinken.
- Berühre den Schlüssel sofort, sobald er blinkt.
- Berühre ihn weiterhin entsprechend den aufeinanderfolgenden schnellen und langsamen Blinkfolgen.
- Lass den Schlüssel angeschlossen und warte, während dein Python-Skript weiter den Status abfragt.
- Warte, bis das Skript die abschliessende Antwort zurückgibt:
90 00
Die abschliessende Antwort 90 00 bestätigt, dass der Vorgang erfolgreich war. Das Gerät gibt sie nach der wiederholten Berührungssequenz zurück.
Der Ablauf im Überblick
Das Admin-Applet auswählen
00 A4 04 00 05 F0 00 00 00 00
Die Admin-PIN sperren
Sende 00 20 00 00 06 30 30 30 30 30 30 dreimal.
Das Zurücksetzen auf Werkseinstellungen starten
00 50 00 00 05 52 45 53 45 54
Berühren, bis der Reset abgeschlossen ist
Reagiere auf jedes Blinksignal, bis die Antwort 90 00 lautet.