CVE-2022-20235: PowerVR GPU driver arbitrary write to Information Page¶
PowerVR kernel driver'ı, yalnızca driver'ın yazması gereken dahili bir "Information Page" tutar; DDK 1.18 öncesinde bir user-space program ona keyfi data yazabiliyor ve driver'ın güvendiği state'i bozabiliyordu.
Mechanism¶
User-writable hale gelen driver-private bir page
PowerVR DDK, Information Page dediği küçük bir kernel structure tutar — driver'ın cache subsystem'inin, hem driver'ın CPU tarafının hem de diğer bileşenlerin başvurduğu control/metadata'yı tutmak için kullandığı paylaşımlı bir page. Security model bu page'i driver-owned olarak ele alır: güvenilir kernel kodu tarafından doldurulur ve güncellenir, ve onu okuyan her şey değerlerin iyi biçimli ve driver tarafından yazılmış olduğunu varsayar.
Invariant, bir memory region üzerindeki trust boundary: Information Page performans için map'lenir/paylaşılır, ama write'ların GPU driver'ının özel ayrıcalığı olması gerekir. Page'in içeriğine sonradan göre davranan herhangi bir consumer — örneğin bir copy'yi boyutlamak, bir table'ı index'lemek veya bir cache descriptor'ı yorumlamak için — bir attacker'ın o byte'ları asla forge edemediğine güvenir.
CVE-2022-20235 bu boundary'nin başarısızlığıdır. DDK 1.18 öncesinde Information Page üzerindeki mapping/permission'lar, bir unprivileged user-space program'ın ona keyfi data yazmasına izin veriyordu. Attacker byte'ları, driver'ın yetkili kabul ettiği bir page'de bir kez oturunca, o byte'ları okuyup güvenen sıradaki kernel kodu attacker-controlled değerler üzerinde çalışır. Bozulan field'ın nasıl tüketildiğine bağlı olarak bu, bir out-of-bounds write'tan (CWE-787 / CWE-119) daha geniş memory corruption'a kadar uzanır — advisory etkiyi, base CVSS vector'da hiç confidentiality veya availability etkisi olmadan Integrity: High olarak sınıflandırır.
Kavramsal ders, user tarafında yazılabilir ama kernel tarafında güvenilen paylaşımlı kernel/user page'lerinin tekrar eden tehlikesi. Bir metadata page, ona ulaşabilen en zayıf writer kadar güvenilirdir; onu user-writable yapmak, downstream'deki her "bunu driver yazdı" varsayımını sessizce "bunu bir attacker yazmış olabilir"e indirir. Bu, CVE-2022-20122'deki use-after-free'nin write-primitive kuzeni ve ikisi de aynı PowerVR DDK hardening dalgasının parçası.
Walkthrough¶
Zafiyetli yüzey, PowerVR device node'u üzerinden app'lere açılan Information Page'in mapping'i. Mantıksal saldırı kısa:
Kavramsal exploitation akışı (gösterim amaçlı)
/* 1. Open the PowerVR GPU device reachable by an unprivileged app. */
int fd = open("/dev/pvr_sync", O_RDWR);
/* 2. Obtain the user-side mapping of the driver's Information Page.
* Pre-1.18 this mapping is writable from user space. */
void *info_page = mmap(NULL, PAGE_SIZE,
PROT_READ | PROT_WRITE, /* <-- W should not be here */
MAP_SHARED, fd, INFO_PAGE_OFFSET);
/* 3. Overwrite a field the kernel driver later reads and trusts
* (e.g. a cache descriptor / size / index used by the cache subsystem). */
((uint64_t *)info_page)[TARGET_INDEX] = attacker_value;
/* 4. Trigger the driver code path that consumes the corrupted field.
* The driver acts on attacker bytes -> memory corruption. */
trigger_cache_path(fd);
Yük taşıyan, source ile doğrulanmış gerçekler: (a) page, cache subsystem tarafından kullanılan driver'ın Information Page'i, (b) driver-write-only olması gerekiyor ve (c) DDK 1.18 öncesinde user space ona keyfi data yazabiliyordu. Tam field layout'u vendor-internal.
Patched (DDK >= 1.18) bir cihazda beklenen davranış: Information Page user space'e read-only map'lenir (veya başka şekilde korunur), böylece 2/3. adım ya write'ta fault verir ya da page basitçe user-writable değildir — driver'ın güvendiği metadata artık forge edilemez.
Triage için advisory metadata:
CVE: CVE-2022-20235
Component: Imagination Technologies PowerVR-GPU (Android)
Affected: PowerVR DDK before 1.18
Severity: CVSS 3.1 5.5 (Local / PR:L / Integrity:High)
Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N
CWE: CWE-119 / CWE-787 (OOB write)
Patched: DDK 1.18 ; Android Security Bulletin 2023-01-01
Detection¶
- Driver/patch level. PowerVR DDK'nın 1.18 veya sonrası olduğunu ve cihazın 2023-01-01 (veya sonrası) Android security patch level'ını taşıdığını doğrula.
- Mapping permission'ları. Patched bir driver'da Information Page mapping'i user space'ten yazılabilir değildir; map'ledikten sonra page protection'ları üzerinde hızlı bir kontrol patch'lenmemiş bir driver'ı ortaya çıkarabilir.
Mitigation¶
- PowerVR DDK 1.18+'a güncelle / Ocak 2023 Android security update'ini uygula.
- Fix, Information Page'e user-space write erişimini kaldırır, böylece cache subsystem'inin güvendiği metadata unprivileged bir process'ten forge edilemez.
- Genel hardening prensibi: kernel'in sonradan güvendiği herhangi bir kernel/user paylaşımlı page ya user space'e read-only map'lenmeli ya da her consumer data'yı güvenilmeyen input olarak yeniden doğrulamalı.