Perl Imager 一次修兩洞:PNG 寫越界、EXIF 讀越界
oss-security mailing list · 2026-09-17
Perl 的影像處理模組 Imager 同時公開兩個獨立的記憶體越界問題:Imager::File::PNG 在展開 PNG 的 tRNS 透明度區塊時,會把解碼結果寫出配置好的橫列緩衝區之外;核心的 EXIF 解析函式則因為只驗證位移加長度的終點、沒驗證起點本身,讓讀取跑到 EXIF 區塊邊界外。兩者分別編號 CVE-2026-73639(寫入越界)與 CVE-2026-73638(讀取越界),由 Alexander Bluhm 與 Stig Palmquist 回報,於 2026 年 9 月 17 日一起公開在 oss-security 郵件論壇。任何用 Imager 直接讀取使用者上傳圖片的服務,這兩個洞都同時打得到。
漏洞機制
CVE-2026-73639 出在 read_direct8() 函式。當來源 PNG 帶有 tRNS 透明度色表時,底層的 libpng 會在 png_read_row() 呼叫時把透明度資訊展開成額外的 alpha 通道,但 Imager::File::PNG 配置橫列緩衝區時,用的仍是原始(未展開)的通道數。結果是 libpng 寫回的資料比緩衝區多出一個通道的寬度,直接把資料寫到配置範圍之後,造成堆積(heap)損毀。觸發方式很單純:呼叫 Imager->read() 解析一張帶 tRNS 的惡意 PNG 即可。
CVE-2026-73638 則在 tiff_load_ifd(),用於解析 EXIF 裡的 TIFF 式 IFD(Image File Directory)條目。這個函式會檢查「entry->offset + entry->size 是否落在 EXIF 區塊範圍內」,卻沒有單獨檢查 entry->offset 這個起點本身是否合法。問題出在整數表示法的演進反而留下新洞:1.033 版之前 offset 是一般整數,在二補數系統上,高位元被設的負值偏移量可以讓加總「繞回」區塊內、通過檢查;1.033 版把欄位改成 size_t 後,只有在 32 位元系統才會發生同樣的環繞(wrap);而 IFD 起始位移的檢查在 64 位元 Windows(unsigned long 仍是 32 位元)上也有相同毛病。最終效果是讀取跑到 EXIF 區塊外,可能洩漏鄰近記憶體內容或造成處理程序當掉。
受影響版本
| CVE | 元件 | 問題類型 | 受影響版本 | 修補版本 |
|---|---|---|---|---|
CVE-2026-73639 | Imager::File::PNG / Imager | 越界寫入(CWE-787) | Imager::File::PNG 至 1.003;Imager 至 1.034 | Imager::File::PNG 1.004;Imager 1.035 |
CVE-2026-73638 | Imager(EXIF 解析) | 越界讀取(CWE-125) | 0.45_02 至 1.034 | Imager 1.035(2026-08-19 發布) |
換句話說,凡是還沒升級到 Imager 1.035 的安裝,兩個洞都同時存在;只單獨更新 Imager::File::PNG 到 1.004、但核心 Imager 沒跟著升到 1.035,仍會留著 EXIF 讀取越界的問題。會受影響的角色很具體:任何用 Imager->read() 直接處理使用者上傳圖片的網站後端、縮圖產生服務、圖片浮水印或轉檔管線,只要輸入來源不受信任,就該立刻檢查自己釘住(pin)的版本號。
修補與緩解
兩個 GitHub Security Advisory 都已公開:CVE-2026-73639 對應 GHSA-jhx5-34j8-9g88,修補提交為 d973bd7e8843f084e8071caa24b89545c88b1e4b(PR #567),做法是依 libpng 是否會展開 tRNS 動態調整緩衝區大小;CVE-2026-73638 對應 GHSA-j47j-8w8p-3mmc(Issue #568),修法是在檢查終點之外,額外驗證 IFD 條目與區塊起始位移本身是否落在合法範圍。
緩解方式很直接:把 Imager 升級到 1.035、Imager::File::PNG 升級到 1.004。無法立即升級的環境,可以在服務前端先用獨立的圖片驗證工具剝除或重寫 EXIF 區塊、並拒絕帶 tRNS 的可疑 PNG,作為短期緩衝;但這只是繞過觸發條件,不是修補,長期仍要跟上版本。
原始來源:oss-security: CVE-2026-73639 Imager::File::PNG Buffer Overflow、oss-security: CVE-2026-73638 Imager EXIF Vulnerability