支付宝技术部的盛锦辰(幻猫)在第 19 届 D2 终端技术大会发表了主题为《鸿蒙 ArkTS 代码安全风险检测》的演讲。
前言:安全是技术发展的基石
在当前软件工程技术迅猛发展的数字化变革浪潮中,安全依然是所有技术架构中不可动摇的基础设施。无论是传统互联网软件系统还是新兴的 AI 融合系统甚至AI原生系统的演进过程中,安全技术始终发挥着关键性作用。正如高性能汽车制造过程中,先进引擎、空气动力学设计和精密控制系统都必须建立在完善的安全框架之上,技术创新同样需要坚实的安全保障作为前提条件。
安全机制并非可选功能,而是系统架构的核心支柱,尤其在新兴技术领域更显重要。新的架构带来了新的业务与技术发展机会,也引入了全新的安全挑战,这些挑战若不能有效应对,可能对整个业务造成不可预估的损失。
鸿蒙原生应用安全挑战与机遇
2022-2023 年,国内主流应用平台纷纷启动了鸿蒙原生应用的战略性开发计划,支付宝同样积极响应这一技术变革。作为支付宝安全团队,我们高度关注这一新兴操作系统及其 ArkTS 开发语言可能引入的潜在安全隐患。鸿蒙生态不仅可能继承传统移动应用的安全脆弱性,还可能因新架构、新组件和新通信机制引入前所未有的攻击面。
这种技术平台迁移过程伴随着显著的安全风险,原因在于新平台的安全成熟度尚未经过长期验证,开发者对平台安全特性的理解不足,以及安全工具链的缺失。我们面临的挑战是在保障业务快速创新的同时,确保用户数据和交易安全不受威胁。
2024 年初,我们对 ArkTS 语言安全分析工具进行了全面系统的市场调研,发现市场上几乎不存在专门针对 ArkTS 语言的安全分析解决方案。这一技术空白亟需填补,尤其考虑到支付宝承载的金融级安全要求,支付宝安全团队与平台事业群程序分析团队携手进行技术共建,并通过一年时间的努力构建了一套完善的安全检测技术体系。本次技术分享的主要目的即详细介绍我们为 ArkTS 语言开发的这套完整安全分析工具体系,并通过开源方式回馈技术社区,共同提升鸿蒙生态的安全水位。
https://github.com/codefuse-ai/CodeFuse-Query
分析目标与技术架构设计
鸿蒙应用架构通常遵循清晰的分层设计:底层的系统能力层(主要采用C/C++ 实现),中间的业务 Native 层(主要采用 ArkTS 实现),以及上层的业务跨端层。我们的安全分析重点聚焦于业务 Native 层,因为这一层不仅承载核心业务逻辑,还涉及复杂的跨 bundle 通信、组件间调用和权限管理机制。
这一层的安全分析面临诸多技术挑战:代码分散在多个独立 bundle 中、组件间通过多种机制进行通信、数据流经过多重转换和处理,以及框架自动处理的隐式调用。这些特性使得传统的单文件或单模块分析方法难以发挥作用。
针对这些复杂场景,我们设计的分析技术需要具备四大核心能力:完整的调用链分析能力(追踪方法调用关系及参数传递)、全面的污点数据流分析能力(跟踪用户输入如何影响关键操作)、精确的变更分析能力(识别代码变更可能引入的新风险),以及深度的业务逻辑理解能力(识别特定业务场景下的安全隐患)。
以一个典型的 JSAPI 安全漏洞为例:某支付宝小程序提供了文件上传 API,允许开发者传入文件路径参数并上传至指定服务器。恶意攻击者可通过构造特殊的路径参数(如包含"../"的目录穿越路径),实现对应用沙箱外敏感文件的非授权访问和泄露。这类漏洞的危险性在于:它涉及多个 Native bundle 之间的数据传递链路,最终调用底层系统 API 实现文件操作,而整个过程中缺乏有效的输入验证和路径规范化处理。只有通过全面的跨 bundle 数据流分析,才能有效识别此类安全风险。
ArkTS 语言分析框架的核心设计
我们构建的 ArkTS 安全分析框架包含三大核心技术模块:
源码抽取与分析层:该层负责从 ArkTS 源代码中精确提取关键程序结构、语法特性和语义信息,并将其转换为结构化的中间表示形式。并基于中间表示形式施加基础的程序分析算法,得到函数内控制流、数据流以及程序调用图等程序分析基础数据。
高级算法与分析层:在程序分析基础数据上实现一系列上层分析算法,包括调用链路分析、上下文敏感的跨函数污点数据流分析、以及针对 ArkTS 特性优化的污点分析算法。这些算法共同构成了强大的分析引擎,能够发现常规测试难以识别的深层次安全问题。
程序建模与知识层:针对 ArkTS 框架 API、系统服务和第三方库进行全面建模,弥补源码分析的不足。这层包含大量专家知识和安全规则,能够理解 ArkTS 框架的内部工作机制,如补全跨 bundle 连接的信息,以及识别框架级的安全风险点,如权限绕过、数据泄露和组件劫持等问题。
源码抽取技术介绍
我们调研了华为开源的 ArkTS 编译器,并基于此进行深度定制以满足安全分析需求。通过编译器前端,我们获取完整的抽象语法树(AST),捕获代码的精确结构和语义信息。
在此基础上,我们采用 Datalog 分析技术 —— 一种兼具声明性和递归能力的高效查询语言,将 AST 节点及其关系转换为程序分析关系型数据库。Datalog 的优势在于其形式化严谨性和高效的递归查询能力,特别适合基础控制流、数据流、调用图分析等这类需要频繁递归推导的场景。
通过精心设计的 Datalog 规则集,我们实现了层次化的程序表示构建:首先提取基本的语法结构,然后逐步构建更复杂的程序表示,包括精确的控制流图(CFG)、全面的数据流图(DFG)以及完整的方法间调用关系图(CallGraph)。这些基础数据结构共同构成了后续高级分析的坚实基础。
我们将这些结构化数据存储在专门设计的关系数据库中,支持高效查询和增量更新。整个源码抽取模块已作为独立组件开源,为社区提供可复用的 ArkTS 代码分析基础设施。
函数内数据流分析
数据流分析的核心挑战在于准确模拟数据在程序执行过程中的传递和转换。我们的方法分为三个关键步骤:
首先,我们精确建模 ArkTS 程序的控制流结构,包括条件语句、循环结构、异常处理和异步执行模式。通过路径敏感的分析技术,我们能够区分不同执行路径上的数据流特性,避免传统分析中的路径混淆问题。
其次,我们深入建模影响值传递的各类操作,包括直接赋值、属性访问、解构赋值、对象传递和引用共享等 ArkTS 特有的数据操作模式。我们在 AST 节点间建立精确的数据流边,表示数据如何从一个程序点流向另一个程序点。
最后,我们从海量的数据流关系中提取三类关键需要缓存的数据流摘要:从外部输入参数到方法返回值的数据流(识别数据泄露风险)、从输入参数到敏感操作调用点的数据流(识别注入类风险),以及从安全规则定义的入口点到敏感操作的完整数据流路径(识别端到端的攻击链)。
函数间分析算法
函数间分析是安全检测的核心挑战,我们的创新在于开发了两代算法以平衡分析精度和性能。
第一代采用 Bottom-Up 算法,从调用图最底层开始逐层向上分析。算法核心思想是先分析无外部调用的基础函数,计算其摘要信息后缓存结果,再分析调用这些基础函数的上层函数。这种自底向上的汇聚过程类似企业信息流:基层员工的工作报告汇总至直接主管,再层层上报至高层管理者,每一层只需关注直接下属的汇总信息。
该算法的优势在于只需一次迭代即可完成全程序分析,但计算量随程序规模线性增长。以及局限性在于缺乏跨多个方法的上下文敏感性,可能导致一些调用情境下的行为混淆,产生误报。
针对这一挑战,我们开发了第二代改进算法,将分析过程分为两个独立阶段:第一阶段并行分析所有方法节点并构建细粒度缓存,第二阶段根据实际需求自顶向下进行上下文敏感的按需分析。这种设计借鉴了大数据 MapReduce 思想,并针对安全分析场景进行了专门优化。
改进算法在保持高效率的同时,显著提升了分析精度,特别是在处理多态调用、回调函数和框架驱动的事件处理等复杂场景时,能够准确区分不同调用上下文下的安全行为。
算法论文:https://dl.acm.org/doi/10.1145/3632743 《Octopus: Scaling Value-Flow Analysis via Parallel Collection of Realizable Path Conditions》
程序建模与大模型辅助技术
ArkTS 应用大量依赖框架 API 和系统服务,这些代码通常不直接包含在应用源码中,仅以接口声明形式存在。为解决这一"隐形代码"问题,我们开发了系统性的程序建模方法。
传统方法要求安全专家手动分析每个API的行为并创建模型,这一过程耗时且易出错。例如,分析鸿蒙 SDK 中的 Buffer.from() 方法,安全专家需明确其内部如何处理输入数据并影响返回值,但SDK仅提供接口声明而非实现细节。
我们的创新在于引入大模型辅助技术,构建半自动化的 API 建模流水线。流程包括:首先通过程序分析自动提取所有鸿蒙 SDK 接口和应用中的调用点;然后将这些信息与API文档和代码注释整合,构建结构化的提示模板;最后将提示输入到千问大模型中,自动生成安全相关的 API 行为模型。
这一方法取得了显著成效:我们已从鸿蒙 SDK 的 9,508 个 API 中,自动识别并模型化了 520 个关键安全相关 API,初次生成的模型完全准确率达 70%,其余 30% 仅需轻微人工调整。这大幅降低了专家工作量,同时保证了模型质量。
随着大模型能力不断提升,我们预计未来能实现更高的自动化水平,甚至可能通过代码理解技术直接从框架实现中提取安全模型,而无需人工干预。
研发流水线集成与变更分析技术
将安全分析无缝集成到开发流程是实现“安全左移”的关键。我们设计了完整的流水线集成方案,在 bundle 集成到应用前自动触发安全扫描,确保问题在早期阶段被发现并修复。
对于快速迭代的研发团队,我们重点优化了变更分析流程,专注于新增或修改的代码部分。具体实现包括三个关键步骤:
首先,通过精确的版本比较技术,我们比较当前开发分支与上一次发布版本的差异,利用 Git 差分算法提取变更文件列表和具体变更内容。
其次,我们对变更部分进行针对性构建和分析。仅为变更部分构建 AST 并进行数据流分析,大幅降低分析成本。同时,我们采用智能上下文推断技术,确保即使在局部分析的情况下,也能准确捕获变更代码与周边代码的交互影响。
最后,我们实现了增量风险评估机制,能够精确判断变更代码是否修复了已有风险、引入了新风险,或者影响了现有安全措施的有效性。
跨 Bundle 分析与知识图谱技术架构
鸿蒙应用的模块化特性带来了显著挑战:单个分析引擎受内存和计算能力限制,难以同时处理完整应用的所有代码。为解决此问题,我们开发了创新的跨 Bundle 分析架构。
核心思想是将每个 bundle 视为一个独立的分析单元,提取其数据流摘要后存入统一的知识图谱。这种方法类似于函数内分析的扩展,将整个 bundle 抽象为具有明确输入输出特性的“超大函数”。
知识图谱中包含五类关键节点:入口节点(表示 bundle 可接收的外部输入)、出口节点(表示 bundle 对外暴露的数据)、危险调用节点(表示 bundle 内的敏感操作)、中间节点(表示重要的数据处理和转换点)以及安全防护节点(表示输入验证和数据清洗操作)。
知识图谱最核心的技术挑战在于如何精确连接不同 bundle、不同语言间的节点关系。我们基于实际通信机制设计了两套连接规则:
针对显式调用(如直接 import 和方法调用),我们通过分析模块导出机制,构建唯一标识键,包含导出方法的完整路径、方法签名和参数位置信息。当两个 bundle 中出现匹配的标识键时,系统自动建立连接。
针对隐式调用(如框架回调和事件处理),我们通过建模框架行为实现连接。例如,鸿蒙的 startAbility 方法启动新页面时会触发目标 Ability 的 onCreate 回调,我们通过分析 WantParams 中的 bundleName 和 abilityName 参数,构建特殊连接键将调用方与目标回调方法关联。
目前,我们的知识图谱包含 22 类节点类型,涵盖代码实体(如方法、变量、API)、业务实体(如应用、模块、功能)和组织实体(如团队、责任人)。这种多维度建模使我们能够回答复杂的安全查询,如“特定团队负责的模块是否存在跨公司数据传输的未授权风险”,为安全治理提供全景视图。
风险推理引擎与智能检测系统
基于完整的知识图谱,我们构建了四层风险检测架构:数据采集层、知识关联层、智能决策层和业务平台层。这一架构不仅服务于代码安全分析,还支持更广泛的安全风险管理场景。
在风险推理引擎中,我们将安全风险检测抽象为带约束条件的子图匹配问题。通过专门设计的声明式查询语言(DSL),安全专家可以精确定义风险模式,而无需理解底层图算法细节。
我们的 DSL 支持三类关键定义:子图模式定义(描述风险的结构特征)、约束规则定义(指定排除条件,如已实施的安全措施)以及结果格式定义(规定风险报告的信息组织方式)。
例如,针对前文提到的文件上传漏洞,我们可以定义子图模式为“从用户可控输入到文件操作 API 的数据流路径”,约束规则为"路径上不存在路径规范化或权限验证操作",结果格式包含完整调用链和受影响的 API 信息。
这种基于图的推理方法具有显著优势:能够发现复杂的多步骤攻击链,支持灵活的规则组合和条件表达,以及提供直观的可视化结果,帮助开发者理解风险成因和修复方法。
目前,我们的推理引擎采用高效的图算法实现,能够在小时级时间内完成大规模应用的风险检测,支持实时开发环境中的即时反馈需求。
技术成果与未来展望
通过系统性的技术创新,我们已取得显著的业务与技术成果:
建立了面向 ArkTS 语言的专业级程序分析工具链,支持精确的数据流和控制流分析;
构建了完整的鸿蒙端代码知识图谱和基于图的风险推理架构,支持全景式安全分析;
在产品发布前发现并修复了多个安全风险;
将核心分析引擎组件开源,为鸿蒙生态安全建设提供基础设施支持。
展望未来,我们的技术发展将围绕四个方向持续深化:
算法与工程优化:安全静态分析是一个需要不断深化的领域,我们将持续改进分析算法的精度和性能,减少误报和漏报,提升分析速度。特别是在处理大规模应用时,我们计划引入更多启发式算法和优化技术,实现分析能力的质的飞跃。
“三端一码”技术支持:随着跨平台开发框架的兴起,许多企业正探索通过单一语言/仓库支持 Android、iOS 和鸿蒙三个平台的技术路线。这一趋势对安全分析提出新要求,我们将扩展现有架构,支持跨平台框架的特定语法和运行时行为,确保在代码复用的同时不会引入跨平台安全风险。
跨语言分析与端云打通:现代应用系统日益复杂,往往涉及多种编程语言和前后端交互。我们将加强跨语言分析能力,以及客户端与服务端程序之间的数据流跟踪,识别端云协作中的安全风险,如API接口缺少权限校验、数据加密不一致等问题。
AI 驱动的分析优化:当前我们的架构主要基于确定性规则和算法,这种方法在处理明确定义的风险时非常有效,但在发现未知风险和理解复杂逻辑时存在局限。我们正在探索将大型语言模型与传统程序分析技术相结合,构建智能辅助的安全分析工具。在单个工程或特定 API 的分析场景中,我们正在探索,未来将进一步扩展 AI 在风险评估辅助、修复代码生成推荐等方面的应用。
我们相信,随着这些技术方向的深化,安全分析技术将更加智能化、自动化,并能更好地适应快速变化的软件开发实践,为构建更安全的鸿蒙生态提供坚实保障。
最后,欢迎对 ArkTS 安全分析感兴趣的开发者和研究人员访问我们的开源项目,共同推进鸿蒙安全技术的发展。通过开源协作,我们期望建立更广泛的技术交流,共同提升整个行业的安全能力水平。
https://github.com/codefuse-ai/CodeFuse-Query

