歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

代碼分析平臺CodeQL學習手記(三)

來源:本站整理 作者:佚名 時間:2020-01-22 TAG: 我要投稿

在上一篇文章中,我們為讀者介紹了CodeQL平臺相關的基本概念,并演示了如何編寫和運行簡單的QL程序。在本文中,我們將為讀者介紹項目數據庫的創建過程,以及如何借助數據庫分析項目代碼。
數據庫概述
在前面的文章中,我們已經編寫過一些非常簡單的QL代碼,也就是通常所說的查詢,接下來,我們將介紹如何借助于CodeQL庫來分析項目中的代碼。實際上,在之前的查詢過程中,LGTM已經自動生成一個描述項目代碼的數據庫,因此,我們就可以直接通過QL代碼來查詢這個數據庫了。接下來,我們就一起了解一下這個數據庫的創建過程。
數據庫的創建
實際上,在每次向存儲庫(repository)提交(commit)修改時,LGTM都會為其生成一個數據庫。下面,我們先來解釋這句話中的三個關鍵詞。這里的“存儲庫”,可以簡單粗暴地理解為一個存放項目中的文件夾、文件、圖像、視頻、電子表和數據集等資源的地方。而所謂的“提交”,就是保存對所做的修改;并且每次提交修改時,都可以添加相應的描述信息,以指出這次做了哪些修改,以及為什么做這些改變,等等。另外,這里所說的“數據庫”,其實就是一個關系數據庫,用于描述代碼庫在特定的瞬間,如進行某次修訂或某次快照時的結構,其中包括代碼的抽象語法樹(AST),以及代碼庫的其他有用信息。
數據庫的創建分為兩步:
· 數據的提。簩⒃创a文件轉換為代碼所定義的底層層次結構。對于編譯型語言來說,這一步需要編譯源代碼。
· 數據的導入:將提取的所有數據導入到數據庫中,以便查詢之用。
提取數據
LGTM首先會確定出哪些文件需要進行處理,然后,根據文件中的源代碼所使用的編程語言來確定相應的“提取器(extractor)”,并將源文件轉換為關系表示形式,即所謂的“陷阱(trap)”文件。
確定要分析的文件
對于像Java這樣的編譯型語言來說,在確定要分析的文件時,LGTM是通過運行和監視構建過程來完成的——監聽系統調用,并檢測對編譯器的調用情況。然后,利用相應的提取器處理構建過程中用到的所有源文件。
對于像Python和JavaScript這樣的解釋型語言來說,可以直接使用提取器來處理源代碼樹中的文件,解析它們的依賴關系,以給出準確的代碼庫表示形式。
提取數據
提取器會將上一步確定出來的每個源文件都轉換為一種關系表示形式,即“陷阱”文件。例如,對于Java源代碼來說,提取器會為每個.java文件生成一個.trap文件,就像編譯器會為每個.java文件生成一個.class文件一樣。

導入數據
與把.class文件打包成.jar文件類似,當數據收集的工作完成后,提取器也會把上一步中生成的所有.trap文件導入到描述“整個”程序的數據庫中。完成數據的導入工作后,提取器會創建一個“快照”。需要注意的是,這個快照由兩部分組成,即數據庫和所分析的所有源文件的副本。這樣一來,LGTM就能夠直接通過源代碼文件來展示查詢結果了。
該處理方式的優點
這種處理方式有兩個優點,一個是準確,二是簡潔。
為什么準確性高呢?因為對于每種編程語言(如果支持的話),都提供了一個單獨的提取器,而非使用一個通用的提取器,從而確保了分析盡可能的準確——這是因為:
· 不同的編程語言之間可能存在顯著的差別,因此,需要使用截然不同的處理方法。
· 適應不同編程語言之間的細微差異——例如,同樣是繼承的概念,在c++和Java之間卻存在一定的差異。
同時,每種語言都使用自己特有的數據庫模式。每種模式都規定了相應的方法表、表達式表,等等——每種語言結構都對應于一個表。在這里,我們稍微解釋一下數據庫模式,它是一個比較抽象的數據庫概念,為了便于理解,可以做一個簡單的類比——如果將數據庫比作一個倉庫的話,那么,模式就是倉庫中的一個貨架,并且每個貨架分為多層,每層就對應于數據庫中的一個表。
此外,由于提取器擁有編譯器可用的全部信息,比如類路徑等,所以,它能夠將符號與其定義精確地綁定在一起。這種準確性對于跨編譯單元邊界的深度非本地分析而言是非常關鍵的。例如,通過傳播受污染的數據來挖掘XSS之類的安全漏洞時,這種準確性就是至關重要的。
為了便于讀者理解,我們這里舉一個簡單的例子。請考慮以下Java查詢:當我們調用x.equals(y)時,變量x的類型(假設為T1類型)和變量y的類型(假設為T2類型)應該是兼容的。也就是說,類型T1和類型T2在繼承層次結構中應該具有公共的子類型。
實際上,用于檢查這種安全問題的查詢是非常有效的,幾乎可以在所有大型的Java代碼庫中都找到了真實存在的漏洞。為了挖掘這種類型的安全漏洞,要求安全分析人員能夠正確地理解繼承的層次結構。當然,您也可以嘗試部分地處理繼承層次結構,但是這將要求您重新實現Java編譯器。
上面介紹了這種處理方式的準確性,下面我們再來談談其簡單性。
無論處理什么樣的數據,底層數據庫平臺和查詢語言都是相同的。這里創建的數據庫也是一種通用的關系數據庫,只不過針對軟件工程中的數據類型進行了相應的優化而已:
· 它提供了遞歸的有效實現,當我們需要深入了解層次結構和圖結構(這里的圖是只圖論里討論的圖),就需要借助于遞歸操作。
· 由于針對原始數據編寫查詢是一件非常繁瑣的事情(例如,C++語言的數據庫模式規定了160多個表),因此,CodeQL平臺提供了一種面向對象的機制,以便將視圖從物理數據布局中抽象出來,并且是在不增加運行時成本的情況下實現抽象的。
此外,對于許多常用的操作,CodeQL已經提供了豐富的代碼庫加以支持,從而減輕了使用者的負擔。這些內容,我們將在后面的文章中加以介紹。
通過查詢數據庫分析代碼
在之前的示例代碼中,我們只是簡單介紹了一些基本數據類型的用法,這個過程中,雖然我們也選擇了要分析的項目,可實際上并未用到這些項目所對應的數據庫。下面的示例代碼中,我們將切實用到這些數據庫,并以便幫助大家進一步了解CodeQL的功能作用。

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.650547.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        安徽快3自由的百科 体彩11选5最聪明的玩法 二分pk10人工计划软件 青海体彩十一选五怎么玩 青海省十一选五今日走势图 辽宁快乐12遗漏号 北京快3形态一定牛 喜乐彩票是正规的吗 今晚快乐双彩开什么号 股市行情大盘k线图 安徽省福彩快3走势图