JS加密的研究背景和意义

发布于 2023-11-29  1.16k 次阅读


  • JS加密的研究背景和意义

    往期文章 一.研究背景 JavaScript在应用的早期主要处理一些页面内容修改和表单提交等简单操作,代码结构…

往期文章

JSVMP是什么

一.研究背景

JavaScript在应用的早期主要处理一些页面内容修改和表单提交等简单操作,代码结构简单,安全需求不高。而伴随着网络和浏览器性能的提高,前端的JavaScript 应用也越来越丰富多样化,其执行能力和性能的增强,也使得更多的重要逻辑从后端 转向前端。同时这也意味着,JS加密的工作变得越来越重要,并且其自身的安全问题和安全需求也就越加紧迫。


在许多涉及登录注册以及安全支付和交易的前端页面中,都依赖JavaScript脚本 来实现交互过程中的安全需求。比如用户在交易支付页面完成交互时,前端JavaScript 实现安全代码会对用户的行为进行特征数据采集,加密重组后上传,然后分析比对人 固有的行为特征,识别是否存在机器行为并及时的执行交互过程的阻断,如图1所示, JavaScript代码的在人机验证中起到了重要的作用,一旦恶意的用户破解了前端代码 的加密手段,逆向分析出执行逻辑,往往可以伪造数据将自己模拟成一个正常用户, 绕过安全验证进而达到其恶意的目的。

JavaScript脚本在可信前端框架中的作用

因此,随着电商等服务的高速发展,也衍生了大量的恶意注册、刷单等借助技术 手段获利的黑色产业。构建安全可信的前端交互环境,首先需要保障输入数据的安全 和可靠,鉴别来自用户的消息和数据的真实性。但是,前端浏览器作为一个开放的平 台,采集数据的主要手段JavaScript代码是直接暴露的,很难阻止恶意用户通过分析代码、伪造数据来获利。因此,在前端安全对抗中,JavaScript代码安全的重要性日益凸显JS加密。

目前主流的JavaScript代码保护措施主要为精简、加密和混淆,这些方法的核心 思想主要借鉴传统的软件代码保护技术。而JavaScript属于脚本语言,在传输过程中 就是带有语法属性的文本源码,逆向分析要比传统的经过编译的二进制应用程序更加 容易,再加上浏览器性能的发展,调试器的功能越来越完善,这些保护方法很难起到 很好的保护效果。


针对目前JavaScript代码保护方法存在的缺陷,我们提出一种基于WebAssembly 的JavaScript代码虚拟化保护方法。该方法借鉴二进制代码保护中的代码虚拟化保护 的思想,设计实现一种针对JavaScript代码的虚拟化保护方案,基于抽象语法树(AST, Abstract Syntax Tree)对目标代码进行特殊的指令拆分和自定义的虚拟化处理,然后 基于WebAssembly编译实现特定的虚拟解释器,在执行时解释还原目标代码的语义 和逻辑。通过虚拟机保护技术隐藏JavaScript代码的执行逻辑,阻止目标代码的核心 功能和逻辑结构被恶意的分析和使用,满足目前前端攻防环境下的关键JavaScript应用的安全需求。

二.JS加密现状

1 JavaScript代码保护


在Web应用和浏览器性能蓬勃发展的今天,JavaScript作为一门重要的浏览器语言受到广泛的应用。由于JavaScript传输的就是源码,在前端对抗中,源代码的暴露使其安全性十分脆弱,因此一直以来,JavaScript代码的加密广受学术界和工业界的 关注。有多款商业化的保护系统和平台提供综合的JavaScript代码保护,例如, JScrambler[ 1]是一款成熟的商用保护工具,提供了多种代码保护选项,可以JavaScript 代码实施压缩、数据和字符串分割编码、结构和变量名混淆等多种保护策略,其还带 有简单的反调试措施阻碍恶意的调试分析。JavaScript Obfuscator[ 2]主要对JavaScript 代码的进行加密和混淆保护,通过编码、加密和转移字符串,混淆变量名以及插入垃 圾代码等策略来提高对JavaScript代码的保护强度。JShaman[ 3]在平展控制流混淆和代 码加密的基础上,引入JavaScript代码的多态变异策略,每次调用脚本会自动发生变 异,防止代码被动态调试分析。还有一些保护工具针对某类特定的保护效果,如Google会分析JavaScript代码,删除不会执行的死代码,去除其中一些可以直接输出运行结果的逻辑,通过一种近乎重构的方式来压缩脚本文件。Yosuke提供了两套编码工具,可以将JavaScript代码编码成由常用字符或者颜文字表情字符组成的代码,破坏代码的可读性,阻碍恶意的逆向分析。


对于软件代码保护的探索,也有越来越多的研究工作关注JavaScript代码保护JS加密。Qin等人[6]提出了一种参考多态性病毒特征设计的随机加密算法“parhelion”,通过随机加密的方式保护脚本代码。Terrace等人[7]提出了一个框架“js.js”,其是一个运行在JavaScript环境下的JavaScript解释器,可以在完全隔离的沙盒环境中执行第三方脚本,从而达到控制代码行为的效果。Bertholon等人[8]提出了一种基于进化的启发式的设计来优化的混淆框架“JShadObf”,对于给定的JavaScript程序,通过迭代优化选择将特定转换序列应用于目标代码以提高其混淆强度。陈晓江等人[9]通过分析研究各个主流浏览器的调试原理和特征,添加调试行为的检测和响应机制,来保护JavaScript代码不被恶意的动态调试。房鼎益等人[10]引入时间多样性的思想,对JavaScript代码进行多样化处理使保护后的代码在执行时具有多样性,从而达到抵御累积攻击的效果。Liu等人[11]提出了一个统一的框架“Closure”来优化程序混淆。对一个给定的程序输入和一组混淆变换集合,基于马尔可夫链蒙特卡罗方法指导随机算法类搜索出最优解,并最终给出最优的混淆变换序列。

2.代码虚拟化/JS加密/JS混淆保护

代码虚拟化保护(又称虚拟机保护JS加密)的思想在Windows应用安全上的实施已经非常成熟,是目前最强的二进制代码保护方案。其基本原理是用自定义的虚拟指令替换原程序指令,再在运行时使用对应的解释器将其用本地指令解释还原。因为其强大的保护效果,目前在工业界已经被广泛的应用和商业化,比如Themida[12]、CodeVirtualizer[13]和VMProtect[14]等都是业界成熟的商业虚拟机保护应用。在学术界,也有大量的工作研究讨论如何使用和增强代码虚拟化技术来保护软件免受恶意逆向工程的攻击。Fang等人[15]提出了一种多阶段软件虚拟化方法,该方法采用不同的解释器迭代转换关键代码区域多次以提高安全性,对手将需要破解所有的中间结果来找出原始代码的结构。类似的,Yang等人[16]提出了嵌套虚拟机代码保护,使得攻击者不得不完全逆向工程一层解释器,然后才能再移动到下一层,增加恶意逆向攻击的成本。Averbuch等人[17,18]在基于虚拟机的保护的基础上引入了加密和解密技术,该方法使用AES算法和自定义加密密钥来加密虚拟指令,在运行期间解密虚拟指令,然后再调度处理程序来解释虚拟指令。房鼎益等人[19,20]提出了一种时间多样性的保护方案,以增加受保护的代码区域的时间多样性来抵御动态分析。

该方法通过构建几个等效但不同形式的子程序执行路径来实现,在运行时动态的从这些路径中随机选择一条执行。Wang等人[21]在传统虚拟机结构的基础上提出了寄存器轮转和多虚拟寄存器等方法改进虚拟机保护强度。汤战勇等人[22]提出了一种虚拟指令随机化的保护方法,根据虚拟指令的定义设计随机化编码方式,使得软件在保护后的代码具有多样性,达到阻碍恶意逆向分析的效果。Kuang等人[23,24]提出了具有动态调度结构的多虚拟机代码保护方案,采用动态的指令调度程序和多虚拟机结构来随机地指导程序执行不同的路径。保护后的程序每次执行都具有不同的执行行为和路径,使得攻击者重复利用从先前运行或类似应用程序收集的知识发起攻击变得更加困难。

3.WebAssembly技术

JavaScript作为脚本代码,执行在浏览器的JavaScript引擎中,虽然JavaScript执行的速度经过引擎的不断优化获得了极大的提升,但其执行效率仍然无法达到原生C/C++程序的程度,因此,浏览器厂商开始引入WebAssembly。WebAssembly(缩写为WASM)是由包括所有主要浏览器供应商的代表组成的W3C社区组开发的一个开放标准[25],是一种安全,便携,低级的代码格式,旨在实现高效执行和紧凑表示,它的主要目标是在Web上启用高性能的应用程序[26],是除了JavaScript以外,另一种可以在浏览器中执行的语言。此外,现有各种语言的编译器,如Java[27]、Rust[28]和C\C++[29],以及专门为WebAssembly设计的语言[30,31],都支持它作为编译目标,这使得程序员能够自由选择最适合特定应用特性的编程语言。

WebAssembly作为一种高效的浏览器语言,一经出现就受到学术界的广泛关注。MichaReiser和LucBläser[32]提供了一个交叉编译器Speedy.js,将性能关键的JavaScript/TypeScript代码转换为WebAssembly,并生成必要的粘合代码,将生成代码集成到传统的JavaScript应用程序中,通过这种方法可以使计算密集型的代码显著加速。Letz等[33]利用新的WebAssembly技术改进之前的工作,将WebAssembly应用到WebAudioAPI的上下文中,用C\C++实现更高效的采样级DSP(数字信号处理)算法。Ellul等人[34]认为WebAssembly可以减少通过网络发送的客户端脚本的占用空间以及JavaScript中固有的执行开销,并且它基于网络平台、和语言无关,具有紧凑和高效执行的编码特性,非常适用于无线传感器网络(WSN)应用。

通过对JS加密的分析可以发现,目前的研究方向主要集中在代码加密和混淆保护,这些方法在传统二进制程序中有着成熟的应用,也意味着存在相应的成熟的逆向分析手段。尽管提出的优化的混淆框架等能有效的增加混淆的复杂度,但是JavaScript是一种源码传输的脚本语言,比起经过编译的二进制应用更加容易逆向分析,添加的反调试和防篡改模块也容易被发现和剔除。传统代码混淆的效果主要是改变目标代码的语法结构,而代码虚拟化则是将目标代码映射成虚拟指令并通过解释执行,改变了目标代码的执行过程,因此代码虚拟化可以带来更强的保护效果。WebAssembly技术的逐步应用也使得传统二进制程序保护的加壳和虚拟化思想更有可能应用到JavaScript代码保护之上。

JS一键VMP加密 jsvmp.com


点击体验一键VMP加密 |下滑查看JSVMP相关文章