标签 AST 下的文章

摘要:
浙大与 OceanBase 联合提出 DeepK 调试引擎,为 LLM-based 自动程序修复提供了一种全新的思路。通过将隐含在大规模 bug-fix 数据中的调试经验显式化、结构化并系统复用,有效弥补了现有方法过度依赖隐式推理的不足,引导大语言模型从“隐式猜修复”转向“基于经验的知识驱动调试”,显著提升了自动程序修复的准确性与稳定性。

日前,由浙江大学与 OceanBase 团队联合撰写的论文:《Debugging Engine Enhanced by Prior Knowledge: Can We Teach LLM How to Debug?》被软件工程领域顶级会议 The ACM International Conference on the Foundations of Software Engineering (FSE) 2026 录用。

FSE 是软件工程领域最具影响力的国际顶级会议之一,是中国计算机学会 CCF 推荐的 A 类国际会议。本论文通过系统化提取和复用结构化调试知识,引导大语言模型从“隐式猜修复”转向“基于经验的知识驱动调试”,显著提升了自动程序修复的准确性与稳定性。

简介

随着大语言模型在代码理解与生成领域能力的不断增强,自动程序修复(Automated Program Repair,APR)逐渐成为软件工程研究的重要方向。

近年来,大量工作尝试通过提示工程、多智能体协作、示例检索或执行反馈等方式提升修复效果,并在多个基准数据集上取得了可观进展。然而,这些方法大多仍然依赖模型的隐式推理能力:模型需要从原始示例、上下文或运行结果中自行推断调试思路,而调试过程中真正稳定、可复用的知识却并未被显式建模和系统利用。

论文 DeepK(Debugging Engine Enhanced by Prior Knowledge)正是针对这一核心缺陷提出了解决方案。

作者指出,大规模 bug-fix 数据集中蕴含着丰富的调试经验,但现有方法通常只将其作为上下文示例或推理演示使用,而没有将其中的调试逻辑提炼为结构化知识。

DeepK 通过系统性地提取、验证并复用调试知识,为大语言模型提供明确的调试指导,使程序修复从“依赖模型临场发挥”转向“基于经验的知识驱动推理”。

核心理念:让调试从隐式推断走向显式知识引导

传统的 LLM-based APR 方法在设计上存在一个根本矛盾:一方面希望模型具备类似人类的调试能力,另一方面却很少向模型明确提供“人类是如何调试的”。模型虽然可以在大量示例中隐式学习模式,但这种方式缺乏稳定性、可解释性,也难以在分布外场景中保持鲁棒。
DeepK 的核心理念在于,将调试视为一种可总结、可验证、可复用的知识过程。它不再把修复行为简单等同于补丁生成,而是将调试拆解为两个紧密协同的部分:对错误根因的理解,以及围绕该根因展开的修复策略。通过显式建模这两类调试知识,DeepK 试图为大语言模型提供类似“资深程序员经验”的指导,使其在面对新 bug 时能够遵循已有的成功调试路径进行推理,而非从零开始试探。

图 1. DeepK 的 4 阶段架构

核心技术一:基于 AST 的编辑描述生成与调试语义对齐

在从历史 bug-fix 数据中提取调试知识时,一个关键挑战在于如何避免被低层次的代码差异所干扰。直接对比 buggy 与 fixed 代码往往会产生大量琐碎、语义不明确的修改信息,难以反映真实的调试逻辑。

为此,DeepK 引入了一种基于抽象语法树的编辑描述生成机制,将代码层面的差异转化为人类可读、具有步骤感的自然语言编辑描述。

该机制通过分析两版代码的 AST 结构,定位真正与错误修复相关的修改位置,并过滤掉不合理或无关的编辑操作,从而生成更符合人类调试习惯的修改描述。这一过程有效弥合了“代码补丁”与“调试思维”之间的鸿沟,为后续调试知识的抽取提供了清晰、语义化的输入。

图 2. 代码编辑描述生成工具

核心技术二:结构化调试知识的抽取、验证与知识库构建

在获得编辑描述后,DeepK 进一步引导大语言模型围绕“如何定位并修复该 bug”生成结构化调试知识。模型需要明确指出错误的根因,并给出一步步的调试与修复策略。与以往方法不同的是,DeepK 并不直接接受模型生成的结果,而是引入了验证机制:模型必须仅基于自己生成的调试知识重新修复程序,并通过测试用例验证其正确性。只有能够稳定指导修复成功的知识,才会被纳入最终的调试知识库。

在知识组织层面,DeepK 采用多视角索引策略,从任务描述、程序结构以及执行轨迹等多个维度刻画每一条调试知识,使其能够在面对不同类型的新 bug 时被准确检索。这种多维度设计避免了单一相似度度量带来的偏差,使知识检索既具备语义相关性,又保留结构与运行层面的信息。

图 3. 结构化调试知识抽取

核心技术三:先验调试知识增强的程序修复流程

在实际修复新 bug 时,DeepK 并不替代现有 APR 系统,而是以“调试知识增强模块”的形式融入其中。当系统接收到新的 buggy 代码后,会从知识库中检索出最相关的调试知识,并将其注入模型的推理阶段,引导模型围绕已验证的调试思路展开修复。

这种设计使 DeepK 能够自然地与不同类型的 APR 系统集成,无论是基于提示与检索的非智能体方法,还是基于脚本化流程的修复框架,都可以从中受益。

通过这种方式,程序修复过程不再依赖单次推理的偶然成功,而是建立在大量历史调试经验的积累之上,使模型的行为更加稳定、可解释。

性能成果

在 ACPR 与 AtCoder 等多个基准数据集上的实验结果表明,DeepK 在不同模型后端(GPT-4o与 DeepSeek-v3)下均能显著提升现有方法的修复准确率。在分布内场景中,DeepK 相较最强基线方法取得了稳定的绝对提升;在更具挑战性的分布外竞赛编程任务中,其相对提升尤为显著,显示出结构化调试知识在应对分布偏移时的独特价值。

图 4. DeepK 与其他基准方法的对比

进一步的消融实验验证了各个设计组件的重要性。结果显示,对调试策略的显式建模对性能提升贡献最大,多维度检索机制显著增强了系统的鲁棒性,而基于 AST 的编辑描述在复杂程序修复中发挥了关键作用。同时,实验还揭示了调试知识数量与性能之间的权衡关系,表明适量、精准的知识注入比简单堆叠上下文更加有效。

图 5.知识库索引构建的消融实验

图 6. 结构化调试知识的消融实验

图 7. 代码编辑描述工具的消融实验

图 8. 调试知识数量与调试性能的关系

结语

DeepK 的工作为 LLM-based 自动程序修复提供了一种全新的思路。通过将隐含在大规模 bug-fix 数据中的调试经验显式化、结构化并系统复用,该框架有效弥补了现有方法过度依赖隐式推理的不足。

在实践中,DeepK 在多种数据分布与模型设置下均展现出稳定的性能提升,并显著增强了修复过程的可解释性与鲁棒性。

这项研究表明,相比不断扩展模型规模或复杂化推理流程,让模型掌握可复用的调试知识可能是一条更加稳健、可持续的路径,也为未来构建更可靠的软件智能系统奠定了坚实基础。

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/

重塑传统自动化漏洞挖掘的Multi-Agent框架攻防一体化实践

前段时间在某大厂做安全研究时,针对SDLC的重复性审计工作结合大模型Agent思索了一些可行的思路,便在不断摸索中构建了一个Multi-Agent的协同漏洞挖掘框架系统,目前个人使用来看对于开源的web应用的实战效果相比传统的SAST、DAST以及纯LLM的漏洞挖掘工具来说还是很不错的,便记录此篇框架实现过程和当今Agent赋能漏挖的可行性与优势供师傅们交流指点....

0x00 传统漏洞挖掘的困局

当前针对Web应用后端的自动化漏洞挖掘技术主要受困于“覆盖率”与“准确性”难以两全的矛盾:

  • 传统的静态分析技术虽能提供全量的代码覆盖,但由于缺乏对程序运行时状态和复杂业务逻辑的语义理解,往往导致海量的误报噪声,极大地增加了安全工程师的审计成本
  • 而动态应用程序安全测试虽能在黑盒方面挖掘漏洞更具真实性,却受限于黑盒视角的路径探索能力,难以触及深层业务逻辑,会存在很多漏报
  • 目前大语言模型的出现为代码语义分析带来了新的契机,但受限于Context Window 的约束以及生成式模型固有的幻觉问题,直接依赖原生LLM进行大规模代码审计往往导致分析结果碎片化且缺乏可信度,并且直接将代码喂给大模型容易受与漏洞无关代码的影响

0x01 探索漏洞挖掘框架的新出路?

在探索新的框架实现时,我们可以思考是否能将黑白盒的现有技术互补结合来引导漏洞挖掘?以及我们可以看到几年LLM与Agent相关技术如MCP、RAG的工程化落地,能否用LLM赋于框架更好的语义理解和丰富的上下文能力,再通过Agent做一套自动化流程?

为突破上述技术瓶颈,我在探索新的漏洞挖掘框架时也看了一些目前学术界的相关LLM赋能的研究与github开源的技术实现,总体的探索方法还是在论文与现实实践中思考各个方面的优势与缺陷,最终确定做一个基于Muti-Agent协同的智能化漏洞挖掘框架:构建一个从静态分析到动态验证的闭环生态。技术上引入MCP 来作为连接LLM推理能力与静态分析工具的桥梁,利用RAG 技术通过构建高质量漏洞专家知识库来校准模型判定,深度缓解LLM的“幻觉”与知识盲区;同时,结合运行时自动化的流量Fuzz模糊测试技术,将白盒的逻辑推演与黑盒的攻击验证深度融合,减少漏洞的误报和漏报。

这里放一个当时挖到的有CNVD证书的水洞,通过项目上传与聊天,自动化分析审计出多处SQL注入漏洞,并且能够给出攻击POC,以及后续完整的修复方案

image.png

0x02 框架核心:打破黑白盒壁垒

该框架核心架构旨在重构传统安全检测的边界,提出了一种 “白盒语义指引黑盒,黑盒动态验证白盒”的深度融合范式。框架并非单一工具的线性叠加,而是一个基于Multi-Agent编排(Agent Orchestration)的异构系统。

  • 白盒分析维度:框架引入了MCP作为智能体的执行接口,驱动底层的静态分析工具与正则匹配引擎,对代码AST进行初步扫描,快速锚定潜在的危险函数调用Sink。为解决静态分析中常见的上下文缺失问题,进一步融合了RAG 技术:通过引入高质量的博客记录的高精度漏洞知识库,系统能够为大语言模型提供特定漏洞类型的完备的Context上下文与判定依据,从而在保持高代码覆盖率的同时,抑制传统模式匹配带来的误报,实现了从“语法”到“语义”的代码的全面理解提升。
  • 黑盒验证维度:框架构建了运行时的自动化Fuzz模糊测试。该模块独立承担着对Web通用漏洞(如XSS、SQL注入)及敏感信息泄露的覆盖任务。当白盒Agent发现疑似逻辑漏洞时,通过黑盒上的Fuzz可在流量侧生成针对性的变异Payload进行动态优化,通过分析HTTP响应状态来实证漏洞的可利用性。

我认为将静态视角的逻辑推演与动态视角的攻击验证相结合的机制,能极大地提升了漏洞检测的置信度,实现了真正意义上的全链路攻防评估,刚开始时候画的大致架构草图,仅贴示了主要功能,一些细节实现并未展示:

image.png

0x03 智能化Agent设计细节

1. Static Orchestration Agent:基于MCP协议的异构工具编排

在传统的LLM应用中,模型往往被禁锢在文本交互的孤岛中,难以触及本地庞大的代码仓库,且面临着Context Window对海量代码理解的限制。本框架设计的漏洞定位Agent,本质上是一个 静态分析增强型智能体(Static Orchestration Agen) ,通过引入MCP与构建Prompt定义角色任务将LLM从被动的文本生成者转变为主动的工具使用者,通过静态分析获取代码结构中的丰富语义上下文

MCP驱动的“深层感知”

不同于简单的API调用,MCP协议使得Agent能够理解工具的输入输出Schema,实现复杂的推理链条:

  • 工具与模型的语义对齐:通过定义标准化的MCP接口,将底层的静态代码分析工具封装为LLM可调用的能力。
  • 意图驱动的执行:构造合适的CoT思维链Prompt让Agent根据当前的分析任务代码(例如“寻找未授权访问漏洞”),自主决策调用何种工具、传入何种参数。这可以让Agent模拟安全专家的思维过程,主动去探测代码中的漏洞点。

SINK点定位与攻击面收敛

针对LLM处理大规模代码时的“大海捞针”难题,高效定位漏洞利用链

  • SINK点精准锚定:Agent并不直接阅读全量代码,而是利用MCP驱动底层扫描器,基于AST解析和高精度的正则模式,快速提取代码中的SINK点(需要根据不同语言类型的不同漏洞进行扩充分类)

image.png

  • 代码切片与上下文聚焦:一旦定位到SINK点,系统会通过静态分析工具获取sink点污染的上下文Code Slice,并且做到变量语句级,将无关语句统统移除(这里详细的实现师傅们可以去阅读Joern等工具的源码和他的论文,主要在于CPG代码属性图的构建和后向切片等算法技术)。极大地收敛了分析范围,过滤大量无关业务代码,确保输送给LLM进行深度研判的每一行代码都具有潜在的安全价值(无论是控制流还是数据依赖流都对漏洞的存在有潜在的约束和影响)。这不仅大幅降低了Token消耗,更显著提升了后续漏洞验证的准确性。

2. Contextual Reasoning Agent:基于RAG的领域知识增强与检索优化

作为本框架保障检测精度的核心组件,校验 Contextual Reasoning Agent承担着“校验”的角色。针对通用大语言模型在特定安全领域存在的专业知识匮乏逻辑幻觉 问题,本模块引入RAG 技术,人为构建了一个可随时扩展的领域专家知识文档库,通过实时注入精确的先验知识来约束和校准模型的推理过程。

RAG知识库的结构化重构与向量化

为了让非结构化的安全知识能够被机器高效理解,摒弃粗暴的文本截断,采用基于Markdown语法树的结构化清洗策略。系统依据标题层级对海量的漏洞PoC、修复方案及原理分析文档进行逻辑切分,确保每个Chunk都包含完整的语义单元

例如一个简易的MARKDOWN文档:

image.png

动态滑窗与重叠分块策略

在知识切片过程中,为了规避硬切分导致的语义断层,切片策略采用基于重叠策略(Overlapping Strategy)的动态滑窗机制

  • 语义连贯性保障:设定固定的Token阈值作为基础窗口大小,同时引入预设比例的重叠缓冲区。每一分块的末尾段落会被完整保留并作为下一分块的起始上下文。
  • 边界信息无损传输:这种机制确保了跨越分块边界的逻辑描述(如一段跨越多行的代码逻辑或长难句的漏洞解释)不会被割裂,保证了向量检索时上下文信息的完整性与连贯性。

image.png

向量检索与推理运行

采用all-MiniLM-L6-v2模型作为Embedding引擎。该模型在保持低延迟推理的同时,在多语言的语义相似度任务上有更好的泛化能力;数据库采用集成Qdrant向量数据库,支撑大规模向量的高并发检索

  • 上下文感知的推理校准:当定位Agent上报疑似SINK点时,校验Agent会提取当前代码特征,在向量库中实时检索最相似的Top-K个历史漏洞模式和修复示例。这些检索结果被作为增强上下文 注入到LLM的Prompt中,迫使模型基于检索到的“事实依据”而非单纯的概率预测进行最终判定,减少了误报的产生

0x04 动态流量FUZZ

我从以往的安全研究触发,针对通用型漏洞的工具做了大量的调研,并基于BurpSuite原生API开发了自动化Fuzz工具如:反射性和存储型XSS、SSRF、CORS、敏感信息泄露等(同时也是在锻炼开发能力,也让日常重复性漏洞渗透工作能够做的更高效),再结合MCP集成给Agent。该模块并非简单的随机测试,而是作为一个流式检测组件,实时拦截、解析并重放业务流量,对潜在漏洞动态扫描。而对于敏感信息泄露则是比较容易 ,针对Spring Boot Actuator、Swagger UI、Druid Monitor等常见中间件的指纹来做识别。同时,结合模式匹配,对响应包中的JWT Token、阿里云AK/SK、AWS凭证等高熵字符串进行实时监测,有效发现硬编码或调试信息泄露。

下面挑了几个通用型漏洞的Fuzz来做简单做下原理解释

1. 通用XSS漏洞的自动化Fuzz

比如针对XSS反射型和存储型漏洞,开发时采用了全量参数解析+动态污点标记的检测策略,确保对异构http包结构中参数的全面覆盖。

  • 深度参数提取与结构化解析
    不仅仅局限于URL Query参数,还有针对JSON、XML、Multipart-form等多种数据格式的解析器。能够递归遍历HTTP Request Body中的每一层嵌套结构,提取所有用户可控的叶子节点作为Fuzz入口。
  • 唯一性污点标记
    为了解决并发扫描时的结果混淆问题,引擎摒弃了静态Payload,转而采用动态生成的唯一性测试标记


    • Payload构造:Timestamp + RandomStr + Vector(例如:CurrentTime等高熵字符串)
    • 状态映射表:内存中维护一张高并发的HashMap,记录RequestID <-> ParameterName <-> UniquePayload的映射关系。
    • 响应回显与验证
      发送测试请求后,引擎自动捕获HTTP Response,通过高效的字符串匹配算法检索之前的唯一标记。一旦检测到标记回显且上下文未经过滤(如HTML实体编码缺失),即判定存在可疑XSS漏洞,并自动关联原始请求数据生成漏洞条目。

(当时研究设计思路时绘制的草图)

image.png

2. 访问控制与配置缺陷的CORS漏洞检测

自动化Fuzz HTTP请求头中的Origin字段,构造包括恶意第三方域名、特殊字符(如null)及子域名在内的多种变异Payload

  • 高危利用判定:当响应头Access-Control-Allow-Origin和攻击者Payload一样或为小写null,且同时存在Access-Control-Allow-Credentials: true时,将其标记为高危漏洞。此类配置允许攻击者绕过同源策略(SOP)窃取用户敏感数据
  • 严格语法校验:针对协议规范的边缘场景进行校验,例如检测到Access-Control-Allow-Origin: Null(大写)时,引擎会自动识别其为无效配置(浏览器不识别大写Null),从而将其作为无效处理
    以及服务端错误配置导致Access-Control-Allow-Origin始终和Origin一样,这里放一张示例图便于理解:

image.png

0x05 构建认知型安全智能体的未来图景

在对Multi-Agent探索自动化漏洞挖掘实践的探索过程中,其实我们一直在试图回答一个核心问题:如何在安全攻防领域,构建一个具备“感知-推理-决策-行动”完整闭环的智能系统。目前的Agent主要还停留在“检测与验证”阶段,之后更完备的阶段是自动化环境的感知探索与白盒源码的结合,以及能够基于当前的Shell环境或数据库权限,自主规划后续的横向移动与权限提升路径。另一个重要的方面是自适应Payload生成:比如利用强化学习反馈机制,让Agent在面对WAF拦截时,能够动态调整Payload的混淆策略,实现智能化的WAF绕过

希望本文的实践能为各位师傅提供一种新的视角供师傅们交流指点~

各位佬友大家好!

最近折腾文档转换,发现现有的工具不太顺手,于是一怒之下用 Rust 手搓了个开源工具 —— Tylax

这玩意儿主要用来在 LaTeXTypst 之间进行全文档互转。

跟市面上那些靠正则(Regex)硬替换的脚本不一样,Tylax 走了正道,基于 mitextypst-syntax 搞了完整的 AST(抽象语法树)解析。这意味着处理嵌套结构、各种环境定义还有复杂的数学公式时,稳得一批,不会因为少个括号就原地爆炸。

开源地址GitHub - scipenai/tylax: A bi-directional converter between Typst and LaTeX. Available as both a CLI tool and a Web interface.
在线体验(WASM)https://convert.silkyai.cn/

几个核心功能:

  • 双向奔赴:完美支持 LaTeX ↔ Typst 互转,不偏科。
  • 表格不乱:智能处理 \multicolumn\multirow,以前最头疼的表格转换现在很丝滑。
  • TikZ 黑科技:搞了个实验性功能,支持把 LaTeX 的 TikZ 代码直接转成 CeTZ!
  • Rust 性能:速度极快,既可以本地 CLI 跑,也可以浏览器里跑 WASM。

食用方法:

如果你有 Rust 环境,直接一把梭:

cargo install tylax

最后求一波反馈:
欢迎各位佬友尝鲜、Star 或者提 Issue 拍砖!
目前项目还在快速迭代中,特别需要大家手里那些奇奇怪怪的文档(Edge Cases)来喂养测试,以此修复潜在的 Bug。

感谢佬友们支持!


📌 转载信息
原作者:
zhxsxuan
转载时间:
2026/1/8 12:14:01

起因是 CC 读大项目的时候,幻觉严重,特别是对于需要大量上下文的复杂流程理解错误,所以基于 AST 做了一个工具来提取函数签名,以及调用关系,能极大压缩上下文的情况下让 CC 完整理解调用链路。

欢迎佬友试用,轻喷,当然能给个 star 就更好了


📌 转载信息
原作者:
didnhdj
转载时间:
2026/1/3 15:02:30