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:
- First free —
VS4L_VERTEXIOC_S_FORMAT,vb_queue_s_format()'i çağırır. Format invalid olduğunda (__vb_find_format()colorspace'i match edemediğinde), error pathkfree(q->format.formats)yapar amaq->format.formats'ı free edilmiş block'u gösterir halde bırakır; bu block persistentvb_queuetarafından referans edilmeye devam eder. - Second free —
VS4L_VERTEXIOC_STREAM_OFF,vb_queue_stop()'u çalıştırır veq->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 beklenmeyenuntrusted_apperişimi.- Aynı fd üzerinde error dönen (invalid format) bir
S_FORMATioctl'ini takip eden birSTREAM_OFF, tam olarak bu double-free pattern'idir.
Mitigation¶
- Samsung'un fix'i, free edilmiş pointer'ı
kfree'den sonraNULLyapar; böylece ikinci free bir no-op olur (globalvb_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).