FacturaScripts 檔案上傳路徑穿越漏洞:偽造原始檔名可寫出 MyFiles/ 目錄並升級為遠端程式碼執行
GitHub Security Advisory GHSA-hgjx-r89m-m7v4 · 2026-07-14
開源 ERP/會計系統 FacturaScripts 被揭露一個 CVSS 9.9 的路徑穿越漏洞,編號 GHSA-hgjx-r89m-m7v4,目前尚未取得 CVE 編號。問題出在 Core/UploadedFile.php 的 move() 函式,由於未對檔名做正規化處理,已驗證身分且具有上傳權限的使用者可將檔案寫出至 MyFiles/ 目錄以外的任意可寫路徑,進一步串接成遠端程式碼執行。
漏洞機制
move(string $destiny, string $destinyName): bool 直接將目的地路徑與 $destinyName 字串相接,而所有呼叫端都把 getClientOriginalName()——也就是客戶端上傳表單裡使用者可完全控制的原始檔名——不經過濾地當成 $destinyName 傳入。這代表檔名中的 ../ 序列會被原樣保留並參與路徑拼接。缺乏 basename 正規化是此漏洞的根本原因。
// Core/UploadedFile.php(簡化示意,非原始程式碼)
public function move(string $destiny, string $destinyName): bool
{
// $destinyName 直接取自 getClientOriginalName(),未經過 basename() 過濾
$target = $destiny . DIRECTORY_SEPARATOR . $destinyName;
return move_uploaded_file($this->tmpName, $target);
}
// 攻擊者可將上傳檔名偽造為:
// ../../Dinamic/Assets/.htaccessadvisory 描述,由於 .htaccess 副檔名不在黑名單內,且 FacturaScripts 在 Apache 正式環境設定中將 Dinamic/Assets/ 排除於 rewrite 規則之外,攻擊者可以此路徑寫入自訂 .htaccess,將特定副檔名重新對應為以 PHP 解譯器執行。
受影響版本
受影響版本範圍為 >= 2025, <= 2026.2,對應套件為 Composer 上的 facturascripts/facturascripts。完整攻擊鏈可拆解為以下步驟:
- 上傳檔名含
../的檔案,利用move()缺乏過濾寫出至../Dinamic/Assets/.htaccess - 該
.htaccess將特定(例如原本非可執行)副檔名重新映射為由 PHP 引擎處理 - 再上傳一個以該副檔名偽裝的 PHP payload,並直接以 HTTP 請求觸發執行
此漏洞被歸類為 CWE-22(路徑穿越)與 CWE-434(危險型別檔案上傳),由研究者 aslein1413-sys 回報至 NeoRazorX/facturascripts 專案。
修補與緩解
advisory 目前未列出已修補版本,建議的修法是在 move() 內部對 $destinyName 呼叫 basename(),先剝除任何目錄組成部分再進行路徑拼接,如此可一次性修正所有呼叫點,而不需逐一檢查上層業務邏輯是否重複做了驗證。在官方釋出修補版本前,自架 FacturaScripts 的維運者應自行於上傳流程的入口處加上檔名正規化,並檢查 Dinamic/Assets/ 目錄下是否已被植入非預期的 .htaccess 或可疑檔案。
原始來源:GHSA-hgjx-r89m-m7v4
Cursor 編輯器路徑解析瑕疵曝光:偽裝成 git.exe 的檔案可在開啟專案時無聲執行
Mindgard(全面揭露公告) · 2026-07-14
資安團隊 Mindgard 完整揭露(full disclosure)AI 程式碼編輯器 Cursor 在 Windows 平台上的一個任意程式碼執行漏洞,目前未取得 CVE 編號,Cursor 母公司 Anysphere 也未發布對應的公開修補公告。問題根源在於 Cursor 開啟專案時的 Git 執行檔路徑解析邏輯,自 2025 年 12 月 15 日回報至今超過七個月仍未修補。
漏洞機制
Cursor 在載入專案時會在多個位置搜尋 Git 執行檔,其中包括專案工作目錄本身。若攻擊者在儲存庫根目錄放置一個命名為 git.exe 的惡意執行檔,Cursor 會在路徑解析過程中自動執行它,過程中沒有任何警告、確認提示,甚至沒有跡象顯示有來自儲存庫內容的執行檔即將被執行。研究人員以 Windows 內建小算盤(Calculator)改名為 git.exe 作為概念驗證,證實了此行為。更值得注意的是,只要專案維持開啟狀態,Cursor 會持續重複呼叫該偽造執行檔,使進程隨時間不斷增生。
研究人員以 Sysinternals Process Monitor 擷取到的紀錄顯示,Cursor 會以類似 git rev-parse --show-toplevel 的參數呼叫該執行檔,整個過程不需要使用者任何互動即可觸發。
受影響版本
文中指出漏洞持續存在至 3.2.16 版(測試日期為 2026 年 4 月 30 日),目前沒有已知的修補版本。揭露時間軸如下:
- 2025-12-15:研究人員首次發現並回報
- 2026-01-15:在 Cursor CISO 介入後,改以 HackerOne 平台正式提交
- 2026-06-01:研究人員公告將對外進行完整揭露的意圖
- 2026-07-14:正式發布完整揭露文章
修補與緩解
Cursor 官方的回應被形容為近乎「不存在」。CISO 一度將此事定性為「自動化流程失誤」,並邀請研究人員改至 HackerOne 漏洞懸賞計畫提交,但此後溝通完全中斷;報告一度因研究人員提出質疑而被重新開啟,但後續的進度詢問始終未獲回覆。在官方修補釋出前,於 Windows 上使用 Cursor 開啟不受信任的儲存庫時,應留意工作目錄根目錄下是否存在可疑的 git.exe,並考慮在沙箱或隔離環境中開啟外部專案。
Tailscale SSH 命令列參數處理瑕疵(TS-2026-009):以連字號開頭的使用者名稱可繞過 ACL 取得 root 權限
Tailscale Security Bulletins · 2026-07-13
Tailscale 在其官方安全公告頁面揭露 TS-2026-009,說明 Tailscale SSH 在 Linux 主機上處理使用者名稱時的一項參數注入瑕疵,可讓攻擊者繞過 ACL 限制取得 root 權限。此問題已於 1.98.9 版修補,公告發布日期為 2026 年 7 月 13 日。
漏洞機制
當使用者以形如 -i 這類以連字號開頭的使用者名稱透過 Tailscale SSH 連線時,該字串在傳遞給 getent(1) 查詢系統帳號資訊的呼叫中,會被解讀成命令列選項旗標而非單純的使用者名稱參數。公告指出這可能導致整份 passwd 檔案內容被意外揭露,進而讓依賴 ACL 中 autogroup:nonroot 限制的主機被繞過,取得未經授權的 root 存取權。
# 示意攻擊向量(非可直接執行之利用程式)
tailscale ssh "-i"@host
# 伺服端等效於執行:
# getent passwd -i
# 若呼叫端未以 "--" 明確結束選項解析,
# "-i" 會被 getent 當成旗標而非帳號名稱影響範圍主要集中在依賴 autogroup:nonroot ACL 規則限制登入身分的 Linux 主機,因為該限制假設傳入的使用者名稱一定會被當成一般字串比對,而非被底層工具當作參數解析。
受影響版本
- 受影響版本:
Tailscale < 1.98.9 - 修補版本:
1.98.9及之後版本 - 受影響平台:主要為 Linux 上執行 Tailscale SSH 且設有
autogroup:nonrootACL 限制的主機
修補與緩解
修補內容為直接拒絕帶有前導連字號的使用者名稱,從輸入層面阻斷後續命令列參數被誤解析的可能性,而非僅在呼叫 getent 時補上 -- 分隔符。公告建議所有受影響環境應盡速升級至 1.98.9 或更新版本。此漏洞由 Anthropic 與 Ada Logics 共同回報。