Synchronisierung

Aus PyroNeo Wiki
Zur Navigation springenZur Suche springen

Die Synchronisierung bezeichnet einen Vorgang, der einmalig vor jeder hochsicheren Kommunikation zwischen Sender und Empfänger durchgeführt wird, um die hochsichere Kommunikation aufzubauen. Dabei werden Sender und Empfänger "auf den gleichen Stand" gebracht. Alte Funkbefehle können so weder vor noch nach der Synchronisierung benutzt werden, hochsichere Befehle werden jedoch erst nach der erfolgreichen Synchronisierung ausgeführt.

Aus diesem Grund ist für die hochsichere Verbindung zumindest einmalig nach dem Einschalten eines Moduls eine bidirektionale Kommunikationsmöglichkeit erforderlich. Sollte diese nicht zur Verfügung stehen, kann alternativ die Freischaltung benutzt werden, die jedoch nicht immer vollständig gegen mutwillige Angriffe geschützt ist.

Technischer Hintergrund

Jeder Empfänger unterhält einen Sequenzzähler, nachfolgend Sequenznummer genannt. Diese Nummer dient zur Unterscheidung zwischen "alten" und "aktuellen" Funkbefehlen. Die Nummer wird beim Ausschalten (oder Spannungsverlust) eines Moduls nicht-flüchtig gesichert und bietet so einen eindeutigen Anhaltspunkt dafür, welche Befehle bereits empfangen und ausgewertet wurden.

Normale Befehle

Jeder Befehl enthält selbst eine solche Sequenznummer, die vom Sender automatisch hoch gezählt wird. Jeder Befehl ist darüber hinaus mit einem kryptographischen Hash abgesichert, so dass sich ein Befehl nicht von einer unbeteiligten Person fälschen lässt.

Wenn nun ein Modul einen solchen Befehl empfängt, prüft es zunächst, ob der enthaltene Hash gültig ist (es verwirft also Nachrichten, die nicht von einer anderen Systemkomponente erzeugt wurden). Sollte hierbei ein Fehler festgestellt werden, wird die Nachricht sofort verworfen. Wenn die Nachricht gültig signiert ist, wird anschließend geprüft, ob die enthaltene Sequenznummer größer ist als die im Modul gespeicherte Sequenznummer. Nur wenn dies der Fall ist, ist der Befehl "aktuell" und darf ausgeführt werden. Andernfalls wurde der Befehl bereits benutzt bzw. das Modul hat bereits einen Befehl mit einer größeren Sequenznummer erhalten und der empfangene Befehl ist damit zu alt.

Probleme des Verfahrens

Dieses Verfahren wird einige Probleme auf:

  • Eventuell ist der Sender (und davon kann es ja mehrere geben, so lange der eingetragene Systemschlüssel identisch ist) auf einem Sequenznummer-Stand "hinter" dem befehlsempfangenen Modul. Es muss also ein Verfahren geben, den Sender an die größte Sequenznummer anzugleichen die angesprochen werden soll. Dies ist ein Teil der Synchronisierung und des Anlernens.
  • Es ist möglich, dass das Modul auf einem Sequenznummer-Stand ist, der nicht mehr der letzten ausgesendeten Sequenznummer entspricht. Folgendes Szenario:
Ein Benutzer hat 15 Module, die alle mit dem gleichen Systemschlüssel programmiert sind. Alle Module sind auf dem Sequenznummer-Stand 7. Zu einem Feuerwerk werden nun 10 Module mitgenommen, 5 bleiben im Lager zurück weil sie nicht benötigt werden. Während die Show geschossen wird, generiert der Commander gültige Befehle mit den Sequenznummern 8 - 109, die von den 10 Zündmodulen im Feld als gültig angenommen und ausgeführt werden. Nach der Show wird das Equipment wieder ins Lager geräumt.
Ein Angreifer hat nun diese vom Commander generierten Funkbefehle aufgezeichnet (dazu ist keine Kentniss des Inhaltes notwendig, auch verschlüsselte Befehle könnten so verwendet werden). Bei der nächsten Show die unser Benutzer durchführen möchte liegen nun alle 15 Zündmodule im Feld und wurden gerade eingeschaltet. Sie hatten also noch keinen Kontakt mit dem Commander. Fünf der 15 Module stehen immer noch bei Sequenznummer 7, die restlichen 10 Module stehen bei Sequenznummer 109.
Der Angreifer könnte jetzt seine von der vorherigen Show aufgezeichneten Befehle (mit Sequenznummer 8-109) an zumindest fünf der 15 Module abschicken und diese würden sie als gültig betrachten und ausführen. Dadurch könnte im Zweifel die komplette Show der letzten Woche auf diesen fünf Modulen gezündet werden, was natürlich nicht akzeptabel ist.

(Übrigens hat jedes andere Zündsystem genau dieses letztgenannte Problem: Dort lassen sich, egal welche Verschlüsselung benutzt wird, sämtliche Befehle aufzeichnen und dadurch ungewollte Zündungen jederzeit auslösen!)

Lösung für Problem 1 (falscher Stand des Commanders)

Nach dem Erkennen eines Moduls fragt der Commander dessen Sequenznummer signiert ab. Dadurch ist der Commander anschließend auf dem aktuellen Stand und sendet nur noch Befehle aus, die eine höhere Sequenznummer als die des Moduls beinhalten.

Sicherer Modus

Im sicheren Modus wird genau dieses zweite Problem nicht adressiert - so lange ein empfangener Befehl eine Sequenznummer enthält, die größer ist als die aktuelle Modul-Sequenznummer, wird der Befehl akzeptiert. Die verbleibenden Angriffsmöglichkeiten sind gegeben, erfordern jedoch einen hohen technischen Aufwand.

Als Vorteil zu nennen ist hier die Möglichkeit, Module auch ohne Freischaltung unidirektional zu benutzen, da die Module nicht erst bidirektional angesprochen werden müssen.

Hochsicherer Modus: Lösung für Problem 2 (falscher Stand des Moduls)

Das Modul kann davon ausgehen, dass der Commander nur einen signierten Befehl an ein Modul sendet, wenn dieses auch vorhanden ist und signiert antwortet (Abfrage der Sequenznummer, siehe Problem 1). Wenn also ein Befehl generiert wird, der direkt an das Modul adressiert ist, so kann daran die aktuelle Sequenznummer abgelesen werden. Nach dem Einschalten wartet das Modul also, bis es einen gültigen Synchronisationsbefehl bekommen hat, der ausschließlich an dieses Modul adressiert war. Erst danach werden signierte Befehle als "gültig" ausgeführt. So wird verhindert, dass es zu fehlerhaften Zündungen kommen kann.

Ablauf der Synchronisation

  • Schritt 1
Der Commander sendet den signierten Befehl "COMMAND_GET_SEQUENCE" an das Modul - dieser Befehl ist nicht signiert.
  • Schritt 2
Das Modul antwortet "ANSWER_GET_SEQUENCE" signiert mit seiner aktuellen Sequenznummer.
  • Schritt 3
Der Commander prüft die Signatur und übernimmt eventuell die Sequenznummer (wenn Sie größer ist als seine eigene). Er schickt daraufhin den Befehl "COMMAND_SET_SEQUENCE" signiert mit seiner dann aktuellen Sequenznummer und inkludiert außerdem seine Systemnummer.
  • Schritt 4
Das Modul empfängt diese Nachricht und setzt seine aktuelle Systemnummer entsprechend (alte Befehle eines anderen Commanders werden nicht mehr angenommen), außerdem wird die Sequenznummer auf den Stand des Commanders gesetzt.

Beide Geräte benutzen jetzt die höchste bekannte Sequenznummer; so ist sichergestellt, dass alte Befehle nicht mehr angenommen werden können und die beiden Geräte trotzdem hochsicher miteinander kommunizieren können.

Nicht sicherheitsrelevante Befehle

Befehle, die selbst nicht sicherheitsrelevant sind (z.B. Abruf von Statusinformationen) werden grundsätzlich unabhängig von der Signatur ausgeführt und bedürfen daher keine sicheren Befehle. Die so generierten Befehle können etwas schneller übertragen werden, weswegen diese Unterscheidung vorgenommen wird.