Kate Li (Taiwan)的部落格

首頁

介紹rips分析引擎

作者 sebastiani 時間 2020-02-25
all

在今天的帖子中,我們想分享一些關於我們的靜態程式碼分析引擎RIPS的見解,這些RIPS檢測到了前面和即將到來的行事曆禮物中描述的安全性漏洞。這臺發動機歷史悠久,歷經幾代才達到現時的效能。在您按一下掃描按鈕並彈出第一個漏洞報告後的幾秒鐘內,它實際上做了什麼?

歷史

2007-2009年

近10年前,一個簡單的PHP掃描器是在大學團隊的流行獲取旗幟(CTF)攻擊戰中開發的。掃描器基於規則運算式並識別用戶輸入之間的簡單連接,這些輸入首先分配給變數,然後用於PHP程式碼的關鍵操作。它可以用於分析CTF事件中的小應用程序,但很快就發現規則運算式不足以徹底解析程式設計語言。

1 2 3 // this examples confuses even the syntax highlighter of our blog $var = rips1("rips2(/* rips3())", rips4("*/")); // the function rips1() and rips4() is called, rips2() within a string is not

2009-2012年

使用標記器是朝著正確方向邁出的第一步。開發了一個新工具,該工具首先按照正式的PHP語法將PHP程式碼折開為單個標記,然後得到更精確的分析結果。這個工具被命名為RIPS,在PHP安全(MOPS)月發佈。今天,它是世界上許多領先公司用於安全稽核的最流行的開源PHP分析工具。然而,開源版本的主要缺點是,大量誤報和缺少對分析每個現代PHP應用程序中使用的面向對像程式碼的支持。

1 2 3 4 5 6 7 class Text { public function __construct($data) { $this->data = $data; } } $t = new Text($_POST['data']); echo $t->data; // XSS

2012-2016年

為了克服這些限制,從頭開始構建了一個新的分析引擎,該引擎利用了過去幾年的工程經驗教訓。解决了動態PHP語言及其特性的挑戰,並通過使用專門為PHP語言設計的新方法改進最先進的靜態程式碼分析科技,開創了使用面向對像PHP程式碼對大型web應用程序進行有效分析的先河。到目前為止,RIPS是唯一一個從一開始就專注於PHP分析的SAST工具,囙此能够以高精度檢測甚至複雜的漏洞類型。

工作原理

當新引擎指向程式碼存儲庫時,它會在初始分析階段將所有PHP程式碼轉換為圖形表示。為此,將程式碼折開為單個標記,構建抽象語法樹並將其劃分為塊,然後將這些塊連接到帶注釋的控制流圖。現在可以在這個抽象模型的基礎上分析資料流程。在污點分析的幫助下,通過跟踪整個圖形模型中每個輸入的資料流程,可以檢測到在應用程序的安全關鍵操作中未經初始化使用的用戶輸入。源污染匯的概念可以應用於許多不同的漏洞類型,例如跨網站腳本(XSS)和SQL注入。

例子

在下麵,我們將看到一個簡單的示例代碼及其分析。我們跳過了程式間(函數、方法)、約束或對象敏感分析產生的所有障礙。該示例將演示為什麼需要專門關注PHP及其特性,以便檢測和驗證安全性漏洞。

1 2 3 4 5 6 7 8 9 $id = $_POST['id']; if(...) { $id = (int)$id; } else { $id = htmlentities($id); } echo "<div id='$id'>"; // XSS

程式碼在第8行中包含一個XSS漏洞,因為第1行中的用戶輸入/源($_POST['id'])流入敏感的接收器回顯。在此期間,將應用輸入清理,這需要進一步的分析。在初始分析階段,由引擎分析程式碼並對其進行標記化。它標識不同的分支(if/else),並相應地將程式碼分成不同的塊。然後,這些塊連接到帶有標記邊的控制流圖。

$_POST['id'] echo if else

對圖中的每個塊進行敏感匯分析。在我們的示例中,在最後一個塊(紅色邊框)中檢測到echo運算子。此時,引擎調用一個專門用於接收器標記的標記解析器-例如,HTML。我們的HTML標記解析器能够精確定位HTML中動態內容的確切位置。它檢測到變數$id位於HTML元素的單引號内容中。這一資訊非常重要,因為現在我們知道攻擊者需要什麼才能脫離内容並注入惡意的HTML:他需要一個引號。

echo $id '

接下來,引擎解析前一個塊的sink echo參數。變數$id在左塊中查找,其中類型轉換可防止任何攻擊並停止跟踪。然後,在右邊的塊中查找變數。這裡,PHP內寘函數htmlentities()用於清理$id。引擎對該內寘函數執行完整的類比,並檢測到在沒有附加參數的情况下,只有“,<,和>字元編碼為HTML實體。如果沒有這種特定於PHP的精度,前幾代以及其他方法將在此時停止跟踪,並經常將htmlentities()作為XSS消毒劑列出白名單。相反,我們的引擎在類比過程中準確地學習哪些字元受到影響,並將跟踪從右塊繼續到圖中的第一個塊。這裡,變數$id映射到一個$POST源。

echo $id htmlentities() $id " < > htmlentities() $id $_POST

最後,我們的引擎可以合併所有收集到的資訊,並决定源$_POST['id']沒有針對單引號進行清理,並使用單引號作為分隔符號污染HTML内容id。由於清理不足,攻擊者可以執行跨網站腳本攻擊,並發出包含以下事實的漏洞報告。此外,可以根據漏洞類型、其標記上下文、源類型和任何現有安全機制對嚴重性進行微調。

$_POST['id'] id

跨網站腳本(單引號内容)

嚴重性:中等,CWE:79,OWASP前10名:A3,SAN 25排名:4

1 2 3 4 5 $id = $_POST['id']; ⋮ $id = htmlentities($id); ⋮ echo "<div id='$id'>";

重建的HTML上下文

1 <div id='$_POST['id']'>

摘要

PHP環境在過去幾年中發生了變化,SAST工具的需求也發生了變化。不同的語言特性和特性,以及更具安全意識的開發人員和不斷增長的程式碼大小,導致了更複雜的應用程序。靜態程式碼分析必須是先進的,以便跟上這些挑戰,自動檢測安全問題。

在這篇文章中,我們瀏覽了RIPS分析引擎的內部工作,以及與前幾代相比的一些關鍵進展。我們希望我們提供了一些對程式碼分析世界的見解,這將有助於理解我們即將發佈的漏洞帖子的背景。如果您想與靜態分析領域的頂尖專家合作,我們目前正在招聘,並期待與您取得聯系。

在推特上關注我們,當我們的降臨行事曆的下一個禮物打開時,我們會得到通知!

APAV時間表

免責聲明:此處提供的資訊僅用於教育目的。您有責任遵守所有適用的地方、州和聯邦法律。RIPS Technologies GmbH不對直接或間接使用所提供資訊造成的任何誤用或損害承擔任何責任。