把四十種演算法塞進一支 fuzzer,十小時挖出 FFmpeg 除以零
code.ffmpeg.org · 2026-08-27
FFmpeg 官方 issue tracker 在 2026 年 8 月 27 日新增 #24290:VPK 解封裝器有一個除以零錯誤,由開發者 Darío Clavijo 用自製 fuzzer daedalus/fuzzer 在 10.7 小時、495,211 次執行後,從 13,188 筆語料裡挖出來。這支工具在 Hacker News 上被戲稱是「vibecoded」的產物——功能多到像是一次坐下來把能想到的招式全部寫進去。
除以零怎麼發生的
問題出在 libavformat/vpk.c 第 89 行的 vpk_read_packet():程式直接拿 par->ch_layout.nb_channels 當除數,卻沒檢查它是否為零。只要偽造一個聲道數欄位為零的 VPK 檔頭,呼叫 avformat_open_input() 加 av_read_frame() 就會觸發 SIGFPE。重現檔案只需要 21 bytes:magic bytes 20 4b 50 56,加上 0x0e–0x11 位置歸零的聲道欄位。維護者 Jun Zhao 指出這其實與 2024 年 11 月郵件群組討論過的問題重複,截至回報當下仍未修補。
那支「什麼都要」的 fuzzer
daedalus/fuzzer 是一支 Python 寫成、C 做插樁殼層的覆蓋率導向 fuzzer。它的賣點不是速度,而是招式數量:40 多種變異運算子涵蓋 PNG、JPEG、BMP、MP4、H.264/265、Protobuf、ZIP 甚至 x86/ARM 組語,還有自動調整長度欄位的 FrameShift、用 Berlekamp–Massey 演算法反推未知線性校驗碼的功能。排程端更誇張,同時擺了 Elo 排名、Thompson sampling bandit、粒子群最佳化、演化賽局論、Gaussian Process UCB、Katz 中心性排程等 40 多種策略,外加互資訊導引、Rényi 熵加權、遷移熵與 Shapley value 歸因。README 甚至自承是「原始吞吐量最慢」的 fuzzer,拿發現新邊界的能力換掉了速度。
- 執行方式:AFL 風格共享記憶體 bitmap + forkserver(宣稱加速 2.77 倍)
- 覆蓋率取得:ptrace 邊緣覆蓋、原地執行(每秒 2k–34k 次)
- 目標涵蓋:除了 FFmpeg VPK,也記錄了 fgrep 正規表示式的失敗案例
原始來源:daedalus/fuzzer
84 天,把 N64《雪板小子》整隻反編譯回可編譯的 C
blog.chrislewis.au · 2026-08-26
開發者 Chris Lewis 在部落格貼出《Decompiling a Nintendo 64 game in 84 days》,記錄他把 N64 遊戲《Snowboard Kids》的全部 2,145 個函式,逐一還原成能編譯回「與原始 ROM 位元組完全相同」機器碼的 C 原始碼。整個專案在 84 天內達成 100% match,這款遊戲原本用 SGI 的 IDO 5.3 編譯器打包,續作《Snowboard Kids 2》用的則是 GCC 2.7.2。
比對是怎麼做的
- 先用 N64Sym 找出程式裡的函式庫函式,縮小要手工還原的範圍
- agent 依參考實作嘗試寫出對應 C 碼,再交給 decomp-permuter 暴力搜尋能重現同樣暫存器配置的寫法
- 用 m2c 把 MIPS 組語反編譯成初稿 C 碼
- 靠 N64 Decomp Workbench 的 pass-replay 功能逐一除錯不吻合的組譯輸出
- 透過 Nigel 這套 agent 協作框架,把工作拆到四個 git worktree 平行進行,並跨 worktree 搜尋相似函式
最大的變數其實是編譯器本身。IDO 的多輪最佳化會不可預期地打亂暫存器分配,而且開源文件遠不如 GCC 齊全,團隊只能把摸索心得整理進 DECOMPILATION_LEARNINGS.md,形容這比較像一門手藝而非科學,連迴圈展開的預設行為都會產生意料外的樣式。
拿幾個模型來對照
文章也附帶記錄了幾家 AI 模型執行還原任務的表現:GPT-5.5/5.6、Claude 4.5/Fable、GLM 5.2 都上場比過,最後是 Codex 表現最好。這個對照放在整個 84 天流程裡,更像是順手記下哪個 agent 撞牆撞得比較少,而不是正式評測。
原始來源:Chris Lewis 的部落格
分析 4.7 萬篇 GitHub PR 說明,揪出 Claude 的口頭禪「load-bearing」
louisabraham.github.io · 2026-08-27
Louis Abraham 做了一個互動網頁《The load-bearing vocabulary of Claude》,把 GitHub 搜尋 API 裡新開 PR 的說明文字分群,追蹤「像 Claude 語氣」的寫法怎麼在一年多內從幾乎不存在,變成佔了近半數。資料每天用種子固定的隨機五分鐘視窗取樣,連續蒐集了 602 天,存成一個個不可變的 data/days/YYYY-MM-DD.jsonl。
清資料與分群怎麼做
整個語料庫累積 5,024,747 次詞出現,扣掉自動化機器人帳號(約佔 13%)後,留下 6,846 個通過門檻的詞——至少出現 45 次、來自 25 篇不同說明與 20 個不同帳號。唯一破例是 em dash,即使不是字母也照樣列入統計,近期每萬字出現 132.4 次,遠高於一開始的 0.2 次。分群用的是Bregman hard clustering(以 KL 散度做 k=8 的 K-means),greedy k-means++ 初始化、跑 Lloyd's algorithm 到收斂,取 8 次重跑裡代價最低的一組,整套流程完全沒放時間變數。
「降臨」的那一群
其中一群寫法的占比,從 2025 年初不到 1%,漲到 2026 年年中逼近 45% 的新開 PR。這一群最具代表性的詞是 load-bearing,在 92 個不同帳號裡出現 93 次,相對其他群組的出現頻率高出 123 倍;同一份清單裡還有 quietly、latent、genuine、seam 這幾個詞。
文章特別澄清delve 從來不是 Claude 的用詞,那其實是 ChatGPT 的偏好。作者也老實承認 K=8 與最低詞頻 45 這兩個參數,是「看著答案回頭調出來的」。