AI-LECTURER 速報課|2026-10-24|約 25 分鐘

測試一萬次都過,為什麼還不安全?AI 讓「數學證明程式沒漏洞」變得做得到

📍 真實場景
雅婷,32 歲,小型物聯網公司的韌體工程師,負責一個會被全球上千台裝置使用的開源加密小函式庫

發版前一晚,她的自動化測試全部亮綠燈,團隊還跑了上百萬次隨機測試

😖 卡住的地方:上週新聞說 Linux 核心這種被測得最徹底的軟體,仍一口氣被揭露超過 1,000 個漏洞。她睡不著:測試都過了,到底憑什麼敢說自己的程式安全?傳統的「數學證明」聽說要專家花好幾年,她的公司根本請不起。
💡 這課讓你搞懂「測試」和「證明」差在哪,並親手玩一個小實驗,看見為什麼綠燈不等於沒漏洞,以及 AI 如何把證明的成本壓下來。

🧭 這到底是什麼(白話版)

大多數軟體都藏著錯誤,而現在的 AI 越來越擅長把這些錯誤找出來,甚至把幾個看似無害的小錯誤串成嚴重的攻擊。Anthropic 的研究團隊(與 Theorem 合作)指出:光靠平常的防禦手段已經不夠,我們需要一種辦法,能「證明」程式裡沒有某一類漏洞。這個辦法叫做 形式驗證用數學方法證明程式永遠遵守你定下的規則,而不是只靠試跑幾次來碰運氣。

它的做法是:開發者先把程式翻譯成一個 數學模型把程式的行為改寫成數學式子,這樣就能用邏輯推理,而不是用執行來檢查,再去證明它「永遠」遵守一組安全規則。如果證明失敗,就代表程式可能真的有錯,而且失敗的原因會透露錯誤藏在哪。把原因修掉、再證一次,反覆做到證明成功,就得到「這份程式沒有任何會違反這些規則的錯誤」的保證。

問題是,這件事一直貴得離譜。證明的篇幅常常比原本的程式還長好幾倍,而且需要極少數專家。例如 seL4 作業系統核心一套以安全聞名的作業系統最底層程式,負責管理記憶體與程式執行,寫出來花了 2 個人年,但替它做形式驗證卻花了 20 個人年(「人年」=一個人全職做一年的工作量)。這次的突破是:研究團隊用 Claude 這個 大型語言模型LLM,一種讀過大量文字與程式碼、能生成程式與推理步驟的 AI,在超過 100 個真實的開源函式庫上,證明了 組合語言層級比一般程式語言更接近晶片的指令,這裡用的是 RISC-V 這種處理器的指令集(RISC-V)的安全性質。據作者所知,這是第一次把 AI 的形式驗證大規模用在真實的產品級軟體、而且做到組合語言這一層。

更有趣的是,Claude 在寫證明的過程中,還順手找到了躲過多年偵測的錯誤,即使這些程式已經被測試跑過「數兆次」。這正是「證明」與「測試」最根本的差別:測試只能說「我試過的都沒事」,證明才能說「所有可能的情況都沒事」。

🎯 為什麼值得你花時間

測試再多也有盲區素材中的例子很直接:Linux 核心是最被徹底測試的軟體之一,裝在數十億台裝置上,近期仍被揭露超過 1,000 個漏洞。連 Claude 找到的那些錯誤,也是在數兆次測試下仍躲了好幾年。測試的次數再多,也只是抽樣。
攻擊者也有 AI 了當前沿模型越來越會把「看起來無害」的小錯誤串成嚴重漏洞,找漏洞的成本就下降了。防守方如果只靠「修已知的洞」,永遠在追趕,所以需要能保證「這一類洞不存在」的方法。
成本曲線正在被改寫形式驗證過去只在極少數場合划得來,因為證明需要稀有專家與多年時間。LLM 能大量產出證明,意味著它可能從「少數關鍵系統的奢侈品」變成「一般開發流程裡的安全環節」,作者也預期隨著模型變強,它會成為安全軟體開發的必要一環。

⚙️ 它是怎麼運作的

1
1. 定下規則先講清楚「安全」是什麼意思,例如「這個函式永遠不會讀寫到不該碰的記憶體」。沒有規則,就沒有東西可以證明。
▼
2
2. 把程式翻成數學模型把程式(這次是組合語言層級的 RISC-V 程式碼)改寫成可以做邏輯推理的數學描述。
▼
3
3. 讓 AI 寫證明由 Claude 這類 LLM 產生證明:一步一步推導「無論輸入是什麼,規則都不會被違反」。這是過去最耗人力的部分。
▼
4
4. 檢查證明;失敗就是線索證明交給驗證工具檢查。如果卡住證不出來,代表程式可能真的有錯,而卡住的位置會指出錯誤大概藏在哪。
▼
5
5. 修正後重證,直到成功排除失敗的原因,再證一次。重複到成功,就得到「沒有任何違反這些規則的錯誤」的證明。
測試 vs. 形式驗證
比較項目一般測試形式驗證
能說明什麼我試過的情況都沒出事所有可能的情況都不會違反規則
找不到錯誤時只能說「目前沒找到」能給出「沒有這類錯誤」的保證
傳統成本較低、人人會做極高,需稀有專家與多年時間(seL4:2 人年寫、20 人年驗證)
有 LLM 之後AI 也能幫忙找洞AI 可大規模寫證明,已用於 100 多個真實開源函式庫

🔍 程式碼漫遊(點有 ● 的行看白話講解)

這是一個很常見、看似無害的小函式:算兩個數字的中間值。我們用 8 位元(只能存 0~255)的世界來模擬「數字存不下而繞回去」的錯誤,這類小錯誤正是測試容易漏掉的類型。這是教學用的簡化模型,不是素材中真實函式庫的程式碼。

●def mid(a, b):
💬 要驗證的函式:回傳 a 和 b 的中間值(整數)。
● s = (a + b) & 255
💬 重點行:& 255 模擬 8 位元只能存 0~255。若 a+b 超過 255,會「繞回」從 0 重新算,就像里程表轉一圈歸零,這就是藏起來的錯誤。
● return s >> 1
💬 右移一位等於除以 2 取整數。
●def spec(a, b):
💬 「規格」:數學上正確的答案長什麼樣。形式驗證就是要證明程式永遠等於規格。
● return (a + b) // 2
💬 不會繞回的正確算法。證明的目標是:對所有 a、b,mid(a, b) == spec(a, b)。

🛠️ 動手做:實驗:隨機測試 vs. 窮盡驗證

  1. 先按「隨機測試」:它會用 0~100 之間的隨機數字(很像一般工程師寫測試時挑的「正常」數字)測試 mid 函式,看看有沒有失敗。把組數調到 100000 再按幾次,結果通常還是全部通過。
  2. 再按「窮盡驗證」:它把 0~255 所有 65,536 種 (a, b) 組合全部檢查一遍,並列出第一個失敗的例子與失敗總數。
  3. 觀察:為什麼隨機測試永遠綠燈、窮盡驗證卻抓到錯?提示:失敗的情況需要 a+b 超過 255。
  4. 想一想:真實的程式,輸入可能是 64 位元甚至更複雜的資料,窮盡檢查不可能。形式驗證靠的是「數學證明」涵蓋所有情況,而不是一個一個試。這個實驗只是用小範圍幫你看見「抽樣」和「涵蓋全部」的差別。
👇 下面是活的,直接操作

🧠 工程思維透鏡(資深工程師看到的是什麼)

🔭 資深工程師為什麼說「測試只能證明有錯,不能證明沒錯」?
測試是從無限多種輸入裡抽一小部分來試,通過只代表這些樣本沒事。素材裡的例子很有說服力:有的錯誤在數兆次測試下仍躲了多年。形式驗證換了一個思路,不去試輸入,而是對『所有輸入』做邏輯推理。代價是你必須先把規則講得非常精確,而且證明本身很貴,這是工程上的核心取捨:用事前的精確定義與證明成本,換取事後的確定性。
🔭 證明失敗為什麼反而是好事?
素材說明,證明失敗代表程式可能真有錯誤會違反規則,而且失敗的性質暗示了錯誤可能是什麼。換句話說,證明過程本身就是一台高強度的除錯器:它不是『跑出怪結果才發現』,而是『邏輯上走不通』就被迫面對。這也解釋了為什麼 Claude 在寫證明時順便找到了躲過多年的錯誤,找洞變成了證明的副產品。
🔭 LLM 在這件事裡扮演什麼角色?它可以被盲目相信嗎?
LLM 的角色是替人承擔最耗時的部分:大量撰寫證明。但這個工作流的好處是結構性的:證明最後要交給驗證工具檢查,錯的證明過不了關,所以 AI 即使會出錯,也不會悄悄讓錯誤的保證溜進來。資深工程師會這樣設計:讓不可靠但便宜的生成者(AI)搭配可靠但死板的檢查者(驗證工具)。不過要注意,證明只保證『你寫下的規則』成立,規則本身寫錯或漏寫,保證就沒有意義,這是人仍必須負責的地方。

📝 隨堂考(點選答案,立即回饋)

Q1. 測試全部通過、而且跑了數兆次,下列哪個結論最站得住腳?
✅ 測試是抽樣。素材指出有些錯誤在數兆次測試下仍躲了多年,所以通過只能說明「試過的沒事」。
Q2. 形式驗證如果「證明失敗」,最合理的解讀是?
✅ 素材說明:若無法證明,代表程式可能有錯誤會違反規則,且失敗的性質暗示錯誤可能是什麼。
Q3. 以下哪一項最符合這篇研究的成果描述?
✅ 素材說是在超過 100 個真實開源函式庫上,在 RISC-V 組合語言層級證明安全性質;並沒有說取代測試,也沒有證明 Linux 核心無漏洞。
Q4. seL4 的例子(2 人年實作、20 人年驗證)要說明什麼?
✅ 20 人年相對 2 人年,約 10 倍;這說明形式驗證過去太貴,只有少數場合划得來,而 AI 的價值就在壓低這個成本。

🃏 翻牌記憶卡(先想答案,再點開對答)

測試 vs. 形式驗證的根本差別?點我翻面
測試是抽樣,只能說「試過的沒事」;形式驗證是數學證明,能保證「所有情況都不違反規則」。
形式驗證的基本流程?點我翻面
把程式翻成數學模型 → 證明它永遠遵守規則 → 證明失敗代表可能有錯並提示位置 → 修正後重證,直到成功。
為什麼過去形式驗證很少被使用?點我翻面
證明可能比原程式大好幾倍,且需要稀有的專家技能;例:seL4 實作 2 人年、驗證 20 人年。
這次研究做了什麼?點我翻面
與 Theorem 合作,用 Claude 在超過 100 個真實開源函式庫上,證明了 RISC-V 組合語言層級的安全性質,並找到躲過數兆次測試的隱藏錯誤。
形式驗證保證的「邊界」在哪?點我翻面
只保證你寫下的規則成立;規則本身寫錯或漏寫,證明再完整也無法保證整體安全。

✅ 離開前自測(全勾=這課真的學會了)

0%