Skip to content

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ı.

References