PlÀne zur VerstÀrkung des W^X-Schutzmechanismus in OpenBSD

Theo De Raadt teilte mit seine PlĂ€ne zur VerstĂ€rkung des W^X (Write XOR Execute)-Schutzmechanismus. Der Kern des Mechanismus besteht darin, dass Speicherseiten eines Prozesses nicht gleichzeitig zum Schreiben und AusfĂŒhren zugĂ€nglich sein können. Somit kann Code nur ausgefĂŒhrt werden, nachdem das Schreiben verboten wurde, und das Schreiben auf eine Speicherseite ist nur nach dem Verbot der AusfĂŒhrung möglich. Der W^X-Mechanismus hilft, Anwendungen im Benutzerspeicher vor typischen Angriffen zu schĂŒtzen, die durch PufferĂŒberlĂ€ufe, einschließlich StackĂŒberlĂ€ufen, ausgefĂŒhrt werden, und er ist in OpenBSD aktiv. standardmĂ€ĂŸig.

Von Beginn der Arbeiten an W^X war klar, dass dies ein langer Weg sein wĂŒrde, da es eine erhebliche Anzahl von Anwendungen gibt, die JIT verwenden. JIT-Implementierungen lassen sich in drei Kategorien unterteilen:

  • Wechseln des Speichers zwischen W- und X-ZustĂ€nden, wobei die „Kosten“ von Systemaufrufen in Kauf genommen werden. mprotect.
  • Erstellen von Aliasen zwischen einem Paar von W- und X-Abbildungen desselben Speichers.
  • Die dreckigste Variante - die ein W|X-Speichermodell erfordert, das gleichzeitig Schreiben und AusfĂŒhren zulĂ€sst.

Derzeit gibt es deutlich weniger Programme, die die dritte Variante verwenden, und mehr, die die erste und zweite verwenden. Dennoch, da es notwendig war, auch Programme mit W|X JIT (hauptsĂ€chlich Chromium und Iridum) auszufĂŒhren, wurde eine Option zum EinhĂ€ngen des Dateisystems „wxallowed“ hinzugefĂŒgt, die es ermöglichte, Speicher gleichzeitig fĂŒr Schreiben und AusfĂŒhren zu nutzen, wenn die ausfĂŒhrbare ELF-Datei mit dem Marker „wxneeded“ gekennzeichnet ist, wĂ€hrend die Anwendungen selbst durch Mechanismen zusĂ€tzlich geschĂŒtzt wurden. pledge und unveil um die Liste der verwendeten Systemaufrufe und die Teile des Dateisystems, die fĂŒr die Anwendung verfĂŒgbar sind, entsprechend einzuschrĂ€nken.

Um das Ausnutzen von Schwachstellen in solchen Anwendungen weiter zu erschweren, wurde eine ErgĂ€nzung des Mechanismus vorgeschlagen MAP_STACK, die ĂŒberprĂŒft, ob der Systemaufruf aus einer beschreibbaren Speicherseite erfolgt. Wenn die Seite beschreibbar ist, wird der Prozess zwangsweise beendet. Somit kann ein Angreifer keine Systemaufrufe nutzen und wird gezwungen sein, die benötigten Gadgets in der JIT-Implementierung zu finden oder sogar die schwierige Arbeit der Auffindung von Stub-Systemaufrufen direkt innerhalb von zufĂ€llig verbundener libc.

Die Prozesse von Chrome/Iridium sind bereits durch pledge und unveil ausreichend geschĂŒtzt, aber das Verhindern der Nutzung eines systematischen Aufrufs wie write(2) hat eindeutig einige Vorteile, da es dem Angreifer zusĂ€tzliche Schwierigkeiten bereitet. Dennoch können auch Schwierigkeiten auftreten, wenn die JIT-Implementierung native Systemaufrufe aus W|X-Speicher verwendet. Es besteht jedoch Grund zur Hoffnung, dass es nicht dazu kommen wird, da sich die ABI mehrfach geĂ€ndert hat, aber niemand jemals von Problemen berichtet hat.

Die Änderungen sind bereits in den aktuellen Snapshot-Versionen des OpenBSD-Currents verfĂŒgbar, und alle Interessierten sind eingeladen, diese zu testen.

Besondere ErwĂ€hnung von Theo erhielt die verwandte Nachricht ĂŒber die EinfĂŒhrung des Modus in Chrome/Iridium JITless. In seinen Augen ist dies fĂŒr einige Anwendungsmodelle akzeptabel, wahrscheinlich jedoch nicht fĂŒr alle, da die Belastung der CPU in diesem Modus offensichtlich zunehmen wird. Zurzeit wird Chrome hauptsĂ€chlich funktionieren, wenn "wxallowed" fĂŒr /usr/local deaktiviert ist, obwohl Probleme mit einigen Erweiterungen (beispielsweise ghostery) wahrscheinlich sind. Wie dem auch sei, Theo hofft, dass der vollstĂ€ndige Betrieb im JITless-Modus bald in einen voll funktionsfĂ€higen Zustand gebracht wird.

Quelle: opennet.ru

60GB SSD 8Gb DDR4