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

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

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

在前面的文章中,我們為讀者深入介紹了如何利用CodeQL提供的標準類來分析Python項目中的函數、語句、表達式和控制流。在本文中,我們將為讀者介紹如何分析數據流,以及如何進行污點跟蹤和指向分析。
概述
首先,什么是污點跟蹤呢?簡單來說,就是分析代碼運行過程中,可能存在安全隱患或“受污染”的數據的流動情況。其次,污點跟蹤有什么作用呢?作用就很多了,比如,我們可以通過污點跟蹤來查明下列情況:用戶控制的輸入是否存在被惡意利用的隱患?危險的參數是否會傳遞給易受攻擊的函數?機密或敏感的數據是否存在被泄漏的風險?除此之外,在進行其他類型的安全分析過程中,還可以通過這種方法來跟蹤各種非法的、不安全或不可信的數據。
污點跟蹤與基本數據流的不同之處在于,除了進行“常規的”數據流分析之外,它還考慮到了在不保留值(non-value-preserving)的情況下的數據流分析。例如,在賦值語句dir = path + "/"中,如果path被污染了,那么dir也將被污染,即使從path到path + "/"之間沒有數據流動。
對于不同的語言,包括C/C++、C#、Java和JavaScript語言,CodeQL平臺都為其提供了獨立的、用于處理其“常規”數據流和污點跟蹤的庫。通過在查詢中導入相應的庫,我們就可以訪問相應的類和謂詞,以便處理這些數據流模式。在分析Python代碼的時候,我們也可以使用相同的污點跟蹤庫來分析“常規的”數據流和污點流,同時,我們也可以通過定義額外的數據流屬性來區分保留值和不保留值的情況下的處理方法。
污點跟蹤與數據流分析
其實,污點跟蹤庫位于TaintTracking模塊中。另外,用于污點跟蹤或數據流分析的所有查詢都具有三個顯式組件(其中一個是可選的),以及一個隱式組件。這些顯式組件包括:
1. 一個或多個可能存在不安全數據的源點,它們由TaintTracking::Source類表示。
2. 由TaintTracking::Sink類表示的一個或多個數據或污點可能流向的接收點。
3. 零個或多個清洗器,由Sanitizer類表示。
在數據從源點流向接收點的過程中,如果沒有遭到清洗器的攔截的話,用于污點跟蹤或數據流分析的查詢就會返回相應的分析結果。
這三個組件是通過TaintTracking::Configuration綁定在一起的,以便明確特定查詢與哪些源點和接收點相關。
最后一個隱式組件是污點的“kind”,由TaintKind類表示。污點的類型決定了,除了執行內置的、針對“保留值”的處理之外,還執行哪些針對“非保留值”的分析步驟。例如,對于上面講過的 dir = path + "/",當污點表示字符串的時候,則污點數據會從path流向dir,但如果污點為None的話,則不會出現這種情況。
污點跟蹤的局限性
盡管污點跟蹤是一種強大的技術,但值得注意的是,它嚴重依賴于底層的數據流圖。然而,要想創建一個準確且覆蓋率又高的數據流圖,卻是一個非常大的挑戰,特別是對于像Python這樣的動態語言來說。此外,調用圖通常也不是很完整的,代碼的可達性也很難精確測量,而某些結構,比如eval函數,由于動態性太強了,所以很難進行分析。
利用污點跟蹤分析Python代碼
一個簡單的污點跟蹤查詢的基本形式如下所示:
/**
 * @name ...
 * @description ...
 * @kind problem
 */
 
import semmle.python.security.TaintTracking
 
class MyConfiguration extends TaintTracking::Configuration {
 
    MyConfiguration() { this = "My example configuration" }
 
    override predicate isSource(TaintTracking::Source src) { ... }
 
    override predicate isSink(TaintTracking::Sink sink) { ... }
 
    /* optionally */
    override predicate isExtension(Extension extension) { ... }
 
}
 
from MyConfiguration config, TaintTracking::Source src, TaintTracking::Sink sink
where config.hasFlow(src, sink)
select sink, "Alert message, including reference to [email protected]", src, "string describing the source"
作為一個虛構的示例,這里的查詢代碼想要查找從HTTP請求到名為“unsafe”的函數的數據流。當然,這些源點都是預定義好的,讀者可以通過導入semmle.python.web.HttpRequest庫來訪問它們。此外,接收點則可以通過一個定制的TaintTracking::Sink類來進行定義。
/* Import the string taint kind needed by our custom sink */
import semmle.python.security.strings.Untrusted
 
/* Sources */
import semmle.python.web.HttpRequest
 
/* Sink */
/** A class representing any argument in a call to a function called "unsafe" */
class UnsafeSink extends TaintTracking::Sink {
 
    UnsafeSink() {
        exists(FunctionValue unsafe |
            unsafe.getName() = "unsafe" and
            unsafe.getACall().(CallNode).getAnArg() = this
        )
    }
 
    override predicate sinks(TaintKind kind) {
        kind instanceof StringKind
    }
 
}
 
class HttpToUnsafeConfiguration extends TaintTracking::Configuration {
 
    HttpToUnsafeConfiguration() {
        this = "Example config finding flow from http request to 'unsafe' function"

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

【聲明】:黑吧安全網(http://www.650547.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        安徽快3自由的百科 上海快三今天走势图爱彩乐 美国股票代码查询 黑龙江快乐十分一定牛 天津时时彩历史开奖 重庆幸运农场专家预测 广东十一选五买的人多吗 今天体彩p3图谜总汇 澳门五分彩定位胆技巧 浙江6+1开奖号码是多少 银行理财