Web安全研究(六)

文章目录

  • HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs
    • 文章结构
    • Intro
    • js obfuscation
    • methodology
      • Example

HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs

CCS 2019
CISPA

恶意软件领域,基于学习的系统已经非常流行,并且可以检测新的恶意变种。然而,掌握目标系统特定内部知识的攻击者可能会生成被错误分类的输入样本。在实践中,强攻击者的假设并不现实,因为这意味着可以获取内部信息。

作者提出HideNoSeek这种工具,无需任何目标系统的信息,可以规避整个基于语法特征的检测器类别;这种攻击包括改变恶意js样本的结构以重新生产良性语法。

具体来说,HideNoSeek需要恶意种子样本来搜索恶意种子样本和良性样本之间的同构子图,然后使用恶意等价物(相同的AST结构)来替换良性部分,并且调整其余良性数据依赖关系。

文章结构

  1. intro
  2. javascript obfuscation
    1. obfuscation techniques
    2. static detection system
    3. malicious transformation of ASTs
  3. Mthodology
    1. Conceptual Overview
    2. Program dependency graph analysis
    3. slicing-based clone detection
    4. malicious code with a benign ast
  4. comprehensive evaluation
    1. experimental setup
    2. evasive samples generation
    3. validity test
    4. evaluation against real-world systems
    5. run-time performance
  5. discussion
  6. related work
  7. conclusion

Intro

Javascript是一种浏览器语言,最初是为了增强网站与用户的交互性和提高用户友好性创建的,但其是在用户浏览器上工作,因此也可用于从事恶意活动,如加密货币挖掘,偷渡式下载,重定向托管网站等。利用js的词法和语法可以为捕捉代码的显著属性提供有价值的洞察力。且与机器学习相结合时,可以准确的检测出新的混淆变体。

攻击者越来越多的使用混淆技术来逃避检测,给人工分析带来更多的障碍。因此恶意\混淆会在样本的语法中留下痕迹。因此,改变恶意样本的结构以重现现有良性语法的设计会挫败任何基于语法或词汇结构的分类器。例如作者可以在更大的良性软件中插入恶意软件,以通过在统计上增加良性特征来逃避检测。

作者提出一种在AST层检测、替换和调整良性文件与恶意文件之间所谓克隆的方法:
通过语法分析将js代码转为AST,而后用来构建程序依赖图;program dependecy graph,PDG

  • 基于后向切片的克隆检测;
  • 良性AST替换;

js obfuscation

作者在野外发现的几种类型的混淆规避技术:

  • 随机化混淆,在不改变语义的情况下,随机插入或改变脚本元素,如添加空白字符,变量名随机化,从而挫败依赖于内容匹配的技术
  • 数据混淆,重新组合字符串的操作技术,如字符串拆分/合并,字符替换
  • 编码混淆,使用标准编码或自定义编码,以及加密解密功能,米遍特定字符串以文本形式出现
  • 逻辑结构混淆,在脚本中添加无关指令,如大量条件分支
  • 环境交互,将语句拆分并分散到HTML文档中的多个脚本标签中,有效载荷包存在DOM中,然后再提取出来;

Still, obfuscation should not be confused with maliciousness: benign obfuscation can protect intellectual property, while malicious obfuscation hides the malicious intent of the sample.

混淆和恶意不能混为一谈,良性混淆可以保护知识产权,恶意混淆则用于隐藏样本的恶意意图。

HideNoSeek并不试图将样本的恶意性隐藏在传统的混淆层后面,而是先通过JSDetox,box-js进行解混淆,然后改变恶意样本的结构,重写为现有的良性语法,这一隐藏形式可视为一种新的混淆形式。

methodology

image.png
三部分构成:

  • 抽象代码表示,使用控制流和数据流来增强ast,并将数据存储在pdg中
  • 同构子图查询,查找benign和malware的相同子图,然后后向切片,使用恶意克隆代替良性克隆,并遵循原有的良性数据依赖关系
  • 将AST转换回代码

语法分析由 JavaScript 解析器 Esprima [28] 进行,它以有效的 JavaScriptsample 作为输入,生成描述程序句法结构的有序树(AST)。

总的来说,Esprima 可以生成 69 个不同的语法单元,称为节点。

内节点代表操作符,如变量声明(VariableDeclaration)、赋值表达式(AssignmentExpression)或 If 语句(IfStatement),而叶节点则代表操作数,如标识符(Identifier)或文字(Literal)(ContinueStatement 和 BreakStatement 除外)。

var x = 1;
var y = 1;
if (x == 1) {d = y;}

image.png

如图所示,AST 仅保留了程序构造如何嵌套以形成源代码的信息,但不包含任何语义信息,如控制流或数据流,而这正是我们进行克隆检测所需要的。

image.png

image.png

在 JavaScript 中,作用域定义了变量的可访问性。在 JavaScript 中,作用域定义了变量的可访问性。如果变量是在任何函数之外定义的,或者没有使用 var、let 或 const 关键字,或者使用了 window 对象,那么它就属于全局作用域,而只能在代码的特定部分(如块语句)中使用的变量则属于局部作用域。

目标是从恶意文件中检测出也可以在良性文件中找到的子AST。将这种常见结构称为克隆。

为了检测克隆,作者采用了 Komondooret 等人[45]的算法,该算法结合了 PDGs 和程序切片的变体[78]。

  1. 创建等价类(第 3.3.1 节),根据其抽象语法意义重新组合常见的良性和恶意 PDG 语句节点。
  2. 对于同一类别中具有相同语句依赖性(即切分标准)的良性和恶意对,我们将它们添加到当前克隆列表中,并沿着它们的控制和数据依赖性向后切分。
  3. 当且仅当它们匹配(语法相同)时,我们才会将这些前代节点添加到当前克隆列表中,只要找到匹配的语句节点,我们就会进行迭代(第 3.3.2 节)。

Example

恶意js样本

wscript = WScript . CreateObject ('WScript . Shell ');
wscript . run (" cmd . exe /c \"< malicious powershell >;\" ", "0");

image.png

良性样本:

obj = document . createElement (" object ");
obj . setAttribute ("id", this . internal . flash .id);
obj . setAttribute (" type ", " application /x- shockwave - flash ");
obj . setAttribute (" tabindex ", " -1");
createParam (obj , " flashvars ", flashVars );

良性AST形势下的恶意语义样本:

wscript = WScript . CreateObject ('WScript . Shell ');
wscript . toString ('id ', this . internal . flash .id);
wscript . run ('cmd . exe /c "< malicious powershell >;" ', "0");
wscript . hasOwnProperty ('tabindex ', ' -1');
parseFloat ( wscript , 'flashvars ', flashVars );

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DS:二叉树的链式结构及实现

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、前言 前期我们解释过二叉树的顺序结构&#xff08;堆&#xff09;为什么比较适用于完全二叉树&#xff0c;因为如果用数组来实现非完全二叉树&#xff0c;那么数组的中间部分就可能会存在大量的空间浪费。 …

Linux操作系统基础(十四):集群服务器搭建

文章目录 集群服务器搭建 一、新增Linux服务器 1、克隆虚拟机 2、修改虚拟机的硬件配置 3、修改虚拟机的网络配置 二、关闭防火墙 1、关闭firewalld 2、关闭SElinux 三、修改主机名 四、修改hosts映射 五、SSH免密登录 六、时钟同步 七、远程文件拷贝 1、从本机拷…

剑指offer——二进制中1的个数

目录 1. 题目描述2. 可能引起死循环的想法3. 改进后的代码4. 给面试官惊喜的代码 1. 题目描述 请实现一个函数&#xff0c;输入一个整数&#xff0c;输出该数二进制表示中1的个数。例如把9表示成二进制位1001&#xff0c;有2位是1&#xff0c;因此如果输入9&#xff0c;该函数输…

Selenium图表自动化开篇

目录 前言&#xff1a; 使用 Canvas 或者 SVG 渲染 选择哪种渲染器 代码触发 ECharts 中组件的行为 前言&#xff1a; 图表自动化一直以来是自动化测试中的痛点&#xff0c;也是难点&#xff0c;痛点在于目前越来越多公司开始构建自己的BI报表平台但是没有合适的自动化测试…

Shell 学习笔记(三)-shell变量

Shell 语言是一种动态类型和弱类型语言, 因此,在Shell中无需显示地声明变量, 且变量的类型会根据不同的操作符而发生变化. 静态类型语言: 在程序编译期间就确定变量类型的语言, 如java, C等 动态类型语言: 在程序运行期间才确定变量类型的语言, 如PHP, Python等. 一 shell变量…

高中信息技术—数据采集与编码(一)

计算机技术的应用&#xff0c;使得数据的处理方式发生了巨大的转变&#xff0c;要用计算机处理这些数据&#xff0c;需要对采集到的数据进行一定的转换。 采集方式 1.人工采集—观察、实验 2.机器采集 互联网—网络爬虫 传感器—自然信源 数字化 信息可用模拟信号或数字信号表…

MySQL学习记录——구 复合查询

文章目录 1、基本查询2、多表查询3、自连接4、子查询1、多行子查询2、多列子查询3、from句中的子查询 5、合并查询 1、基本查询 看一些例子&#xff0c;不关心具体内容&#xff0c;只看写法 //查询工资高于500或岗位为MANAGER的雇员, 同时还要满足他们的姓名首字母为大写的J …

Docker的常见命令以及命令别名

常见命令 命令说明docker pull拉取镜像docker push推送镜像到DockerRegistrydocker images查看本地镜像docker rmi删除本地镜像docker run创建并允许容器docker stop停止指定容器docker start启动指定容器docker restart重新启动容器docker rm删除指定容器docker ps查看容器do…

ClickHouse--04--数据库引擎、Log 系列表引擎、 Special 系列表引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.数据库引擎1.1 Ordinary 默认数据库引擎1.2 MySQL 数据库引擎MySQL 引擎语法字段类型的映射 2.ClickHouse 表引擎3.Log 系列表引擎几种 Log 表引擎的共性是&#…

opencv通道分离与合并

void QuickDemo::channels_demo(Mat & image) {std::vector<Mat>mv;//通道分离合并split(image,mv);//原图 指针(Mat)imshow("蓝色", mv[0]);imshow("绿色", mv[1]);imshow("红色", mv[2]); } split(image,mv);//原图 指针(Mat) 这里…

学习笔记20:牛客周赛32

D 统计子节点中1的个数即可&#xff08;类似树形dp&#xff1f;&#xff09; #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<set> #include<map>u…

Rust 数据结构与算法:5栈:用栈实现前缀、中缀、后缀表达式

3、前缀、中缀和后缀表达式 计算机是从左到右处理数据的,类似(A + (B * C))这样的完全括号表达式,计算机如何跳到内部括号计算乘法,然后跳到外部括号计算加法呢? 一种直观的方法是将运算符移到操作数外,分离运算符和操作数。计算时先取运算符再取操作数,计算结果则作为…

HTML5+CSS3+JS小实例:锥形渐变彩虹按钮

实例:锥形渐变彩虹按钮 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /…

maven创建webapp+Freemarker组件的实现

下载安装配置maven Maven官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供Maven最新版正式版官方版绿色版下载,Maven安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123pan.com/s/9QRqVv-TcUY.html链接为3.6.2-3.6.3的版本 下载解…

LLVM的中间表示

概括 选择编译器IR的决策很重要&#xff0c;它决定了优化过程将拥有多少信息来使代码运行得更快。 一方面非常高层级的IR允许优化器轻松地提取原始源代码的相关信息。 另一方面&#xff0c;低层的IR更加贴近目标机器&#xff0c;这样编译器更容易为特定的硬件生成相应的代码…

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之XCP模块配置详解(上)

XCP模块配置详解 - 上 一、XCP模块配置项处理1.1 Tx Pdu配置项二、XCP模块其他配置项2.1 参数XcpMainFunctionPeriod2.2 参数XcpOnCanEnabled2.3 容器XcpOnCan总结从本节开始先专注与配置项错误处理以及构建Autosar Rh850的最小系统搭建。 XCP模块在汽车电子各控制器中处于十分…

【Java记】数据类型与变量

一、数据类型 在Java中数据类型主要分为两类&#xff1a;基本数据类型和引用数据类型。基本数据类型有四类八种&#xff1a; 四类&#xff1a;整型、浮点型、字符型以及布尔型八种&#xff1a; 数据类型 关键字 内存占用 范围 字节型 byte 1 字节 -128~ 127 短整型 …

高程 | 数组、指针与字符串(c++)

文章目录 &#x1f4da;数组&#x1f407;数组的概念&#x1f407;数组的声明与使用&#x1f407;数组的存储与初始化&#x1f407;数组作为函数参数&#x1f407;对象数组 &#x1f4da;指针&#x1f407;内存空间的访问方式&#x1f407;指针变量的声明&#x1f407;指针运算…

蓝桥杯嵌入式第10届真题(完成) STM32G431

蓝桥杯嵌入式第10届真题(完成) STM32G431 题目 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body********************************…

【C语言】指针练习篇(下),深入理解指针---指针练习题【图文讲解,详细解答】

欢迎来CILMY23的博客喔&#xff0c;本期系列为【C语言】指针练习篇&#xff08;下&#xff09;&#xff0c;深入理解指针---指针练习题【图文讲解,详细解答】&#xff0c;图文讲解指针练习题&#xff0c;带大家更深刻理解指针的应用&#xff0c;感谢观看&#xff0c;支持的可以…