Forum: Mikrocontroller und Digitale Elektronik Codemanipulation an AVR erkennen


von Matt B. (mattb)


Lesenswert?

Hallo,

folgendes Gedankenspiel:

Ein System besteht aus einem Master und mehreren Slaves. Der Master 
erfragt sich zyklisch Daten von den Slaves (z.B. per 
Bluetooth-UART-Adapter).

Bei den Slaves besteht grundsätzlich die Möglichkeit, dass durch 
Unbefugte eine modifizierte oder eine andere Software aufgespielt wird 
und dem Master dadurch gefälschte Daten gesendet werden.

Eine Änderung der Slave-Hardware, um Eingriffe zu verhindern, ist nicht 
möglich.


Grundsätzlich ist davon auszugehen, dass die Daten zwischen Master und 
Slave verschlüsselt übertragen werden.

Die Frage ist nun, welche Methoden/Verfahren es gibt, die es dem Master 
ermöglichen, dass der Client (Software-seitig) modifiziert wurde.


Folgende Ideen gab es bereits:

1) Slave sendet zusätzlich zu den Daten einen MD5-Hash, der aus den 
Daten selbst und einem ihm eindeutig zugewiesenen Key berechnet wird

2) Im Prinzip wie die erste Idee, allerdings kann anstelle eines 
einzelnen Keys eine Art TAN-Liste für jeden Slave hinterlegt werden. 
Entsprechend müssen ausreichend viele TANs hinterlegt sein, oder die 
Möglichkeit bestehen neue TANs vom Server an den Client zu senden.


Bin in dem Thema aber nicht wirklich fit und bin mal gespannt, welche 
Methoden/Verfahren es gibt.

von foo (Gast)


Lesenswert?

Das ist ja auch eine Frage welche kriminelle Energie dahintersteckt und 
welche Hardwaremöglichkeiten.
Wenn z.B. ein PC als Slave angeschlossen oder eingeschleift wird, kann 
der dem Master alles Gewünschte vorgaukeln, falls jemand das Programm 
analysiert hat.

Wenn aber die Hardware des Slave unveränderlich ist, UND wenn dessen 
Software den Speicher fast vollständig belegt, könnte der Slave dem 
Master einfach diverse Bröckchen seines Programmspeichers zu Überprüfung 
schicken.
Master fragt z.B. "was steht an Stelle 07feh" und der Slave braucht nur 
nachzuschauen und sagt z.B. "3ch".
Auf diese Weise kann der Master das Programm des Slave nach und nach 
vollständig überprüfen, oder Checksummen bestimmter Programmteile 
errechnen, ohne dass diese im Speicher des Slave erscheinen.

von Sebastian V. (sebi_s)


Lesenswert?

Matt B. schrieb:
> 1) Slave sendet zusätzlich zu den Daten einen MD5-Hash, der aus den
> Daten selbst und einem ihm eindeutig zugewiesenen Key berechnet wird

Nennt sich HMAC und sollte ausreichen, sofern du dafür sorgst, dass der 
Key auf den Slaves geheim bleibt. Also Lock Bits setzen, wobei das auch 
nicht jeden abhält aber schonmal recht viele. Die "TAN Liste" hat keinen 
wirklichen Vorteil und braucht mehr Speicher. Wenn jemand einen geheimen 
Key auslesen kann, dann kann er das auch für mehrere.

von Schreiber (Gast)


Lesenswert?

Sebastian V. O. schrieb:
> sofern du dafür sorgst, dass der
> Key auf den Slaves geheim bleibt. Also Lock Bits setzen...

...die Lockbits kann man einfach zurücksetzen. Hierzu muss man das 
Gehäuse öffnen und die Lockbits mit UV-Licht beleuchten.

Sebastian V. O. schrieb:
> wobei das auch
> nicht jeden abhält aber schonmal recht viele...

...wenn die Daten so wichtig sind, dass man eine Softwaremanipulation 
verhindern muss, dann wird man auch mit einem Zurücksetzen der Lockbits 
rechnen müssen.

von Ulrich H. (lurchi)


Lesenswert?

Die Abfrage des Slave Codes als eine Art "Geheimnis" für den Slave ist 
eine gute Idee. Solange der Slave nicht mehr Speicher hat, ist da kein 
Platz für zusätzlichen Code, oder ein Abbild des Originals. Den nicht 
genutzten Teil muss man halt noch irgendwie nicht trivial auffüllen.

Die Abfrage muss auch nicht offensichtlich sein, und kann z.B. 
"Verschlüsselt" (z.B. Checksumme/Hash über Teil des Codes ab ... + 
zusätzlichen Salt) sein, so dass es für einen Angreifer nicht so leicht 
ist an den original Code des µC zu kommen um einen falschen Slave mit 
mehr Speicher nachzubauen.

von Sebastian V. (sebi_s)


Lesenswert?

Schreiber schrieb:
> ...die Lockbits kann man einfach zurücksetzen. Hierzu muss man das
> Gehäuse öffnen und die Lockbits mit UV-Licht beleuchten.

Und das Equipment dazu hat jeder Bastler im Keller? Und ob man jetzt 
einen Key in den Slaves oder den Code selbst nimmt ist doch ziemlich 
egal wenn der Angreifer den Code auslesen kann. Dann kommt einfach der 
nächst größere µc rein, um die Codeabfrage zu überlisten, und den Rest 
kann man dann mit eigenem Zeugs vollpacken.

von Christian B. (casandro)


Lesenswert?

Matt B. schrieb:
> Die Frage ist nun, welche Methoden/Verfahren es gibt, die es dem Master
> ermöglichen, dass der Client (Software-seitig) modifiziert wurde.

Das geht prinzipiell nicht, zumindest nicht mit normalen 
Mikrocontrollern.

> Folgende Ideen gab es bereits:
>
> 1) Slave sendet zusätzlich zu den Daten einen MD5-Hash, der aus den
> Daten selbst und einem ihm eindeutig zugewiesenen Key berechnet wird

Ja, den Key kann man aus einem normalen Mikrocontroller auslesen. 
"Deckel ab", Flash und EEprom mit schwarzer Farbe abdecken, mit UV-Licht 
die "Code Protection Fuses" rücksetzen und ganz normal auslesen.
Wenn Du den Schlüssel hast kannst Du beliebige Daten fälschen.

> 2) Im Prinzip wie die erste Idee, allerdings kann anstelle eines
> einzelnen Keys eine Art TAN-Liste für jeden Slave hinterlegt werden.
> Entsprechend müssen ausreichend viele TANs hinterlegt sein, oder die
> Möglichkeit bestehen neue TANs vom Server an den Client zu senden.

Gleiches Problem. Man kann die TAN auslesen wie oben.

Du kannst die Verbindung mit so was schützen, aber Du kannst keinen 
Angreifer der Zugriff auf die Hardware hat davon abhalten den Schlüssel 
auszulesen... zumindest nicht mit billiger Standardhardware...

Was es gibt ist Folgendes: Du speicherst die Schlüssel im RAM. Du baust 
in Deine Schaltung einen Teil ein, der wenn ein Draht unterbrochen ist, 
die Versorgungsspannung für den Mikrocontroller schnell kurzschließt 
(unterbrechen reicht nicht, da bleibt die Spannung für viele Minuten 
noch hoch genug um den Speicherinhalt zu erhalten). Den isolierten aber 
dünnen Draht wickelst Du dann um Deine Schaltung in mehreren Lagen. Das 
ganze kommt dann in ein undurchsichtiges Gießharz.
Gleichzeitig baust Du noch einen Temperatursensor ein, der bei 
Unterschreitung einer Minimaltemperatur die Schlüssel löscht.

Mit dem kommst Du in einem Bereich in dem es ein Angreifer mit 
Sportsgeist schwierig hat.
So was schaut dann so aus:
http://www.puff65537.com/Home/4758-tear-down

von Christian B. (casandro)


Lesenswert?

Sebastian V. O. schrieb:
> Schreiber schrieb:
>> ...die Lockbits kann man einfach zurücksetzen. Hierzu muss man das
>> Gehäuse öffnen und die Lockbits mit UV-Licht beleuchten.
>
> Und das Equipment dazu hat jeder Bastler im Keller?

Nein nicht jeder, aber das meiste bekommt man im Baumarkt.

So macht man solche Chips auf:
http://media.ccc.de/browse/congress/2014/31c3_-_6084_-_en_-_saal_6_-_201412281130_-_uncaging_microchips_-_peter_laackmann_-_marcus_janke.html#video

Die Lockbits kann man mit jeder UV-Lampe beleuchten, zur Not sogar mit 
Sonnenlicht. Vorher sollte man jedoch Flash und EEPROM abdecken, das 
geht mit schwarzer UV-undurchlässiger Farbe und einer ruhigen Hand. 
Microcontroller sind nicht so unglaublich winzig.

von Schreiber (Gast)


Lesenswert?

Sebastian V. O. schrieb:
>> ...die Lockbits kann man einfach zurücksetzen. Hierzu muss man das
>> Gehäuse öffnen und die Lockbits mit UV-Licht beleuchten.
>
> Und das Equipment dazu hat jeder Bastler im Keller?

fast jeder und wenn nicht gibts alles erforderliche Zubehör preiswert 
bei ebay und in der Apotheke.

Im wesentlichen brauchts dazu:
ein paar Pipetten, Spritzflasche, feinen Pinsel, Zahnstocher, 
Glasschälchen und eine UV-Lampe

An Verbrauchsmaterial brauchts zusätzlich:
Nagellack, rauchende Salpetersäure und Aceton

mit einigen µCs zum Üben und einem billigen Mikroskop kommt man recht 
einfach ans Ziel. Handschuhe und Schutzbrille sind noch ein sinnvolles 
Zusatzzubehör.

Ulrich H. schrieb:
> so dass es für einen Angreifer nicht so leicht
> ist an den original Code des µC zu kommen

was soll daran schwierig sein? µC auslesen und disasemblieren, fertig

von Sebastian V. (sebi_s)


Lesenswert?

Es kommt natürlich immer darauf an was man schützen will und vor wem. 
Die Variante mit Key und Lockbits ist schonmal deutlich besser als gar 
kein Schutz und sehr einfach zu implementieren. Rein aus Interesse würde 
mich ja mal interssieren ob hier schonmal jemand höchstpersönlich die 
Lockbits eines µcs mit privater Ausrüstung zurück gesetzt hat. Mit genug 
Aufwand kann man jede Sicherung überwinden. Auch noch so tolle 
Sensoren/Detektionsmechanismen lassen sich überwinden.

von dfgh (Gast)


Lesenswert?

Mal eine ganz andere Idee zum Thema:

Der Master macht über ISP ein Verify, dh. liest den gesamten Code. Im 
Zweifelsfall kann so der Master dabei sogar noch Firmwareupdates an alle 
Slaves verteilen.

Ist natürlich die Frage, ob dafür genug Zeit bzw. Speicher im Master zur 
Verfügung steht.


Der Nachteil ist natürlich, dass du dein Programm für jeden sichtbar 
über die ISP-Pins schickst...

von Andreas H. (ahz)


Lesenswert?

Matt B. schrieb:
> Bei den Slaves besteht grundsätzlich die Möglichkeit, dass durch
> Unbefugte eine modifizierte oder eine andere Software aufgespielt wird
> und dem Master dadurch gefälschte Daten gesendet werden.
>
> Eine Änderung der Slave-Hardware, um Eingriffe zu verhindern, ist nicht
> möglich.
>

Wenn Du sagst "modifiziert", dann gehe ich mal davon aus, das der Code 
auf dem Slave Oscar bekannt ist.

Diese Situation habe ich mal vor Jahren "Naked Eve" getauft, weil Oscar 
ALLE Informationen EINES Teilnehmers (Eve) kennt. Meines Wissens nach 
ist dann weder Verschlüsselung noch Signing sicher möglich.

>
> Die Frage ist nun, welche Methoden/Verfahren es gibt, die es dem Master
> ermöglichen, dass der Client (Software-seitig) modifiziert wurde.

Wenn Du die Software auf dem Slave vorgeben kannst und der Slave nicht 
gerade ein ATTiny sein muss, dann kannst Du folgendes Verfahren 
probieren:

Dein Slave hat kein Program, das Daten sendet. Nur einen Bootloader.

Beim PowerUp erhält der Slave sein Programm vom Master, legt es im RAM 
ab und führt es dann aus.
Das runtergeladene Progamm enthält (u.a.) eine Verschlüsselungsroutine, 
der Key dazu ist auch im (runtergeladenen) Program.

Um jetzt die Datenübertragung zu starten schickt der Master eine 
Initialisierungsanfrage mit einer Zufallszahl (challenge). Das 
runtergeladene Program antwortet mit einer verschlüsselten (!) Zahl, die 
aus der Zufallszahl und seiner eigenen Codechecksumme berechnet wird.
Der Master prüft diese Antwort und "vertraut" dem Slave, wenn die 
Antwort OK ist.

Der Trick:
Der KEY, die VERSCHLÜSSELUNGSROUTINE und die POSITION von Key & 
Verschlüsselungsroutine im Code werdend bei jedem Download des Programms 
neu generiert, ist also Oscar nicht bekannt.
Es ist nicht wirklich schwer, aus N+1 vorgefertigten 
Verschlüsselungsroutinen (.obj)  randommäßig eine auszusuchen und diese 
an eine andere Stelle im Code zu "linken" (ok, es ist auch nicht 
trivial, aber machbar).

Oscar kann keine Hardwareanalyse machen (nur Bootloader im Slave).
MITM oder Sniffing bringen nur Informationen über die aktuelle Session 
(who cares, Du wolltest nur Manipulation verhindern).
Cloning klappt auch nicht, da sich der Code bei jeder Session ändert und 
sein Hash am Anfang der Session geprüft wird.

Auf "kleineren" Prozessoren kann man auch ein "Macroprogramm" 
übertragen, das bestimmte, im FLASH gepeicherte, Subroutinen in einer 
(dann jeweils anderen) Reihenfolge ausführt (Die Subs sollten dann 
natürlich nicht kommutativ sein ;-).

Dann kommt man auch mit relativ wenig RAM aus.

Hth
Andreas

von Bernd K. (prof7bit)


Lesenswert?

Mich würde mal interessieren was das für Geräte sind und worin die 
Motivation liegen würde sie zu manipulieren. Tintenpatronen vielleicht 
zufällig?

von Ulrich H. (lurchi)


Lesenswert?

Auch wenn die Lock Bits und ähnliches nicht perfekt sind, sollte man sie 
auch nutzen. Je nach µC sind die auch nicht so einfach zu knacken.
Wenn der Speicher im µC gelesen werden kann, ist die Verschlüsselung bei 
der Übertragung hinfällig, aber vorher sollte man natürlich vermeiden 
den Code bei der Übertragung Preis zu geben.

Gegen einen µC mit mehr Speicher kann man sich einige Zeit schützen, 
indem man den größten verfügbaren Typ aus der Serie nutzt. Ein längeres 
Programm macht auch die Analyse schwerer.

Nur ein Bootloader (mit Verschlüsselung) auf dem µC und den eigentlichen 
Code zu übertragen ist auch keine so schlechte Idee, braucht aber einen 
µC der dies erlaubt, und wenn möglich den Bootloader vor dem Zugriff aus 
dem normalen Code schützt.

von Max D. (max_d)


Lesenswert?

Also die AVRs kann man meines Wissens NICHT mit UV entsperren sondern 
nur sperren. Die Lockbits werden beim löschen aufgeladen und beim 
sperren entladen (deswegen sind die auch "gefühlt" invertiert).

von Andreas H. (ahz)


Lesenswert?

Ulrich H. schrieb:
> wenn möglich den Bootloader vor dem Zugriff aus
> dem normalen Code schützt.

Warum ?

Eigentlich sollte der Loader ja nicht sinnvoll manipulierbar sein, weil:

Andreas H. schrieb:
> Das
> runtergeladene Program antwortet mit einer verschlüsselten (!) Zahl, die
> aus der Zufallszahl und seiner eigenen Codechecksumme berechnet wird.

Habe ich da in der Eile eine Lücke übersehen ?

Grüße
Andreas

von Andreas H. (ahz)


Lesenswert?

P.S:

Ulrich H. schrieb:
> Nur ein Bootloader (mit Verschlüsselung) auf dem µC

Bei meiner Idee oben wäre eine Verschlüsselung im Bootloader nicht 
notwendig (waste of FLASH).

Lass Oscar doch sniffen. Das Problem ist ja nicht geheimhaltung, sondern 
Datenmanipulation ;-)

Grüße
Andreas

von Stefan F. (Gast)


Lesenswert?

Der Ansatz, irgendwelche Keys, Prüfsummen, TAN Nummern etc zu verwenden 
ist sinnlos.

Beispiel Prüfsumme vom Programmspeicher: Ein modifiziertes Programm kann 
einfach die erwartete Prüfsumme senden, anstatt eine von seinem Programm 
zu berechnen.

Programme können so modifiziert werden, dass die was anderes machen und 
dennoch die gültigen Keys und TAN Nummern verwenden.

Außerdem kann der ganze Mikrocontroller des Slave durch einen anderen 
ersetzt werden, der möglicherweise viel mehr Speicher hat. Bestes 
Beispiel sind die gefälschten Codekarten für Premiere Decoder (aus den 
90ern).

Selbst Spielkonsolen wurde schon durch modifizierte Firmware ergänzt, 
ohne dass die Server der Hersteller das bemerken konnten.

von Bernd K. (prof7bit)


Lesenswert?

Max D. schrieb:
> Also die AVRs kann man meines Wissens NICHT mit UV entsperren sondern
> nur sperren. Die Lockbits werden beim löschen aufgeladen und beim
> sperren entladen (deswegen sind die auch "gefühlt" invertiert).

Nein. Der gelöschte und entladene Zustand ist "1", genauso wie beim 
EEPROM und beim Flash auch. UV-Licht entlädt es und setzt es damit auf 
1.

Irgendwo in Russland gibts ne Firma (hab leider die www Adresse nicht 
zur Hand, aber sollte zu finden sein) die lesen Dir jeden AVR aus, Preis 
~$600 pro Stück.

Also der Widerstand eines AVR-Lockbits beträgt somit ungefähr 600 
Dollar.

: Bearbeitet durch User
von Max D. (max_d)


Lesenswert?

Dann würde mir noch die MSP430er Familie einfallen.
Die haben eine irreversible Jtag-Fuse...

Ansonsten wie die POS-Terminals machen: Die ganze chose im RAM halten 
und beim kleinsten Verdacht die Versorgung kurzschließen.

Die Frage ist hier nur: Wer soll ferngehalten werden ?
Ist das Problem ein Skript-kiddie das Telefonkarten wieder auflädt ?
Oder ist dein Token der Zugang zu einer Schweizer Bank ?

Der Aufwand muss immer im Verhältniss zum Ergebniss stehen. Bei dem 
erwähnten Kiddie reichen sicher die Lockbits.

Echte 100% Sicherheit kann es nicht geben. Man kann aber den Zugang sehr 
schwer machen. Nicht umsonst werden "echte" (Hardware) Tresore danach 
klassifiziert wie lange ein Profi zum knacken braucht...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.