蚂蚁自研多语言静态程序分析框架YASA论文获软件工程顶会FSE收录

6 阅读6分钟

日前,由蚂蚁集团基础安全事业部安全程序分析团队与华中科技大学Security PRIDE团队合作的论文——《YASA: Scalable Multi-Language Taint Analysis on the Unified AST at Ant Group》被软件工程领域国际顶级会议FSE 2026 Industry Track正式录用。

2CBD63AA-4501-4D69-B27D-1FEF4AB02523.png 这是继去年安全程序分析团队xAST评价体系研究论文亮相FSE后,团队成果的再次入选。

FSE(ACM International Conference on the Foundations of Software Engineering),被中国计算机学会(CCF)列为A类会议。其中Industry Track专门面向工业界的真实系统与工程实践,不仅要求技术创新,更要求在大规模生产环境中得到实际验证。本论文的录用,标志着蚂蚁在多语言静态程序分析领域的自研成果获得了国际学术界的认可。

简介

现代企业日益采用多语言技术栈进行软件开发(研究表明超过80%的大型应用使用两种以上编程语言),给静态应用安全测试(SAST)带来了显著挑战。现有的污点分析工具存在根本性的局限:单语言工具(如FlowDroid、PySA等)需要为每种语言独立开发和维护分析引擎,成本高、结果不统一;多语言工具(如CodeQL、Joern、WALA)虽试图统一,但在中间表示设计上面临精度损失或扩展困难的固有问题,难以有效服务于大规模工业化场景。

为解决这些问题,蚂蚁集团安全程序分析团队设计并实现了YASA(Yet Another Static Analyzer),一个面向工业级部署的统一多语言静态污点分析框架。YASA 构建于全新设计的“统一抽象语法树(UAST)”之上。UAST是一种离线设计的中间表示规范,将不同编程语言的语法结构统一到共享的表示空间,同时精确保留各语言的特有语义。基于UAST,YASA实现了上下文敏感、路径敏感、字段敏感的指向分析与污点传播,通过语言无关的统一语义模型配合各语言专属的语义处理函数,在跨语言分析复用与语言特性精度之间取得平衡。

目前,YASA已在蚂蚁集团内部大规模部署,扫描覆盖约2万个应用、数亿行多语言代码,发现300多条此前未知的漏洞路径,其中包括了数个0-day 漏洞,已由业务团队开展修复。该工作已全面开源。

论文链接:

arxiv.org/abs/2601.17…

开源项目:

UAST规范与解析器: github.com/antgroup/YA…

分析引擎: github.com/antgroup/YA…

技术方案与创新方法

在多语言静态分析中,中间表示(IR)的设计是决定分析效果、精度和可扩展性的核心问题。现有方案各有困境:CodeQL依赖语言专属的提取器和数据库模式,语言无关代码仅占4.5%,新增语言成本极高;Joern的CPG(Code Property Graph)过度抽象,将Python类定义分解为数十个低层节点,丢失了生成器函数、原型链等高层语义;WALA最初为Java设计,依赖于已有的基础设施(如 Rhino、Jython)来转换中间表示,难以拓展到其他语言上。

YASA的核心洞察是:AST 层面的统一是最佳平衡点——既能保留高层语义信息(优于寄存器/SSA 方案),又不会过度抽象(优于CPG),同时具备天然的可扩展性。

8899AF12-A2D1-4DBB-B469-2733CCECB5EF.png

图1:CodeQL、Joern、WALA多语言分析架构对比

围绕这一思路,YASA提出了三个关键设计:

1.UAST:统一抽象语法树规范

YASA设计了包含54 种节点类型的UAST 规范,将不同语言的AST节点划分为三类:通用语义节点(35 种):指的是至少两种语言共享的语义结构,如 RangeStatement统一了JS的for-of、Python 的 for-in、Go的range,实现"一次编写,多语言复用";语言专属节点(19 种):对于无法无损统一的语言特有构造(如Python的 YieldExpression、Go 的 ChanType),UAST规范显式保留以确保分析精度;可规约节点:对于各语言的语法糖(如列表推导、箭头函数),将其分解为等价 UAST 序列后不再保留。各语言AST 到 UAST 的转换通过直接映射、结构转换和去糖三条规则完成。

16F25B52-0603-4D8E-B9F2-EF96B20499AC.png

图2:YASA整体架构

2. Point-to Analyzer:三重敏感的过程间指向分析

Point-to Analyzer是分析引擎的计算核心,在统一的UAST之上实现了上下文敏感、路径敏感、字段敏感的过程间指向分析。上下文敏感通过状态克隆和有界调用栈扩展实现,精确区分同一函数在不同调用场景下的行为;路径敏感在条件分支处 fork 执行状态,沿 true/false 分支分别推进并最终合并,避免路径混淆;字段敏感逐字段独立追踪对象属性,避免"一个字段被污染、整个对象被污染"的过度近似。核心分析逻辑是语言无关的(52 个共享的语义处理函数,占 77.3%),同时为每种语言的独有特性配备了专门的语义处理方法,如 Python 的继承字段传播、JavaScript 的原型链方法派发、Java 的 Lombok 注解代码生成、Go 的接口满足性判断。

3. Taint Checker:插件化的污点检测系统

Taint Checker由基础污点传播规则和框架专属检测器两层构成。基础规则覆盖赋值传播、容器字段传播、函数调用传播三类通用场景,以及JavaScript原型链/Promise传播和Go Channel传播等语言特有场景。在此之上,YASA 为11 个主流框架(Python: Flask/Django/FastAPI, JavaScript: Express/Egg.js/Node.js, Java: Spring, Go: Gin/gRPC/Beego/Gorilla Mux)实现了专属检测器,针对框架定义的路由入口、中间件管道和数据绑定进行深度建模。所有检测器以独立事件驱动插件实现,新增框架支持无需修改核心引擎。

成果

在包含851个测试用例的xAST工业级基准上(github.com/alipay/ant-…),YASA在 Java、JavaScript、Python、Go四种语言上全面超越6个单语言工具和2个多语言框架(CodeQL、Joern),在对各语言的语法特性支持方面测试通过率提升4%-22%,在污点分析灵敏度方面测试通过率提升14%-26%;语言无关语义规则的跨语言复用率达77.3%,新增语言的增量工程量仅 16%-27%。扫描性能方面,YASA 达到平均31.8 KLOC/min,是 CodeQL的3.4倍、Joern的1.9 倍。所有发现的漏洞均已负责任地报告和处置。

欢迎关注【开放式安全基础设施】公众号,与上千名技术精英交流技术干货&程序分析

点击了解【开放式统一多语言程序分析产品YASA