Backward Call-chain Knowledge Base:针对 PE 文件中 memcpy/strcpy 等危险系统函数调用,构建自底向上(bottom-up)数据流调用溯源链并本地持久化的知识库系统。基于 IDA + ida-pro-mcp + Claude Code 落地,在 bingraph(BinGraph)与 codegraph 技术之上创新,面向大模型辅助漏
版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9
京公网安备 11010802047560号
BCKB — 危险函数自底向上调用溯源链知识库
一、项目定位
在漏洞挖掘中,”危险函数被谁调用、危险参数从哪来、数据如何流入” 是判定漏洞可控性的核心问题。bingraph 等现有图谱工具提供的是静态调用图(谁调用谁,双向可达性);BCKB 则把每个危险调用点作为溯源根(root),自底向上物化出完整的调用链与跨函数参数数据流,并沉淀为本地 SQLite 知识库,供大模型直接查询与积累跨二进制模式。
二、与 bingraph 的关系
BCKB 的定位是 bingraph 的垂直深化,不是替代品。两者共享同一套”静态分析沉淀 → 图谱化 → 供 AI 查询”的设计哲学,但在分析方向、数据粒度、数据流语义上存在根本差异。
2.1 直接继承/复用的部分
data/sinks.yaml(78 条,Microsoft SDL banned.h + CWE 分类)danger_call_sites(who/site/sink 三元组)bc_danger_roots表保持相同语义(UNIQUE(binary_id, site_ea, sink_name)),保证两库结果可比对call_edges.edge_type(direct/indirect/tail/external/unresolved)bc_chain_edges.kind完全对齐,跨库边类型可互相解释2.2 bingraph 没有、BCKB 新增的功能(核心创新)
bc_chain_nodes用level表达距 sink 的层级(0=sink → 12=顶层),链随构建完成,查询零计算arg_mask),并逐边保存参数来源分类(param(k)/constant/global/return/local/unknown),回答”危险参数从哪来”bc_chain_paths:path_key = SHA256(规范化 EA 序列)作为跨二进制模板指纹——同一链条形状在不同二进制中重复出现即可被聚合,支持漏洞模式挖掘get_bottlenecks):被最多危险链经过的函数即最高价值审计目标(真实测试精准命中 netlogon 协议核心)get_taint_slice(root, arg_idx)沿链纵向抽取某一危险参数的完整传播记录,直接供 LLM 做漏洞判定export_codegraph()把链导出为 codegraph 兼容节点/边格式;bc_chain_nodes.cg_symbol为桥接列,可并入 codegraph 的符号图做跨层次融合2.3 与 codegraph 的关系
cg_symbol列 +export_codegraph导出,可将二进制链映射回源码符号图,打通”源码污点 → 二进制危险调用”的全链路。三、系统架构
3.1 数据来源分工(互为验证通道)
data/ida_funcs.json,经 ida-pro-mcp 采集)3.2 目录结构
四、数据存储设计(核心数据结构)
SQLite 单文件(WAL 模式),6 张表:
bc_binariesbc_danger_rootsbc_chain_nodeslevel表达自底向上层级UNIQUE(root_id, ea),arg_mask(本函数哪些参数可达危险参数)bc_chain_edgesbc_chain_pathspath_key= SHA256(EA 序列) 指纹,node_seq 紧凑编码EA:level:arg_mask;…bc_meta自底向上语义:
level0 = sink 本身,1 = 直接调用者,逐层向顶;”自底向上”即从 sink 沿调用者方向反向生长,最终得到”危险调用从哪些入口可达”的完整答图。五、安装与使用
5.1 安装
5.2 构建知识库
5.3 常用命令
bckb inspect <kb目录>bckb query <kb目录> --rootsbckb query <kb目录> --root <id>bckb query <kb目录> --taint <root> <arg>bckb query <kb目录> --bottlenecksbckb query <kb目录> --patternsbckb query <kb目录> --export-cg <root>bckb report <kb目录>bckb verify <PE文件> <kb目录>六、真实测试结果(netlogon.dll)
x86 32 位 PE(无 .pdata,IDA 提供权威函数表 1128 个带名称函数;PDB 符号齐全)。
6.1 检测结果:161 个危险调用实例,5 种危险函数
全库规模:7642 链节点 / 7633 链边 / 0 截断链。
6.2 完整性评估(三层独立验证)
get_xrefs_to(_memcpy)逐函数核对一致;get_callers(_Nlparse@12)=_NlparseAllSections✓ 与链边吻合;get_callers(_NlNetlogonMain@8)=[]✓ 证实链在 RPC 入口正确终止call _memcpy6.3 分析产出
_NlNetlogonMain@8(108 链)、_NlMainLoop、_NlInit、NetrLogonSamLogon 系列(99 链)—— 即 netlogon 登录验证协议关键处理入口(ZeroLogon 相关研究起点)七、已知限制(如实说明)
八、后续规划
decompile_function(ida-pro-mcp 活体)反编译验证,降低 unknown 占比