[论文阅读] (54)NDSS26 JSIMPLIFIER:动静态与LLM如何协同完成JavaScript解混淆?

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期待与您前行,加油。

前一篇博客介绍了NDSS2026 秋季录用的智能体安全和系统安全方向的文章。本文将带来NDSS 2026的一篇论文,该工作提出了 JSIMPLIFIER,旨在概述动静态与LLM如何协同完成JavaScript解混淆?该工作提出了一条非常明确的处理链:先使输入代码可解析,再通过静态---动态协同恢复实际逻辑,最后使用LLM改善标识符与代码的可读性。注意,由于我们团队还在不断成长和学习中,写得不好的地方还请海涵,未来希望能多读多分享,这些大佬真值得我们学习。fighting!

  • 欢迎关注作者新建的『网络攻防和AI安全之家』知识星球(文章末尾)

文章目录

  • 一、研究背景:为什么JavaScript反混淆仍然很难?
    • [1.1 三个真实挑战](#1.1 三个真实挑战)
    • [1.2 20种混淆技术,分成四类](#1.2 20种混淆技术,分成四类)
  • 二、核心方法:JSIMPLIFIER的三阶段技术框架
    • [2.1 第一阶段:Preprocessor------使混淆代码成为可分析输入](#2.1 第一阶段:Preprocessor——使混淆代码成为可分析输入)
    • [2.2 第二阶段:Deobfuscator------静态与动态双向协同](#2.2 第二阶段:Deobfuscator——静态与动态双向协同)
    • [2.3 第三阶段:Humanizer------LLM主要改善可读性](#2.3 第三阶段:Humanizer——LLM主要改善可读性)
  • 三、数据集与评价
    • [3.1 三套互补数据](#3.1 三套互补数据)
    • [3.2 评价维度](#3.2 评价维度)
    • 四、关键实验结果
    • [4.1 20类混淆技术的覆盖能力(Table II)](#4.1 20类混淆技术的覆盖能力(Table II))
    • [4.2 正确性和语义一致性](#4.2 正确性和语义一致性)
    • [4.3 代码简化与熵值:效果如何量化?](#4.3 代码简化与熵值:效果如何量化?)
    • [4.4 模块消融](#4.4 模块消融)
    • [4.5 运行效率与真实部署分析](#4.5 运行效率与真实部署分析)
    • [4.6 真实案例:JSFireTruck揭示安全行为](#4.6 真实案例:JSFireTruck揭示安全行为)
  • 五、贡献与局限
    • [5.1 三个主要贡献](#5.1 三个主要贡献)
    • [5.2 论文自身承认的边界](#5.2 论文自身承认的边界)
  • 六、个人理解
  • 总结

论文 :From Obfuscated to Obvious: A Comprehensive JavaScript Deobfuscation Tool for Security Analysis

作者 :Dongchao Zhou, Lingyun Ying, Huajun Chai, Dongbin Wang

主题 :JavaScript反混淆、程序分析、安全语义恢复、LLM辅助代码可读性

会议 :NDSS 2026

代码 :https://github.com/XingTuLab/JSIMPLIFIER

参考 :奇安信星图实验室论文分享

笔记作者:贵州大学 杨子轩 杨秀璋


一、研究背景:为什么JavaScript反混淆仍然很难?

在恶意JavaScript分析中,困难往往不是拿不到脚本,而是拿到了也难以判断脚本究竟做了什么。一段看起来由奇怪变量、字符串数组、编码表达式和动态调用组成的JavaScript,实际可能包含访问来源判断、恶意页面注入与痕迹清除等行为。只把脚本格式化,或者只让LLM"猜测"其含义,都不能保证还原后的程序仍与原程序等价。

1.1 三个真实挑战

论文从真实恶意脚本和现有工具的缺陷出发,凝练出三个问题:

关键挑战 具体表现 对系统设计的要求
输入格式多样 畸形语法、旧编码、混合字符、Webpack等打包结果 先修复/统一格式,让后续AST分析有可靠输入
多层混淆复杂 静态字符串变换与运行时eval、动态求值等叠加 静态AST分析与受控动态执行应互补协同
人工理解困难 逻辑部分恢复后仍保留_0x...等无意义变量名 语义重命名、代码美化和人工核查不可缺少

1.2 20种混淆技术,分成四类

作者整理了4个层级、20种混淆技术(T0---T19),而不是"20个类别"。

混淆层级 数量 典型技术 主要变化
词法级(Lexical) 5 标识符重命名、间接属性访问、字符串/布尔编码 改变词法形式,基本结构保持
语法级(Syntactic) 6 表达式/赋值转函数、反转字符串、AAEncode、JJEncode、JSFUCK 改变代码组织和表达方式
语义级(Semantic) 7 字符串数组、控制流平坦化、死代码插入、动态eval 深度改变实现过程,保留预期行为
多层混淆(Multi-layer) 2 OB混淆、LLM辅助混淆 多种技术嵌套与组合

二、核心方法:JSIMPLIFIER的三阶段技术框架

整个框架包含三部分:Preprocessor、Deobfuscator、Humanizer。下方是一段JavaScript从混淆到可读代码的逐步变化。

2.1 第一阶段:Preprocessor------使混淆代码成为可分析输入

预处理器的主要任务是确保不同来源的JavaScript能够进入稳定的分析流水线。原图列出五个步骤:

  • Code Validity Check:使用Meriyah进行容错解析与AST构造。
  • Lexical Sanitize:转换旧式八进制转义、处理编码冲突和多字节字符的重建。
  • Semantic Compatibilize:针对旧式语法和平台相关构造进行兼容性转换。
  • Structural Refine:处理作用域与声明冲突等结构问题。
  • Code Unminify:识别并拆解打包器形成的复杂结构,改善后续分析条件。

很多检测/解混淆工作将重点放在"模型"上,但预处理失败会使之后所有算法无从谈起。输入有效性、版本兼容性、作用域正确性,实际上是安全工具落地时容易被低估的工程瓶颈。

2.2 第二阶段:Deobfuscator------静态与动态双向协同

这是我认为全文最关键的技术部分。它不是简单地把两个引擎串联,而是建立静态移交动态、动态结果回填静态的协作方式。

分析子模块 关键机制 解决的问题
Static AST Analysis 多解析器后备、表达式求值、短路逻辑、作用域跟踪 还原可由AST结构与静态上下文确定的表达式
Dynamic Monitoring 执行前风险评估、Node.js vm.runInNewContext受控执行、限制资源 捕获静态分析无法求出的运行时值
Hybrid Analysis Coordination 将难求值表达式与作用域上下文打包;对执行结果做类型感知AST替换 建立静态→动态→静态的证据闭环

对静态阶段无法安全求值的内容,系统基于分析条件识别可移交片段,并结合上下文在受控环境中计算;执行结果按类型转换为AST节点,再参与后续静态处理。这里的动态执行并非允许任意真实恶意脚本直接在宿主环境中运行。

  • 最重要的设计细节是 "边界条件":哪些片段适合静态求值?哪些需要动态执行?执行得到的值能否安全、准确地写回AST?如果缺少这些判断,所谓"静态---动态融合"就只能停留在框图上。

2.3 第三阶段:Humanizer------LLM主要改善可读性

系统使用LLM进行上下文感知的标识符重命名,并用Prettier进行格式化;论文把核心逻辑恢复交给AST分析与受控执行,而不是依赖LLM直接生成整份恢复后的程序。例如,将无意义的标识符改为更符合代码功能的名称,有助于安全分析师迅速定位行为。

这一点看似普通,却牵涉到关键安全边界:"代码读起来合理"不等于"代码语义已经被严格保持"。后文Table III、Appendix H正是检验这条边界的重要证据。


三、数据集与评价

3.1 三套互补数据

数据集 样本数量 平均文件大小 来源与目的
MalJS 23,212 391.78 KB 企业伙伴提供真实恶意样本,经清洗、去重、分层取样
BenignJS 21,209 41.40 KB 网站与GitHub等来源,用于良性样本和相关评估
CombiBench 1,296 8.06 KB 来自JsDeObsBench的复杂组合混淆子集,用于基准对比

MalJS从超过1,000万份候选样本出发,经合法性筛选与内容归一化去重,再按混淆复杂度取样。BenignJS的21,209条中,包括19,209条网站混淆样本及2,000条人工核对的干净脚本。

3.2 评价维度

作者同时考察:技术覆盖能力、结果正确性、语义一致性、代码简化度、熵值变化、代码可读性。这些指标回答不同的问题:

  • 覆盖能力:面对T0---T19,工具能否处理?
  • 语法正确性:输出代码能否满足语法要求?
  • 语义一致性:控制流、数据依赖与实际行为是否保留?
  • 简化度:Halstead Length Reduction(HLR)、Halstead Effort Reduction(HER)是否改善?
  • 熵值:代码文本和AST结构复杂度是否变化?
  • 可读性:分析人员或评价模型是否更容易理解代码?

四、关键实验结果

4.1 20类混淆技术的覆盖能力(Table II)

原论文 Table II。√表示完全成功,○表示部分成功,空白表示不支持;横向比较不同工具对T0---T19技术的处理能力。

在这项按20种混淆技术构建的能力实验中,JSIMPLIFIER覆盖全部20项。与之相比,传统工具往往只处理其中一部分技术,复杂语义级和多层混淆更难。

  • 注意 :"20/20技术可处理"是技术覆盖结果,不意味着所有现实样本都已被证明100%保留原始语义。

4.2 正确性和语义一致性

研究者对不一致的17条样本进行了失败分析,问题包括控制流改变、变量依赖破坏、API行为变化、计算差异等,若干样本同时具有多种问题。作者把重要失败原因归结为LLM变量重命名可能误解动态作用域/变量绑定。

4.3 代码简化与熵值:效果如何量化?

HLR=0.8820意味着在论文采用的Halstead长度定义下,简化幅度约为88.20%。

图2对比MalJS与BenignJS处理前后文本熵、AST熵的变化。作者在大规模样本上分析了文本熵和AST熵,其中熵分析仅使用Preprocessor与Deobfuscator,不包含Humanizer,以减少LLM引入的额外变化。

4.4 模块消融

下表展示1,000条MalJS样本上的模块组合实验。静态分析负责主要的结构/表达式还原,动态监控进一步扩展能力,Humanizer负责标识符语义增强;但调用LLM显著增加时延(Section V-G)。

4.5 运行效率与真实部署分析

表7展示了MalJS整体运行性能。 JSIMPLIFIER更像面向离线安全分析的综合工具,而非无需权衡就可直接放到毫秒级在线告警链路中的轻量检测器。对未来工程化研究而言,"何时需要昂贵的LLM阶段"是一个很有价值的独立问题。

四模型评估给出的平均相对提升为466.94% ;这反映模型评价的可读性分数变化 ,不应改写为"程序性能提升466.94%"。另一个100条样本的GPT-4o-mini标识符重命名实验发现约12%重命名幻觉率,再次显示自然语言模型对变量语义推断存在风险。

此外,作者还进行了小规模用户研究(9人 ,初级/中级/专家各3人)。其中初级参与者的任务评分相对原始代码提高12.7% ,中级参与者平均分析时间缩短47.7%。

4.6 真实案例:JSFireTruck揭示安全行为

下图展示混淆脚本及经JSIMPLIFIER处理后的可读代码与行为提示

在JSFireTruck案例中,系统将复杂混淆表达式恢复为可读的JavaScript,使分析人员能够识别:依据document.referrer筛选访问来源、插入恶意iframe、调用document.currentScript.remove()清除脚本痕迹等行为。

  • 这比单纯报告"解混淆成功"更有说服力,因为它将代码转换结果与真实安全分析任务对应起来:人能否更快定位与解释恶意行为? 建议读论文时特别关注这类贯穿引言、框架设计和案例验证的running example。

五、贡献与局限

5.1 三个主要贡献

  • 综合式三阶段框架:面对异构输入、多层混淆和可读性不足,联合预处理、静态---动态反混淆和语义增强。
  • 静态---动态双向协调:依据AST、作用域和受控执行结果进行上下文传递、类型感知回填,而非把两类分析独立拼接。
  • 覆盖与评价体系结合:梳理20种混淆技术,构建MalJS/BenignJS数据集,并结合语法、语义、简化度、熵、可读性和用户研究开展多维验证。

5.2 论文自身承认的边界

原文局限(Section VI-D) 我的理解
ES6+语法在兼容化中可能被降级 兼容性修复并非总能不损失语言特性
LLM可能误命名变量、误判动态作用域 "增强可读性"同样需要语义约束与回退
动态执行面临潜在VM逃逸风险 vm.runInNewContext并非无需额外隔离的绝对安全边界
无法处理外部密钥加密、定制解释器与部分时间依赖解密 方法有适用条件,并非通用恶意代码恢复器
对抗者可针对已有规则和分析机制设计新混淆 需要持续的真实样本验证与更新

此外,作者报告的83/100语义一致性、较高LLM阶段耗时,以及小规模用户研究,也都提醒读者不能仅据"覆盖20项技术"推断工具已在所有维度达到最优。


六、个人理解

以下内容是结合本人对PowerShell恶意代码检测、LLM安全分析与智能体系统的兴趣提出的后续研究思考。

(1)启发一:从"LLM生成代码"转向"LLM辅助决策,工具确定性执行"

JSIMPLIFIER向我们提供的最直接启示,是把语言推理能力 与确定性执行能力分离。代码语义恢复环节需要可检查、可重复的工具结果;LLM更适合做分析计划、上下文总结和解释。特别是在Table III与Appendix H出现重命名引入未定义变量的问题后,不能把"生成看似合理的代码"当作正确性的替代品。

可以考察"验证优先(verification-first)的智能体编排":智能体仅负责选择AST分析、字符串恢复或受限行为追踪工具,最终输出必须通过程序约束、语义一致性与执行证据检查。

(2)启发二:向PowerShell场景扩展,但不能简单复制JavaScript方案

此前我们讨论过" Verifiable Multi-Agent Planning for Instruction-Level PowerShell Deobfuscation"。借鉴JSIMPLIFIER的"多阶段恢复+语义核验"理念,并结合PowerPeeler已有的AST与运行时指令关联机制,设想四类角色协作:

智能体角色 可探索的职责 必须回答的科学问题
Planner 根据静态结构与混淆特征制定工具调用计划 是否比固定规则流程减少无效操作?
Executor 调用现有解析/指令跟踪/沙箱等确定性工具 是否确保恢复的可复查性与环境隔离?
Verifier 对比CFG、DDG、API行为与运行结果,失败则回退 校验指标是否真的能够预测语义错误?
Explainer 只解释通过核验的结果并给出步骤记录 是否提升分析人员效率而不引入新语义风险?
  • 边界必须讲清 :PowerPeeler的指令级解混淆与JSIMPLIFIER的静态---动态整合都是已有成果 ;如果仅把固定流程包装成四个Agent,并不必然形成新贡献。真正需要验证的是自主规划是否改善复杂混淆下的成功率/效率,语义校验闭环是否降低错误输出。

(3)启发三:建立"正确性---可读性---耗时"三目标评价,而非只比准确率

倾向于构建三层指标:功能正确性 (受控语义差分/行为等价)、安全分析效用 (分析耗时、关键行为识别、误解率)、部署成本(工具调用次数、时延、计算资源)。如果Agent决策带来额外20%耗时,却没有明显提高未知混淆恢复效果,就很难说明引入它的必要性。

(4) 启发四:让"失败案例"反过来指导新方法

这篇论文Appendix H中:在模型能让变量名更"有意义"的同时,也可能制造未定义变量和错误依赖。下一步工作如果只展示漂亮的成功示例,论证仍然很薄弱。 可以设计基于不确定性的"选择性LLM介入":当变量绑定清晰时允许语义建议,遇到动态作用域、反射或高风险API链时保留原始名称或要求额外验证。实验需报告拒绝/回退比例、错误命名率、恢复成功率和额外时延,而不是只用主观可读性分数评价。

对于学习或复现不要直接在宿主电脑执行未知恶意脚本。程序分析和受控执行应遵循机构授权、隔离环境与安全实验规范。


总结

读完这篇NDSS 2026论文,最深的体会可以浓缩成:

  • 第一,好的安全系统工作要从真实分析痛点出发,按"问题---机制---证据"构建完整论证链。
  • 第二,LLM并非必须接管全部工作;把它放在合适的规划、解释或可读性环节,并用程序分析和可验证约束兜底,往往更有研究价值。
  • 第三,真正值得深挖的新Idea通常不是"再加一个Agent",而是发现安全问题,再深度分析构建威胁模型,并证明新机制确实解决了它。

JSIMPLIFIER仍存在语义不一致、耗时和执行隔离等限制,但正因作者提供了较完整的实验与失败分析,它才为下一步可验证、多阶段、动态工具协同研究提供了值得持续追踪的起点。

2024年4月28日是Eastmount的安全星球------『网络攻防和AI安全之家』正式创建和运营的日子,该星球目前主营业务为 安全零基础答疑、安全技术分享、AI安全技术分享、AI安全论文交流、威胁情报每日推送、网络攻防技术总结、系统安全技术实战、面试求职、安全考研考博、简历修改及润色、学术交流及答疑、人脉触达、认知提升等。下面是星球的新人券,欢迎新老博友和朋友加入,一起分享更多安全知识,比较良心的星球,非常适合初学者和换安全专业的读者学习。

目前收到了很多博友、朋友和老师的支持和点赞,尤其是一些看了我文章多年的老粉,购买来感谢,真的很感动,类目。未来,我将分享更多高质量文章,更多安全干货,真心帮助到大家。虽然起步晚,但贵在坚持,像十多年如一日的博客分享那样,脚踏实地,只争朝夕。继续加油,再次感谢!

(By:Eastmount 2026-10-20 周二夜于贵阳 http://blog.csdn.net/eastmount/ )


前文赏析:

相关推荐
Ai-_Man1 小时前
ChatGPT还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·javascript·人工智能·chatgpt·小程序·ecmascript
miofly2 小时前
GitHub 今日推荐|security-audit-skill:让编码代理自己审计漏洞还互相验证
javascript·开源·github
এ慕ོ冬℘゜2 小时前
es6理论总结
前端·javascript·es6
Lsx_3 小时前
微信支付接入全流程:JSAPI支付、小程序支付与H5支付
前端·javascript·全栈
试图让你心动3 小时前
【无标题】
前端·javascript·vue.js
Hilaku3 小时前
为什么每个前端都应该拥有一个自己的独立博客?
前端·javascript·程序员
木圭的AI时代指南3 小时前
实测 MiniMax M3.1 Flash:同一道 Three.js 大题,两个 agent 差出 4.6 倍
开发语言·javascript·ecmascript
西红柿炖牛腩3543 小时前
3D 模型压缩脚本又报错又配环境?换个不用维护的方案
javascript·3d·性能优化
tryCbest4 小时前
Vue3——第 6 篇:事件处理与表单绑定——v-on 与 v-model
前端·javascript·vue.js