Im Kryptographiemodul von Linux wird die Unterstützung entfernt. zero-copy aus der Schnittstelle AF_ALG für Algorithmentypen SKCIPHER und AEAD. Die Änderung befindet sich bereits im cryptodev-Baum und wird zur Zusammenführung eingereicht. Linux 7.2, das im Juni geöffnet werden soll. Anlass sind wachsende Bedenken hinsichtlich der Sicherheit von zero-copy-Mechanismen im Kernel, insbesondere nach den jüngsten Schwachstellen im kryptographischen Code von Linux.
AF_ALG sind Benutzeroberfläche zum kryptographischen API des Linux-Kernels. Darüber können Programme auf die Implementierungen von Verschlüsselung, Hashes und AEAD-Algorithmen im Kernel wie auf Sockets zugreifen. Die Linux-Dokumentation beschreibt separat den zero-copy-Modus für AF_ALG über splice() und vmsplice(), wobei der Kernel versucht, überflüssiges Kopieren von Daten in den Kernel-Speicher zu vermeiden.
Das Problem ist, dass dieser Leistungsgewinn im Fall von AF_ALG nicht so wichtig war, während die Risiken zu groß sind. Der Autor der Änderung, der Entwickler des kryptographischen Moduls von Linux, Eric Biggers von Google, wies darauf hin, dass zero-copy es dem Benutzerspeicher ermöglicht, kryptographische Operationen direkt über die Seiten des Page Cache von Dateien, wie zum Beispiel die Binärdatei su, durchzuführen, und gleichzeitig Bedingungen für TOCTOU-Schwachstellen schafft, bei denen der Speicher gleichzeitig mit der Operation daran geändert werden kann.
Mit anderen Worten, ein Mechanismus, der im Netzwerk- oder Dateieingangs-/ausgabe nützlich ist, erscheint bei AF_ALG zu gefährlich als Optimierung. AF_ALG wird laut dem Entwickler hauptsächlich beibehalten, um die Abwärtskompatibilität mit einer kleinen Anzahl von Programmen, wie z. B. iwd, zu gewährleisten, die noch nicht auf kryptografische Implementierungen im Benutzerspeicher umgestellt wurden. Ursprünglich wurde AF_ALG auch für den Zugriff auf Hardware-Krypto-Beschleuniger entwickelt, hat sich jedoch in der Praxis als nicht besonders effiziente Schnittstelle für diese Aufgabe erwiesen.
Es ist wichtig zu beachten, dass splice() oder sendfile() für AF_ALG nicht vollständig entfernt werden. Die Änderung wird als „weicher Bruch“ der Kompatibilität beschrieben: Die Datenübertragung in AF_ALG-Anfragen über splice() und sendfile() wird weiterhin funktionieren, aber der Kernel erstellt jetzt eine interne stabilisierte Kopie der Daten vor der kryptographischen Operation. In einigen Fällen könnte die Leistung sinken, jedoch bleibt die Benutzer-API formal intakt.
Es wird besonders betont, dass zero-copy vorerst aus skcipher und aead entfernt wird.. Unterstützung für den Typ hash wird separat betrachtet.
Der Kontext der Änderung ist unangenehm. Ende April wurde eine Schwachstelle entdeckt Kopierfehler (CVE-2026-31431) in algif_aead, also genau im benutzerseitigen Krypto-Interface AF_ALG. Forscher haben gezeigt, dass die Kombination von AF_ALG, splice() und den Besonderheiten der AEAD-Verarbeitung es einem nicht privilegierten Benutzer ermöglichte, den Seiten-Cache zu beschädigen, einschließlich Seiten, die entsprechenden setuid-Binärdateien entsprachen, und um Privilegien bis zum Root zu erlangen.
Das Auftreten Kopierfehler stand im Zusammenhang mit der Optimierung von 2017, die AEAD-Operationen auf die Verarbeitung „in situ“ umstellte; beim Übertragen von Dateien über splice() in AF_ALG arbeitete der Kernel nicht mit einer Kopie, sondern mit Verweisen auf Seiten des Seiten-Caches. Infolgedessen konnten Teile der Daten, die nur als Eingabewerte galten, in die schreibbare Scatterlist gelangen.
Die Entfernung von Zero-Copy aus AF_ALG ist keine punktuelle Behebung nur einer Schwachstelle. Vielmehr ist es der Versuch, eine ganze Klasse riskanter Szenarien aus dem wenig genutzten UAPI zu entfernen, wo der Gewinn aus der Optimierung den Aufwand und die potenziellen Konsequenzen nicht rechtfertigt. Für normale Benutzer wird die Änderung wahrscheinlich unbemerkt bleiben; für seltene Programme, die AF_ALG aktiv über splice() oder sendfile() verwenden, kann es zu Leistungseinbußen aufgrund zusätzlicher Kopiervorgänge kommen.
Quelle: linux.org.ru
