-
momentaner Stand
-
moegliche Attacken
- Node IDs
-
Sicherheitsmassnahmen
- Pruefsummen und Signaturen
- Verschluesselung
-
Challenges
-
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
-
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
-
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
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.
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(); } }
-
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
Sicherheitsmassnahmen haengen von den Zielen, die verfolgt werden, ab:
-
Schutz vor Fehlinformationen
- Plausibilitaetspruefungen
- Pruefsummen und Signaturen
-
Abhoersicherheit
- Verschluesselung
TODO: kanalwechsel
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.
-
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
-
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
-
-
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]; }
-
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);
-
Pruefsumme der Daten bilden
-
Pruefsumme mit dem geheimen Schluessel verschluesseln, zum Beispiel durch XOR
-
Senden der Daten mit der verschluesselten Signatur statt der Pruefsumme
-
Empfang der Daten, Entschluesseln der Pruefsumme, Pruefen ob die entschluesselte Pruefsumme zu den Daten passt
-
Wenn ja, sind die Daten von der richtigen Gegenstelle gesendet worden und korrekt
-
Wenn nicht, dann sind die Daten entweder von einer falschen Gegenstelle gesendet worden oder beim Transfer gestoert worden
- Wie Pruefsumme + XOR, allerdings ausgedehnt auf die ganze nachricht
- mehrere keys
- PRNG
- (evtl public + private key?)