吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何處理重現使用仿真發現的死鎖漏洞

Codasip 科達希普 ? 來源:Codasip 科達希普 ? 2023-11-02 09:17 ? 次閱讀

在上一部分中,我們重點討論了在組件上設置形式驗證的最佳實踐。那么現在設置已經準備就緒,協議檢查器可以避免不切實際的情況(這也有助于發現一個新漏洞),基本抽象也可以提高性能。現在的任務便是如何處理重現使用仿真發現的死鎖漏洞?

重現死鎖漏洞

重現死鎖漏洞要確保設計無死鎖,其中一種方法是驗證它是否 "最終 "能夠響應請求。”最終“這個措辭很重要,無論當前狀態如何,也無論我們必須等待多少個周期,設計都必須在未來做出響應。而這可以很好地通過一種稱為 "有效性屬性 "的 SystemVerilog 斷言來實現:

can_respond: assert property(s_eventually design_can_respond);

對于正在驗證的緩存,我們在Worker端口上定義了該屬性:

resp_ev:assert(s_eventually W_HREADY);

由于 W_HREADY 在 Worker 接口上永遠保持 LOW 時也會出現死鎖 bug,因此我們認為這個斷言是最簡單、最通用的檢查方法。注:與安全屬性相比,有效性屬性的概念背后有很多理論依據。這里不需要討論這個問題與驗證有效性斷言的正式算法之間的差異,同時也不在本文的討論范圍之內。


擁抱故障

然而通過證明上述斷言,我們很快就敗下陣來。這促使了我們使用方法和工具的支持。當發現死鎖是 "可逃脫的"。換句話說,對失效計數器的抽象(見第 1 部分)使其永遠不會達到終值。在這種情況下緩存 "最終 "沒有響應,因為它永遠停留在無效循環中。這是一個可逃逸的死鎖,因為存在一個逃逸事件(計數器達到其終值,失效停止)。

這是一個錯誤的“故障”,我們最終放棄了這個“故障”,增加了一個 "公平性約束":一個用作約束的有效性屬性。

fair_maint: assume property(s_eventually maintenance_module.is_last_index);

同樣,必須將管理器接口上的M_HREADY約束為 "始終最終 "為高。否則,緩存可能會永遠處于等待響應的狀態。這在下面的波形中可以看到。

在LOOP區域,如果管理器端口上的M_HREADY在請求飛行時也保持LOW,那么Worker端口上的W_HREADY可能會永遠保持LOW。這個LOOP區域可以無限大,但 Escape 區域表明,如果環境最終使管理器端口上的M_HREADY升高,那么它就會解除鎖定狀態,Worker端口上的相同信號也會升高。這就是 "逃逸事件"。

132c8126-78c4-11ee-939d-92fbcf53809c.png


從一種故障到另一種故障

在修復了這些錯誤的“故障”后,我們又遇到了 resp_ev 斷言故障。

結果更有趣:它顯示為 "無法逃脫的死鎖"。這意味著我們不必再嘗試找出其他缺失的公平性約束。有一種狀態在于無論之后發生什么,設計都不會響應。

形式化工具顯示了一個在LOOP區以無限LOOP結束的波形。由于不存在任何逃逸事件,該區域總是向右無限延伸。

1354da2c-78c4-11ee-939d-92fbcf53809c.png



這時設計師們便可以確認 "這就是漏洞!"。最酷的是我們在不到一周的時間里,從零開始重現了這個故障。

驗證RTL修復

我們已經有了一個RT 修復方案,所以很快就可以嘗試......結果發現它并不完整!我們仍然遇到了無法擺脫的死鎖。在經過幾次迭代后,情況有所改善,此類的故障也沒有再出現......但同時也沒有證據可以證明已經徹底擺脫死鎖。

增加時間限制后,我們在 iCache 總線上得到了 resp_ev 斷言的完整證明(見實踐之一)。通過對dCache 總線上的瓶頸分析,發現它是由于標準緩存請求與 CSU 動態更改緩存配置請求的混合功能造成的。這使得狀態空間變得非常大。為了避免這種情況,我們對環境進行了限制從而使證明趨于一致。

使用過度約束

在迭代調試過程中,我們使用了過度約束來減少探索。這可以大大減少獲得反例或證明所需的時間,并有助于調試故障,因為生成的方案更簡單。當然,這些過度約束必須在最終運行時去除。

在正式設置中以簡單的方式允許過度約束是很重要的。為了安全起見,最好的做法是禁止在正式測試平臺中直接編寫約束條件(即假設屬性)。這樣做的風險太高,可能會在最后留下一些已啟用的屬性。相反,所有屬性都必須寫成斷言,有些屬性可以通過顯式運行選項轉換成約束。同時Codasip的形式框架允許我們這樣做。

其它死鎖檢測技術

在該系列的第一部分我們已經介紹了形式驗證工具如何區分可逃逸和不可逃逸的死鎖。然而并非所有工具都能提供這種功能,下面是一種模仿這種功能的技術:

以 s_eventually expr 的形式編寫一個有效性斷言A。

用工具來證明A。如果被證明就意味著大功告成:沒有死鎖。

如果出現了反例,就會產生一個以無限循環結束的跟蹤T,以防止 expr 再次為真。

運行A、WA的見證證明,使用T來初始化設計,而不是正常的重置序列。形式分析將從LOOP狀態開始。

如果證明的結果是WA不可達,則意味著T顯示了不可避免的死鎖。

如果WA被覆蓋,則意味著T是一個可逃逸的死鎖,并且WA的跟蹤顯示了該逃逸事件。

證明有效性斷言在計算上比證明安全性斷言更困難。因此有時最好采用不同的方法來驗證死鎖。

使用有界斷言

有一種方法是用有界斷言代替有效性斷言。可以寫成 !expr [*N] |=> expr 來代替 s_eventually expr。這意味著expr預計不會在超過N個LOOP的時間內為假。這種特性在仿真測試平臺中非常常見。難點在于將N設置得足夠大,但又不能太大!如果將N設置為數百或數千個周期,FV就不太可能得到結果。如果將N設得很小,可能會發生一些事件導致N太小,從而導致錯誤故障。因此在驗證有效性斷言時,所遇到的困難類似于尋找公平性約束,以摒棄所有可逃逸的死鎖。

使用進度計數器

另一種方法是使用進度計數器。首先必須定義一個計數器,每當設計中發生一些事情,例如更接近任務完成時,計數器就會遞增。然后安全斷言可以檢查并在必須取得進展的情況下取得進展。以緩存為例,我們可以將進度計數器定義為在一個管理器端口上發出請求時遞增。但一般來說,定義所有必須使計數器遞增的事件是很困難的。

進一步驗證死鎖的方式

在重現了目標錯誤并驗證了建議的 RTL 修正后,我們希望更進一步。我們了解到,只有在使用 "寫透 "高速緩存配置時才會出現該錯誤。因此,在完成上述工作時,我們限制只啟用這種配置。當然,我們還想確保在 "回寫 "配置中不會出現該問題,因此我們重復了上述過程,取消了這一限制。


然后,我們要驗證是否存在其他死鎖。這些死鎖不會出現在HREADY上,而是出現在設計的內部有限狀態機(FSM)上。事實上,死鎖可能出現在FSM永遠阻塞在某個特定狀態時,盡管HREADY并沒有像LOW那樣被阻塞。為此,我們確定了設計中的主要FSM,并生成了有效性斷言,檢查所有狀態是否最終都能達到。例如

fsm_dcache_miss: assert(s_eventually dcache.fsm_state == MISS);

故障再次出現

我們很快就遇到了許多故障,而且都是可以逃脫的死鎖。

例如,如果Worker端口接收到對同一地址的連續請求流。第一個請求可能未命中,也可能命中。但接下來的請求都會命中。如果請求流 "足夠密集",那么每次命中之間就不會有等待周期,因此FSM的狀態始終是 HIT,無法達到任何其他狀態,包括MISS。這就是上述斷言失敗的原因。

幸運的是,工具顯示該失敗是由于可逃逸的死鎖造成的。逃脫的方法是在請求流中騰出一些空間,或者更改地址。為了掩蓋這種情況,我們需要添加公平性約束。但它們似乎限制過多,大大縮小了驗證范圍。

我們最終決定不這么做。相反,我們讓工具在不同的配置下運行了幾天(這對正式版來說是很長的時間!)。它報告了許多我們忽略的可逃脫死鎖,但沒有發現無法逃脫的死鎖,至此,這些收獲即使沒有得到完整的證明,但也大大增強了我們的信心。

在本次的死鎖漏洞調查案中,我們探討了驗證死鎖的形式化最佳實踐。以下是三個主要收獲:

136d6a56-78c4-11ee-939d-92fbcf53809c.png


在本次的死鎖漏洞調查案中,我們探討了驗證死鎖的形式化最佳實踐。以下是三個主要收獲。

通過故障重現和RTL修復驗證,大大提高了我們對形式化驗證的信心,相信并沒有其他真正的死鎖存在。當然Codasip并沒有就此止步,作為專業的bug獵人,在下一集中,將為大家介紹Codasip如何驗證設計的其他方面,包括高級屬性等。敬請期待!

審核編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 仿真
    +關注

    關注

    50

    文章

    4124

    瀏覽量

    133983
  • 端口
    +關注

    關注

    4

    文章

    990

    瀏覽量

    32206
  • 漏洞
    +關注

    關注

    0

    文章

    204

    瀏覽量

    15424
  • 檢查器
    +關注

    關注

    0

    文章

    16

    瀏覽量

    3513

原文標題:形式化驗證的最佳實踐之二:死鎖漏洞調查案!

文章出處:【微信號:Codasip 科達希普,微信公眾號:Codasip 科達希普】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    安裝完AIC3256EVM-U_CS_v1_2_1 軟件后,發現沒有固件應該如何處理

    我手上有一塊AIC3256EVM-U 仿真版,安裝完AIC3256EVM-U_CS_v1_2_1 軟件后,發現沒有固件,不知道應該如何處理? 請知道的大哥指導一下!謝謝!
    發表于 10-10 07:09

    用modelsim進行仿真時,編寫testbench,inout信號應該如何處理

    用modelsim進行仿真時,編寫testbench,inout信號應該如何處理
    發表于 03-20 16:39

    串口使用中斷模式發現程序有時候會進去死鎖狀態

    用STM32 HAL庫,串口使用中斷模式,發現程序有時候會進去死鎖狀態,原因應該是串口在發送過程中,這時候數據又被發送過去了,然后就很容易會死鎖了。上網找了相關的資料,見鏈接:作者分析了原因,是__HAL_LOCK的原因,這里點
    發表于 08-13 07:36

    linux處理機調度與死鎖

    linux處理機調度與死鎖 掌握處理機的三級調度 掌握作業調度及進程調度的概念 理解調度算法的評價準則 掌握并靈活運用常用的幾種作業調度、
    發表于 04-28 14:59 ?0次下載

    DIN中的死鎖避免和死鎖恢復

    DIN中的死鎖避免和死鎖恢復 由于存在占用資源者申請另一個資源的情形,在DIN中由于拓撲結構本身存在環狀路徑,所以
    發表于 02-23 14:47 ?940次閱讀
    DIN中的<b class='flag-5'>死鎖</b>避免和<b class='flag-5'>死鎖</b>恢復

    Linux發現更多安全漏洞LHA 與imlib受到波及

    Linux 發現更多安全漏洞 LHA 與imlib 受到波及 日前,開放源開發商已經發出警告,稱兩種Linux 部件內出現嚴重的安全漏洞。利用這些漏洞
    發表于 06-12 10:07 ?514次閱讀

    基于主要特征抽取的重現概念漂移處理算法

    基于主要特征抽取的重現概念漂移處理算法_馮超
    發表于 01-07 16:24 ?0次下載

    saber仿真軟件波形如何處理分析、saber仿真軟件如何畫電路圖

     saber仿真電路最主要的就是看電路某些點的電壓電流波形,當仿真后,得到波形了,波形如何處理才更好得分析電路呢?下面介紹下。
    發表于 12-08 11:37 ?2.4w次閱讀
    saber<b class='flag-5'>仿真</b>軟件波形如<b class='flag-5'>何處理</b>分析、saber<b class='flag-5'>仿真</b>軟件如何畫電路圖

    騰訊發現特斯拉Autopilot漏洞

    特斯拉CEO埃隆馬斯克(Elon Musk)通過推文贊揚騰訊科恩實驗室發現Autopilot系統漏洞工作扎實。
    發表于 04-19 11:23 ?1019次閱讀

    何處理化料機軸表面磨損

    何處理化料機軸表面磨損
    發表于 01-17 10:45 ?5次下載

    何處理軸表面磨損造成的傷害

    何處理軸表面磨損造成的傷害
    發表于 02-15 16:03 ?1次下載

    調試TrustZone時,如何處理HardFault?

    調試TrustZone時,如何處理HardFault?
    的頭像 發表于 09-27 16:33 ?753次閱讀
    調試TrustZone時,如<b class='flag-5'>何處理</b>HardFault?

    Linux內核死鎖lockdep功能

    的編程思路,也不可能避免會發生死鎖。在Linux內核中,常見的死鎖有如下兩種: 遞歸死鎖:如在中斷延遲操作中使用了鎖,和外面的鎖構成了遞歸死鎖。 AB-BA
    的頭像 發表于 09-27 15:13 ?749次閱讀
    Linux內核<b class='flag-5'>死鎖</b>lockdep功能

    什么是串擾?該如何處理它?

    什么是串擾?該如何處理它?
    的頭像 發表于 12-05 16:39 ?912次閱讀
    什么是串擾?該如<b class='flag-5'>何處理</b>它?

    何處理MOS管小電流發熱?

    何處理MOS管小電流發熱?
    的頭像 發表于 12-07 15:13 ?675次閱讀
    如<b class='flag-5'>何處理</b>MOS管小電流發熱?
    大发888娱乐场图标| 大发888注册送58元| 威尼斯人娱乐网网上百家乐| 百博百家乐的玩法技巧和规则| 赌王百家乐的玩法技巧和规则 | 大发888国际体育| 大发888娱乐城下载地址| 皇冠足球比分网| 涂山国际娱乐城| 百家乐官网单跳投注法| 百家乐官网大小桌布| 百家乐官网电投网址| 战胜百家乐官网的技巧| 百家乐官网龙虎台布价格| 网上百家乐官网游戏玩法| 百家乐博送彩金18| 3U百家乐的玩法技巧和规则| 永盈会娱乐场官网| 百家乐官网专业赌徒| 永利百家乐官网娱乐场| 百家乐微心打法| 百家乐打印机破解| 大发888娱乐场下载| 全州县| 百家乐官网心得打法| 任你博百家乐现金网| 威尼斯人娱乐场官网| 星河国际娱乐场| 百家乐官网币| 博联百家乐游戏| 大发888娱乐城健账号| 菲律宾沙龙国际| 百家乐官网赌博彩| 百家乐桌布尼布材质| 金沙网上娱乐城| 百家乐官网澳门百家乐官网澳门赌场 | 广州百家乐官网筹码| 艮山坤向 24山| 威尼斯人娱乐场cqsscgw88| 百家乐官网怎么才赢| 24山水口吉凶图|