Sicherere C-Arrays im Linux-Kernel
Zusammenfassung
Kees Cook beschreibt die Umstellung falscher flexibler C-Arrays auf eindeutige Strukturen mit überprüfbaren Grenzen. Echte flexible Array-Member verwenden leere Klammern am Strukturende.
Ideen
- Historische Null- und Ein-Element-Arrays simulieren dynamische Strukturenden mehrdeutig.
- Echte C99-Flexible-Arrays drücken die Entwicklerabsicht eindeutig aus.
-fstrict-flex-arraystrennt dynamische und tatsächlich feste Endfelder.- Compilerwarnungen erkennen dadurch Zugriffe außerhalb fester Arrays.
- Counted-by-Annotationen verbinden dynamische Arrays künftig mit ihrer Elementanzahl.
Einsichten
- Sicherheitswerkzeuge brauchen eindeutigen Quellcode, bevor sie Grenzen zuverlässig prüfen können.
- Legacy-Konventionen blockieren Compilerhärtung weit über ihren ursprünglichen Zweck hinaus.
- Typpräzision verwandelt Laufzeitangriffe teilweise in Buildfehler.
Fakten
- GCC und Clang unterstützen
-fstrict-flex-arrays. DECLARE_FLEX_ARRAY()kapselt flexible Arrays innerhalb von Unions.
Empfehlungen
- Ersetze Null- und Ein-Element-Platzhalter schrittweise durch echte Flexible Arrays.
- Aktiviere strikte Arraydiagnosen erst zusammen mit vollständiger Bereinigung der Altformen.
Referenzen
Links zur Originalquelle und zum Webarchiv öffnen einen neuen Tab.