Execute-only Memory (XOM) für AArch64-Binärprogramme

<ph type="x-smartling-placeholder">

Ausführbare Codeabschnitte für AArch64-Systembinärdateien sind standardmäßig mit Execute-only (nicht lesbar) zur Vermeidung von Just-in-Time-Code zur Härtung wiederverwendete Angriffe. Code, der Daten und Code vermischt und gezielt Code sich diese Bereiche ansieht (ohne die Speichersegmente vorher als lesbar zu kennzeichnen) funktionieren nicht mehr. Apps mit einem SDK von 10 (API-Level 29 oder höher) betroffen sind, wenn in der App versucht wird, Codeabschnitte XOM-fähige Systembibliotheken im Arbeitsspeicher, den Bereich als lesbar markiert.

Um von dieser Abhilfe zu profitieren, wird sowohl Hardware- als auch Kernel-Unterstützung erforderlich. Ohne diese Unterstützung kann die Entschärfung möglicherweise nur teilweise erzwungen werden. Die <ph type="x-smartling-placeholder"></ph> Der allgemeine Kernel von Android 4.9 enthält die entsprechenden Patches zur Bereitstellung einer auf ARMv8.2-Geräten unterstützt.

Implementierung

AArch64-Binärdateien, die vom Compiler generiert werden, gehen davon aus, dass Code und Daten vermischt sind. Die Aktivierung dieser Funktion wirkt sich nicht negativ auf die Leistung von auf dem Gerät.

Bei Code, der auf seinem Pixel eine absichtliche Gedächtnis-Introspektion durchführen muss, ausführbaren Segmenten verwendet, wird empfohlen, mprotect auf der Code-Segmente, die überprüft werden müssen, um sie lesbar zu machen, die Lesbarkeit nach der Inspektion entfernt.
Diese Implementierung führt zu Lesevorgängen in Arbeitsspeichersegmente, die als Execute-only, um einen Segmentierungsfehler (SEGFAULT) zu verursachen. Dies kann durch einen Programmfehler, eine Sicherheitslücke, Daten gemischt mit Code (Literal-Pooling) oder bewusste Gedächtnis-Introspektion.

Gerätesupport und Vorteile

Geräte mit älterer Hardware oder älteren Kerneln (unter 4.9) ohne den Die erforderlichen Patches unterstützen diese Funktion möglicherweise nicht oder nutzen sie nicht vollständig. Geräte ohne Kernel-Unterstützung, erzwingt möglicherweise keine Nutzerzugriffe Kernel-Code, der explizit prüft, ob eine Seite lesbar ist, Erzwingen dieses Attributs, z. B. process_vm_readv().

Das Kernel-Flag CONFIG_ARM64_UAO muss im Kernel auf Stellen Sie sicher, dass der Kernel Nutzerlandseiten berücksichtigt, die als „Nur ausführen“ gekennzeichnet sind. Frühere ARMv8-Version oder ARMv8.2-Geräte mit deaktivierter Nutzerzugriffsüberschreibung (User Access Override, UOO) voll davon profitieren. Möglicherweise können Sie trotzdem nur Ausführungsseiten lesen, indem Sie Systemaufrufe.

Vorhandenen Code refaktorieren

Code, der aus AArch32 übertragen wurde, kann vermischte Daten und wodurch Probleme auftreten. In vielen Fällen ist die Behebung dieser Probleme so einfach, indem Sie die Konstanten in einen .data-Abschnitt in der Assembly-Datei verschieben.

Die handschriftliche Montage muss möglicherweise refaktoriert werden, damit sie lokal Konstanten.

Beispiele:

Vom Clang-Compiler generierte Binärdateien sollten keine Probleme mit Daten haben in Code vermischt werden. Wenn der von der GNU-Compiler-Sammlung (GCC) generierte Code ist enthalten (aus einer statischen Bibliothek), prüfen Sie die Ausgabebinärdatei, um dass die Konstanten nicht in Codeabschnitten zusammengefasst wurden.

Wenn eine Selbstprüfung des Codes für ausführbare Codeabschnitte erforderlich ist, rufen Sie zuerst mprotect auf, um den Code als lesbar zu markieren. Nach der Operation abgeschlossen wurde, rufen Sie mprotect noch einmal an, um sie als unlesbar zu markieren.

XOM aktivieren

Die Nur-Ausführung ist standardmäßig für alle 64-Bit-Binärdateien im Build aktiviert. System.

XOM deaktivieren

Sie können die Ausführung nur auf Modulebene, für eine gesamte Unterverzeichnisstruktur oder für einen gesamten Build.

XOM kann für einzelne Module deaktiviert werden, die nicht refaktoriert werden können oder deren Ausführbaren Code durch Festlegen von LOCAL_XOM und xom auf false setzen.

// Android.mk
LOCAL_XOM := false

// Android.bp
cc_binary { // or other module types
   ...
   xom: false,
}

Wenn der Ausführungsspeicher in einer statischen Bibliothek deaktiviert ist, wendet das Build-System für alle abhängigen Module dieser statischen Bibliothek. Sie können die indem Sie xom: true, verwenden.

Um den Ausführungsspeicher in einem bestimmten Unterverzeichnis (z. B. foo/bar/), übergeben Sie den Wert an XOM_EXCLUDE_PATHS.

make -j XOM_EXCLUDE_PATHS=foo/bar

Alternativ können Sie die PRODUCT_XOM_EXCLUDE_PATHS festlegen Variable in Ihrer Produktkonfiguration.

Sie können Binärdateien, die nur für die Ausführung vorgesehen sind, global deaktivieren, indem Sie ENABLE_XOM=false zum Befehl make.

make -j ENABLE_XOM=false

Zertifizierungsstufe

Für die Ausführung sind keine CTS- oder Verifizierungstests verfügbar. zu speichern. Sie können Binärdateien manuell mit readelf verifizieren. Dabei können Sie die Segment-Flags.