// 威脅簡報

nodejs-whisper 指令注入:特製的音訊檔名就能在伺服器上執行系統指令

CVSS
9.3 CRITICAL
CISA KEV
未列入
弱點類型
CWE-78

PlainCVE 團隊 · 發布 2026-10-15 · AI 輔助 · 媒體簡報 ↓

AI 審稿 2026-10-15(未經人工)指令測試:未提供漏洞重現:未進行驗證紀錄 ↓

nodejs-whisper 0.3.1 以前(含)把音訊檔路徑直接放進 shell 指令執行,特製的檔名就能執行系統指令;目前未確認有修補版本。

誰會中使用 npm 套件 nodejs-whisper 0.3.1 以前(含)版本,並把使用者能影響的檔名(例如保留上傳時的原始檔名)交給 nodewhisper() 轉錄的應用程式。
後果如果條件成立,攻擊者可以用 Node.js 程序的權限在伺服器上執行任意系統指令,而且依研究者說明,指令在轉錄開始前就會執行。
現在該做什麼目前沒有已確認的修補版本。不要把使用者可影響的檔名傳給 nodewhisper();上傳檔案改用伺服器自己產生的檔名儲存,並追蹤 PR #259 是否合併與發布。
受影響版本0.3.1 以前(含)的所有版本;研究者已在 0.3.0 實際確認
修好的版本未確認:目前資料中沒有任何已修補的發布版本
時間點
  • 首次公開 2026-06-23

藍隊應對手冊

確認、修補 / 緩解、應變、強化。版本符合受影響條件不等於已被入侵;檢查沒有結果也不等於安全,每一項都有能證明與不能證明的範圍。標記的步驟對應下方攻擊流程裡可以擋下攻擊的那一步。

DETECT確認我受影響嗎?有沒有入侵跡象?
  1. 01確認專案是否用到 nodejs-whisper 及其版本

    在自己專案的根目錄(有 package.json 的資料夾)的終端機執行;只讀取本機專案的相依樹,不會修改環境。0.3.1 以前(含)的版本都在受影響範圍內。直接與間接相依都要檢查,要看完整相依樹可以加 --all。

    唯讀查詢
    npm ls nodejs-whisper
  2. 02檢查檔名從哪裡來

    在自己專案的根目錄的終端機執行;只搜尋本機原始碼,不會修改任何檔案。找出所有呼叫 nodewhisper() 的地方,確認傳入的路徑是否含有使用者可影響的部分,例如上傳時的原始檔名。這是研究者指出最實際的曝險情境。

    唯讀查詢
    grep -rn "nodewhisper(" --include='*.js' --include='*.ts' --include='*.mjs' --include='*.cjs' --exclude-dir=node_modules .
MITIGATE修補 / 緩解先修補;還不能修補時先擋住
  1. 01上傳檔案改用伺服器產生的檔名

    目前沒有已確認的修補版本。讓傳給 nodewhisper() 的路徑完全由伺服器決定,就切斷了攻擊者控制檔名的途徑。這是 PlainCVE 依研究者描述的曝險條件整理的建議。

  2. 02追蹤 PR #259 是否合併與發布

    PR #259 提出不經 shell 執行 ffmpeg 的修法(該頁含攻擊程式,本站不連結),但現有資料看不出是否已合併或發布。下面的指令在任何裝有 npm 的終端機都能執行,不需要在專案目錄;它只向公開的 npm registry 查詢版本清單,不會修改環境。版本號本身看不出新版本是否包含這個修正,有新版本時要另外看它的發布說明或原始碼,確認包含修正再升級。

    唯讀查詢
    npm view nodejs-whisper versions
RESPOND應變發現入侵跡象時
  1. 01懷疑遭利用時,把主機當成已被入侵處理

    注入的指令以 Node.js 程序的權限執行,所以該程序能讀到的金鑰與憑證都應視為可能外洩並輪替。這是 PlainCVE 的建議;目前沒有任何來源回報實際遭利用。

HARDEN強化長期避免同類問題
  1. 01呼叫外部程式時不要經過 shell

    在自己的程式碼中也採用 PR #259 的做法:以參數陣列呼叫程式,讓檔名永遠只是資料。

  2. 02以最小權限執行轉錄服務

    獨立帳號或容器、不放不必要的機密,可以限制指令注入的後果(PlainCVE 建議)。

完整修復步驟與說明

目前沒有已確認的修補版本,我們查閱的資料中也未見維護者的相關公告。處理順序建議如下(PlainCVE 整理):

  1. 先用 npm ls nodejs-whisper 找出使用處,包括間接相依。
  2. 立即讓檔名脫離使用者控制:上傳時改用伺服器產生的名稱儲存,原始檔名只存進資料庫當顯示用。這一步不需要等上游修補。
  3. 第三方彙整網站 OffSeq 也建議,在修補出現前不要把不受信任的輸入放進傳給 convertToWavType() 的路徑,並驗證或清理輸入。注意:這不是維護者的建議;而且單靠過濾字元容易漏掉,改名比過濾可靠。
  4. 有新版本發布時,先確認它包含 PR #259 的修正(不經 shell 執行 ffmpeg),再升級。

攻擊流程

從左到右是攻擊發生的順序。藍色盾牌代表這一步可以被擋下,越早擋下越好。點圖示可看細節。

由上到下是攻擊發生的順序。藍色盾牌代表這一步可以被擋下,越早擋下越好。點圖示可看細節。

nodejs-whisper 指令注入:特製的音訊檔名就能在伺服器上執行系統指令: 1. 上傳一個檔名經過特製的音訊檔 → 2. 應用程式把這個檔案路徑交給 nodewhisper() → 3. convertToWavType() 把路徑拼進 ffmpeg 指令字串 → 4. shell 把檔名的一部分當成指令執行CVE-2026-110644 · nodejs-whisper 指令注入:特製的音訊檔名就能在伺服器上執行系統指令攻擊者你的系統上傳一個檔名經過特製的音訊檔 — 只有當應用程式保留使用者提供的原始檔名時,這一步才有意義。 1上傳一個檔名經過特製的音訊檔應用程式把這個檔案路徑交給 nodewhisper() — nodewhisper(filePath, options) 是套件的公開 API;套件只檢查檔案是否存在,不會清理檔名。 2應用程式把這個檔案路徑交給 nodewhisper()convertToWavType() 把路徑拼進 ffmpeg 指令字串 — 0.3.1 的程式碼沒有跳脫路徑,直接透過 shelljs 的 exec() 交給 shell 執行。 3convertToWavType()把路徑拼進 ffmpeg 指令字串shell 把檔名的一部分當成指令執行 — 依研究者說明,注入的指令在轉錄前就執行,無論 ffmpeg 成功與否;權限等同 Node.js 程序。 4shell 把檔名的一部分當成指令執行攻擊路徑可在此擋下PlainCVE · plaincve.date/vulns/cve-2026-110644-nodejs-whisper-command-injection · CC BY 4.0
nodejs-whisper 指令注入:特製的音訊檔名就能在伺服器上執行系統指令: 1. 上傳一個檔名經過特製的音訊檔 → 2. 應用程式把這個檔案路徑交給 nodewhisper() → 3. convertToWavType() 把路徑拼進 ffmpeg 指令字串 → 4. shell 把檔名的一部分當成指令執行CVE-2026-110644 · nodejs-whisper 指令注入:特製的音訊檔名就能在伺服器上執行系統指令上傳一個檔名經過特製的音訊檔 — 只有當應用程式保留使用者提供的原始檔名時,這一步才有意義。 1攻擊者上傳一個檔名經過特製的音訊檔應用程式把這個檔案路徑交給 nodewhisper() — nodewhisper(filePath, options) 是套件的公開 API;套件只檢查檔案是否存在,不會清理檔名。 2你的系統應用程式把這個檔案路徑交給nodewhisper()convertToWavType() 把路徑拼進 ffmpeg 指令字串 — 0.3.1 的程式碼沒有跳脫路徑,直接透過 shelljs 的 exec() 交給 shell 執行。 3你的系統convertToWavType() 把路徑拼進ffmpeg 指令字串shell 把檔名的一部分當成指令執行 — 依研究者說明,注入的指令在轉錄前就執行,無論 ffmpeg 成功與否;權限等同 Node.js 程序。 4你的系統shell 把檔名的一部分當成指令執行攻擊路徑可在此擋下PlainCVE · CC BY 4.0plaincve.date/vulns/cve-2026-110644-nodejs-whisper-command-injection
圖片可自由用於報導與教學,採 CC BY 4.0,圖上已附出處。
  1. 攻擊者

    上傳一個檔名經過特製的音訊檔

    只有當應用程式保留使用者提供的原始檔名時,這一步才有意義。

    防禦: 上傳的檔案一律改用伺服器產生的檔名(例如隨機 ID)儲存。

  2. 你的系統

    應用程式把這個檔案路徑交給 nodewhisper()

    nodewhisper(filePath, options) 是套件的公開 API;套件只檢查檔案是否存在,不會清理檔名。

    防禦: 不要把使用者可影響的字串傳進檔案路徑;第三方彙整網站也建議先驗證或清理輸入。

  3. 你的系統

    convertToWavType() 把路徑拼進 ffmpeg 指令字串

    0.3.1 的程式碼沒有跳脫路徑,直接透過 shelljs 的 exec() 交給 shell 執行。

    防禦: PR #259 提出的修法:改用 execFileSync 搭配參數陣列,不經過 shell。

  4. 你的系統

    shell 把檔名的一部分當成指令執行

    依研究者說明,注入的指令在轉錄前就執行,無論 ffmpeg 成功與否;權限等同 Node.js 程序。

    防禦: 用最小權限的帳號或容器執行轉錄服務,限制被入侵後的影響(PlainCVE 建議)。

影響範圍

nodejs-whisper 是 npm(Node.js 的套件庫)上的語音轉錄套件,作者為 ChetanXpro。

條件是否受影響
nodejs-whisper 0.3.1 以前(含)+ 傳給 nodewhisper() 的檔名可受使用者影響受影響
研究者實際測試的 0.3.0已確認可觸發
檔名完全由伺服器產生(例如隨機 ID)攻擊者無法控制檔名,PlainCVE 判斷風險大幅降低,但仍屬受影響版本
修補版本未確認:沒有任何來源指出已修補的版本

研究者指出,最實際的曝險情境是:應用程式把使用者上傳的音訊以原始檔名存下,再把路徑交給 nodewhisper()。而且這個檔案必須真的存在,因為套件只檢查檔案是否存在。

關於「不需登入」:CNA 的 CVSS 評分把所需權限列為「無」、攻擊途徑列為「網路」。PlainCVE 的判斷是:nodejs-whisper 是程式庫,攻擊者需不需要登入,取決於使用它的應用程式怎麼接收檔名,因此「不需認證」是評分上的假設,不代表每個部署都如此。

原理

轉錄前,套件的 convertToWavType() 會呼叫 ffmpeg(常見的影音轉檔工具)把音訊轉成 WAV。在 0.3.1 的程式碼中,檔案路徑被直接拼進一段指令字串,沒有跳脫,再透過 shelljs 的 exec() 交給 shell(解讀文字指令的程式)執行。

shell 會把某些特殊字元當成語法。如果檔名裡藏了這類字元,檔名的一部分就會被當成另一道指令執行,權限等同 Node.js 程序。依研究者說明,這道指令在轉錄開始前就會執行,而且無論 ffmpeg 本身成功與否都會執行。這類弱點對應 CWE-78(作業系統指令注入)。

有問題的思路(概念示意,不是原始程式碼):

展開程式碼範例(js)
// 路徑被拼進字串,再整段交給 shell 解讀
const command = `ffmpeg -i "${filePath}" ... output.wav`
shell.exec(command)

PR #259 提出的思路(概念示意;PR #259 頁面含攻擊程式,本站不連結):

展開程式碼範例(js)
// 不經過 shell,檔名只是參數陣列中的一個值,永遠被當成資料
execFileSync('ffmpeg', ['-i', filePath, /* ... */ 'output.wav'])

時間軸

日期事件
2026-06-23研究者開啟 PR #259,公開描述問題並提出修法(該頁含攻擊程式,本站不連結);CNA 在 CVE 紀錄中也以此日為公開日期
2026-10-14VulnCheck 發布 CVE 紀錄;CISA SSVC 評估遭利用狀態為「無」、可自動化
2026-10-15尚未列入 CISA KEV

延伸閱讀

  • 評分:CNA 給出 CVSS 3.1 9.8 分與 CVSS 4.0 9.3 分,都屬「嚴重」,差異來自評分版本不同。
  • 遭利用狀態:截至 2026-10-15 未列入 CISA KEV,也沒有實際遭利用的報告;是否曾在修補前遭利用沒有證據。不過 PR #259 是公開的,其中包含研究者用來確認問題的檔名範例(該頁含攻擊程式,本站不連結),CISA 也評估這個問題可被自動化利用。
  • PR #259 是否已合併或發布,現有資料無法確認。
  • 發現者:Zachariah Mithani(VulnCheck 公告列名)。
  • 相關弱點類型:CWE-78。

驗證紀錄 AI 依審稿規則逐項核對來源,全部通過;未經人工審稿,也尚未在我們的環境重現

AI 審稿2026-10-15 · 審稿規則

驗證紀錄只寫環境與結果,不公開重現步驟或可攻擊他人系統的程式。詳見 政策.

來源

  1. CVE / NVD / OSVCVE-2026-110644 Record (CVE Services API) · CVE Program / VulnCheck (CNA), 2026-10-14 · 查閱 2026-10-15
  2. 安全公告nodejs-whisper through 0.3.1 OS Command Injection via convertToWavType · VulnCheck, 2026-10-14 · 查閱 2026-10-15
  3. 廠商說明nodejs-whisper v0.3.1 src/utils.ts · ChetanXpro (GitHub) · 查閱 2026-10-15
  4. 其他CVE-2026-110644: Improper Neutralization of Special Elements used in an OS Command · OffSeq Radar · 查閱 2026-10-15

媒體簡報

一句話

nodejs-whisper 是一個用於語音轉錄的 npm 套件。它的 0.3.1 以前(含)版本在轉換音訊格式時,會把檔案路徑直接放進交給 shell 執行的指令;如果應用程式把使用者可影響的檔名(例如保留上傳時的原始檔名)交給這個套件,特製的檔名就可能在伺服器上執行任意系統指令。CNA 給出 CVSS 4.0 9.3 分的評分;截至 2026 年 10 月 15 日,這個漏洞未列入 CISA 已知遭利用漏洞清單,也沒有實際遭利用的報告。目前沒有確認的修補版本。

關鍵數字

嚴重度
CVSS 4.0 9.3 / CVSS 3.1 9.8(CNA) cveawg.mitre.org
受影響版本
0.3.1 以前(含) cveawg.mitre.org
首次公開
2026-06-23(CVE 紀錄的公開日;研究者在專案 PR 公開回報,該頁含攻擊程式,本站不連結) cveawg.mitre.org
CVE 發布
2026-10-14,由 VulnCheck 發布 cveawg.mitre.org
發現者
Zachariah Mithani vulncheck.com

已確認

  • 0.3.1 的程式碼把檔案路徑未經跳脫就拼進 ffmpeg 指令,並透過 shelljs exec() 執行。
  • 研究者在已發布的 0.3.0 版本上實際確認了指令注入。
  • 截至 2026-10-15 未列入 CISA KEV;CISA 的 SSVC 評估把遭利用狀態列為「無」。

尚未確認 / 說法不一

  • 是否已有修補版本:沒有任何來源指出修補版本,PR #259 是否合併或發布也無法確認。
  • 在我們查閱的資料中,未見維護者(ChetanXpro)發布關於這個 CVE 的公告、變更紀錄或發布說明。
  • 是否曾在修補前遭利用(零時差):沒有證據。

可引用的一句話

一個檔名本該只是一個名字,但在這個漏洞裡,它變成了一道會被執行的指令。

圖片

下載分享圖(PNG) · 攻擊流程圖(可下載)

引用時請標示「PlainCVE」並附上本頁連結。 完整引用格式見下方「如何引用本頁」。有事實錯誤請回報.

如何引用本頁

本文採 CC BY 4.0,轉載請保留署名與連結。

PlainCVE 團隊(2026)。《nodejs-whisper 指令注入:特製的音訊檔名就能在伺服器上執行系統指令》。PlainCVE。https://plaincve.date/vulns/cve-2026-110644-nodejs-whisper-command-injection(查閱日期:YYYY-MM-DD)
BibTeX
@misc{cve2026110644nodejswhispercommandinjection2026,
  title  = {nodejs-whisper 指令注入:特製的音訊檔名就能在伺服器上執行系統指令},
  author = {PlainCVE 團隊},
  year   = {2026},
  howpublished = {PlainCVE},
  url    = {https://plaincve.date/vulns/cve-2026-110644-nodejs-whisper-command-injection},
  note   = {更新於 2026-10-15}
}