Skip to content

Samsung NPU double free (CVE-2022-22265)

Samsung'un NPU vision-buffer driver'ındaki (/dev/vertex10) format buffer'ının double free'i; unprivileged bir app'ten erişilebilir ve local privilege escalation için in-the-wild exploit edildi.

Mechanism

Note

Samsung'un Neural Processing Unit'i bir vision device node'u olan /dev/vertex10'u expose eder; arkasında drivers/vision/vision-core/vision-buffer.c vardır. Bir queue, vb_format_list format tutan bir vb_queue struct'ı ile tanımlanır ve bunun formats array'i heap'te allocate edilir.

Bozulan invariant şu: formats buffer'ı bir error path üzerinde free edildikten sonra, global vb_queue içindeki pointer temizlenmez. Daha sonraki bir teardown aynı pointer'ı tekrar free eder — içeriğini ve timing'ini attacker'ın kontrol ettiği bir kernel heap object'inin double free'i.

İki free, aynı dangling pointer üzerinde işlem yapan iki farklı ioctl'den gelir:

  1. First freeVS4L_VERTEXIOC_S_FORMAT, vb_queue_s_format()'i çağırır. Format invalid olduğunda (__vb_find_format() colorspace'i match edemediğinde), error path kfree(q->format.formats) yapar ama q->format.formats'ı free edilmiş block'u gösterir halde bırakır; bu block persistent vb_queue tarafından referans edilmeye devam eder.
  2. Second freeVS4L_VERTEXIOC_STREAM_OFF, vb_queue_stop()'u çalıştırır ve q->format.formats'ı tekrar free eder.

Walkthrough

// 1) open the NPU vision node
int fd = open("/dev/vertex10", O_RDWR);

// 2) trigger the first free: submit an S_FORMAT with an invalid colorspace
//    so __vb_find_format() fails and the error path kfree()s q->format.formats
ioctl(fd, VS4L_VERTEXIOC_S_FORMAT, &bad_format_list /* invalid format */);
// q->format.formats is now dangling but still stored in the global vb_queue

// 3) reclaim the freed slot with a controlled object (see below)

// 4) trigger the second free via STREAM_OFF -> vb_queue_stop()
ioctl(fd, VS4L_VERTEXIOC_STREAM_OFF, &stream);

Double free, ardından page-table-controlled bir read/write'a çevrilir. Public analiz, free edilmiş slot'u spray'leyip PTE kontrolüne pivot eder:

- reclaim the freed object (~128-byte kmalloc) with controlled data
  (e.g. signalfd objects), and spray with pipe buffers to win reuse
- gain control of a Page Table Entry via the reclaimed object
- read/write physical memory; locate the kernel base
- disable SELinux and inject into init (libbase.so) by walking
  current->mm->pgd, flushing the TLB to make PTE edits take effect

Warning

Reachability zamanla değişti. İlk in-the-wild örnekler görüldüğünde (2021 başı), bir untrusted_app /dev/vertex10'u SELinux engellemeden açabiliyordu; Samsung SELinux policy'sini 2021 ortalarında sıkılaştırdı. Memory bug'ının kendisi ise NPU'nun Galaxy S10 (Exynos 9820) ile çıktığı andan beri var.

Detection

  • /dev/vertex10'a beklenmeyen untrusted_app erişimi.
  • Aynı fd üzerinde error dönen (invalid format) bir S_FORMAT ioctl'ini takip eden bir STREAM_OFF, tam olarak bu double-free pattern'idir.

Mitigation

  • Samsung'un fix'i, free edilmiş pointer'ı kfree'den sonra NULL yapar; böylece ikinci free bir no-op olur (global vb_queue'daki dangling reference'ı etkisiz hale getirir).
  • Samsung Mobile Security (SMR) Ocak 2022 maintenance release'inde patch'lendi; seçili Exynos chipset'lerde Android P(9.0)'dan S(12.0)'a kadar etkiler.
  • CISA'nın Known Exploited Vulnerabilities catalog'unda listelenir (in-the-wild exploit edildi).

References