Mit KI entwickeln

PyTorch-Rückwärtsdurchlauf kann turing-vollständige Malware in verlustfreien Termen verstecken

Forscher demonstrieren, wie Unregelmäßigkeiten bei der Gleitkomma-Präzision beliebige Codeausführung innerhalb des Gradientenabstiegs von PyTorch ermöglichen, selbst wenn die Verlustmetriken null anzeigen.

Illustration eines Glaswürfels mit Schaltkreisschichten, die versteckten Code in ML-Modellen darstellen.
Für diesen Artikel generierte Illustration

Automatisch aus dem englischen Original übersetzt.

Eine neue technische Demonstration zeigt, dass die automatische Differenzierungs-Engine von PyTorch dazu gebracht werden kann, während des Rückwärtsdurchlaufs (Backward Pass) im Training beliebige Programme auszuführen. Durch Ausnutzung von Diskrepanzen zwischen der IEEE 754-Gleitkomma-Arithmetik und symbolischer Kalkülrechnung kann ein Angreifer eine Turing-vollständige Zustandsmaschine, wie etwa Conways Spiel des Lebens, in Modellgewichte einbetten. Dies geschieht, während der gemeldete Verlust exakt null bleibt, wodurch Standardüberwachungs- und Validierungsprüfungen umgangen werden.

Was passiert ist

Die Entdeckung stammt aus einer Untersuchung von Anomalien bei der Gleitkomma-Präzision innerhalb von PyTorch. Der Forscher wollte zunächst feststellen, ob eine Verlustfunktion mathematisch null ergeben kann, während sie dennoch Gewichtsaktualisierungen während des Gradientenabstiegs auslöst. Das Ergebnis bestätigte, dass es möglich ist, einen Verlustterm zu konstruieren, der in jeder Trainingsmetrik als 0.0 protokolliert wird, den Optimierer jedoch zwingt, komplexe Logik auszuführen. Diese Erkenntnis verwandelt eine theoretische numerische Kuriosität in einen praktikablen Angriffsvektor für die Lieferkette von Machine-Learning-Pipelines.

Das Bedrohungsmodell betrifft einen Entwickler, der ein Open-Source-Modell wie Meta’s Llama-3-8B feinabstimmt (Fine-Tuning). Standard-Sicherheitspraktiken könnten beinhalten, SHA-256-Hashes von Checkpoint-Dateien zu überprüfen und Python-Code auf offensichtliche Hintertüren oder Systemaufrufe zu prüfen. Wenn die Trainingskurven normal erscheinen und Hilfsverluste flach bleiben, wird die Umgebung typischerweise als sicher eingestuft. Ein Angreifer kann jedoch ein bösartiges Paket verteilen, wie etwa einen gefälschten Regularizer namens UltraLoss, der sich nahtlos in die Trainingsschleife integriert, ohne das Basis-Checkpoint, die Architektur oder den Datensatz zu modifizieren.

Wenn dieser bösartige Verlustterm zur Gesamtverlustfunktion hinzugefügt wird, meldet er bei jeder Iteration 0.000000. Trotz dieses harmlosen Erscheinungsbilds führt der Aufruf von total_loss.backward() und optimizer.step() ein beliebiges Programm aus, das in den Modellgewichten eingebettet ist. Der Angreifer muss die Parameter nicht direkt während des Vorwärtsdurchlaufs (Forward Pass) mutieren, was den Exploit schwer durch standardmäßige statische Analyse oder Runtime-Logging von Verlustwerten erkennbar macht.

Wie es funktioniert

Der Exploit beruht auf der Uneinigkeit zwischen hardwareseitiger Gleitkomma-Kürzung und den symbolischen Differenzierungsregeln, die von Autodiff-Engines verwendet werden. Der Kernmechanismus nutzt eine Funktion h(u) = (2^30 + u) - 2^30. In der IEEE 754 float32-Arithmetik führt das Hinzufügen eines kleinen Wertes u (wobei |u| < 64) zu 2^30 aufgrund der Rundung wieder zu 2^30, da die Lücke zwischen darstellbaren Zahlen in dieser Größenordnung 128 beträgt. Das Subtrahieren von 2^30 ergibt dann 0.0. Die Autograd-Engine von PyTorch behandelt Addition und Subtraktion jedoch symbolisch und zeichnet ihre Ableitungen als 1 auf. Während der Vorwärtsdurchlauf also null sieht, berechnet der Rückwärtsdurchlauf einen Gradienten von 1.

Um eine stealth-fähige Gradientenquelle zu erstellen, kombiniert der Forscher dieses Verhalten mit der Produktregel. Ein skalarer Verlust wird konstruiert, indem zwei Terme multipliziert werden: einer, der im Rückwärtsdurchlauf zum Zielgradientenvektor evaluiert, aber im Vorwärtsdurchlauf null ist, und ein anderer, der in beiden Durchläufen null ist, aber eine Ableitung von 1 hat. Spezifisch ist der Verlust definiert als die Summe von (v - h(v)) * h(theta), wobei v die gewünschte Gewichtsaktualisierung ist. Im Vorwärtsdurchlauf ist h(theta) null, daher ist der Verlust null. Im Rückwärtsdurchlauf erlaubt die Produktregel, dass der gespeicherte Vorwärtswert des ersten Terms als Gradient durchfließt, wodurch theta.grad effektiv auf den gewünschten Aktualisierungsvektor gesetzt wird.

Dieser Mechanismus ermöglicht es dem Optimierer, Gewichte mit dem nächsten Zustand einer zellulären Automaten, wie Conways Spiel des Lebens, bei jedem Trainingsschritt zu überschreiben. Der Forscher demonstrierte dies, indem er die Regeln des Spiels des Lebens in 1.024 Gewichte eines CNN verdrahtete, das auf MNIST trainiert wurde. Über 2.345 Schritte blieb der Hilfsverlust null, das Modell erreichte normale Genauigkeit und die Gewichte simulierten den Automaten erfolgreich fehlerfrei. Die Aktualisierungswerte sind kleine Ganzzahlen (-1, 0, 1), die in float32 keinen Rundungsfehler haben, was präzise Zustandsübergänge gewährleistet.

Wichtige Details

  • Der Exploit funktioniert, weil IEEE 754 float32 kleine Additionen zu großen Konstanten auf null rundet, während PyTorch Autograd Ableitungen symbolisch als 1 berechnet.
  • Eine Verlustfunktion kann so konstruiert werden, dass sie im Vorwärtsdurchlauf 0.0 ergibt, aber im Rückwärtsdurchlauf einen beliebigen Gradientenvektor erzeugt.
  • Der Angriff ermöglicht es Turing-vollständigen Programmen, wie Conways Spiel des Lebens, während standardmäßiger SGD-Aktualisierungen innerhalb der Modellgewichte zu laufen.
  • Bösartige Logik kann durch "Math-Washing" versteckt werden, bei dem Regeln zellulärer Automaten als geometrische Regularizer oder Faltungsschichten getarnt werden.
  • Angreifer können kritische Konstanten, wie Kernel-Gewichte für die Zustandsmaschine, in externen Konfigurationsdateien speichern, die angeblich Ergebnisse der Hyperparameter-Anpassung sind.
  • Kompilierte CUDA-Erweiterungen können die Logik weiter verschleiern, indem sie bösartigen Binärcode in dünnen Python-Klassen verpacken, die wie standardmäßige spektrale Strafen aussehen.

Warum es wichtig ist

Diese Schwachstelle stellt die Annahme infrage, dass die Überwachung von Verlustmetriken und die Überprüfung von Datei-Hashes ausreichen, um ML-Trainingspipelines abzusichern. Entwickler vertrauen oft Open-Source-Bibliotheken und Regularisierungstechniken, ohne deren mathematische Implementierung tiefgehend zu inspizieren. Wenn eine Bibliothek behauptet, Konvergenz oder Stabilität zu verbessern, werden ihre internen Operationen selten auf nicht-standardmäßiges Gradientenverhalten hin auditiert. Dieser Exploit zeigt, dass sich eine Bibliothek hinsichtlich ihrer Ausgabe-Metriken perfekt normal verhalten kann, während sie den Trainingsprozess selbst kapert.

Für Teams, die Produkte mit KI entwickeln, hebt dies einen blinden Fleck in der Lieferketten-Sicherheit hervor. Traditionelle Softwaresicherheit konzentriert sich auf Codeausführung und Datenzugriff, aber ML-Training führt einen neuen Vektor ein, bei dem der Optimierungsalgorithmus selbst zum Payload-Träger wird. Da der bösartige Code innerhalb der legitimen mathematischen Operationen des Gradientenabstiegs läuft, umgeht er viele konventionelle Schutzmaßnahmen. Dies erfordert eine Änderung darin, wie Ingenieure Drittanbieter-ML-Komponenten validieren, weg von oberflächlichen Metriken hin zur Verifizierung der mathematischen Integrität von Verlustfunktionen.

Was Sie tun können

  • Prüfen Sie alle benutzerdefinierten Verlustfunktionen oder Regularizer auf Operationen, die große Konstanten und kleine Offsets beinhalten, was auf eine Ausnutzung der Gleitkomma-Arithmetik hindeuten kann.
  • Stellen Sie sicher, dass die während der Backpropagation berechneten Gradienten mit den erwarteten mathematischen Ableitungen übereinstimmen, anstatt sich ausschließlich auf Verlustwerte zu verlassen.
  • Inspectieren Sie Konfigurationsdateien und externe Assets, die von ML-Bibliotheken geladen werden, auf unerklärliche Konstanten oder Kernel, die nicht mit dokumentierten Zwecken übereinstimmen.
  • Bevorzugen Sie die Verwendung kompilierter Erweiterungen aus vertrauenswürdigen Quellen und überprüfen Sie deren Integrität, da sie bösartige Logik effektiver verstecken können als Python-Code.
  • Implementieren Sie Runtime-Checks, die Gewichtsaktualisierungen gegen erwartete Normen vergleichen und ungewöhnliche Muster markieren, selbst wenn der Verlust stabil bleibt.
  • Behandeln Sie Drittanbieter-ML-Pakete mit derselben Sorgfalt wie systemweite Abhängigkeiten, in dem Bewusstsein, dass sie während des Trainings beliebige Logik ausführen können.
  • #pytorch
  • #security
  • #machine learning
  • #floating point
  • #supply chain

Tools aus dem Bytechap-Shop

$89

DocBento

Selbst gehostetes Dokumentenmanagement, das jeden Scan liest und mit Seitenzitaten antwortet.

Live-Demo

Weiterlesen

Alle Artikel