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.