Multiplier作為代碼審計效率倍增器,通過構建多維度代碼表示和持久化數據庫,解決傳統索引器在C/C++代碼分析中的語義深度不足問題。其核心架構圍繞三大支柱展開:索引器組件、跨語言API層和多樣化工具鏈,三者通過統一的實體ID系統實現無縫協同,使開發者能夠在不同抽象層級間自由導航。

索引器:突破傳統的多表徵存儲引擎

Multiplier索引器(mx-index)通過解析編譯命令數據庫(compile_commands.json),將構建產物轉化為包含AST節點、宏展開、MLIR中間表示的SQLite數據庫。與傳統索引器僅存儲file:line:column位置不同,該組件為每個代碼實體分配64位唯一ID,實現了從源代碼到機器碼的全鏈路追蹤。

核心技術特性

  • 多表徵存儲:同時保存源代碼令牌(Token.h)、Clang AST節點(Entity.h)和MLIR中間表示(SourceIR.h)
  • 環境保真:通過--env參數導入構建時環境變量,確保編譯器行為精確復現
  • 增量處理:支持大型項目分步索引,通過combine_compile_commands.py合併分散的編譯命令片段

雲幫系列文章:核心組件介紹 -_索引器

圖1:索引器生成的令牌依賴圖,展示宏展開與源代碼的關聯關係

性能優化策略

索引過程採用雙模式執行架構:

  • --reproc_mode:使用reproc庫實現輕量級進程管理
  • --fork_mode:傳統fork+exec方式,兼容Docker等受限環境

典型C項目索引耗時約為編譯時間的30倍,C++項目因模板實例化複雜度可能達到300倍,但通過工作區目錄(--workspace)的RocksDB緩存可顯著提升重複分析效率。

API層:多語言訪問的統一接口

Multiplier提供C++和Python雙API接口,通過實體ID系統實現"從任何點到達任何點"的代碼導航能力。API設計鏡像Clang的AST接口,使熟悉編譯器開發的用户能快速上手。

C++核心接口

  • 實體查詢:EntityProvider.h定義實體檢索接口,支持按ID、名稱或類型查詢
  • 類型系統:Type.h實現完整的C++類型系統,支持typedef展開和cv限定符分析
  • 交叉引用:Reference.h提供實體間調用、繼承、使用關係的遍歷方法

Python腳本綁定

Python綁定模塊提供高層分析能力,如:

# 查找所有調用特定函數的AST節點
from multiplier import Database
db = Database("openssh.db")
func = db.find_entity_by_name("ssh_packet_read")
for caller in func.callers():
    print(f"Call at {caller.location()} in {caller.file().name()}")

工具鏈:面向安全分析的專業套件

基於核心API構建的工具集覆蓋從代碼瀏覽到安全分析的全流程需求,特別優化了C/C++項目的複雜場景處理。

關鍵工具示例

  1. 調用圖分析:mx-print-call-graph生成交互式調用關係圖,支持跨編譯單元追蹤

雲幫系列文章:核心組件介紹 -_索引器_02

圖2:OpenSSH認證流程的可達性分析結果,紅色節點表示潛在危險函數

  1. 類型聚類分析:GroupFunctions.py實現函數簽名聚類,自動識別相似功能的函數組:
// 自動識別的同類型函數示例
static int g_lstat(Char *fn, struct stat *sb, glob_t *pglob)
static int g_stat(Char *fn, struct stat *sb, glob_t *pglob)
  1. 污點分析:mx-taint-entity追蹤數據流傳播路徑,支持從用户輸入到敏感操作的全鏈路分析

雲幫系列文章:核心組件介紹 -_工具鏈_03

圖3:污點分析日誌展示用户輸入數據如何傳播至加密函數

協同架構:構建安全分析閉環

三大組件通過共享數據庫實現無縫協作:索引器生成基礎數據,API層提供標準化訪問,工具鏈則針對特定分析場景實現高級功能。這種架構特別適合安全分析工作流:

  1. 使用web-browser探索代碼庫,通過右鍵菜單觸發交叉分析
  2. 發現可疑模式後,調用mx-harness提取最小化測試用例
  3. 通過Python API編寫自定義規則,批量檢查相似代碼模式

雲幫系列文章:核心組件介紹 -_API_04

圖4:引用關係圖展示組件間數據流向,圓圈大小表示實體引用次數

實戰應用:OpenSSH安全分析案例

在OpenSSH變體分析中,Multiplier工具鏈展現了獨特優勢:

  • mx-find-linked-structures自動識別雙鏈表結構,發現use-after-free缺陷
  • mx-print-reference-graph生成密鑰交換函數的調用上下文,定位邏輯缺陷

完整分析流程文檔參見openssh-variant-analysis.md,其中包含如何利用mx-taint-entity追蹤信號處理函數中的數據競爭問題。

擴展指南:構建自定義分析工具

開發者可基於現有組件快速擴展功能:

  1. 新工具開發:參考mx-list-functions實現模式,使用EntityProvider訪問索引數據
  2. UI集成:通過WebBrowser.py的NiceGUI界面框架,添加自定義可視化組件
  3. 分析插件:擴展GroupFunctions.py的類型比較邏輯,支持協變返回類型等高級場景

總結與展望

Multiplier通過創新的實體ID系統和多表徵存儲,突破了傳統代碼索引器的語義瓶頸。其架構特別適合處理C/C++項目的複雜場景,如宏密集型代碼、模板元編程和跨編譯單元分析。隨着LLVM IR支持的完善(llvm.cmake),未來將實現從源代碼到彙編的全棧安全溯源能力。