随着大语言模型在漏洞利用生成领域展现出工业化潜力,约束求解与符号执行的技术优化成为提升自动化攻击能力的关键瓶颈。Sean Heelan 在 2026 年初的实验显示,通过投入 30M tokens(约 30 美元),LLM 代理能够在 QuickJS JavaScript 解释器中生成 40 多个不同的漏洞利用。这种 "token 换结果" 的工业化模式,将传统依赖黑客经验的漏洞利用开发,转变为可规模化复制的工程问题。在这一转变中,如何高效处理路径爆炸、内存模型抽象和约束求解,成为决定自动化攻击效率的核心技术挑战。
路径探索剪枝:从静态策略到动态学习
符号执行面临的最大挑战是路径爆炸问题 —— 随着程序分支数量的增加,可能的执行路径呈指数级增长。传统静态剪枝策略往往采用固定的检查频率,但这种方法在面对不同程序特性时表现不稳定。
动态路径剪枝(DPP)策略
动态路径剪枝(Dynamic Path Pruning)策略通过实时监控程序执行特征,动态调整路径检查率。其核心思想是:为更可能不可满足的路径分配更高的检查频率。DPP 的实现基于以下关键参数:
- 可满足路径观察比例:记录已探索路径中可满足路径的比例,作为后续路径检查的基准
- 路径复杂度估计:基于路径约束的数量和类型(算术、位运算、内存访问)评估求解难度
- 检查率调整算法:使用指数加权移动平均(EWMA)动态更新检查阈值
实验数据显示,在 131 个 CGC 二进制文件测试中,DPP 在 84% 的情况下优于静态策略,探索时间保持在最佳静态策略的 100-124% 范围内。这种动态适应性使得符号执行引擎能够根据具体程序特征优化资源分配。
基于学习的积极状态剪枝(Homi)
Homi 系统采用机器学习方法识别 "有希望" 的执行状态,仅保留对提高代码覆盖率或到达漏洞点有显著贡献的状态子集。其实现包含三个关键组件:
- 状态特征提取:从执行状态中提取程序计数器值、约束复杂度、内存访问模式等特征
- 在线学习模型:使用多臂老虎机(Multi-Armed Bandit)算法持续更新剪枝策略
- 概率剪枝决策:基于学习到的模型为每个状态分配保留概率
在开源 C 程序的测试中,Homi 显著提升了 KLEE 的代码覆盖率和漏洞发现能力。这种基于学习的剪枝策略特别适合 LLM 驱动的漏洞利用生成场景,因为 LLM 可以生成多样化的初始输入,为学习算法提供丰富的训练数据。
内存模型抽象:平衡精度与可扩展性
在漏洞利用生成中,准确的内存模型对于生成有效的利用代码至关重要。然而,过于精细的内存模型会导致约束求解复杂度急剧上升。
分层内存抽象策略
工程实践中通常采用分层内存抽象策略,在不同分析阶段使用不同精度的模型:
- 符号内存区域划分:将内存划分为堆、栈、全局数据等逻辑区域,为每个区域分配独立的符号变量
- 指针别名分析简化:使用基于区域的别名分析替代精确的指向分析,减少约束复杂度
- 内存访问模式识别:识别常见的访问模式(如数组遍历、结构体访问),应用模式特定的简化规则
COTTONTAIL 系统在 LLM 驱动的 concolic 执行中引入了 Expressive Coverage Tree(ECT),这是一种更完整的程序路径表示方法。ECT 不仅记录基本块覆盖,还捕获输入结构相关的约束信息,帮助选择结构感知的路径约束。
约束表达式优化
内存模型抽象的质量直接影响约束表达式的可求解性。关键优化技术包括:
- 约束简化预处理:在传递给求解器前,应用代数简化、常量传播和冗余消除
- 位向量大小优化:根据实际使用情况选择最小化的位向量宽度
- 数组理论应用:对数组类型的内存访问使用数组理论,而非展开为多个独立变量
这些优化措施可以将约束求解时间减少 30-50%,在 LLM 驱动的漏洞利用生成流水线中,这意味着更快的迭代速度和更低的 token 消耗。
求解器集成策略与参数调优
约束求解器的性能直接影响符号执行的效率。Z3、Boolector 等 SMT 求解器提供了丰富的配置参数,合理的参数调优可以显著提升求解成功率。
关键求解器参数配置
基于实际工程经验,以下参数配置在漏洞利用生成场景中表现最佳:
# Z3求解器优化配置
solver_config = {
"timeout": 5000, # 5秒超时,避免单个约束消耗过多时间
"memory_limit": 2048, # 2GB内存限制
"auto_config": True, # 启用自动配置,让Z3选择最佳求解策略
"model": True, # 生成模型,用于获取具体输入值
"unsat_core": False, # 禁用不满足核心生成,减少开销
"proof": False, # 禁用证明生成
"rlimit": 1000000, # 资源限制,防止无限推理
}
求解器选择与回退策略
单一求解器无法应对所有类型的约束。工程实践中需要实现多求解器协同工作:
- 求解器能力画像:为每个求解器建立能力画像,记录在不同约束类型上的表现
- 约束类型识别:基于约束特征(算术、位运算、数组、字符串)选择最合适的求解器
- 分层求解策略:先尝试快速求解器(如 Boolector),超时后回退到更强大的求解器(如 Z3)
- 并行求解尝试:对关键约束启动多个求解器并行求解,取最先返回的结果
COTTONTAIL 系统采用的 Solve-Complete 范式特别值得关注。该范式不仅要求约束可满足,还要求生成的输入符合目标语法结构。这对于生成有效的漏洞利用输入至关重要,因为语法无效的输入无法触发实际的漏洞。
工程实践中的监控与调优
在 LLM 驱动的漏洞利用生成系统中,约束求解与符号执行的性能监控是持续优化的基础。
关键性能指标
建立以下监控指标体系:
- 路径探索效率:单位时间内探索的路径数量、平均路径深度
- 约束求解成功率:不同类型约束的求解成功率、平均求解时间
- 内存使用模式:峰值内存使用、内存碎片化程度
- 覆盖率进展:代码覆盖率随时间的变化趋势
自适应参数调整
基于监控数据实现参数的自适应调整:
- 动态超时调整:根据历史求解时间分布动态调整超时阈值
- 内存压力响应:在内存使用接近限制时,主动终止低优先级的状态探索
- 剪枝策略调优:基于路径可满足性的实际分布调整剪枝参数
Sean Heelan 的实验显示,最复杂的漏洞利用挑战消耗了 50M tokens 和约 3 小时时间。通过优化约束求解和符号执行,可以显著降低这些成本,使 LLM 驱动的漏洞利用生成更加经济可行。
未来方向与挑战
尽管约束求解与符号执行的工程优化已取得显著进展,但仍面临重要挑战:
- 路径爆炸的根本缓解:需要更智能的路径选择策略,优先探索可能包含漏洞的路径
- 内存模型的精度权衡:如何在保证精度的同时控制复杂度,需要更精细的抽象技术
- 求解器性能突破:针对漏洞利用场景的特化求解器开发,可能带来数量级的性能提升
- LLM 与符号执行的深度融合:将 LLM 的语义理解能力与符号执行的系统性探索相结合,形成互补优势
随着 LLM 在漏洞利用生成领域的工业化应用不断深入,约束求解与符号执行的工程优化将成为决定自动化攻击能力上限的关键因素。通过持续的技术创新和工程实践,我们有望在安全可控的前提下,推动这一领域的技术进步。
资料来源
- Sean Heelan, "On the Coming Industrialisation of Exploit Generation with LLMs", 2026 年 1 月 18 日
- COTTONTAIL: Large Language Model-Driven Concolic Execution for Highly Structured Test Input Generation, SP26
- Dynamic Path Pruning in Symbolic Execution, IEEE 2018
- Making Symbolic Execution Promising by Learning Aggressive State-Pruning Strategy (Homi), FSE 2020