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

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

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

前面的文章中,我們為讀者簡單介紹了如何利用查詢控制臺分析Python代碼,以及用于分析Python代碼的CodeQL庫。在本文中,我們將為讀者深入介紹如何利用CodeQL提供的標準類來分析Python項目中的函數、語句、表達式和控制流。
函數分析
在前面的文章中,我們簡單的介紹了一下標準的CodeQL類Function,下面,我們開始通過示例進行深入的講解。
查找所有名為“get ...”的函數
在這個例子中,我們要找出程序中的所有“getter”函數。眾所周知,對于剛剛從Java語言轉換到Python語言的程序員來說,往往會習慣性地編寫getter和setter方法,而不是使用屬性。有時候,我們可能需要找出這些方法,那該怎么辦呢?很簡單,利用成員謂詞Function.getName(),就能輕松找到數據庫中的所有getter函數,具體代碼如下所示:
import python
 
from Function f
where f.getName().matches("get%")
select f, "This is a function called get..."
上面的代碼并不復雜,其中where f.getName().matches("get%")的含義是,這里要找的函數的名稱與字符串"get%"匹配;而"get%"表示以get開頭的字符串,因為%在這里是一個通配符,表示其他字符。代碼的運行結果如下所示:

如圖所示,這里找到了大量的其名稱以get開頭的函數,不過,其中許多函數都不是我們要找的getter函數。
查找所有名為“get ...”的方法
為了讓查詢返回我們真正感興趣的內容,需要對上面的查詢稍作修改。由于這里只對“方法”感興趣,所以,我們可以通過Function.isMethod()謂詞來改進我們的查詢代碼。
import python
 
from Function f
where f.getName().matches("get%") and f.isMethod()
select f, "This is a method called get..."
上述代碼的查詢結果如下所示:

我們發現,這里返回的方法的名稱都是以“get”開頭的,但是,仍然有許多不是要找的目標方法。
查找所有名為“get…”的單行方法
我們可以進一步修改查詢,使其只返回函數定義中只有一條語句方法。為此,我們可以通過統計每個方法中的代碼行數來做到這一點,具體代碼如下所示:
import python
 
from Function f
where f.getName().matches("get%") and f.isMethod()
 and count(f.getAStmt()) = 1
select f, "This function is (probably) a getter."
其中,count(f.getAStmt()) = 1表示函數的定義中只包含一條語句,其他代碼非常簡單,這里就不多說了。上述代碼的運行結果如下所示:

如您所見,這次返回的結果明顯減少了,但是,其中的許多方法仍然不是我們要找的getter方法。因此,該查詢代碼還需做進一步的調整,具體將在后文中詳細介紹。
查找針對特定函數的調用
下面,我們要通過Call 和Name這兩個類來查找對函數eval的調用,因為這個函數經常會帶來安全隱患,具體代碼如下所示:
import python
 
from Call call, Name name
where call.getFunc() = name and name.getId() = "eval"
select call, "call to 'eval'."
其中,call.getFunc() = name and name.getId() = "eval"表示調用的函數的名稱為eval。此外,Call類表示Python程序中的調用,而謂詞getfunc()則用于獲取被調用的表達式。而謂詞getid()則用于獲取名稱表達式的標識符(字符串)。上述代碼的運行結果如下所示:

由于Python的動態特性,該查詢將返回具有eval(...) 形式的所有調用,無論它是否是對內置函數eval的調用。在后文中,我們將介紹如何使用類型推斷庫來查找對內置函數eval的調用。
上面,我們介紹了如何利用查找滿足特定條件的函數和調用,接下來,我們開始介紹如何從語句和表達式的角度來分析Python代碼。
語句與表達式分析
語句
對于Python程序來說,大部分的代碼都是某種語句的形式出現的。因此,對于Python中各種類型的語句,CodeQL都提供了相應的類來加以表示。
下面是這些類的層次結構:
Stmt類 —— 語句
· Assert類 —— assert語句
· Assign類
* AssignStmt類 —— 賦值語句,如x = y
* ClassDef —— 類定義語句
* FunctionDef —— 函數定義語句
· AugAssign —— 增量賦值(augmented assignment)語句,如x += y
· Break類 —— break語句
· Continue類 —— continue語句
· Delete類 —— del語句
· ExceptStmt類 —— try語句的except部分
· Exec類 —— exec語句
· For類 —— for語句
· Global類 —— global語句
· If類 —— if語句
· ImportStar類 —— from xxx import * 語句
· Import類 —— 其他類型的import語句
· Nonlocal類 —— nonlocal語句

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

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 3d开机号牛彩网 4887铁算开奖结果果 小说 兴动哈尔滨麻将官3011 湖南快乐十分开奖直 26选5开奖1031期 前av女优苍井空内地夜店捞金 拉萨酒店按摩全套 微乐棋牌龙江麻将 5分3D软件 意甲赛程直播cctv 516棋牌中心 豪利棋牌安卓版下载 快3开奖结果和 广西十一选五推荐 5分3D下载 印尼足球指数