跳至主要內容
>_ITDITD網站資安平台

資安事件與漏洞

Log4Shell(CVE-2021-44228)——讓全世界一夜之間為『不知道自己是否在用』的漏洞而戰慄的一天

2021 年 12 月,Java 的日誌輸出函式庫 Log4j 中發現了最高等級(CVSS 10.0)的遠端程式碼執行漏洞。其恐怖的本質在於『即使你沒有直接使用,也會經由另一個函式庫被捲入其中』的傳遞性相依。本文用圖解、時間軸,以及 SBOM、相依套件的機器化監控、迅速修補這些至今依然有效的教訓,配合圖與表為你梳理。

發布於 2026-06-07 更新於 2026-06-07 閱讀時間 2 分鐘

回顧過去的重大事件,不去重現攻擊,而是聚焦於『對當下你的維運真正有用的教訓』。

2021/12
被發現
10.0
CVSS(最嚴重級別)
傳遞性相依
恐怖的本質
多個
後續的跟進 CVE

發生了什麼——『被動的處理』成了攻擊通道

Log4j 是承擔日誌輸出這一極其常見處理的函式庫,在 Java 世界裡幾乎無處不在。問題在於,這個函式庫會把日誌所含字串中的特定寫法解釋為『參照外部進行解析』的功能,結果導致執行由外部指定的程式碼

也就是說,攻擊者只需在『會被記入日誌的位置』(使用者名稱、HTTP 標頭等)放入經過構造的字串,就有可能在伺服器端導致程式碼執行。日誌輸出這一『被動的處理』竟然成了攻擊通道,其衝擊是巨大的。

為什麼回答不出『我們沒事吧?』

許多應用程式沒有印象自己直接引入過 Log4j。是框架或 SDK 在內部使用了它——這正是傳遞性相依(transitive dependency)。相依套件的相依套件,再往下還有相依套件。如果手裡沒有自己的『物料清單』,連是否受影響都無從判斷。

你的應用程式(package.json 裡的一行)
└─▶
框架 / SDK(直接相依)
└─▶
日誌元件(相依套件的相依套件)
└─▶
Log4j ← 漏洞就在這裡(沒有直接引入的印象)
即便你引入的只有一個,它背後也藏著幾十個『相依套件的相依套件』。Log4j 就潛伏在那裡。

最可怕的是『無法掌握』

在『不知道是否在用』的狀態下,連處置的優先順序都無從排定。是否掌握自己的物料清單(SBOM),決定了那一夜的成敗。

時間軸

  1. 2021-12-09〜10

    漏洞被廣泛知曉,全世界一齊奔走確認『我們是否受影響』。
  2. 緊隨其後

    緊急修補與臨時緩解措施陸續展開。攻擊嘗試也急劇增多。
  3. 此後

    修補此前修復不足的後續 CVE 接連公布。『修過一次』並沒有就此結束。

至今依然有效的教訓

1

擁有 SBOM(物料清單)

把自己的應用程式在內部使用了什麼可視化出來。用 npm ls / 鎖定檔 / SBOM 產生工具掌握『實際在運行的相依套件』。只看『直接引入的東西』是不夠的。

2

用機器監控相依套件

CVE 公布的那一刻,自動判定是否受影響(Dependabot / osv-scanner)。能連同傳遞性相依一起檢查,正是機器監控的強項。靠人工巡查必然會有遺漏。

3

加快修補的維運

為了在緊急時刻能跑通『立刻升級、驗證、上線』,平時就要練好更新的『肌肉』。也請參閱 相依套件跟進的機制

4

追蹤後續 CVE

Log4Shell 之後,對修復的再修復出現了多次。不要在『修過一次』就收手,要一直追到後續報導。

接下來閱讀

FAQ

QLog4Shell『新』在哪裡、為何如此可怕?
A

它在全球範圍內讓人直面了傳遞性相依(transitive dependency)的恐怖:『即使你沒有印象自己直接引入過,它也在另一個函式庫內部被使用著,並且存在漏洞』。如果不掌握自己的 SBOM(物料清單),連是否受影響都無從判斷。

Q為什麼日誌輸出會成為攻擊通道?
A

因為 Log4j 把日誌字串中的特定寫法當作『參照外部進行解析』的功能來解釋。攻擊者只需在會被記入日誌的位置(使用者名稱、HTTP 標頭等)放入經過構造的字串即可,本應是被動的日誌輸出由此變成了執行通道。

Q怎樣才能不重蹈覆轍?
A

三點:①用機器監控相依套件(Dependabot/osv-scanner),自動偵測對應的 CVE;②產生 SBOM,把『自己在用什麼』可視化;③建立迅速修補的維運機制。追蹤後續 CVE(對修復的再修復)同樣重要。