觀點 · 資訊分享

Perl 爆出 CVSS 9.8 的正規表達式漏洞:只有 32 位元版受影響,但要記得檢查

CVE-2026-8376 是 Perl 編譯正規表達式時的堆積緩衝區溢位,NVD 給 9.8 分。關鍵條件是 32 位元的 perl,而且程式會編譯外部輸入的正規表達式。

發布
2026-05-26
篇幅
約 3 分鐘 · 1,287 字
結構
7 節 + 3 題常見問題
標籤
#Perl#CVE-2026-8376#緩衝區溢位#正規表達式
Perl 爆出 CVSS 9.8 的正規表達式漏洞:只有 32 位元版受影響,但要記得檢查

一句話看懂:Perl 在編譯含有「大量重複字串」的正規表達式時算錯記憶體大小,導致 32 位元版本寫出界,NVD 評為 9.8 分。

Perl 正規表達式堆積溢位 CVE-2026-8376資訊圖卡:重複字串的次數太大,記憶體算錯,32 位元 Perl 會寫出界

先用白話講:緩衝區溢位是什麼?

想像你要在一個小盒子裡放 100 顆彈珠,卻只準備了一個放得下 10 顆的盒子。多出來的彈珠會掉到桌上,壓到旁邊別人的東西。

緩衝區溢位就是這件事:程式先向記憶體要一塊空間,結果資料比空間大,多的部分就寫到別人的地盤。壞人可以利用這一點讓程式當機,甚至執行自己的指令。

發生什麼事

  • CVE 編號:CVE-2026-8376,2026 年 5 月 26 日公開
  • 問題出處:Perl 的 Perl_study_chunk(原始碼 regcomp_study.c)
  • 成因:有一種正規式寫法是「某個固定字串重複很多次」。Perl 在算「合併後要多少位元組」時,用的是字元數而不是位元組數;次數很大時乘法結果會溢位,配置的空間就變得太小,接下來複製資料就寫過頭
  • 觸發條件:程式在 32 位元的 Perl 上,編譯了攻擊者能控制的正規表達式

誰會受影響?

條件 風險
64 位元 Perl 公告只描述 32 位元建置會觸發
32 位元 Perl,正規式都是寫死的 攻擊者碰不到,風險低
32 位元 Perl,吃外部輸入的正規式 需要優先處理

受影響版本:5.40.5-RC1 以前、5.41.0 至 5.42.3-RC1 以前、5.43.0 至 5.43.11 以前。

給開發者的技術細節

  • NVD 的主要評分是 CVSS 3.1 的 9.8(向量:網路、低複雜度、免登入、免互動、機密與完整與可用性皆高);另一個來源給的是 7.3
  • 官方沒有說明是否已有實際攻擊,請不要把「可能被利用」寫成「已被利用」
  • 修補提交在 Perl 的 GitHub 專案內,NVD 頁面的參考連結可以找到
  • 臨時作法:不要把使用者輸入直接當正規表達式編譯;真的需要時,限制長度與重複次數,或改用 \Q...\E 把輸入當純文字

我的看法

接案時常遇到客戶的舊系統裡還有 Perl 腳本,像是老舊的表單處理、記錄檔分析。這類東西最麻煩的是沒人記得它跑在哪台機器、是幾位元。

這個漏洞的條件很具體,所以反而是好事:先查 32 位元,再查有沒有吃外部正規式,兩關都過才需要緊張。自架服務的人也一樣,最好趁這次把「我到底跑了哪些 Perl 工具」列一張清單,比單純看分數有用得多。

名詞小辭典

  • CVE:全球通用的漏洞編號,方便各家用同一個名字討論同一個漏洞。
  • CVSS:漏洞嚴重度評分,0 到 10 分,9 分以上稱為 Critical。
  • 正規表達式:用特殊符號描述文字規則的寫法,常用來搜尋與驗證文字。
  • 堆積(Heap):程式執行時動態向系統要來的記憶體區域。

資料來源

常見問題

我的 Perl 受影響嗎?
要同時符合兩件事:Perl 是 32 位元建置,而且你的程式會編譯來自使用者或外部的正規表達式。可以用 perl -V 查看建置資訊中的指標大小。
為什麼是 9.8 分卻只影響 32 位元?
CVSS 分數是從「最糟情況」估算:網路可達、不用登入、影響機密、完整與可用性。實際上要不要中,還要看你的環境條件,所以官方的分數看到「32 位元」這個前提就不能直接當作你一定會中。
要怎麼修?
升到包含修補的版本,也就是 5.40.5-RC1、5.42.3-RC1、5.43.11 之後的版本;發行版的套件請看各家的更新公告。
LINE