章节摘要:第 06 章的两台引擎各自封闭:semgrep 活在规则文件里,CodeQL 活在数据库里。本章引入第三种表达——代码属性图(CPG):把 AST 的结构、CFG 的流向、PDG 的依赖融合成一张可查询的图,代表平台是 Joern(约 3.6k stars,Apache-2.0,Scala 实现)。7.1 节讲清三张旧地图各自的盲区,以及「一张图」为什么改变了分析方式,并与 CodeQL 数据库做同异对比;7.2 节上手实战:导入代码库无需构建环境,在 REPL 里用几条 Scala DSL 查询找危险函数调用、追参数流向;7.3 节是本书的差异化卖点——经 Ghidra 前端把 x86 二进制也生成 CPG,让源码图谱与二进制图谱说同一种查询语言。学完本章,你手里的代码模型从「引擎私产」变成「一张可自由遍历的图」,且这张图同时覆盖源码与二进制两个世界。
# ch07_cpg.txt —— 代码属性图(CPG):三张旧地图拼成一张新地图 AST(结构) CFG(流向) PDG(依赖) 谁包含谁 执行到哪 谁影响谁 │ │ │ └──────────────────┼──────────────────┘ ▼ 同一套节点,三种边并存 CPG │ Scala DSL 自由遍历 (源码图谱与二进制图谱同语言)
一句话金句:AST 管结构、CFG 管流向、PDG 管依赖——CPG 让你一次遍历同时问三个问题。
(文字流程图)代码 ──▶ 节点与边的统一 schema ──▶ 图遍历查询 ──▶ 结构、流向、依赖混合答案。
三节递进:7.1 建图思维,7.2 在源码图上练手,7.3 把同样的功夫用到二进制图上。
# ch07_logic.txt —— 三节递进:导入练查询,同语言查二进制 ┌──────────────┐ 导入源码练查询 ┌──────────────┐ 同语言查二进制 ┌──────────────┐ │ 7.1 CPG 模型 │ ──────────────▶ │ 7.2 Joern 实战│ ───────────────▶ │ 7.3 二进制前端│ │ 三合一 schema │ │ DSL 与污点 │ │ 源码与二进制 │ │ (为什么) │ │ (怎么用) │ │ 打通(差异化)│ └──────────────┘ └──────────────┘ └──────────────┘
7.2 的每条查询语法在 7.3 原样可用——这正是「一张图」承诺的兑现:学会一次,源码与二进制通吃。
合规声明:本节内容仅用于授权范围内的安全研究与教育目的;未经授权对他人软件进行逆向工程可能违反法律与许可协议。