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++項目的複雜場景處理。
關鍵工具示例
- 調用圖分析:mx-print-call-graph生成交互式調用關係圖,支持跨編譯單元追蹤
圖2:OpenSSH認證流程的可達性分析結果,紅色節點表示潛在危險函數
- 類型聚類分析: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)
- 污點分析:mx-taint-entity追蹤數據流傳播路徑,支持從用户輸入到敏感操作的全鏈路分析
圖3:污點分析日誌展示用户輸入數據如何傳播至加密函數
協同架構:構建安全分析閉環
三大組件通過共享數據庫實現無縫協作:索引器生成基礎數據,API層提供標準化訪問,工具鏈則針對特定分析場景實現高級功能。這種架構特別適合安全分析工作流:
- 使用web-browser探索代碼庫,通過右鍵菜單觸發交叉分析
- 發現可疑模式後,調用mx-harness提取最小化測試用例
- 通過Python API編寫自定義規則,批量檢查相似代碼模式
圖4:引用關係圖展示組件間數據流向,圓圈大小表示實體引用次數
實戰應用:OpenSSH安全分析案例
在OpenSSH變體分析中,Multiplier工具鏈展現了獨特優勢:
- mx-find-linked-structures自動識別雙鏈表結構,發現use-after-free缺陷
- mx-print-reference-graph生成密鑰交換函數的調用上下文,定位邏輯缺陷
完整分析流程文檔參見openssh-variant-analysis.md,其中包含如何利用mx-taint-entity追蹤信號處理函數中的數據競爭問題。
擴展指南:構建自定義分析工具
開發者可基於現有組件快速擴展功能:
- 新工具開發:參考mx-list-functions實現模式,使用EntityProvider訪問索引數據
- UI集成:通過WebBrowser.py的NiceGUI界面框架,添加自定義可視化組件
- 分析插件:擴展GroupFunctions.py的類型比較邏輯,支持協變返回類型等高級場景
總結與展望
Multiplier通過創新的實體ID系統和多表徵存儲,突破了傳統代碼索引器的語義瓶頸。其架構特別適合處理C/C++項目的複雜場景,如宏密集型代碼、模板元編程和跨編譯單元分析。隨着LLVM IR支持的完善(llvm.cmake),未來將實現從源代碼到彙編的全棧安全溯源能力。