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

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

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

前面的文章中,我們介紹了QL語言的基礎知識,接下來,我們將與讀者一起學習如何利用CodeQL平臺查找Python項目中的安全漏洞變種。在本文中,我們將為讀者介紹如何利用查詢控制臺分析Python代碼,以及用于分析Python代碼的CodeQL庫的知識點。
基于CodeQL的漏洞變種分析
前面說過,CodeQL是一種代碼分析引擎,在它的幫助下,我們可以根據已知的安全漏洞,在其他源代碼中查找相似的安全問題,這個過程就是我們常說的變種分析。通常情況下,安全工程師可以通過變種分析識別多個項目中潛在的安全漏洞,并及時給以修復。
實際上,CodeQL平臺不僅能夠對多個代碼庫(限于同一種語言編寫的代碼倉庫)進行分析,同時也支持對多種編程語言編寫的代碼進行變種分析,例如C/C++、Java、Python等等。在前面的文章中,我們通過一些示例介紹了QL語言的數據類型、謂詞、類以及遞歸等基礎概念,接下來,我們將介紹如何利用CodeQL平臺對特定的編程語言進行安全漏洞變種分析。
在本文中,我們將為讀者介紹如何利用CodeQL平臺查找Python代碼中的漏洞變體。
利用查詢控制臺分析Python項目
對于特定的編程語言來說,我們可以同時分析一個或多個用該語言編寫的代碼項目。下面,我們將一個簡單的CodeQL查詢示例,來演示如何對Python項目進行分析。具體來說,這里做的事情,就是找出只包含pass語句的if語句——實際上,這些代碼都是多余的,下面是一個具體的例子:
if error: pass
運行查詢代碼
首先,打開查詢控制臺,地址為https://lgtm.com/query。然后,從Language下拉列表中選擇Python,然后從Project下拉列表中選擇要查詢的一個或多個項目。接著,將以下查詢代碼復制到查詢控制臺的文本框中:
import python
 
from If ifstmt, Stmt pass
where pass = ifstmt.getStmt(0)
  and pass instanceof Pass
select ifstmt, "This 'if' statement is redundant."
這時,LGTM會自動編譯查詢代碼,并檢查是否存在語法錯誤;如果一切正常的話,“Run”按鈕將變成綠色的,表示查詢代碼已經通過了編譯,可以運行了,具體如下圖所示:

單擊“Run”按鈕,查詢就會開始運行,運行結束后,原來的按鈕會變成一個紫色的“View results”按鈕。點擊這個按鈕,我們就可以看到查詢代碼返回的結果了:

如您所見,結果通常展示在項目名稱下面。這里的查詢結果分為兩列,分別對應于查詢的select子句中的兩個表達式。第一列對應于表達式ifstmt,并鏈接到項目源代碼中ifstmt所在的位置。第二列是警報消息。結果底部的省略號(…)表示有更多的結果可用,單擊它就會顯示更多的結果。
如果返回的結果數量不為0,單擊ifstmt列中的相關鏈接,就會在代碼查看器中顯示符合要求的If語句。

我們可以看到,匹配的if語句在代碼查看器中會以黃色背景突出顯示。
查詢代碼的組成結構
現在,我們來解釋一下這個查詢中的組成部分。首先,是一個import語句,其作用是導入相應的標準庫。在此之后,這個查詢還包含三個語句,它們的作用與 SQL查詢中的FROM、WHERE和SELECT子句的作用基本相同。
下面,我們進行逐行解讀:
import python
這一行代碼的作用是,導入用于分析python代碼的標準查詢庫。注意,每個查詢的開頭部分都會有一個或多個import語句。
from If ifstmt, Stmt pass
這個from子句的作用是定義了兩個變量,一個是變量叫做ifstmt,其類型為If,表示Python語言中的if語句;另一個變量是叫做pass,其類型為Stmt,表示一個語句。實際上,定義變量的一般形式為:
where pass = ifstmt.getStmt(0) and pass instanceof Pass
這個where子句定義了一個邏輯表達式。其中,pass = ifstmt.getStmt(0)表示pass是if語句體中的第一條語句;pass instanceof Pass的含義是變量pass中保存的是一個pass語句;而and是一個邏輯連接詞,表示前后的判斷必須同時成立,則整個判斷才能成立。換句話說,這個表達式的含義是if語句體中的第一個語句就是一個pass語句。
select ifstmt, "This 'if' statement is redundant."
這里的select子句的作用是,規定要顯示匹配項的哪些內容。就本例來說,就是顯示符合要求的if語句,并給出一個解釋性的文本,也就是上面的字符串。一般來說,用于查找不良編碼實踐實例的查詢的select語句總是采用以下形式:
select
改進現有的查詢
通常來說,查詢的編寫過程就是一個迭代的過程。例如,剛開始的時候,我們編寫了一個簡單的查詢,通過運行,可能會發現以前沒有考慮過的情況,或需要改進的地方,然后,著手進行修改,再次運行,如果有必要,繼續進行修改,依此類推。
消除假陽性結果
如果仔細瀏覽上面查詢返回的結果,就會發現我們的代碼還有待改進,因為返回的結果中存在一些帶有else分支的if語句,雖然這些語句的第一個分支為空,但是then分支確實是有實際用途的,所以,這些if語句根本就不是多余的。例如:

這些語句的的一般形式為:
if cond():
  pass
else:
  do_something()
像這樣的結果,雖然then分支為空,但是else分支是有用的,這里將其判定為多余的if語句,就是通常所說的假陽性。為此,我們可以進一步修改查詢代碼:對于帶有else分支的if語句,即使其then分支為空,也不將其歸類為多余的if 。

[1] [2] [3]  下一頁

【聲明】:黑吧安全網(http://www.650547.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        安徽快3自由的百科 如何投资理财 今日上证指数是多少点了 安徽快3开奖结果查询 平特一肖怎么才是中奖 哪些时时彩平台是真的 体彩福建31选7第20022期 炒股如何开户手机 贵州快三走势图一定牛 好股票推荐软件 时时彩龙虎计划软件