目录

BCKB — 危险函数自底向上调用溯源链知识库

Backward Call-chain Knowledge Base:针对 PE 文件中 memcpy/strcpy 等危险系统函数调用,构建自底向上(bottom-up)数据流调用溯源链并本地持久化的知识库系统。基于 IDA + ida-pro-mcp + Claude Code 落地,在 bingraph(BinGraph)与 codegraph 技术之上创新,面向大模型辅助漏洞挖掘场景设计。


一、项目定位

在漏洞挖掘中,”危险函数被谁调用、危险参数从哪来、数据如何流入” 是判定漏洞可控性的核心问题。bingraph 等现有图谱工具提供的是静态调用图(谁调用谁,双向可达性);BCKB 则把每个危险调用点作为溯源根(root),自底向上物化出完整的调用链与跨函数参数数据流,并沉淀为本地 SQLite 知识库,供大模型直接查询与积累跨二进制模式。

输入一个二进制(PE)
   │  IDA 权威函数表 + pefile IAT + capstone 函数级反汇编
   ▼
危险调用点识别(双维度:IAT 槽 + 函数名)
   │
   ▼
自底向上 BFS 链构建(level 1=直接调用者 … 逐层向顶)
   │  每层附带参数溯源(arg_mask 位图 + push 回扫分类)
   ▼
路径物化 + 指纹化(path_key = SHA256(EA 序列))
   │
   ▼
SQLite 知识库(kb.sqlite, WAL)+ HTML 审计报告 + 独立验证通道

二、与 bingraph 的关系

BCKB 的定位是 bingraph 的垂直深化,不是替代品。两者共享同一套”静态分析沉淀 → 图谱化 → 供 AI 查询”的设计哲学,但在分析方向、数据粒度、数据流语义上存在根本差异。

2.1 直接继承/复用的部分

组件 来源 BCKB 中的使用
危险函数知识库 bingraph data/sinks.yaml(78 条,Microsoft SDL banned.h + CWE 分类) 原样复用,含 category / severity / cwe / danger_args(危险参数下标)
sink 匹配语义 bingraph 的 danger_call_sites(who/site/sink 三元组) bc_danger_roots 表保持相同语义(UNIQUE(binary_id, site_ea, sink_name)),保证两库结果可比对
存储哲学 SQLite + WAL + 自包含快照 + meta 元信息 全套沿用,schema 从 6 张表扩展到 6 张表(新增 3 张链表,改造 2 张)
边界类型 call_edges.edge_type(direct/indirect/tail/external/unresolved) bc_chain_edges.kind 完全对齐,跨库边类型可互相解释
IDA 为权威源 bingraph 用 idalib 采集;BCKB 用 ida-pro-mcp 采集函数表 函数边界/名称均以 IDA 为准,EA 命名空间与 IDA/bingraph 完全统一

2.2 bingraph 没有、BCKB 新增的功能(核心创新)

# 创新点 bingraph 现状 BCKB 做法
1 自底向上溯源链(非可达性) 只存单向调用边,查询时 BFS 现算路径,无方向性 每个危险调用点物化完整链bc_chain_nodeslevel 表达距 sink 的层级(0=sink → 12=顶层),链随构建完成,查询零计算
2 跨函数参数数据流(arg_mask 位图) 只记录”谁调用了危险函数”,不关心参数 每个链节点记录本函数哪些参数可达危险参数(位图 arg_mask),并逐边保存参数来源分类(param(k)/constant/global/return/local/unknown),回答”危险参数从哪来”
3 路径物化 + 指纹 查询时才算路径 构建期把每条链物化为 bc_chain_pathspath_key = SHA256(规范化 EA 序列) 作为跨二进制模板指纹——同一链条形状在不同二进制中重复出现即可被聚合,支持漏洞模式挖掘
4 双通道交叉验证 单一采集实现 主通道(capstone 函数级反汇编)+ 独立通道(字节级 raw 扫描,永不跳步),构建后自动比对产出 recall / FP rate,从机制上杜绝”漏检/误报”
5 瓶颈函数分析 跨链汇聚点聚合(get_bottlenecks):被最多危险链经过的函数即最高价值审计目标(真实测试精准命中 netlogon 协议核心)
6 危险参数溯源切片 get_taint_slice(root, arg_idx) 沿链纵向抽取某一危险参数的完整传播记录,直接供 LLM 做漏洞判定
7 codegraph 融合预留 export_codegraph() 把链导出为 codegraph 兼容节点/边格式;bc_chain_nodes.cg_symbol 为桥接列,可并入 codegraph 的符号图做跨层次融合

2.3 与 codegraph 的关系

  • codegraph:面向源码级的符号索引与调用路径(含动态分发解析),无二进制级信息;
  • BCKB:面向二进制级(EA 地址空间),物化危险链;
  • 融合点:BCKB 的链节点 cg_symbol 列 + export_codegraph 导出,可将二进制链映射回源码符号图,打通”源码污点 → 二进制危险调用”的全链路。

三、系统架构

3.1 数据来源分工(互为验证通道)

数据 来源 作用
函数边界/名称 IDA 权威函数表(data/ida_funcs.json,经 ida-pro-mcp 采集) 按函数驱动反汇编,杜绝段内空洞导致的解码错位
IAT 导入表 pefile(PE 权威) 维度 A:危险导入槽位检测
调用边 capstone 函数级扫描 主检测通道
调用边(独立) verify.py 字节级 raw 扫描 验证通道,永不跳步
数据流 propagation.py x86 栈参数回扫 参数来源分类

3.2 目录结构

d:\漏洞挖掘\
├── bckb/                          # 本项目源码(pip install -e 安装)
│   ├── pyproject.toml             # CLI 入口:bckb
│   ├── data/
│   │   ├── sinks.yaml             # 78 条危险函数知识库(复用 bingraph)
│   │   └── ida_funcs.json         # IDA 权威函数表(1128 个函数)
│   └── bckb/
│       ├── schema.sql             # 6 张表 + 索引
│       ├── sinks.py               # sink 匹配(剥离 _ 前缀 / @N stdcall 后缀)
│       ├── ida_funcs.py           # 函数表加载与 EA 二分定位
│       ├── db.py                  # GraphDB(SQLite WAL 存储层)
│       ├── query.py               # 查询引擎:链/瓶颈/模式/参数切片/codegraph 导出
│       ├── builder.py             # sink 检测 → 自底向上 BFS → 路径物化
│       ├── verify.py              # 独立字节级交叉验证
│       ├── report.py              # HTML 审计报告(暗色中文主题)
│       ├── cli.py                 # build / inspect / query / report / verify
│       └── analysis/
│           ├── pe_loader.py       # pefile 封装(IAT 绝对 VA)
│           ├── disasm.py          # capstone 函数级扫描
│           └── propagation.py     # x86 栈参数传播解析
├── netlogon.bckb/                 # netlogon.dll 的构建产物(示例知识库)
│   └── kb.sqlite                  # 知识库本体(WAL)
│   └── report.html                # 审计报告
├── BinGraph-main/                 # bingraph 项目(技术基线)
└── codegraph-main/                # codegraph 项目(融合对象)

四、数据存储设计(核心数据结构)

SQLite 单文件(WAL 模式),6 张表:

作用 关键字段
bc_binaries 二进制本体(跨二进制研究锚点) sha256 / image_base / func_count / danger_import_count
bc_danger_roots 危险调用实例 = 溯源根 site_ea / sink_name / slot_ea / danger_args(JSON) / owner_func_ea / chain_count / depth_cut
bc_chain_nodes 链节点(函数),level 表达自底向上层级 UNIQUE(root_id, ea)arg_mask(本函数哪些参数可达危险参数)
bc_chain_edges 链边:调用边 + 跨函数数据流标注 kind ∈ direct/indirect/tail/external/unresolved,propagation(JSON) 逐参数来源
bc_chain_paths 物化链(路径查询零计算) path_key = SHA256(EA 序列) 指纹,node_seq 紧凑编码 EA:level:arg_mask;…
bc_meta 构建元数据(完整性评估依据) 扫描统计 / 未解析计数 / 深度上限 / 耗时
链条层级示例(netlogon 真实链,自底向上):
L0  memcpy(IAT 槽)                      ← sink
L1  _NlParseTStr                          ← 直接调用者(参数溯源在此解析)
L2  _Nlparse
L3  _NlparseAllSections
L4  _NlNetlogonMain / _NlMainLoop         ← 顶层(无静态调用者,链终止)

自底向上语义level 0 = sink 本身,1 = 直接调用者,逐层向顶;”自底向上”即从 sink 沿调用者方向反向生长,最终得到”危险调用从哪些入口可达”的完整答图。


五、安装与使用

5.1 安装

cd d:\漏洞挖掘\bckb
pip install -e .
# 依赖:pefile / capstone / pyyaml / click

5.2 构建知识库

bckb build <PE文件> -o <输出目录> [--depth 16] [--max-paths 200]
# 例:bckb build D:\漏洞挖掘\netlogon.dll -o D:\漏洞挖掘\netlogon.bckb

5.3 常用命令

命令 说明
bckb inspect <kb目录> 知识库概览(表统计/扫描元数据)
bckb query <kb目录> --roots 列出全部危险调用实例
bckb query <kb目录> --root <id> 获取单条完整链(节点/边/路径)
bckb query <kb目录> --taint <root> <arg> 危险参数溯源切片
bckb query <kb目录> --bottlenecks 瓶颈函数(跨链汇聚点)
bckb query <kb目录> --patterns 链模式(path_key 指纹聚合)
bckb query <kb目录> --export-cg <root> 导出 codegraph 兼容格式
bckb report <kb目录> 生成 HTML 审计报告(report.html)
bckb verify <PE文件> <kb目录> 双通道交叉验证(recall / FP rate)

六、真实测试结果(netlogon.dll)

x86 32 位 PE(无 .pdata,IDA 提供权威函数表 1128 个带名称函数;PDB 符号齐全)。

6.1 检测结果:161 个危险调用实例,5 种危险函数

危险函数 类别 严重度 调用点 物化链 最大深度
memcpy buffer_copy 152 4312 12
RegSetValueExW persistence 5 13 6
ReadFile input_source 2 4 3
RegCreateKeyExA persistence 1 1 1
memmove buffer_copy 1 1 1
合计 161 4330 12

全库规模:7642 链节点 / 7633 链边 / 0 截断链。

6.2 完整性评估(三层独立验证)

  1. 双通道比对:独立字节级 raw 扫描 vs capstone 主通道 → recall 1.0(161/161),FP rate 0.0
  2. IDA 活体对照(ida-pro-mcp):get_xrefs_to(_memcpy) 逐函数核对一致;get_callers(_Nlparse@12) = _NlparseAllSections ✓ 与链边吻合;get_callers(_NlNetlogonMain@8) = [] ✓ 证实链在 RPC 入口正确终止
  3. 误报逐点核验:唯一疑似 FP 站点 0x501F1A16 经反汇编确认为真实 call _memcpy

6.3 分析产出

  • 瓶颈函数精准命中协议核心:_NlNetlogonMain@8(108 链)、_NlMainLoop_NlInitNetrLogonSamLogon 系列(99 链)—— 即 netlogon 登录验证协议关键处理入口(ZeroLogon 相关研究起点)
  • 参数溯源(示例 root 63):memcpy 的 n 参数追溯到前序 call 的返回值(return 来源);全库 level-1 解析:unknown 231 / local 44 / param 5 / return 23 / constant 1

七、已知限制(如实说明)

  1. 间接调用:79 个间接调用点(寄存器/函数指针)静态无法解析目标,已单列统计并写入报告,可后续用 IDA 活体通道补全
  2. 参数传播是启发式:x86 栈回扫(push 序列 + 局部槽写入追踪)对跨 call 别名/复杂计算解析有限,unknown 占比偏高
  3. 函数表外代码:仅覆盖 IDA 函数边界内的代码,数据混排/洞内代码不在覆盖范围
  4. 架构支持:当前数据流解析面向 x86 栈传参(cdecl/stdcall/fastcall);x64(寄存器传参)需扩展 propagation 层

八、后续规划

  1. 参数溯源回填:链节点 → decompile_function(ida-pro-mcp 活体)反编译验证,降低 unknown 占比
  2. 注册为 MCP server(FastMCP stdio),供 Claude Code 直接查询链库
  3. 与 bingraph 产物互操作:同 sinks.yaml 基础上做调用点结果比对与合并
  4. 跨二进制模式挖掘:利用 path_key 指纹积累,识别重复出现的危险链条形状(漏洞模式库)
关于

Backward Call-chain Knowledge Base:针对 PE 文件中 memcpy/strcpy 等危险系统函数调用,构建自底向上(bottom-up)数据流调用溯源链并本地持久化的知识库系统。基于 IDA + ida-pro-mcp + Claude Code 落地,在 bingraph(BinGraph)与 codegraph 技术之上创新,面向大模型辅助漏

92.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号