<delect id="1g9jo"><noframes id="1g9jo"><i id="1g9jo"><nobr id="1g9jo"><acronym id="1g9jo"></acronym></nobr></i><strike id="1g9jo"><dfn id="1g9jo"></dfn></strike>

  • <b id="1g9jo"><small id="1g9jo"><dl id="1g9jo"></dl></small></b>
      <tt id="1g9jo"><small id="1g9jo"></small></tt>
    <tt id="1g9jo"><small id="1g9jo"></small></tt>
    <tt id="1g9jo"><address id="1g9jo"></address></tt>

    1. <b id="1g9jo"></b>
      1. 網站地圖
        中國首家網上媒體 1995年 1 月 12 日創辦
        社內媒體
        官方微信
        官方微博
        當前位置: 首頁 > 學術 > 深度追蹤 > 正文
        FCS | 前沿研究:鏈表操作安全性的自動檢測
        發布時間: 來源: 高教學術公眾號

        原文信息

          ·標 題:

          Automated detection on the security of the linked-list operations

          ·發表年份:

          2022年

          ·原文鏈接:

          https://journal.hep.com.cn/fcs/EN/10.1007/s11704-020-0312-6

          ·引用格式:

          Hongyu KUANG, Jian WANG, Ruilin LI, Chao FENG, YunFei SU, Xing ZHANG. Automated detection on the security of the linked-list operations. Front. Comput. Sci., 2022, 16(2): 162201

          公眾號推文鏈接:

          鏈表操作安全性的自動檢測

          01 導讀

          隨著OS(操作系統)針對漏洞利用采取的措施越來越完善,大多數C/ C++內存漏洞中棧相關的漏洞逐漸減少,而堆相關漏洞日益突出。眾所周知,軟件程序是數據結構和算法的融合,因此,如果對數據進行不安全的操作,可能會導致不可預知的后果。鏈表作為與堆內存密切相關的一類數據結構,在存儲、搜索和修改數據元素方面都十分方便,因此常在實際軟件生產中得到應用。鏈表的創建和刪除包含了堆內存的分配和釋放,如果形成的組合不規范,便可能產生堆漏洞。如果程序員在創建或刪除鏈表時不注意代碼的規范,程序便更有可能面臨由于堆內存管理疏忽而引起的一系列潛在漏洞問題。因此,在編程中使用鏈表時,十分有必要檢查算法實現鏈表的效果,例如,是否在空鏈表上執行、是否執行安全邊界條件的檢測等。為了提高代碼安全性,AddressSanitizer(ASan)經常被使用來進行動態檢測,但是運用ASan開銷大,代碼覆蓋率也相對較低。然而,一些檢測范圍較廣的靜態檢測工具,如Coverity和Cppcheck,在檢測特定目標時精度和效率又較低,很難找到一個現有的方法來自動檢查鏈表操作的安全性。因此,本文提出了一種自動檢查鏈表上安全代碼規范的方法。

          02 方法介紹

          對鏈表的操作是通過一段代碼來完成的,這段代碼可能只是一個文件中的一個函數,甚至是一個函數中的幾行代碼。為了提高檢測的效率和準確性,本文將整個過程分為三個階段。通過前兩個階段,使用兩種神經網絡模型來區分鏈表操作的類型,最后根據它們的類別進行相應的安全檢查。該過程的框架如圖1所示,神經網絡模型接收一個標記序列作為輸入數據,并使用BLSTM模型構建二分類器,使用CNN模型構建三分類器,最后,用我們定義的三種安全代碼規范輸出結果。

        圖1 過程框架概述

          第一階段:判斷一個代碼片段是否是鏈表操作

          近年來,深度學習已被廣泛應用于程序理解。源代碼的建??梢苑譃槿?標記序列、抽象語法樹(AST)和圖結構(CFG、DFG)。通常,AST、CFG和DFG包含有關程序的更多信息。然而,若代碼片段缺少頭文件和宏,就可能包含比通常表單更少且相當不準確的信息。此外,這兩種建模方法比較復雜,因此會產生更多的開銷。

          因此,我們選擇令牌序列并以一種模糊的方式建模和解析C/ C++代碼片段,即使無法提供工作構建環境或缺少部分代碼,模糊解析器也可以根據詞法和句法分析將每個程序語句分割為標記。令牌序列主要包括兩種類型的令牌:符號和標識符。一般來說,在任何C/ C++文件中都有一定數量的符號,例如一元操作符、圓括號和分號,但是標識符的形式是可變的。首先確定整個代碼中的函數名和變量名,然后用占位符替換這些變量名和函數名,因此,處理的標識符類型被控制在一定范圍內,以減輕詞匯表外的問題。經過處理的標識符和符號的總詞匯量為173,由于173維向量的符號和標識符的數量是固定的,故采用單熱嵌入法進行詞嵌入。并且,由于標記序列的長度是可變的,故本文將標記序列的大小設置為300個標記,若序列長度大于300,則將截斷超出的部分,若序列長度小于300,則將對不足的部分補零向量。為了提取不同標記之間的關系,將BLSTM作為神經網絡的主要框架,使用MLP作為最終的分類器。本文使用帶有150個單元格的單層BLSTM和帶有64和32兩個隱藏層的全連接分類器,在BLSTM層和密集層之后使用PReLU作為激活層,然后使用sigmoid函數作為最終輸出的激活,并在每個激活層之后,添加Dropout來緩解過擬合。

          第二階段:將鏈表操作分為三類

          本文將鏈表的操作分為以下幾類:節點的添加、節點的刪除以及節點數據的賦值或修改,這些操作被視為原子操作,即鏈表基本功能的實現。作為原子操作,它們的特征粒度更細。例如,節點的增加和刪除形式不同,但都涉及到鏈表節點的斷開和重新連接的過程。因此,提取這些特征需要更加謹慎。與前一階段不同的是,在這一階段,沒有規范化所有的標識符,而是保留了與鏈表操作語義相關的通用標識符,例如malloc、free、next和prev,保留標識符詞匯表的大小為11。此外,用于特征提取的神經網絡也不同于之前的框架BLSTM,本文使用CNN作為主要框架來捕獲代碼片段中的局部詳細特征,然后使用帶有Softmax函數的MLP作為最終的分類器,本文使用32個核大小為3的一維卷積濾波器和兩個隱藏層為32和16的全連接分類器。對于鏈表操作的代碼段,數據量減少,因此節點之間的關系變得相對緊密,長序列依賴問題可以忽略。與LSTM相比,CNN可以提高訓練速度,降低訓練成本。

          第三階段:檢查鏈表操作的代碼規范

          本文定義了幾個安全代碼規范如下:第一,添加節點時是否有內存分配的狀態檢查;第二,目標節點的內存塊在節點刪除時釋放后是否被清空;第三,在分配或修改節點數據時,是否對分配數據的有效性進行檢查。

          在添加節點時,如果分配目標內存塊失敗,那么再使用目標內存時,程序可能會崩潰。刪除節點時,應回收其內存塊,否則將存在內存泄漏的潛在危險。在分配節點數據時,如果數據來自外部輸入,但沒有對輸入數據進行類型或大小檢查,則可能導致輸入數據與節點數據的字段不一致,從而導致緩沖區溢出。由于代碼片段中可能有多個原子操作,例如在添加新節點后初始化節點,因此需要分別檢測這些規范。對于包含添加節點操作的代碼段,如果它包含分配內存的操作,則應該有一個條件判斷來檢查請求的內存是否為空,否則是不安全操作。如果不包括內存分配的操作,則只是斷開鏈表和組合鏈表的過程,并認為這一步符合安全規范。對于包含節點刪除操作的代碼段,為了保障安全,需要判斷是否存在釋放內存的自由操作。如果存在內存釋放的自由操作,但釋放后的內存沒有設置為NULL,則被認為是不安全的。對于包含數據分配的代碼片段,我們首先需要確定分配的數據源。如果是外部輸入,因缺乏檢查數據大小的條件,故被認為是不安全的,如果是一個內部值,則通常是一個安全值。 

          03 主要貢獻

          幫助程序員檢查大量源代碼中的危險操作,通過靜態分析將源代碼模糊地解析為令牌序列,然后通過神經網絡模型提取這些令牌之間的關系,來識別鏈表的操作是否符合安全規范,包括節點的增加、節點的刪除、節點數據的賦值或修改。并解決了以下問題:

          (1)如何識別鏈表操作。

          (2)如何對細粒度鏈表上的操作進行分類。

          (3)如何檢查鏈表操作的規范。

          04 實驗結果總結

          本文從GitHub開源社區收集了兩個數據集,DATA-BIN(二進制分類)和DATA-MULTI(三種分類)。DATA-BIN的數據為函數粒度,包括4030個鏈表操作和19945個非鏈表操作。DATA-MULTI的粒度更細,增加6352個節點,刪除3896個節點,分配或修改3600個節點數據。在DATA-BIN上,BLSTM被用作基線模型。在DATA-MULTI上,使用Conv1d作為基線模型。此外,本文還為這個多分類模型定義了幾個評估指標。表示基于類別的不同指標的平均值,表示基于每個類別數量的不同指標的平均值。評價結果見表1。

        表1 DATA-BIN和DATA-MULTI的評價結果


        責任編輯:施惠文

        文章中觀點僅代表作者個人觀點,不代表本網站的觀點和看法。

        神州學人雜志及神州學人網原創文章轉載說明:如需轉載,務必注明出處,違者本網將依法追究。

        欧洲最新无极品合集

        <delect id="1g9jo"><noframes id="1g9jo"><i id="1g9jo"><nobr id="1g9jo"><acronym id="1g9jo"></acronym></nobr></i><strike id="1g9jo"><dfn id="1g9jo"></dfn></strike>

      2. <b id="1g9jo"><small id="1g9jo"><dl id="1g9jo"></dl></small></b>
          <tt id="1g9jo"><small id="1g9jo"></small></tt>
        <tt id="1g9jo"><small id="1g9jo"></small></tt>
        <tt id="1g9jo"><address id="1g9jo"></address></tt>

        1. <b id="1g9jo"></b>