Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- u23 - Funksicherheit
- ====================
- * momentaner Stand
- * moegliche Attacken
- * Node IDs
- * Sicherheitsmassnahmen
- * Pruefsummen und Signaturen
- * Verschluesselung
- * Challenges
- u23 - Funksicherheit - momentaner Stand
- =======================================
- * Die Arduinos nehmen Daten von allen moeglichen Quellen an
- * Nur die ID der Gegenstelle muss stimmen
- * Die Daten werden nicht auf Korrektheit geprueft
- * Es koennte z.B. angezeigt werden, dass gerade 1337 Grad sind
- * ... oder dass -300 Grad sind
- * Die Sensoren senden fuer alle lesbare Daten
- u23 - Funksicherheit - moegliche Attacken
- =========================================
- * Einstreuen falscher Daten
- * subtil falsche Daten, also nur leicht veraenderte
- Temperatur- und Lichtwerte
- * komplett unsinnige Temperaturen unter -273.13 Grad Celsius
- oder ueber 600 Grad Celsius
- * Abhoeren von fremden Daten
- * Hier nicht so dramatisch, es geht ja nur um Temperatur-
- und Lichtwerte
- * ... aber fuer andere Nachrichten, zum Beispiel Zutritts-
- codes fuer Tueren, wesentlich schlimmer
- u23 - Funksicherheit - moegliche Attacken
- =========================================
- * beide Attacken basieren darauf
- * dass nur eine ID ueber den Kanal, auf dem gesendet und
- empfangen wird entscheidet, und...
- * ... dass die Daten nicht verschluesselt werden
- * zusaetzlich haengt der zweite Teil der ersten Attacke davon
- ab, ob und wie die empfangenen Daten ueberprueft werden
- u23 - Funksicherheit - Node IDs
- ====================================================
- const uint64_t master_id = 0xF0F0F0F0D2;_
- Wir haben beim letzten Mal Node IDs verteilt, die sich nur im
- letzten Byte unterscheiden.
- Das ermoeglicht uns relativ einfach durch reines Ausprobieren
- an gueltige IDs zu kommen.
- u23 - Funksicherheit - Node IDs
- ====================================================
- uint64_t id = 0xF0F0F0F000LL;_
- for (; id < 0xF0F0F0F100LL; id++) {
- unsigned long l = millis(), t = 0;
- radio.stopListening();
- radio.openReadingPipe(1, id);
- radio.startListening();
- while (!radio.available() && t == 0)
- if (millis() - l > 200)
- t = 1;
- if (t == 1)
- continue; /* auf diesem Kanal wurde nichts empfangen */
- else {
- Serial.print("ID gefunden: 0x");
- Serial.print(id, HEX);
- Serial.println();
- }
- }
- u23 - Funksicherheit - Node IDs
- ====================================================
- * Die IDs, die so aufgespuert wurden, sind Kanaele, auf denen
- Daten von Sensoren zu Basisstationen uebertragen werden...
- * ... und nichts hindert uns daran, einfach einen Kanal fuer
- eine eigene Sendung zu "kapern" :)
- * Da wir gegen das Abhoeren eines Kanals an sich nicht viel
- tun koennen, muessen wir das Ausnutzen der ID so schwer wie
- moeglich machen
- u23 - Funksicherheit - Sicherheitsmassnahmen
- ============================================
- Sicherheitsmassnahmen haengen von den Zielen, die verfolgt
- werden, ab:
- * Schutz vor Fehlinformationen
- * Plausibilitaetspruefungen
- * Pruefsummen und Signaturen
- * Abhoersicherheit
- * Verschluesselung
- TODO: kanalwechsel
- u23 - Funksicherheit - Schutz vor Fehlinformationen
- ===================================================
- Es gibt mehrere Arten von Fehlinformationen
- * Auffaellige Fehlinformationen
- * Temperaturen unter dem absoluten Nullpunkt
- * oder Temperaturen bei denen die Leiterplatte schon laengst
- verbrannt waere
- * ... und subtile
- * zum Beispiel Temperaturen unter 0 Grad melden,
- obwohl die Temperatur 5 oder 6 Grad ist
- Ausserdem koennen Fehlinformationen nicht nur Absichtlich
- sondern auch durch Fehler an der Hardware oder Probleme bei der
- Signaluebertragung erzeugt werden.
- u23 - Funksicherheit - Plausibilitaetspruefungen
- ================================================
- * Grosse Spruenge in der Temperatur sind sehr unwahrscheinlich
- * einfach den vorherigen Wert speichern und mit der neuen
- Temperatur vergleichen, wenn der Unterschied zu gross ist,
- verwerfen
- * funktioniert leider nicht bei Licht
- * Ansonsten koennen auch statische Ueberpruefungen verwendet
- werden:
- * Temperaturen koennen nicht unter -273,13 Grad Celsius sein
- * bei ungefaehr 300 Grad faengt das Loetzinn auf den
- Leiterplatten an zu schmelzen
- * Bei Tageslichtsensoren:
- * grosse Helligkeit mitten in der Nacht ist verdaechtig
- * ... die Ueberpruefung erfordert allerdings, dass wir die
- aktuelle Uhrzeit kennen
- u23 - Funksicherheit - Pruefsummen
- ==================================
- * Durch Pruefsummen koennen manche Aenderungen erkannt werden.
- * Die Summen werden einfach ans Ende der gesendeten Daten
- angehaengt und beim Empfang ueberprueft.
- * Beispiele fuer Pruefsummen:
- * Die Summe der Werte in einem Datensatz, also:
- summe = floor(licht + temperatur)
- * Eine XOR-Verknuepfung der Daten
- u23 - Funksicherheit - Pruefsummen - XOR
- ========================================
- * XOR bedeutet "Exklusiv Oder" oder "Entweder ... oder ..."
- * Die Wahrheitstabelle dafuer ist
- a │ b │ a ^ b
- ───┼───┼───────
- 0 │ 0 │ 0
- 0 │ 1 │ 1
- 1 │ 0 │ 1
- 1 │ 1 │ 0
- * Und so kann damit in C eine Pruefsumme gebildet werden:
- char sum = 0x00;
- char *msg = &nachricht;
- for (int i = 0; i < sizeof(struct u23_nachricht); i++) {
- sum ^= msg[i];
- }
- u23 - Funksicherheit - Signaturen
- =================================
- * Signaturen werden verwendet, um Daten zu "unterschreiben"
- * Dafuer werden zwei Dinge benoetigt:
- * eine Pruefsumme der Daten die signiert werden sollen
- * ein geheimer Schluessel
- * Um die Sicherheit der Signatur zu erhoehen, koennen mehrere
- feste Schluessel im Wechsel verwendet werden
- * ... oder die Schluessel werden mit einem Pseudo-RNG erzeugt:
- int seed = 0xDEADBEEF;
- unsigned char key[16];
- randomSeed(seed);
- for (int x = 0; x < sizeof(key); x++)
- key[x] = (unsigned char) random(0, 256);
- u23 - Funksicherheit - Signaturen - Ablauf
- ==========================================
- 1) Pruefsumme der Daten bilden
- 2) Pruefsumme mit dem geheimen Schluessel verschluesseln, zum
- Beispiel durch XOR
- 3) Senden der Daten mit der verschluesselten Signatur statt
- der Pruefsumme
- 4) Empfang der Daten, Entschluesseln der Pruefsumme, Pruefen
- ob die entschluesselte Pruefsumme zu den Daten passt
- 5) Wenn ja, sind die Daten von der richtigen Gegenstelle
- gesendet worden und korrekt
- 6) Wenn nicht, dann sind die Daten entweder von einer falschen
- Gegenstelle gesendet worden oder beim Transfer gestoert
- worden
- u23 - Funksicherheit - Abhoersicherheit
- =======================================
- u23 - Funksicherheit - Verschluesselung
- =======================================
- * Wie Pruefsumme + XOR, allerdings ausgedehnt auf die ganze nachricht
- * mehrere keys
- * PRNG
- * (evtl public + private key?)
Add Comment
Please, Sign In to add comment