当前位置: 首页 > news >正文

详解混合类型文件(Polyglot文件)的应用生成与检测

1. 引入

混合类型文件(Polyglot文件),是指一个文件,既可以是合法的A类型,也可以是合法的B类型。
比如参考3中的文件,是一个html文件,可以用浏览器正常打开;它也是一个一个.jar文件,可以用JVM正常运行(参考4),如下图所示:

在这里插入图片描述

这样的文件就是混合类型文件,也叫polyglot。他能绕过文件类型检测的限制,比如有的系统只允许用户上传PNG,以防止用户上传具有潜在危险的文件,例如JS文件、PHP文件。利用混合类型文件就能突破这个限制。

2. 有哪些混合类型

参考5给了很多混合类型文件的真实例子,下面举例如下:

(1)7ZIP+JAR.7z: 7z + jar + zip
(2)7ZIP+RAR-1.7z:7z + rar
(3)AVI+HTML.avi:avi + html
(4)BMP+HTML+JAR.bmp:bmp + html + jar + zip
(5)DOCX+ELF+JAR+PDF+RAR-1.zip:docx + elf + jar + pdf + rar + zip

这里给出了102种不同的类型的组合,注意这只是2018年的数据,目前可能已经出现更多类型组合了。
以 HTML+PDF-3.html (参考6)举例:
(1)这个文件下载后,直接用浏览器打开,效果如下:

在这里插入图片描述

(2)如果把这个文件的扩展名改为pdf,就能用pdf阅读器打开,效果如下:

在这里插入图片描述

3. 使用混合类型的恶意样本家族

参考4给出了如下两个恶意样本家族的例子:

  1. 恶意样本家族StrRAT 使用 MSI 格式来伪装 JAR 文件
  2. 恶意样本家族Ratty和StrRAT使用 CAB 格式来伪装 JAR 文件

其中也给出了StrRAT 和 Ratty的链接。

4. 如何生成混合类型文件

使用 mitra 这个工具(参考:https://github.com/corkami/mitra)就能生成混合类型文件。

从源代码看,直接使用它,只能生成两种类型文件混合的文件:

def main():args = Setup(__description__)fn1,fn2 = args.file1, args.file2 #这里显示只读入两个文件with open(fn1, "rb") as f:fdata1 = f.read()with open(fn2, "rb") as f:fdata2 = f.read()pad = getVar("PAD")fdata1 += b"\1" * (pad - len(fdata1))fdata2 += b"\1" * (pad - len(fdata2))

使用方法,笔者在python3.8的环境中,直接运行如下命令,根据报错再安装或者mkdir缺少的文件后:

python mitra.py  pic1.png  2203.07561.pdf

就能生成 一个文件 P(10-4b8516)-PNG[PDF].4425bf7c.png.pdf,它是一个能直接用pdf阅读器打开的pdf文件,能看到pdf的文件内容;当我们把他的文件扩展名改为 P(10-4b8516)-PNG[PDF].4425bf7c.png.png后,就能用图片阅读器打开它,此时看到的就是一张图片。

注意 mitra 这个文件并不能生成所有类型文件的组合,比如笔者实验中就不能把.py文件组合到png图片上。下面是参考7的论文中给出的组合:

DCM+GIF,     DCM+JAR,    DCM+ISO,    DCM+PDF,    DCM+ZiP,    GIF+ISO,    GIF+JAR,    GIF+Zip,    JPG+JAR,    JPG+Zip,    
PE+ISO,    PE+JAR,    PE+Zip,    PNG+ISO,    PNG+JAR,    PNG+PDF,    PNG+Zip,    TIFF+ISO,    TIFF+JAR,    TIFF+PDF,    TIFF+Zip

5. 如何检测文件类型

对于非混合类型文件,有如下几种检测方法,都有相对比较成熟的工具:

  1. 对于常见编程语言的类型,可以使用 guesslang 这个工具来进行检测(参考: https://github.com/yoeo/guesslang/tree/master), 他能用深度学习模型识别如下类型的文本文件
Assembly	Batchfile	C	C#	C++
Clojure	CMake	COBOL	CoffeeScript	CSS
CSV	Dart	DM	Dockerfile	Elixir
Erlang	Fortran	Go	Groovy	Haskell
HTML	INI	Java	JavaScript	JSON
Julia	Kotlin	Lisp	Lua	Makefile
Markdown	Matlab	Objective-C	OCaml	Pascal
Perl	PHP	PowerShell	Prolog	Python
R	Ruby	Rust	Scala	Shell
SQL	Swift	TeX	TOML	TypeScript
Verilog	Visual Basic	XML	YAML	
  1. 对于exe,elf之类的文件,可以使用polydet来检测 (参考:https://github.com/Polydet/polydet/tree/master),
    他能使用已定义的yara规则来检测如下类型的文件
'7z', 'avi', 'bmp', 'elf', 'exe', 'flac', 'gif', 'html', 'jpg', 'mp3', 'ogg', 'pdf', 'php', 'png', 'polyglot_level', 'rar', 'swf', 'tar', 'tiff', 'wav', 'webm', 'zip'
  1. 对于多种不同类型的图像、视频、音频,甚至于SQLITE类型,可以 fleep 来检测(参考:https://github.com/ua-nick/fleep-py/tree/master),
    他能使用已magic-number来检测如下类型的文件
图像: BMP,GIF,ICO,JP2,JPEG,PNG,PSD,TIFF,WEBP
原始图像:ARW,CR2,CRW,DNG,ERF,NEF,NRW,ORF,PEF,RAF,RAW,RW2,SRW,X3F
矢量图:AI,EPS
3D图像:C4D,FBX,MA,MS3D,MTL,OBJ,PLY,WRL,X3D,XSI
音频:AAC,AC3,AIFF,AMR,AU,FLAC,M4A,MIDI,MKA,MP3,OGA,RA,VOC,WAV,WMA
视频:3G2,3GP,ASF,AVI,FLV,M4V,MKV,MOV,MP4,MPG,OGV,SWF,VOB,WEBM,WMV
文档:DOC,DOCX,EPUB,KEY,NUMBERS,ODP,ODS,ODT,PAGES,PDF,PPS,PPT,PPTX,RTF,XLS,XLSX,XML,
压缩:7Z,DMG,GZ,ISO,RAR,TAR.Z,ZIP,
可执行文件:COM,EXE,JAR
字体:OTF,TTF,WOFF,WOFF2
系统文件:CAB,CAT,DLL,DRV,REG,SDB,SYS
数据库:SQLITE

6. 混合类型文件检测

  1. linux下的file命令能检测一部分混合类型文件(参考8),示例如下
$ file --keep-going --raw mA-pdf.pdf
mA-pdf.pdf: tar archive
- DR-DOS executable (COM)
- Windows Program Information File for  R>>
- DOS/MBR boot sector
- Nintendo DS ROM image: "%PDF-1.3" (┬╢, Rev.116)
- Plot84 plotting file DOS/MBR boot sector
- SymbOS executable v., name: 1 0 obj
- PDF document, version 1.3
- Old EZD Electron Density Map
- Scream Tracker Sample adlib drum mono 8bit
- SoundFX Module sound file
- DICOM medical imaging data
- CCP4 Electron Density Map
- VirtualBox Disk Image (%PDF-1.3), 5715999566798081280 bytes
- data
  1. 机器学习方法,找到一篇文章给了一些检测思路,文章见参考7:
    (1)传统机器学习方法:二分类模型,特征为二进制字节直方图,一共256个字节的出现次数,模型选用传统集成学习树模型,比如 light GBM, gradient boosting, and CatBoost
    (2)深度学习方法:二分类模型,选用CNN网络中知名的Malconv2,直接读入字节流(超出容量则截断文件)

根据论文提供的检测结果:
(1)直接使用file命令,效果并不理想,file在很多时候无法准确检测
(2)CatBoost调优后,效果比其他模型要好,也比Malconv2好

在这里插入图片描述

7. 总结

本文总结了 混合类型文件 的定义,使用混合类型的恶意样本家族,如何生成混合类型文件,以及非混合类型的文件检测及混合类型文件检测的方法。

参考

  1. Polyglot的定义。https://en.wikipedia.org/wiki/Polyglot_(computing)
  2. https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a
  3. html混合java文件。https://github.com/deepinstinct/JAR-Polyglot-POC/blob/main/eula.html
  4. https://www.deepinstinct.com/blog/malicious-jars-and-polyglot-files-who-do-you-think-you-jar
  5. https://github.com/Polydet/polyglot-database/tree/master/files
  6. https://github.com/Polydet/polyglot-database/blob/master/files/HTML%2BPDF-3.html
  7. Toward the Detection of Polyglot Files. 2022. https://arxiv.org/pdf/2203.07561.pdf
  8. tool to generate polyglog file. https://github.com/corkami/mitra

相关文章:

详解混合类型文件(Polyglot文件)的应用生成与检测

1. 引入 混合类型文件(Polyglot文件),是指一个文件,既可以是合法的A类型,也可以是合法的B类型。 比如参考3中的文件,是一个html文件,可以用浏览器正常打开;它也是一个一个.jar文件&…...

QT之QTableView的简介

QT之QTableView的简介 QTableView 是 Qt 框架中的一个类,用于显示和编辑表格数据。它提供了一个灵活的模型/视图架构,允许用户以不同的方式显示和编辑数据。 以下是 QTableView 的一些常用函数及其用法: 1)QTableView(QWidget *pa…...

学习记忆——宫殿篇——记忆宫殿——记忆桩——知识讲解

类比 假设这些桩子好比不同的交通工具,每一种交通工具都可以助我们到达目的地,那举现在就根据你的时间以及现实情况,选择最合适自己的交通工具即可,重点在于你要熟悉每种交通工具的用途不区别。桩子也是如此,把所有的桩…...

Python lambda匿名函数

视频版教程 Python3零基础7天入门实战视频教程 前面我们所学的函数定义,都是有函数名的。 我们现在学的lambda函数是没有名称的,也就是匿名函数。 我们在只需要一次性使用的函数的时候,就可以用lambda匿名函数,简单方便快捷。 …...

成绩统计(蓝桥杯)

成绩统计 题目描述 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。 请计算及格率和优秀率,用百分数…...

ETL与ELT理解

ETL ETL( Extract-Transform-Load),用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL模式适用于小数据量集。如果在转换过程…...

IntelliJ IDEA 2023 年下载、安装教程、好用插件推荐

文章目录 下载与安装IDEA常用插件推荐Alibaba Java Coding Guidelines(阿里巴巴Java开发规约)Key Promoter X(IDEA快捷键提示)Translation(翻译插件)Save Actions(优化保存插件)Codo…...

下载HTMLTestRunner并修改

目录 一. 下载HTMLTestRunner 二. 修改HTMLTestRunner 1. 修改内容 2. 修改原因 一. 下载HTMLTestRunner 下载报告模板地址:http://tungwaiyip.info/software/HTMLTestRunner.html 下载模块: 二. 修改HTMLTestRunner 将修改后的模块放到python安装目录下的..…...

C#回调函数学习1

回调函数(Callback Function)是一种函数指针,它指向的是由用户自己定义的回调函数。我们将这个回调函数的指针作为参数传递给另外一个函数,在这个函数工作完成后,它将通过这个回调函数的指针来回调通知调用者处理结果。…...

leetcode 232 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头…...

element UI表单验证,自定义验证规则

validator 可以为指定字段自定义验证函数——这就相当于把前边配置的东西用js按照以前的方式编写验证逻辑了。虽然麻烦点&#xff0c;但是能实现比较复杂的业务逻辑判断。 <el-form-itemlabel"中奖概率"prop"rate":rules"[{ required: true, mes…...

redis 主存复制

1. 前言 Redis的持久化机制&#xff0c;它很好的解决了单台Redis服务器由于意外情况导致Redis服务器进程退出或者Redis服务器宕机而造成的数据丢失问题。 在一定程度上保证了数据的安全性&#xff0c;即便是服务器宕机的情况下&#xff0c;也可以保证数据的丢失非常少。 通常…...

Unity Shader顶点数据疑问

1&#xff09;Unity Shader顶点数据疑问 2&#xff09;Unity 2018发布在iOS 16.3偶尔出现画面不动的问题 3&#xff09;安卓游戏启动后提示“应用程序异常” 这是第352篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答、社区帖子等技术知…...

java写一个用于生成雪花id的工具类

我们创建一个类 叫 SnowflakeIdGenerator 作为生成雪花id的工具类 然后 编写代码如下 public class SnowflakeIdGenerator {private static final long START_TIMESTAMP 1609459200000L; // 设置起始时间戳&#xff0c;可以根据需要进行调整private static final long WORKER…...

淘宝开店装修教程 (2023新版)

一、下载千牛 1. 浏览器打开淘宝 https://www.taobao.com/ 2. 进入 - 千牛卖家中心 3. 进入 - 关于千牛 4. 下载千牛 5. 下载页面 6. 下载安装桌面 二、登录千牛 1. 登录页面 2. 进入 - 千牛工作台 三、pc店铺装修 1. 进入 - pc店铺 2. 进入 - 装修页面 3. 删除没用的模块 从…...

Python傅立叶变换

1. 什么是傅里叶变换&#xff1f; 在数学中&#xff0c;变换技术用于将函数映射到与其原始函数空间不同的函数空间。傅里叶变换时也是一种变换技术&#xff0c;它可以将函数从时域空间转换到频域空间。例如以音频波为例&#xff0c;傅里叶变换可以根据其音符的音量和频率来表示…...

MATLAB向量化编程基础精讲教程

向量化编程是MATLAB中一种重要的编程技术&#xff0c;通过使用向量和矩阵运算代替循环&#xff0c;可以提高代码的执行效率和可读性。本文将介绍MATLAB向量化编程的基础知识&#xff0c;并提供多个案例代码&#xff0c;帮助读者理解和应用向量化编程。 一、向量化编程基础知识…...

【非对称加密算法】RSA算法

一、非对称加密算法 非对称加密算法使用了两个不同的密钥&#xff1a;公钥和私钥。公钥是公开的&#xff0c;可以被任何人使用&#xff0c;而私钥是只有特定的人能够使用的。这种算法的加密和解密过程使用不同的密钥&#xff0c;因此称为非对称加密算法。 在非对称加密算法中…...

【滑动窗口】438. 找到字符串中所有字母异位词

438. 找到字符串中所有字母异位词 滑动窗口解法 创建两个Map 一个记录实际需要的有效字符 另一个记录窗口内的有效字符个数初始化need每次遍历一个字符 判断是不是有效字符 如果是 更新window 另外判断window中有效字符的个数是不是等于need中有效字符的个数 如果是更新valid…...

【PowerQuery】Excel 一分钟以内刷新PowerQuery数据

当需要进行刷新的周期如果小于一分钟,采用数据自动刷新就无法实现自动刷新的目标。那就没有办法了吗?当然不是,这里就是使用VBA来实现自动刷新。这里实现VBA刷新的第一步就是将当前的Excel 保存为带有宏的Excel 文件,如果不带宏则无法运行带有宏代码的Excel文件,保存过程如…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...