
先說事件結論Mozilla 在發現一個 Firefox 擴展簽名密鑰的未加密副本出現在 GitHub 倉庫后直接執行了吊銷處理。簽名密鑰一旦落入公開倉庫就不能再假設它安全這跟有沒有被人下載過無關而是默認已經泄露。本文不打算復述一遍新聞標題而是從簽名機制、事件技術路徑、普通用戶處置、擴展開發者應對、倉庫密鑰審計五個層面展開最后給出一套可以直接復用的排查流程。如果你正在使用 Firefox、給 Firefox 寫過擴展、或者 GitHub 上任何一個倉庫存放過證書、密鑰、口令這類文件這篇文章值得看完。前面講機制和影響后面給命令和工具可以直接照著操作。1. 事件核心速覽項目說明事件類型密鑰泄露與吊銷處置涉及方Mozilla、Firefox 用戶、擴展開發者、GitHub 倉庫維護者核心問題Firefox 擴展簽名密鑰的未加密副本出現在公開 GitHub 倉庫Mozilla 的動作吊銷該簽名密鑰降低被惡意利用的風險風險等級高。簽名密鑰可用于偽造擴展簽名進而影響擴展安裝與更新鏈路普通用戶影響需確認 Firefox 已更新、擴展安裝與更新正常擴展開發者影響可能遇到簽名失效、擴展被禁用或需要重新提交簽名開發者通用教訓任何密鑰都不應進入代碼倉庫尤其是未加密副本從公開報道看這次事件的核心處置動作是吊銷而不是刪除文件后繼續使用。這個選擇本身就是安全行業的標準做法密鑰一旦公開無論是否真的被濫用都必須立刻視為不可信然后啟動輪換流程。2. 什么是 Firefox 簽名密鑰為什么被吊銷值得關注2.1 簽名密鑰在 Firefox 生態里的作用Firefox 從較早期版本開始就要求擴展必須經過簽名才能被安裝到正式版本中。這個簽名的目的有兩個確認擴展確實來自某個開發者或發布渠道而不是第三方偽造。確認擴展打包文件xpi在發布后沒有被篡改過。瀏覽器在安裝擴展、檢查擴展更新時會驗證簽名。如果簽名無效Firefox 會拒絕安裝或禁用該擴展。這套機制和 Windows 驅動簽名、macOS 應用公證是同一個思路——用一條信任鏈保證用戶拿到的代碼是可信的。Mozilla 官方擴展商店 AMOaddons.mozilla.org負責對擴展進行簽名。開發者提交擴展到 AMO 后AMO 會使用 Mozilla 的簽名密鑰對擴展包進行簽名然后把簽名后的包提供給用戶下載。2.2 密鑰泄露的風險模型如果攻擊者拿到了 Firefox 擴展簽名過程中使用的私鑰他可以做這些事偽造一個簽名有效的惡意擴展。對已經發布的合法擴展進行重打包植入惡意代碼后重新簽名。在某些場景下干擾擴展更新通道讓用戶接收到被篡改的版本。所以密鑰泄露不是改個密碼就行的問題而是整條信任鏈受到了威脅。Mozilla 選擇吊銷密鑰本質上就是切斷這條可能被污染的信任鏈強制所有依賴它的環節重新建立信任。2.3 密鑰吊銷意味著什么吊銷不是刪除一個文件那么簡單。吊銷意味著使用該密鑰簽發的所有擴展或組件需要重新用新密鑰簽名。Firefox 需要針對密鑰輪換發布相應更新。擴展開發者可能需要重新提交或重新下載簽名包。用戶在密鑰輪換完成前可能遇到擴展校驗異常的情況。這里有一個容易混淆的點吊銷針對的是密鑰本身而不是特定版本的 Firefox。對你正在使用的擴展的影響取決于該擴展是否仍然依賴舊密鑰以及 Firefox 更新后是否已經切換到新的校驗邏輯。3. 事件技術分析未加密副本進入 GitHub 的典型風險3.1 密鑰是怎么進入公開倉庫的從公開信息看這次事件的直接原因是未加密副本進入 GitHub。這種泄露在開發者群體里非常常見一般有幾種路徑曾經是私有倉庫后來被改成公開而敏感文件一直留在歷史提交里。備份腳本或打包腳本把整個配置目錄推送到倉庫密鑰文件被當成普通文件一起上傳。為了在另一臺機器上復現問題開發者把本機配置壓縮后臨時上傳到倉庫忘記刪除。CI 構建過程把密鑰明文輸出到日志或產物目錄隨后被提交。無論是哪一種只要文件進入過一個公開倉庫就不能再假設只有自己看過。Git 的歷史記錄、Fork、鏡像、第三方抓取服務都可能保留副本。這也是為什么安全社區反復強調倉庫里出現密鑰處理方式不是刪文件而是吊銷并輪換。3.2 未加密為什么是關鍵未加密副本這個詞很關鍵。如果密鑰文件本身使用強密碼加密攻擊者拿到的是一份密文在沒有口令的情況下無法直接使用。但未加密意味著拿到文件的人可以直接讀取私鑰內容、直接用于簽名操作。所以不要抱著這個倉庫訪問量很小我很快就刪掉了的僥幸心理。密鑰一旦以明文形式出現在公網時間窗口內有多少人抓取過是根本沒法統計的。吊銷是唯一穩妥的處置路徑。3.3 從發現到吊銷的標準處置鏈路不管是 Mozilla 這次事件還是任何公司的密鑰泄露事件標準處置鏈路基本是一致的確認密鑰確實泄露并且泄露范圍是公開的。評估泄露密鑰的使用范圍與權限邊界。立即吊銷密鑰停止其繼續使用的資格。生成新密鑰替換所有依賴舊密鑰的系統與服務。通知可能受影響的用戶或開發者。復盤泄露路徑補上流程和工具層面的漏洞。這次事件里Mozilla 沒有選擇先把倉庫刪掉再看情況而是直接吊銷說明內部對密鑰泄露的響應已經進入標準流程。這種處置方式本身也值得所有開發者學習。4. 普通 Firefox 用戶應該做什么普通 Firefox 用戶不需要做什么復雜操作但建議按下面的步驟快速自查一遍。4.1 確認 Firefox 版本與更新狀態在 Firefox 地址欄輸入about:about找到關于 Firefox入口或者直接在菜單里打開幫助 - 關于 Firefox。Firefox 會自動檢查更新。如果發現有可用更新建議立即安裝并重啟瀏覽器。更新是拿到密鑰輪換修復的最直接方式。Mozilla 在發現密鑰問題后通常會通過常規版本更新把相關的修復和安全配置下發到用戶端。4.2 檢查已安裝擴展是否正常在地址欄輸入about:addons檢查每個擴展的狀態。如果你發現有擴展被自動禁用、提示無法驗證簽名或已損壞不要急著下載所謂的破解版或未簽名版來繞過限制那是更危險的做法。正確的處理方式是確認該擴展是否仍在其官方頁面提供更新版本。重新從 AMO 等官方渠道安裝。如果重新安裝后仍然提示簽名錯誤等待擴展開發者重新簽名并發布更新。4.3 如果 Firefox 無法自動更新的處理方式部分企業環境會通過組策略或管理配置鎖定 Firefox 版本終端用戶無法自行更新。這種情況下建議聯系管理員確認組織內的 Firefox 是否已經應用最新的安全更新。個人用戶如果更新失敗優先檢查磁盤空間、網絡連接和殺毒軟件攔截而不是從非官方渠道下載安裝包。5. 對擴展開發者的影響與處理建議5.1 簽名失效的表現如果你是 Firefox 擴展開發者這次密鑰吊銷可能對你的工作流產生影響。具體表現通常是本地開發時通過 web-ext 工具加載的臨時擴展在自簽名或使用開發簽名后仍然提示無效。通過 AMO 提交的擴展在審核后返回簽名失敗。用戶反饋擴展在更新后突然被禁用。遇到這些情況先去 AMO 開發者中心查看當前擴展的簽名狀態。如果 Mozilla 已經啟用了新的簽名密鑰舊密鑰簽發的包就會失效你需要重新提交或重新下載簽名文件。5.2 重新簽名與版本發布建議重新簽名后建議檢查以下內容擴展的 manifest.json 中的版本號是否需要提升。本地存儲的已簽名 xpi 是否為最新生成。如果是自托管分發需要確認用戶的更新源指向的是新簽名文件。對于依賴 CI 自動打包發布的團隊還需要檢查構建流程里的簽名步驟是否寫死了舊密鑰。密鑰輪換后CI 環境中的密鑰文件要同步替換否則下一次構建會直接失敗或在靜默狀態下生成無效簽名。5.3 測試通道與正式通道分開管理給擴展打開發簽名和正式發布簽名最好使用不同的密鑰體系。這樣即使開發密鑰泄露也不會直接威脅到正式發布版本。Mozilla 的 AMO 體系本身也區分不同簽名場景建議開發者仔細閱讀其文檔不要把測試通道的簽名文件復用到正式發布。6. 從事件看密鑰管理與 GitHub 倉庫安全最佳實踐這次事件給所有 GitHub 用戶提了個醒倉庫里的敏感文件管理比大多數開發者想象中更嚴格。下面的實踐建議適用于任何團隊建議直接收藏。6.1 密鑰應該放在哪里密鑰不應該放在項目代碼目錄里更不應該進入 Git 倉庫。正確的存放位置包括專用密鑰管理服務KMS、Vault、云廠商 Secrets Manager。本地密碼管理器。硬件安全模塊或安全 U 盤。環境變量或受保護的配置文件且不進入版本控制。如果你的項目確實需要把密鑰寫入配置文件一定要確保配置文件被 .gitignore 排除并且只允許在部署階段由 CI 或運維平臺注入。6.2 加密存儲與訪問控制如果密鑰必須以文件形式存在至少要做到文件本身加密存儲。訪問權限按最小權限原則分配。目錄和文件的系統權限嚴格限制。定期審計誰訪問過這些文件。不要把倉庫是私有的當作安全措施。私有倉庫也可能被誤改公開也可能因為賬號泄露、協作庫被外部訪問而暴露。真正安全的做法是密鑰根本不進入倉庫。6.3 git 歷史中的密鑰泄漏問題很多密鑰泄露不是發生在最新代碼里而是隱藏在舊的 git 提交歷史中。即使你刪除了當前文件歷史記錄里的副本依然存在。這意味著清理工作不是刪一次文件那么簡單。如果是 GitHub 倉庫需要聯系 GitHub 支持處理歷史記錄如果是自建 Git 服務需要對歷史進行重寫并強制推送。但更穩妥的做法仍然是吊銷并輪換密鑰而不是只清理歷史。6.4 倉庫可見性審計建議定期檢查組織下的所有倉庫確認每個倉庫是否真的需要公開。可以用 GitHub CLI 快速列出倉庫的可見性# 列出當前賬號下所有倉庫及其可見性 gh repo list --json name,visibility # 查看某個倉庫詳情 gh repo view owner/repo --json name,visibility,url針對已經公開的倉庫重點檢查這幾個位置README 或文檔中的示例配置是否包含真實密鑰占位。測試用例里是否有硬編碼密鑰。歷史提交中是否存在配置文件。CI 日志和發布產物是否包含敏感信息。6.5 密鑰輪換機制不要等密鑰泄露了才想到輪換。合理的做法是所有密鑰都設置定期輪換周期并且有自動化的輪換流程。密鑰過期時間、輪換責任人、輪換后的驗證步驟都應該寫清楚。這樣一旦發生泄露你只需要提前執行已有的輪換流程而不是臨時想辦法。7. 如何用工具審計倉庫中是否存在泄漏密鑰與其擔心密鑰是否已經泄露不如直接在本地把倉庫掃一遍。下面介紹三個常用工具覆蓋提交前攔截、歷史掃描、實時掃描三個環節。7.1 gitleaks全量掃描倉庫歷史gitleaks 可以掃描整個 git 歷史找出所有提交中出現的密鑰模式。安裝后在倉庫目錄執行gitleaks detect --source . --report-path gitleaks-report.json --report-format json掃描結果會輸出到 gitleaks-report.json里面包含命中的文件路徑、提交哈希和密鑰類型。也可以在 CI 里直接跑gitleaks detect --source . --verbose --redact--redact參數會在輸出中遮住密鑰內容避免掃描結果本身又成為泄露源。7.2 git-secrets提交前攔截git-secrets 是一個提交前鉤子工具可以在 git commit 之前檢查暫存內容里是否包含密鑰。安裝方式git secrets --install git secrets --register-aws--register-aws會注冊 AWS 密鑰格式的檢測規則。如果要檢測自定義后綴比如 PEM 私鑰可以手動追加規則git secrets --add -----BEGIN (RSA|EC|OPENSSH|PRIVATE) KEY-----安裝后每次提交都會自動檢查。執行手動掃描可以用git secrets --scan7.3 用 git 自帶命令搜索私鑰特征如果沒有安裝任何工具也可以用 git 命令直接在歷史里搜索私鑰特征# 在全部歷史中搜索私鑰頭部 git rev-list --all | xargs git grep -l BEGIN PRIVATE KEY 2/dev/null# 在全部歷史中搜索常見密鑰文件名 git rev-list --all | xargs git grep -l id_rsa\|\.pem\|\.pfx\|keystore 2/dev/null注意這種搜索只能作為輔助手段因為密鑰可能有多種編碼形式。而且搜索結果命中的文件不代表一定泄露還需要人工確認。7.4 GitHub 自帶 Secret ScanningGitHub 原生提供 Secret Scanning 和 Push Protection 功能。Secret Scanning 會掃描倉庫歷史中的已知廠商密鑰格式一旦發現會向倉庫管理員發送告警。Push Protection 會在開發者試圖把密鑰推送到公開倉庫時直接攔截推送。建議所有團隊都開啟這兩個功能并把 Mozilla 這次事件作為案例寫進團隊的安全培訓文檔里。8. 常見問題排查與后續觀察問題現象可能原因排查方式處理建議Firefox 提示擴展無法驗證簽名擴展簽名密鑰已輪換舊簽名失效查看 about:addons 中的錯誤提示從 AMO 重新安裝最新版或等待開發者更新Firefox 無法檢查更新網絡受限或更新服務被攔截查看關于 Firefox頁面中的更新狀態檢查網絡與代理設置必要時手動下載安裝包擴展被停用但重新安裝仍然報錯本地緩存了舊的簽名包清除瀏覽數據或刪除擴展后重裝確認擴展官方頁面已發布重新簽名的版本git 倉庫歷史中存在密鑰文件早期誤提交使用 gitleaks 確認泄露范圍優先吊銷并輪換密鑰不要只依賴刪除歷史第三方工具掃描出大量密鑰告警測試配置文件或示例代碼誤報逐條確認是否真實密鑰對真實密鑰立即輪換偽密鑰可加入白名單Secret Scanning 告警未被處理倉庫管理員未配置通知檢查 GitHub Security 頁面建立告警處理 SLA明確責任人如果事件后續有新的官方公告建議關注 Mozilla 安全博客和 AMO 開發者中心的公告而不是依賴社交媒體上的二手信息。對于一些不活躍維護的舊擴展如果開發者沒有在合理時間內完成重新簽名可以考慮尋找替代擴展避免一直使用簽名失效的版本。9. 總結與建議這次 Mozilla 吊銷 Firefox 簽名密鑰的事件真正值得關注的不是某一個擴展能不能用而是密鑰管理這條線被完整地暴露了一次。普通用戶最應該驗證的是Firefox 是否已經更新、擴展是否都能正常安裝和更新。擴展開發者最應該驗證的是自己的 CI 流程、簽名配置是否依賴了可能已經被輪換的舊密鑰。GitHub 倉庫維護者最應該驗證的是自己的倉庫歷史里有沒有私鑰、證書、口令這類文件不要等到 Secret Scanning 告警或者更糟的泄露事件發生后再被迫做一次緊急處置。這次事件最容易踩的坑是以為刪掉文件就沒事了。密鑰一旦進入公開倉庫唯一正確的路徑是立即吊銷、馬上輪換。把這條原則沉淀到團隊流程里比任何一次單獨的清理都更有價值。接下來值得做的事很簡單打開終端在你有權限的倉庫上跑一遍 gitleaks看看掃描結果。如果沒有任何命中說明你的倉庫衛生狀況不錯如果有命中正好借這次事件把輪換流程走一遍。