如果你以為「私有推論」這個詞代表「沒有人會看到我的資料」,那大概要重新校準一下——它真正保證的,是「Apple 的伺服器作業員看不到」,而這跟「你的祕密不會外流」是兩件不同的事。
私有推論還不夠私有——Siri 新架構的威脅模型缺口,從零講起
讀完這篇之後,你會有能力分辨兩種「私密」:一種是密碼學能保證的(傳輸與運算過程不被基礎設施業者偷看),另一種是密碼學保證不了的(agent 為了把事情做好,按設計把你的意圖送去外面)。中間這條縫,正是密碼學家 Matthew Green 在 2026 年 6 月 9 日那篇文章裡盯著看的東西。他談的不是 Apple 把 confidential computing 做爛了,而是這套技術就算「perfectly」運作,仍然擋不住一整類的資料外流——因為那類外流住在威脅模型的另一個維度。我們會從 TEE、attestation、TCB 這三個詞講起,把它們各自保證什麼攤開,再走到 Green 點名的缺口。全程把這當成一位密碼學家對某個產品架構提出的論證來讀,附帶他自己的 hedge,不是當成已成定論的事實。
一個會讀你整支手機的助理——需求先攤開
先把案發現場擺好。新一代的 on-device assistant——Apple 正在做的這種——不是一個只會回答「明天天氣」的語音介面。它要能讀你的訊息、行事曆、照片、郵件,理解你的偏好,然後替你辦事。要辦事,它就得做推論(inference),而現代的推論不是塞在你口袋那顆晶片裡跑得完的。Green 把這件事講得很直白:
「your agent (which is really an LLM running on a server in a data center somewhere, combined with a bunch of local state and prompting) will need to perform inference over this data」
翻成白話——你的 agent 本質上是一顆跑在某個資料中心伺服器上的 LLM,配上一堆本地 state 與 prompt,而它必須對「這些資料」做推論。「這些資料」就是你整支手機的 context。問題立刻浮現:一顆在別人資料中心裡的模型,怎麼能讀你最私密的東西,又不讓那個資料中心的擁有者跟著一起讀?這就是「私有推論/confidential computing」想解決的需求。Apple 對外的版本叫 Private Cloud Compute(PCC),官方的承諾寫得很硬:「User data is never available to Apple — even to staff with administrative access to the production service or hardware.」
把這個需求的形狀再描清楚一點,因為缺口就藏在它的形狀裡。一個只回答「明天天氣」的助理,只需要把一個無關痛癢的問句送出去;它讀不到你的 context,也就沒有 context 可以外流。但一個替你辦事的 agent 不同——它的價值正比於它讀到多少你的東西。它越懂你,就越得吞下你的訊息、你的行程、你跟誰往來、你昨晚搜了什麼。換句話說,這個助理的「好用」與它「持有大量私密資料」是同一件事的兩面,你沒辦法只要前者不要後者。這也是為什麼「讓資料中心讀不到」會變成一個非解不可的需求:你被迫把一整支手機的私密 context 交給一台不在你手上的伺服器,於是你需要一個機制,讓那台伺服器能算、卻看不到。confidential computing 就是被叫來補這個位置的。
但這個助理還有第二個需求,跟第一個拉扯:它要能上網。Green 說得很死:
「This assistant will need Internet access: at minimum the ability to query search engines」
會讀你整支手機,又必須對外發查詢——這兩個需求擺在一起,就是整篇文章張力的來源。一邊要你把最私密的 context 全部交出去,另一邊又要這個吃飽了 context 的程式有能力對外講話。你要它有用,就得同時滿足這兩條;而一旦兩條都滿足,「私密的東西」與「對外的管道」就在同一個程式裡會合了。請記住這個形狀,後面整條信任鏈都是沿著它鋪的。
密碼學能保證的那一段——TEE、attestation、confidential computing
要看懂缺口,得先把密碼學「真的能給」的東西定義清楚。三個詞,按由內而外的順序講。
第一個是 TEE(Trusted Execution Environment)。它是主處理器裡的一塊安全區域。標準定義是這樣的:「A secure area of a main processor. It helps the code and data loaded inside it be protected with respect to confidentiality and integrity.」拆開來看保證兩件事:「Data confidentiality prevents unauthorized entities from outside the TEE from reading data, while code integrity prevents code in the TEE from being replaced or modified by unauthorized entities.」也就是——區域外的人讀不到區域內的資料(機密性),區域內的程式碼不能被偷換(完整性)。注意這裡的「外面的人」包含了作業系統、hypervisor,甚至實體拿到機器的人。這就是 PCC 那句「就連 Apple 都看不到輸入」的硬體基礎。
把這個定義念慢一點,會發現它只談兩個維度——機密性與完整性——而且兩個維度的對象都是「資料與程式碼這些位元組本身」,不是「程式碼的行為」。機密性管的是「誰讀得到區域內的位元組」,完整性管的是「區域內的位元組有沒有被換掉」。注意這裡的「外面的人」一路含到底:作業系統、hypervisor、甚至把機器拆開、拿邏輯分析儀去探匯流排的實體持有者,全部被擋在區域外。這是很硬的保證,硬到 PCC 敢喊「就連 Apple 自己都看不到輸入」。但也正因為它硬,它的邊界才值得被看清楚:它保證沒有人能從區域外把資料偷讀走,它沒有、也無法保證「區域內那份合法程式碼,自己不會把資料整理整理、合法地送出去」。前者是「外人入侵」的問題,後者是「內部設計」的問題,TEE 的定義一個字都沒碰到後者。記住這道接縫——後面整篇文章都在這道縫上施力。
這裡值得停一下,把 TEE 的覆蓋面講得再精確些,因為「機密性與完整性」這兩個詞很容易被讀者自動腦補成「安全」。它們不是。機密性只回答一個是非題:區域外的某個實體,能不能讀到區域內的位元組?答案是不能。完整性也只回答一個是非題:區域內這份位元組,是不是還是被載入時那一份、沒被人偷換?答案是沒被偷換。兩個是非題加起來,畫出的範圍是「沒有外人能讀走、沒有外人能改掉」。它畫不出來的,是「這份合法、沒被改過的程式碼,被授權去做的那些動作,對你是不是好事」。這條界線不是 Apple 偷懶留下的,而是 TEE 這個 primitive 在定義上就只管到這裡——它是設計來防「未授權的存取」的,而資料按設計外送是一個「已授權」的動作,它根本不在 TEE 的問題範圍內。
第二個是 remote attestation(遠端認證)。光有一塊安全區域不夠——你在手機這端,怎麼知道對面那台伺服器真的跑著一塊沒被動過手腳的 TEE,跑的是你以為的那份程式碼?attestation 就是回答這個問題的密碼學協定。驗證流程大致是:「A nonce is requested by the untrusted party from the verifier's server and is used as part of a cryptographic authentication protocol, proving integrity of the trusted application.」關鍵在於這份證明偽造不出來:「A valid proof cannot be computed in simulated hardware (i.e. QEMU) because in order to construct it, access to the keys baked into hardware is required.」——證明依賴製造時燒進晶片的金鑰(hardware root of trust,「A set of private keys that are embedded directly into the chip during manufacturing.」),在模擬硬體上算不出來。
這份證明的價值,全在於它「偽造不出來」。一個攻擊者就算自己架一台機器、改了裡頭的程式碼,他也算不出一份能通過驗證的 proof——因為要算這份 proof,得用到製造時燒進那顆真晶片裡的金鑰,而那組金鑰不會離開晶片。所以當你的手機收到一份有效的 attestation,它能斷定的事情很精確:對面是一塊真硬體 TEE,裡頭跑的程式碼雜湊(measurement)等於某個特定值。但請把這句話的「能斷定」與「不能斷定」一刀切開。它斷定的是「跑的是雜湊為 H 的那一坨位元組」——這叫 code identity(程式碼身分)。它沒斷定、也根本沒去看「雜湊為 H 的那坨位元組會做哪些事、那些事對你是好是壞」。measurement 是一張指紋,能證明對面這個人就是指紋對得上的那個人;它不會、也不能告訴你這個人的意圖。指紋比對與意圖判斷是兩件不同維度的事,attestation 只交付前者。
再把 measurement 這張指紋的「覆蓋面」攤開一格,因為這是讀者最容易高估 attestation 的地方。measurement 量到的是一段位元組的雜湊值——載進飛地的那份二進位映像,雜湊出一個固定的數字。它量得到「載進去的是不是 H 這一坨」,它量不到的事情有一長串:這坨程式碼跑起來會打哪些對外連線、會把哪些欄位塞進 query、收到一段可疑的網頁文字時會不會照做、它的開發者把它寫成傾向保護隱私還是傾向多回報一點。這些全都是「行為」,而行為不在一段靜態位元組的雜湊裡。換句話說,attestation 能讓你確認對面跑的是「Apple 官方發佈、雜湊對得上的那一版 agent」,但「Apple 官方那一版 agent 的行為設計對你有沒有利」這個問題,attestation 連碰都沒碰。指紋對得上,不代表這個人是來幫你的。
把這兩件拼起來,就是 confidential computing 的承諾:你的資料在一塊硬體保護的飛地裡被運算,attestation 向你證明那塊飛地跑的是哪一份程式碼,過程中業者看不到明文。Green 自己也認帳這一段是有效的——但他的認帳是帶 hedge 的:「it's probably good enough to keep _Google and Apple_ from accessing your stuff」。注意那個「probably」。他承認這套技術大概足以擋住 Google 跟 Apple 來讀你的東西。爭點從來不在這。
下面這張表把三個 primitive 各自「證明什麼/不證明什麼」並排放。讀的時候眼睛盯右邊那欄——缺口都在那。
| primitive | 它證明 / 保證什麼 | 它不證明什麼 |
|---|---|---|
| TEE | 區域外(含 OS、hypervisor、實體持有者)讀不到區域內資料;區域內程式碼不能被偷換。 | 不保證區域內那份程式碼「在設計上」不會把資料往外送。 |
| attestation | 對面伺服器跑的是「這一份」程式碼,且跑在真硬體 TEE 上,偽造不出來。 | 證明的是 code identity——這份程式碼是哪一份,不是「這份程式碼不會洩漏」。 |
| confidential computing / PCC | 資料在硬體飛地裡運算,業者(Apple/Google)看不到明文輸入。 | 不擋 agent 按設計把可變現的資訊送去外部 search engine 或 LLM。 |
缺口在哪——attestation 證明「身分」,不證明「設計不會漏」
到這裡,最容易出錯的直覺是把「attestation 驗過了」當成「所以安全了」。Green 的核心論點正是要拆掉這個等號。他把它講成一句近乎口號的話:
「private inference can work perfectly, and yet valuable (_monetizable_) data can still flow outward to a public search engine or LLM, simply because the agent was programmed to do its job in a slightly non-privacy-preserving way.」
私有推論可以「perfectly」運作,但有價值、可變現的資料照樣往外流到公開 search engine 或 LLM——只因為 agent 被寫成「稍微不那麼保護隱私」的方式去做事。請注意這句的力道是 asserted,不是 hedged。它不是說「可能會」,是說這件事跟密碼學運不運作無關。理由他也給了,而且給得很絕:
「There is no cryptographic primitive that protects you from 'upload your search facts to Google' or 'report anything suspicious to the government because I programmed you that way.'」
沒有任何密碼學 primitive 能保護你不被「把你的搜尋事實上傳給 Google」或「因為我被這樣寫所以把可疑的東西回報給政府」。attestation 能向你證明跑的是程式碼 X,但它不會替你讀 X 的原始碼、不會判斷 X 的行為是不是符合你的利益。它證明的是 code identity(程式碼身分),不是 code intent(程式碼意圖)。這兩者之間的全部空間,就是缺口。
為什麼密碼學的工具天生碰不到 intent 這一層,值得再講明白一次,因為這是整篇論證的地基。加密、簽章、attestation 這一整套東西,本質上都在處理同一類問題——「這段位元組該給誰看、是不是被改過、是不是出自某把金鑰」。它們全是針對「未授權」設計的:未授權的讀取、未授權的竄改、未授權的偽造。但「把你的搜尋事實上傳給 Google」這個動作,從頭到尾都是「已授權」的——那份程式碼被設計成就是要這麼做,它有權這麼做,它做的當下沒有違反任何一條密碼學規則。一個合法授權、按設計進行的資料外送,在密碼學的座標系裡根本不是一個「攻擊」,因此沒有任何 primitive 是用來擋它的。這不是密碼學沒做好,是這件事壓根不在密碼學的問題定義裡。Green 那句「There is no cryptographic primitive」不是在抱怨工具不夠強,而是在指出問題被放錯了學科。
把這個缺口放回那個會讀你整支手機的助理身上,它的形狀會立刻變得很具體。回想開頭 Green 那句定義——你的 agent 是「a bunch of local state and prompting」配上一顆資料中心裡的 LLM,而它得對「this data」做推論,而「this data」就是你的訊息、行事曆、照片、郵件這一整坨 device context。現在順著走一遍:這坨 context 經加密、經 attestation 驗過身分,送進 PCC 的 enclave;在 enclave 裡,那份合法的、雜湊對得上的程式碼開始做它被設計來做的事——理解你要什麼,再替你辦。辦事就得上網,而 Green 把這個需求釘死過:這個助理「will need Internet access」,至少得能查 search engine。於是 enclave 裡的程式碼把你的意圖整理成一句查詢,發了出去。整個過程裡,TEE 沒被攻破,attestation 沒被偽造,沒有任何一個密碼學保證被違反——可是你最私密對話裡的偏好,已經以明文查詢的形式,離開了那把保護傘。缺口不是某個環節壞掉,缺口是「每個環節都正常運作」時資料本來就會走的那條路。
下面這張圖把整條信任鏈攤開,每個元件都可以點開看它「保證什麼」與「不知道什麼」。從左到右走一遍,你會看到密碼學的保護傘到哪裡為止——以及那把傘的邊緣外面是什麼。
click any link in the chain to read what it does and does NOT guarantee · 5 components
你的裝置 · 信任的起點
持有完整 device context——訊息、行事曆、照片、郵件。它向 TEE 節點上傳資料前,先靠 attestation 確認對面身分。
保護傘內:傳輸經加密,業者讀不到明文。
attestation · 驗身分
用燒進晶片的金鑰算出一份偽造不出來的證明,告訴你的裝置:對面跑的是「這一份」程式碼,且在真硬體 TEE 上。
不知道:那份程式碼的行為對你是好是壞。它驗的是 code identity,不是 code intent。
TEE 節點 · 硬體飛地
PCC enclave。區域外(含 Apple 的作業員、OS、實體持有者)讀不到區域內明文;區域內程式碼不能被偷換。
不保證:飛地裡那份合法、已認證的程式碼,在設計上不會把資料往外送。
agent 程式 · 缺口的所在
合法、已被 attestation 認證的那份程式碼本身。它為了把事情做好,會把你的意圖整理成 query,repeatedly 打去外部 search engine。
關鍵:這一步「在保護傘內」發生,卻把明文意圖送出傘外——而且完全符合設計。
外部 search engine · 傘外
公開的 search engine 或 LLM。它收到的是 agent 整理過的查詢,其中夾帶最私密對話裡萃取出的偏好。
沒有密碼學 primitive擋得住這條流向——它從 agent 的功能需求裡長出來。
注意圖上那條從 agent 程式拉出傘外的虛線。它不是攻擊、不是漏洞、不是有人入侵了 enclave。它是設計。Green 把這個流向講得很具體:
「the agent will literally need to divine each user's preferences and then operationalize them into queries _that will repeatedly hit your search engine_」
agent 字面上就是得「揣摩」每個使用者的偏好,再把偏好「operationalize」成 query,而這些 query 會一次又一次打到你的 search engine。資料在 enclave 裡確實被私密地運算過了——然後它被合法地、有目的地送了出去。注意「repeatedly」這個字:外流不是一次性的意外,而是這個助理只要在替你辦事,就會持續發生的常態。它越勤勞地替你工作,那條虛線上流過去的東西就越多。
傳輸的機密性 vs 目的的機密性——同一條加密管線,兩種隱私
這裡要安裝一個工程師需要的區分:confidentiality of transport(傳輸的機密性)與 confidentiality of purpose(目的的機密性)不是同一件事。前者問「資料在路上、在運算時有沒有被偷看」,confidential computing 把它做到極致。後者問「資料被拿去做了什麼、有沒有按你的利益使用」,這一層密碼學沒有著力點。
為什麼密碼學在後者沒有著力點?因為密碼學的工具——加密、簽章、attestation——本質上都在處理「位元組要給誰看、是不是被改過」這類問題,它們是針對「未授權的存取」設計的。可是「把你的搜尋事實上傳給 Google」這個動作,是一個「已授權」的動作:那份程式碼被設計成要這麼做,它有權這麼做,它做的時候沒有違反任何規則。沒有任何 cryptographic primitive 能擋住一個合法授權的、按設計進行的資料外送——這正是 Green 那句「There is no cryptographic primitive that protects you from『upload your search facts to Google』」的精確含意。傳輸機密性問的是「有沒有人在你不允許的情況下看到」,而目的機密性問的是「你允許的那個用途,本身對你是好是壞」——這是一個關於誘因、政策、產品設計的問題,不是一個關於數學的問題。同一條加密管線,從前者的角度看滴水不漏,從後者的角度看門戶大開,因為這兩種「機密性」量的根本是不同維度的東西。一個工程師在評估任何「隱私 AI」產品時,要先逼自己分清廠商賣的是哪一種——多數宣傳把前者的強保證,悄悄當成後者在賣。
把這個區分變成一個可以隨身帶走的檢查動作,會更有用。下次看到任何打著「私密」「on-device」「end-to-end 加密」旗號的 AI 產品,先問自己一句:它的保證是「沒人在我不允許時看到」,還是「我允許的那個用途本身不會傷我」?前者是 transport,後者是 purpose。再追問兩個小問題就能定位廠商的話術——第一,attestation 在這裡驗的是 identity 還是 intent?答案幾乎一定是 identity,因為 intent 沒有密碼學能驗。第二,這個產品要運作,需不需要把任何東西送出那把傘?只要答案是「需要」,那條外流的路就存在,剩下的只是「送出去的是什麼、送給誰」這種程度問題,不是有沒有的問題。Green 整篇文章的力氣,就是逼你不要把 transport 的強保證,當成 purpose 的保證收下。
下面這個 slider 把同一條管線的兩種讀法疊在一起。左邊是工程師宣傳的版本——加密的管線、沒人偷看;把分隔線往右拖,露出的是同一條管線的另一種真相——明文意圖按設計流向傘外。兩張圖描述的是同一個系統,差別只在你問的是哪一種機密性。
互動圖表
同一條加密管線,傳輸機密性成立、目的機密性不成立,缺口落在這道差
Green 把這條外流的後果講得很重:「Whoever operates this search engine will learn a vast amount of useful information about the users' desires, some of which will come from the most intimate private conversations」——經營那個 search engine 的人,會學到關於使用者欲望的大量有用資訊,其中有些來自最私密的對話。這是 asserted 語氣。資料在 enclave 裡是私密的,這句話為真;但「the data is processed privately」不等於「no one can ever see it」。這兩句話之間的距離,就是這篇文章。
為什麼 TCB 很大、為什麼對手是設計者——把缺口收尾
還有一層讓缺口更難收的結構性原因:TCB(trusted computing base,可信運算基礎)很大。TCB 指的是「你不得不信任」的那一整套東西——所有一旦被攻破、整個安全保證就垮掉的元件。在 PCC 這種架構裡,TCB 不只是那塊矽,還包括飛地裡跑的整個 LLM、prompting、本地 state、編排邏輯。attestation 能驗它跑的是哪一份程式碼,但程式碼越大、行為越複雜,「這份程式碼不會以不利於你的方式行事」這個保證就越難給。
為什麼「TCB 大」本身就是個問題,而不只是個規模描述?因為 attestation 能替你做的,只有「確認載進去的位元組是那一份」這件機械的事——它不會替你讀懂那份位元組會做什麼。當 TCB 只是一小段經過審計、行為窮舉得完的程式碼時,「身分對得上」幾乎就等於「行為可信」,因為那一小段你大致看得穿。可是當 TCB 膨脹到塞進一整個幾千億參數的 LLM、一大坨沒人能完整講清楚的 prompt、會隨對話演化的本地 state、還有把這些縫起來的編排邏輯時,「身分對得上」與「行為可信」之間就裂開一道很寬的縫——你確認了跑的是哪一份,卻完全沒辦法窮舉這一份在所有輸入下會做什麼。一個幾千億參數的模型不是你能逐行讀完、論證「它在任何情況下都不會把私密欄位塞進對外 query」的東西。TCB 越大,attestation 那張「身分對得上」的收據能替你擔保的範圍就越小,因為它擔保的那一格,在你不得不信任的總面積裡只占越來越小的一角。下面這張圖把「attestation 驗得到的」與「你實際要信任的」兩個範圍的落差畫出來。
那麼真正的對手是誰?Green 把威脅模型整個翻過來:「The adversaries we care about are the ones that deal with the model directly, or even the ones who _designed_ the model」——我們真正在意的對手,是直接操作模型的人,甚至是「設計」這個模型的人。傳統 confidential computing 防的是基礎設施業者來偷看;但在 agent 場景裡,把資料外送的恰恰是業者按設計部署的那份程式碼。對手從「來偷看的外人」變成了「決定 agent 行為的設計者」。這個翻轉之所以致命,是因為傳統威脅模型裡「可信任的人」與「對手」是分開的兩方——你信任 Apple 把伺服器顧好,提防的是別的入侵者。可是當外流是設計出來的行為,那個你信任去設計 agent 的人,與那個讓你的意圖流向 search engine 的人,是同一方。你沒辦法靠加密把自己跟一個「你已經同意讓它替你辦事」的程式隔開。再疊上 prompt injection——Green 說這種 agent「are a nightmare case of the lethal trifecta」,而對 prompt injection 攻擊「right now we have not」解決——缺口不只在設計面,也在還沒被攻克的攻擊面。
把這三圈跟前面的需求對起來看,會發現 Apple 踩中三圈不是巧合,是這類助理的功能定義逼出來的。「讀私密資料」是它有用的前提——前面講過,它越懂你就得吞越多 context。「能對外通訊」是 Green 釘死的硬需求——它至少得查 search engine。「接觸不可信內容」則是上網的副產品——它一旦去查、去讀網頁,就會把外面任何人寫的字吃進來,而那些字可能藏著指令。三圈各自都是「為了好用」必須開的能力,可是三圈一交集,一個攻擊者塞進某張網頁裡的一句話,就有機會指揮這個已經讀得到你私密資料、又有對外通道的 agent 替他把資料送出去。這就是為什麼 Green 用「nightmare」這個詞,也是為什麼他對 prompt injection 的現狀只給得出「right now we have not」這句承認。
Green 自己在這裡是收斂的,不是斷言世界末日。他留了 hedge:「It's possible that we'll be able to solve these problems technically, or through some careful element of human observation」——這些問題有可能用技術解決,或靠某種謹慎的人為觀察解決。注意「It's possible」。他沒說做不到,他說現在還沒。但他對「保護如果存在、存在於哪」這件事的結論很冷:「That protection, if it exists at all, lives in law and politics and corporate incentives: the exact messy human institutions that cryptography was invented to let us stop trusting.」——那層保護如果存在,住在法律、政治與公司誘因裡,也就是那些「密碼學當初被發明出來、就是為了讓我們不必再去信任」的混亂人類制度。注意他連這裡都掛著「if it exists at all」的 hedge——他沒保證那層保護真的存在,只說「就算存在,也不在密碼學手上」。這句的諷刺是整篇的收束:你以為買了一個密碼學保證,結果保證落回到了密碼學想替你擺脫的那些東西手上。
Plain words:attestation 證明的是「跑哪份程式碼」,不是「這份程式碼不會漏」——「資料被私密地運算」永遠不等於「沒有人能看到」。