別處 XSS 偷工作階段;這裡金鑰不可匯出
排程中閱讀時間 7 分鐘 作者 NT²
宣稱無敵的保管箱是在賣戲碼。NT² 點名殘餘風險——已解鎖時的 XSS、遭竊且仍解鎖的裝置、 敵意擴充功能——並把設計收斂成:那些失敗不會同時變成密碼神諭或可匯出的金鑰傾倒。
別處 XSS 偷工作階段;這裡金鑰不可匯出
主張:殘餘風險是產品承諾的一部分
多數「安全保管箱」行銷停在一句安慰話:資料有加密,所以你很安全。那句話藏起了問題比較有意思的一半。
靜止加密並不會抹除已解鎖的工作階段。保管箱開啟時,頁面裡有東西能解密。一般網頁應用的跨站指令碼(XSS)常偷走工作階段 cookie 或 bearer token——攻擊者可從另一台機器重放的可攜憑證。裝置遭竊而筆電仍解鎖,往往代表在作業系統鎖定前擁有完整存取。具有對該來源注入指令碼能力的惡意瀏覽器擴充功能,能做頁面能做的事。
NT² Vault 不假裝這些失敗類別會因為我們說「零知識」就消失。主張更窄、也更有用:
我們把設計收斂成:已解鎖工作階段的失敗,不會同時變成可匯出的金鑰傾倒、服務提供者密碼重設,或雲端猜密碼神諭——並把仍然會痛的部分說清楚。
別處,XSS 偷工作階段。這裡,保管箱 AES 金鑰是記憶體中不可匯出(non-extractable)的 CryptoKey 控制代碼。差異很重要。它不是永生。
限制:瀏覽器與攻擊者共用同一個 JavaScript 世界
三項限制逼出誠實。
第一,同源指令碼就是保管箱。 若攻擊者在已解鎖的保管箱頁面執行 JavaScript——透過內容注入漏洞、被寫進該來源的遭入侵相依套件,或能注入頁面的敵意擴充功能——他們與產品共用同一個 Web Crypto 世界。他們能呼叫頁面能呼叫的 API。不可匯出的金鑰(Web Cryptography API)拒絕 exportKey,因此原始 AES 位元組較難被舀進貼上板。它們不會阻止控制代碼仍存活時的 encrypt / decrypt。已解鎖時的 XSS 仍是嚴重缺陷。設計縮小的是金鑰材料本身的外洩;它不會原諒把第三方分析腳本送進保管箱來源。
第二,工作階段仍熱時,實體存取勝過密碼學。 遭竊且保管箱仍解鎖的手機、留在咖啡館開著的筆電,或在閒置清除觸發前坐下的室友,都能讀螢幕並使用 UI 暴露的一切。自動鎖定縮短窗口。它不會在每個瀏覽器裡發明安全區(secure enclave),也不取代鎖定作業系統。
第三,即使客戶端遭入侵,邊緣仍須保持盲目。 若客戶端破綻「順便」變成「向伺服器要 salt、驗證子,或密碼重設」,攻擊者就多了一個面:雲端協助猜密碼,或客服桌還原。限制是雙向的:主密碼永不離開瀏覽器;KDF salt 與密碼驗證子留在裝置上;Workers API 驗證身分,卻不持有解鎖材料。客戶端遭入侵對該裝置的解鎖窗口仍是災難。它絕不能升級成由服務提供者控制的解密路徑。
這些限制與常見產品直覺衝突:把摩擦降到最低、把「記住這台裝置」放到最大、把擴充功能當成免費發行通道。對密碼保管箱而言,那些直覺會擴大爆炸半徑。
設計:工作階段邊界、不可匯出金鑰、盲端點
我們優化的威脅模型不是「永遠沒人在頁面跑指令碼」。而是「當他們這麼做,或裝置在解鎖狀態遭竊時,失敗模式維持本機且有時間界線——且架構拒絕放大它」。
| 威脅 | 對你仍然有效的部分 | 設計拒絕再加的部分 |
|---|---|---|
| 已解鎖時的 XSS/注入指令碼 | 使用活著的 CryptoKey;讀已解密的 UI 狀態;呼叫頁面能呼叫的保管箱 API | 可匯出的保管箱 AES 金鑰;保管箱來源上的第三方指令碼;重新整理後靜默還原金鑰 |
| 已解鎖時的裝置遭竊/窺屏 | 讀螢幕;在鎖定前操作已解鎖 UI | 可把 AES 材料重新水合的「連開數日」cookie;把 PWA 安裝當成持續信任 |
| 具有頁面指令碼存取的惡意擴充功能 | 對它碰得到的來源,與 XSS 同類 | 假裝擴充功能衛生是可選裝飾;運送追蹤 SDK 把更多指令碼邀進來源 |
| 伺服器/邊緣遭入侵 | 密文、公開識別符、產品已盲目存放的中繼資料 | 主密碼、KDF salt、密碼驗證子,或能重建解鎖的客服重設 |
工作階段政策是那張表的客戶端半邊。解鎖以 extractable: false 派生或重建保管箱 AES 金鑰,放在應用程式記憶體狀態中,並在明確鎖定、約五分鐘無輸入、強制重新整理與關閉分頁時清成 null。持久儲存保管密文與解鎖材料——不是可即用的金鑰替代品。細節見自動鎖定是記憶體衛生問題;此處它是 XSS 與遭竊的緩解:縮短活控制代碼窗口、拒絕匯出、拒絕靜默再進入。
邊緣半邊是拒絕神諭。Salt 與驗證子留在裝置上(KDF 鹽值留在你的裝置上)。沒有服務提供者密碼重設(無法重設密碼,是刻意的設計)。雲端功能驗證密碼學保管箱身分;它們不接收測試主密碼猜測所需的材料。遭入侵的 Worker 應看到密文與盲目帳號中繼資料——不是解密按鈕。
flowchart LR
subgraph client [Device]
MP[Master password]
Key[Non-extractable CryptoKey]
CT[Local ciphertext]
MP -->|derive on unlock| Key
Key -->|decrypt while unlocked| CT
end
subgraph edge [Edge]
Blind[Ciphertext + public ids]
end
CT -.->|optional sync ciphertext only| Blind
MP -.-x|never| Blind
Key -.-x|never leaves memory| Blind
惡意擴充功能尷尬地卡在「XSS」與「實體存取」之間。Chromium 等瀏覽器授予擴充功能強大權限;有些能把指令碼注入使用者信任的頁面。NT² 無法改寫瀏覽器的擴充功能模型。我們能做的是讓保管箱來源保持精簡(沒有分析小工具、沒有厚重的第三方 UI CDN)、讓金鑰不可匯出且壽命短,並告訴使用者:對保管箱來源具有指令碼存取的敵意擴充功能,實質上等價於 XSS。擴充功能審查、作業系統更新,以及不安裝不可信附加元件,仍是使用者端控制。架構抹不掉它們。
取捨:誠實犧牲舒適,殘餘風險仍被點名
點名殘餘風險會犧牲行銷順口。說「軍事級加密」然後停住比較容易。我們拒絕那種停法。
想要三十天不解鎖的使用者會覺得產品固執。中途重新整理的使用者要再解鎖一次。安裝每個承諾「生產力」擴充功能的使用者,仍承擔我們無法以密碼學刪除的風險。想要威脅模型以「因此安全」結尾的審查者會失望:已解鎖時的 XSS 仍能解密;已解鎖時遭竊仍能讀取;JavaScript 記憶體不是硬體安全模組。
換回的是符合品牌承諾的失敗模式。客戶端出錯時,邊緣不會變成第二個保管箱擁有者。工作階段結束時,活金鑰消失——不是停在 sessionStorage 裡成字串形狀的祕密。攻擊者在已解鎖頁面有指令碼時,仍無法隨手 exportKey 保管箱 AES 材料到別處離線重用。那是較小的爆炸半徑,不是魔法盾。
還有相關的流程取捨。運送保管箱程式碼的代理與人類,隨時可能「好心地」重新引入可匯出金鑰、忘記密碼 email,或「只為了還原」的 salt 託管。產品的威脅模型只有在那些修補被擋下時才站得住。這就是為什麼安全否決是有權威的角色——不是聊天裡的氣氛——見安全否決是角色,不是氣氛。
我們拒絕什麼
拒絕寫清楚,架構比較清楚。
我們拒絕在已解鎖工作階段使用可匯出的保管箱 AES 金鑰。 若瀏覽器能匯出金鑰,同源指令碼也能。
我們拒絕把 XSS 當成「靜止加密就解決了」。 磁碟上的密文保護不了已解鎖的記憶體控制代碼。緩解是短工作階段、不可匯出金鑰,以及精簡來源——不是口號。
我們拒絕服務提供者密碼重設與雲端持有的解鎖神諭。 客戶端遭入侵絕不能升級成「寄信給客服換一把能開啟舊密文的新金鑰」。
我們拒絕在保管箱來源放置會擴大指令碼面的第三方追蹤與小工具指令碼,避免攻擊者或相依套件濫用。
我們拒絕行銷上的無敵。 已解鎖時的裝置遭竊、具有頁面存取的惡意擴充功能,以及已解鎖時的 XSS 仍然真實。自動鎖定與不可匯出金鑰縮小窗口與外洩形狀;它們不刪除鎖定作業系統、謹慎擴充功能,以及不重用外洩庫裡主密碼的需求。
我們拒絕把活 AES 材料「記住這台裝置」式地重新水合,好讓解鎖摩擦永遠不會變成靜默再進入。
這些拒絕是 Null Trust² 在客戶端與邊緣的讀法:即使對客服、成長或更順的 demo 很方便,我們對你的保管箱仍做不到什麼。命名故事見Null Trust² — 名稱代表什麼。
殘餘風險,刻意點名
有用的威脅模型停在產品權力停下的地方。
NT² 能讓主密碼不上線、讓 salt 與驗證子留在裝置、讓保管箱金鑰不可匯出且不進持久儲存、在閒置與重新整理時清除它們,並讓邊緣對明文盲目。NT² 無法讓已解鎖的瀏覽器分頁免疫注入指令碼、無法阻止小偷在自動鎖定前使用已解鎖 UI,也無法監管使用者安裝的每個擴充功能。
別處,XSS 偷可攜工作階段。這裡,活祕密是壽命短的不可匯出控制代碼——且架構拒絕再經由雲端遞給攻擊者第二把鑰匙。那是設計。也是界線。
記憶體衛生細節見自動鎖定是記憶體衛生問題。鹽值放置見KDF 鹽值留在你的裝置上。還原誠實見無法重設密碼,是刻意的設計。拒絕背後的品牌限制見Null Trust² — 名稱代表什麼。這些拒絕如何在代理速度下仍可出貨,見安全否決是角色,不是氣氛。
若這個威脅模型符合你希望私人保管箱失敗的方式——窄、本機、沒有服務提供者後門——可以試試 NT² Vault,或到 nt2.me 了解更多。
最後更新 2026-10-29
相關故事
- 威脅模型,2026:瀏覽器與擴充功能
閱讀時間 7 分鐘
- 錯誤密碼必須以關閉方式失敗
閱讀時間 7 分鐘
- 自動鎖定是記憶體衛生問題
閱讀時間 7 分鐘