Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CVE-2024-2961@HackerSir StudyGroup

Avatar for YJK YJK
July 23, 2025
2

CVE-2024-2961@HackerSir StudyGroup

Avatar for YJK

YJK

July 23, 2025
Tweet

Transcript

  1. Table of contents 01 03 02 Vulnerability php filter php

    heap 04 php filter to CVE-2024-2961 05 Reproduce
  2. Vulnerability • iconv() • iconv_t iconv_open(const char *tocode, const char

    *fromcode); • 理論上 buffer 皆由呼叫方決定,如果有狀況要出 error message
  3. Vulnerability • But?? • ISO-2022-CN-EXT,用於轉換中文,擴充 ISO-2022-CN • 應該要確認 output buffer

    是否足夠 • 只有確認一個部分 • source code • oob write • overflow 1~3 bytes
  4. Vulnerability • $*H [24 2A 48] • $+I [24 2B

    49] • $+J [24 2B 4A] • $+K [24 2B 4B] • $+L [24 2B 4C] • $+M [24 2B 4D] • 劄、䂚、峛、湿 會有狀況
  5. php protocol • file:// — Accessing local filesystem • ftp://

    — Accessing FTP(s) URLs • php:// — Accessing various I/O streams • zlib:// — Compression Streams • data:// — Data (RFC 2397) • glob:// — Find pathnames matching pattern • phar:// — PHP Archive • manual
  6. php filter • 有很多 filter,處理某些 stream 的資訊 • php://filter/convert.base64-encode/resource=/etc/passwd •

    string.upper:convert to uppercase • string.lower:convert to lowercase • string.rot13:ROT13 • convert.iconv.X.Y:converts charset from X to Y • ......
  7. convert.iconv.X.Y • iconv API 在 Linux 中會呼叫到 glibc 實現 •

    利用 php filter 搭配 convert.iconv.X.Y 來實現 RCE
  8. php heap • emalloc(n)、efree(ptr) • 各種 size(0x10、0x20、0x25…) • 分為 512

    pages 的 0x1000 bytes • 每個 page 大小都不相同 (ex: page11: 0x40、page12: 0x180…) • free 掉 chunk 後會被丟到 free list 的 singly linked list • 每個 size 都有自己的 free list
  9. allocate 流程 • 先看相對應 size 的 free list,有東西就拿他的 head •

    沒有就看有無未使用的空間,在空的空間拿一塊並放入相對應的 list • LIFO • 後 free 會先被拿,跟 GLIBC 的 tcache 類似,無空間限制 • _zend_mm_heap
  10. 特點 • 未分配的 chunk 都有 8 bytes 指向下一塊 free chunk

    的 Pointer • 可以 overflow 到下一個 chunk 的 pointer,藉此修改 free list
  11. 特點 • 未分配的 chunk 都有 8 bytes 指向下一塊 free chunk

    的 Pointer • 可以 overflow 到下一個 chunk 的 pointer,藉此修改 free list • 但 php 會在每次 request create 一個新的 heap,所以不好利用
  12. Bucket brigade • 從 stream 拿資料,存在 bucket,使用 doubly-linked list •

    如果串了各種 filter ▪ 一個 buckets 一個 buckets 處理,依照順序 • _php_stream_bucket
  13. 暫時總結 • zlib.inflate • dechunk ▪ 控 input buf 到

    0x100 • convert.iconv.L1.L1 ▪ trigger realloc • dechunk ▪ 控 input buf 到 16 • convert.iconv.L1.L1 ▪ trigger realloc (free prev)
  14. 暫時總結 • zlib.inflate • dechunk + convert.iconv.L1.L1 ▪ alloc 0x100*3

    • dechunk + convert.iconv.L1.L1 ▪ free 0x100*3 ▪ alloc 0x100*2 • dechunk + trigger bug • 任意寫
  15. RCE • 跟 zend_mm_heap 有關 • 寫 malloc、free、realloc • 目標:free->system、use_custom_heap->1

    • heap_base、system address? • 有回顯->讀 /proc/self/maps、libc.so • 沒回顯->想辦法讀 /proc/self/maps、libc.so • 要想辦法不要弄壞任何部分,不然可能只有一次機會
  16. RCE • zlib.inflate • dechunk + convert.iconv.L1.L1 • dechunk +

    convert.iconv.L1.L1 • dechunk + trigger bug • convert.quoted-printable-decode + convert.iconv.L1.L1
  17. Reference • Iconv, set the charset to RCE: Exploiting the

    glibc to hack the PHP engine • Analysis of CVE-2024–2961 Vulnerability • CVE-2024-2961 调试复现分析 • cnext-exploits • DEFCON 32 talk