it-swarm.com.de

Warum sollte memcmp nicht zum Vergleichen sicherheitskritischer Daten verwendet werden?

Von man 3 memcmp:

Verwenden Sie memcmp() nicht, um sicherheitskritische Daten wie kryptografische Geheimnisse zu vergleichen, da die erforderliche CPU-Zeit von der Anzahl der gleichen Bytes abhängt. Stattdessen ist eine Funktion erforderlich, die Vergleiche in konstanter Zeit durchführt.

Warum ist das so? Ich denke, wenn jemand Zugriff auf den Computer hat, der diese "sicherheitskritischen Daten" verarbeitet, sind diese Geheimnisse bereits gefährdet, da diese Person sie aus dem RAM extrahieren kann. Wenn diese Person keinen Zugriff auf den Computer hat, kann sie die CPU-Zeit ohnehin nicht genau messen.

37
gaazkam

Das Ausnutzen von Zeitinformationen ist ein möglicher Angriff auf Dinge wie Passwortauthentifizierungssysteme.

Konzeptionell vergleicht memcmp() zwei Sätze von Binärdaten byteweise (in Wirklichkeit können Prozessoren abhängig von den Optimierungen mehrere Bytes gleichzeitig vergleichen, es gelten jedoch die folgenden Prinzipien). Die Funktion beginnt am Anfang der Daten, vergleicht jedes Byte nacheinander und wird beendet, sobald ein Unterschied festgestellt wird. Wird kein Unterschied festgestellt, gibt die Funktion einen Code zurück, der angibt, dass die Daten übereinstimmen.

Da die Funktion zurückkehrt, sobald sie einen Unterschied feststellt, kann ein Angreifer mit einer ausreichend genauen Uhr geheime Informationen ableiten. Sie können Aufrufe an memcmp() mit unterschiedlichen Eingaben auslösen und durch Messen, welche Eingaben länger dauern, können sie ableiten, was ein gespeichertes Geheimnis sein könnte.

Beispiel:

Betrachten Sie ein klassisches Passwort-Hashing-System. Angenommen, Ihr Passwort wird als geheimer Hash gespeichert, z. B. Ek8fAMjPhBo. (Dieser Hash wurde mit dem Schema DES) generiert, das von der Linux-Funktion crypt() mit einem Salt von na und einem Kennwort von secret bereitgestellt wird. Beachten Sie, dass diese Funktion unsicher und Sie sollten es nicht in realen Systemen verwenden.)

In einem starken Passwortsystem wird Ihr Hash Ek8fAMjPhBo gespeichert, aber Ihr Passwort wird nicht gespeichert. Wenn Sie zur Authentifizierung aufgefordert werden, nimmt das System Ihr Kennwort, hasht es und vergleicht die beiden Hashes miteinander. Wenn die resultierenden Hashes übereinstimmen, erhalten Sie Zugriff auf das System. Wenn die Hashes nicht übereinstimmen, wird Ihr Kennwort abgelehnt. Auf diese Weise kann das System überprüfen, ob Sie Ihr Kennwort kennen oder nicht, ohne das Kennwort selbst zu speichern.

Wie ein Angreifer das Timing verwenden kann, um dieses System anzugreifen:

Um dieses System anzugreifen, muss ein Gegner wirklich nur herausfinden, welche Passwort-Hashes für den gespeicherten Hash gelten. Normalerweise wird der gespeicherte Hash geheim gehalten, aber der Gegner kann anhand von Zeitinformationen ableiten, was der gespeicherte Hash sein könnte. Sobald der Gegner den gespeicherten Hash ableitet, ist er anfällig für viel schnellere und offlineere Rainbow Table -Angriffe sowie für die Umgehung von Online-Sicherheitsmaßnahmen wie Limits für Kennwortwiederholungen.

Das obige Passwortsystem muss einen Kandidaten-Hash mit dem gespeicherten Hash vergleichen, um ordnungsgemäß zu funktionieren. Angenommen, es dauert 10 Nanosekunden, um jedes Byte des Kandidaten-Hash mit dem geheimen gespeicherten Hash zu vergleichen. Wenn keine Bytes übereinstimmen (ein Vergleich), dauert memcmp() ungefähr 10 ns. Wenn ein Byte übereinstimmt (zwei Vergleiche), dauert memcmp() ungefähr 20 ns. Ihr Angreifer generiert einige Kennwörter und führt sie durch das System. Dabei wird aufgezeichnet, wie lange jedes Kennwort dauert. Angenommen, die ersten paar Hash-Vergleiche dauern jeweils etwa 10 ns und kehren dann zurück, was darauf hinweist, dass keines der Bytes des Kandidaten-Hash mit dem gespeicherten Hash übereinstimmt. Nach einigen Versuchen dauert einer der Hash-Vergleiche 20 ns - was anzeigt, dass das erste Byte des Kandidaten-Hash mit dem gespeicherten Hash übereinstimmt. Im obigen Beispiel zeigt dies an, dass der Angreifer abgeleitet hat, dass das erste Byte des Hash Ek8fAMjPhBoE ist.

Hashes haben die Eigenschaft, dass Sie nicht vorhersagen können, welcher Hash welchem ​​Kennwort entspricht. Beispielsweise sagt dies dem Angreifer nicht , dass das Kennwort mit s beginnt. Der Angreifer kann jedoch eine große Tabelle mit vorberechneten Hashes (eine Rainbow-Tabelle ) haben, damit er nach anderen Kennwörtern suchen kann, die einen Hash für eine Zeichenfolge haben, die mit E beginnt. Nachdem sie genug Hashes ausprobiert haben, erhalten sie schließlich eine Eingabe, die bewirkt, dass memcmp() 30 ns benötigt, was darauf hinweist, dass die ersten zwei Bytes übereinstimmen, und sie haben abgeleitet, dass die ersten zwei Bytes des Hash Ek sind. Sie wiederholen diesen Vorgang immer wieder, bis sie den gesamten oder den größten Teil des Hash abgeleitet haben. Zu diesem Zeitpunkt kennen sie entweder das Passwort oder können es mit einem traditionellen Rainbow-Tischangriff brutal erzwingen.

Dies ist ein wenig hypothetisch, aber Sie können viele praktische Informationen über Timing-Angriffe an anderer Stelle im Internet finden, zum Beispiel:

https://research.kudelskisecurity.com/2013/12/13/timing-attacks-part-1/

47
David

Es geht nicht wirklich darum zu argumentieren, dass ein Seitenkanalangriff in jeder Anwendung, die Sie für Ihr System in Betracht ziehen, praktisch ist.

Ein besserer Punkt ist das

  1. Seitenkanalangriffe sind in der Regel in Situationen möglich , als die meisten Entwickler ohne weiteres denken können.

  2. In jeder Situation ist zuverlässig , sich selbst davon zu überzeugen, dass es nein Gelegenheit für Timing-Angriffe gibt, viel mehr Arbeit zur Entwicklungszeit als einfach eine sichere Vergleichsmethode als SOP zu verwenden. Mehr Arbeit bedeutet sowohl mehr Kosten als auch ein höheres Risiko, etwas falsch zu machen.

Einfach gesagt, es ist tief hängende Frucht. Die Richtlinie "Verwenden Sie niemals memcmp für sicherheitskritische Daten" ist der Richtlinie "Okay, memcmp zu verwenden, wenn dies sicher ist" für fast alle Parameter überlegen, die ich mir vorstellen kann.


Wenn Sie ausnahmsweise sind in einer Situation, in der Sie einen Bruchteil einer Mikrosekunde CPU-Zeit von jeder nicht übereinstimmenden Ein Vergleich (der normalerweise in erster Linie nicht üblich ist!) spart Ihnen genug Geld, sodass es sich lohnt, sich um eine ordnungsgemäße Sicherheitsanalyse zu bemühen. Dann verfügen Sie über zahlreiche Geschäftsdokumente, die diese Tatsache belegen.

(Und trotzdem, wenn Sie nur Comics für die Zeit lesen, die Sie für diese Analyse benötigen, während Sie Moore's Law die Arbeit für Sie erledigen lassen, sparen Sie wahrscheinlich genauso gut diese CPU-Mikrosekunden für Sie).

Es fällt in eine Kategorie der Seitenkanalangriffe (dieselben Anforderungen wie für RSA, die Ausführungszeit mit privatem Schlüssel sollte konstant sein). Es ist auch nicht unbedingt so, dass RAM kompromittiert ist, die Operationen können auf TEE (Trusted Execute Environment) ausgeführt werden.

9
VovCA