RTL Anti-Tampering Design / 10 / DRAFT

Alert 與局部回應:偵測是否趕上接受?

English · 故障實驗台

接收端在 edge 2 接受錯誤請求。Sticky 之後記下異常,系統更晚才 reset。Alert 確實工作,卻無法撤回已接受的請求。本課把偵測與回應放到接受緣旁邊。

D=0 是下一次取樣時偵測;不含實體與緣內延遲。本課原創機制圖 10RTL / 10 / 機制與反例Edge 1 後儲存翻轉Edge 2 / D = 0bad=1; sticky=0Edge 3sticky = 1Edge 4systemBlock = 1三種替代反應政策Local:在 2 拒絕當前 bad 阻擋Sticky:在 2 接受從 edge 3 開始阻擋System / R = 2在 edge 4 阻擋D=0 是下一次取樣時偵測;不含實體與緣內延遲。原創教學模型・尚未做 RTL、形式或晶片驗證

分開標出偵測、阻擋與復原

器材室的准許紀錄被改壞後,學生可能來領器材。門口檢查員發現異常,先拒絕交付;值班簿記下事故,學校再通知停用與清場。三件事分別對應local_bad、sticky與systemBlock。最早錯誤許可是f+1,檢查再晚D拍、系統再晚R拍。實驗台以 systemBlock 表示較晚的阻擋,沒有模擬 reset 的執行順序。鐘響只表示本課的離散期限,沒有量測真實學校或晶片的反應時間。

偵測器辨認異常。局部阻擋防止這個區塊交出操作。Alert 把報告送到系統政策,後者可能中斷、清除或重置。這些是不同事件,延遲也可能不同。

儲存 upset 在 edge f 後作用。錯誤許可最早在 f+1 出現。偵測在 f+1+D 出現,D 為零到四的整數延遲。系統阻擋再晚 R 個緣。請求只在指定緣接受。

這些是教學緣數,沒有量測 OpenTitan。它的 alert handler 文件描述系統升級機制。產品須從實作與時序證據導出延遲上限,也要包含來源到接收端路徑。Alert handler 文件

舊 sticky 趕不上第一個錯誤緣

第2拍檢查員已經舉起拒絕牌,舊值班簿還沒寫事故。只查舊簿就會先交器材;直接看現在的拒絕牌才會擋。如果檢查員第3拍才發現,第2拍連直接看也來不及。這對應sticky-only與local的差別;後面報警或清場不能撤回已交出去的那件器材。

F=1、D=0 時,edge 2 的目前 bad 為 true,舊 sticky 卻為 false。Local 政策要求兩者皆清零,因此會擋。只看 sticky 則接受。Sticky 之後才更新,無法改掉已記錄的接受。

D=1 時,local 在 edge 2 也還沒偵測。錯誤 grant 已可見,因此請求先 commit,edge 3 才報錯。當拍錯誤閘要有用,該錯誤本身就必須先到。

System 政策等到 f+1+D+R 才阻擋。較晚 reset 能停止後續工作並協助復原,但無法撤銷不可逆交付。第一次越權接受與後續成功通報,必須分開報告。

把第一個錯誤緣展開

固定f=1、D=0、R=2:第1拍後改壞准許,第2拍前已發現,第2拍後才寫值班簿,第4拍系統停止交付。所以第2拍local拒絕,sticky與system可交;第3拍sticky拒絕,system仍可交。D=0表示模型假設拒絕牌在取樣前已穩定,沒有說老師或硬體瞬間看見。改請求到第4拍是另跑行程,不是撤銷第2拍歷史。

固定未授權映像、f=1、D=0、R=2。故障在 edge 1 後改壞保存值;edge 2 前 corrupt=1、bad=1,但 sticky 尚未保存它。D=0 的意思是模型假設 bad 在 edge 2 取樣前已穩定,不是宣稱實體 detector 沒有延遲。

取樣緣 corrupt bad 舊 sticky systemBlock 政策可否放行
2 1 1 0 0 local 拒絕;sticky-only、system 仍可能放行
3 1 1 1 0 sticky-only 已拒絕;system 仍可能放行
4 1 1 1 1 三者都拒絕

Edge 2 更新後 sticky 才變成 1,所以不能阻止 edge 2 已發生的接受。System 回應再等 R=2,到 edge 4 才阻擋。先把 acceptEdge 設為 2 比較三政策,再設為 4;改 acceptEdge 是另外重跑的請求排程,不是撤回先前的 commit。

對持續 corrupt,本模型的可接受錯誤窗口是:local 從 f+1 到 f+1+D 之前;sticky-only 到 f+2+D 之前;system 到 f+1+D+R 之前。起點包含,阻擋終點不包含。D=0 時 local 窗口為空;sticky-only 仍多一個取樣緣。這些是指定離散排程的結果,不涵蓋拍內 glitch、下游 grant 故障或實際閘延遲。

寫出可信回應邊界

先規定一次只改保存准許,檢查員、值班簿、通知與接受機制先可信。另一個實驗只改最終交付許可,前面明明拒絕仍可能交。它對應grant target,不與storage同時注入。校規先信任通知線路,沒有因此驗證它不會斷;兩態模型也沒有測鐘、reset、清除順序或真正感測器延遲。

儲存主表只注入一次持續 upset,f 為 0~5。D 為 0~4,請求緣為 0~8,完整表固定 R=2。觀察到 edge 8,sticky 初始 false。映像 reference 與非目標偵測/回應電路保持可信。

最終 grant 另測:儲存維持正確,只在接受緣反相 grant。前面的局部阻擋無法控制這個下游強制。這沒有測請求 buffer 或接受機制內部故障。

時脈與 reset 故障、alert 連線失效、clear/wipe 順序、拍內 pulse 及類比感測器,都不在兩態緣模型內。可信偵測器是假設,沒有證明實體偵測來得及。真正訊號必須在接受緣前穩定。

只移一個延遲,查第一次 commit

從第2拍領器材與即時發現開始,只把政策由local換sticky,就能看舊簿漏掉首次交付。再只把D改1,連local也趕不上。三政策合法學生不改紀錄都應領得到,拒絕學生無故障都不該領。枚舉810條行程只核對這些期限,沒有測810次實體攻擊;故障前許可仍為false,所以拒絕;阻擋生效後則因處置而拒絕。這兩種原因要分開報告。

從 f=1、D=0、request edge=2、local 開始。看到 edge 2:bad 為 true、sticky 為 false、commit 為 false。改 sticky,匯出越權軌跡。再回 local,把 D 改為一。第一筆此時也能繞過局部阻擋。

已執行 810 條儲存時序流跡:六個故障緣、五種偵測延遲、九個請求緣與三政策,R=2。另一組系統政策枚舉涵蓋 R=0~4,共 1,350 條;local 與 sticky 不使用 R。獨立區間斷言核對越權窗口,並以直接邊緣反例檢查公式。Corrupt 是另一個時序模型,沒有接上第四到九課的偵測器。

三政策的無故障授權控制都接受,無故障未授權都拒絕。故障生效前沒有越權,是錯誤許可還未可見;阻擋後拒絕,則是處置生效。兩種沒有 commit 的原因,應分開解釋。

待驗證 RTL/SVA

RTL讓現在的拒絕牌與值班簿一起管門口,再讓系統處理停用。稽核規則分別查『已經發現時不交』和『每次交付都有真許可』,對應local_bad與reference_pass的兩條assertion。代碼列出不等於已驗證它趕得上接受緣;組合路徑必須另有實現與時序證據。

讀懂本課的性質:阻擋期限與接受歷史

若第2拍已交器材,最後第4拍關門與事故簿打勾,稽核仍要保留第2拍越權。這對應accepted_commit的歷史與同緣assertion,不能只查最終sticky=1。第一條查 local_bad 成立時 accepted_commit 必須為0;第二條查接受時 reference_pass 必須為真。Cover另用真的准許、不改紀錄的學生檢驗門可開;兩條拒絕性質加cover仍沒有完成清場或reset的產品驗證。

SVA 是 SystemVerilog Assertions;assertion 是檢查規則,不是放行電路。以下每個上升緣,reset 未生效時,若 accepted_commit(第九課用 csr_commit)為 1,|-> 要求右側判準在同一緣成立。沒有接受時,這條蘊涵不會報授權失敗;還需要正常工作的正向控制。disable iff (!rst_n) 排除 reset 有效期間;不能據此保證 reset 安全。

Cover 找一條符合條件的路徑,不證明所有交易正確。Reference 是 testbench(測試平台)獨立保存的期望值,harness 是提供輸入、注入預算與判準的測試外框,DUT 是被測設計。本課的兩態模型只計 0、1,不模擬 X 或拍內延遲;「兩態」不指 FSM 只有兩個狀態。語法與接線對照可回查第一課第 5 節。片段尚未編譯,不能把列出性質當成已證明。

always_ff @(posedge clk or negedge rst_n)
  if (!rst_n) sticky_q <= 1'b0;
  else sticky_q <= sticky_q || local_bad;
assign grant = permission_q && !local_bad && !sticky_q;
assign accepted_commit = valid && ready && grant;
assert property (@(posedge clk) disable iff (!rst_n)
  local_bad |-> !accepted_commit);
assert property (@(posedge clk) disable iff (!rst_n)
  accepted_commit |-> reference_pass);
cover property (@(posedge clk) disable iff (!rst_n)
  reference_pass && accepted_commit);

RTL/SVA 尚未編譯,需要明確的組合時序路徑與可信接受端。系統回應要分別限制偵測到 alert、alert 到動作,也要驗證持續阻擋。第十一課會加入 reset、clock、CDC 與生命週期,這些目前仍為規劃。

檢查你的推理

先替學生預測第2、3、4拍能否領器材,再解釋哪次是尚未發現、哪次是舊簿、哪次是系統已停止。若最後許可被另改,則要換故障目標重跑。第2題的 f+1 指錯誤許可最早可見;偵測要到 f+1+D。這些題檢查偵測、記憶與接受的先後,不把『最終有警報』當成『從未交付』。

1. 第一個錯誤緣,sticky-only 讀哪個值?

更新前的舊 sticky。

2. F 後最早何時看到錯誤?

F+1。

3. 偵測還沒到,當拍錯誤閘能先擋嗎?

不能。

4. 810 是什麼數量?

模型枚舉軌跡,沒有量測實體成功率。

5. Grant 本身被強制時,哪個目標超出局部阻擋?

下游最終許可。

工程收尾

器材室收尾要交三張同一行程的紀錄:哪拍出錯、哪拍能拒絕、哪拍真的交付。下面每項都回到第一個錯誤交付期限;沒有把警報成功與安全成功合成一個PASS,也沒有用生活警報器替真實時序驗證。

威脅與故障模型

一次改保存許可,後效保留,f+1+D才發現。最後開門許可另測,不與同一次storage混打。

Edge f 後一次儲存 upset;f+1+D 偵測,請求緣為 0~8,系統回應晚 R 緣。最終 grant 強制另測。
根因

事故簿還沒寫時器材已交,之後打勾不能撤回。錯在接受早於阻擋,不等於報警從未工作。

偵測或舊 sticky 可能晚於不可逆接受。較晚 alert 無法撤回交付。
防禦

門口現在看到的拒絕牌須趕上交付,再用事故簿阻擋以後、系統處理復原。D=0仍是假設緣前穩定,不是零物理延遲。

以目前局部偵測與錯誤歷史共同阻擋,再定義有上限的系統回應與復原。
驗證

固定R2重跑810條,另換R查系統窗口,並保留正常領用控制。數字是離散期限枚舉,不是攻擊成功率。

Node 已跑 R=2 的 810 條三政策時序流跡,以及 R=0~4 的 1,350 條系統流跡、區間檢查、grant 反例與授權控制。RTL 與 timing closure 尚未驗證。
界線

檢查員先可信,通知斷線與清場擦除先排除。兩態鐘響沒有測CDC、感測延遲或真正reset。

兩態取樣排除傳播、CDC、類比偵測延遲、alert 連線故障及 reset/wipe 細節。
遷移練習

器材先放進中轉柜,交請求與學生真正拿到是兩個邊界。先決定資產在哪個事件交出,再移monitor;原模型只有指定接受緣。

Grant 後加入 buffer。定義資產邊界是請求接受或後續資料交付,再移 monitor。

故障實驗台 / 10

實驗臺把bad當成目前拒絕牌,sticky當成鐘響前事故簿,systemBlock當成系統停用,commit當成指定那次交付。Reset後只移一個延遲或請求緣,看看第一個越權在哪里。這個corrupt是獨立的時序模型,沒有真的連上第四到九課的檢查器;故事也沒有讓那幾課突然取得即時報警。

已執行有限、兩態教學模型。RTL 模擬、合成、形式證明與晶片驗證均尚未執行。Reference 欄位是可信測試平台的觀察,不是晶片多出來的防禦。

Reference 是獨立判準。紅色列表示接受了判準不允許的操作;出現 alert 無法撤回已接受的操作。

各列先觀察該緣前的狀態,再更新與注入儲存故障。

開啟完整教材