漏洞特征描述:
一、前置条件
原理是构造恶意webp类型图像,在需要将webp解码为其他类型文件的地方造成哈夫曼编码的堆缓冲区溢出。
可以用c代码构造哈夫曼编码频率或者python代码构造哈夫曼编码二级表,精心设计一个存在堆缓冲区溢出的webp类型图像bad.webp,在溢出区域写入了4字节数据,偏移量为152字节。
事先在Ubuntu 20.04上下载Google(2023年9月18日前发布的版本)的libwebp(<1.3.2)源码,利用其中的dwebp解码程序对bad.webp进行测试,输出报错堆溢出并打印出具体的溢出位置。
二、漏洞利用过程
将bad.webp图像保存到手机系统自带的相册,也可通过邮件发送bad.webp使得对方下载到本地。选择用其他利用打开选择qq(最新版V 8.9.83.12605)或者pixlr打开都会出现闪退和死机,或者上传到googlelens识图会导致崩溃,手机系统自带的相册也会出现闪退和卡机。并且这种危害是不可逆的,也就是自从在发送bad.webp图像导致闪退后,应用在之后的日常使用中也会不自觉的闪退。
三、漏洞影响
漏洞影响范围很大,只要应用软件底层调用了Google的libwebp库(如Chrome、Firefox、微信、钉钉、QQ、Edge、Brave、Signal、1Password 等)都会受影响,并且由于写入了4字节数据覆盖堆内存,尝试在某同一处多次打开图像会导致该软件闪退和崩溃
四、漏洞升级前后构造代码对比:
(即对比文档1和2中的craft.c和此文档3中的poc.py)
相同点:构造使得哈夫曼编码很长(树很大)使得超过设定的缓冲区范围导致溢出
不同点:
craft.c:构造频率,抓住哈夫曼建树特点,对15个原子分量精心设计频率,间接导致编码长度
poc.py:直接构造哈夫曼编码
Read More
运用编写的craft 程序输出精心设计的哈夫曼编码很长的恶意文件bad.webp 会在解码时发生缓冲区溢出,何时需要 decode 解码?在将 webp 图像转为其他类型图像如 jpg、png 时需要,因为它们会调用 Google 提供的 webp 库中代码 dwebp 解码程序。
Android 其实也用的 Google 提供的 webp 库,若要将 webp 类型图片转为其他类型时,需要调用 dwebp 程序将 webp 文件解码 decode
接下来依次会在手机端软件 qq、小红书、pixlr(图像处理软件)以及安卓手机端 chrome 浏览器进行测试。以 qq 为重点分析为例。
一、QQ
手机 qq 发送 webp 图片时其实自动转为 jpg 类型,可以通过任意手机 qq 发送 webp 类型图片,然后点开图片点击右下角下载按键保存到本地,然后在本地相册查看文件类型时其实转为了jpg 类型。根据安卓手机qq 这一特点说明会调用安卓将webp 转为其他类型图片的过程,也就是一定会经历 decode 解码这一过程,那么可以体现这一漏洞
实验用的是最新版的手机QQ(V 8.9.83.12605)
打开 logcat 设置过滤器:
发送正常的 test.webp:
手机端很快发送成功,无肉眼可见的延迟
时间戳显示用时 0.1s,out.isDecodeSuccess=true 解码成功,输入输出流完整且结束时也标志成功
发送错误的 bad.webp:
手机端发送图像一直处于加载状态且始终加载进度为 0,经多次实验,平均经历 1 分半至 2分钟后图像才会停止加载上传并显示红色感叹号表征发送失败。
Read More
CVE-2023-4863 漏洞:
WebP 在实现“无损压缩”技术(VP8L)时使用了霍夫曼编码算法,在解码不受信任图像时造成溢出霍夫曼表。
复现结果:
复现思路:
Read More
欢迎来到信息安全数学基础MFIS!(Math Foundation of Information Security我自己翻的也不知道对不对hhh)
这里上传了所有四次实验的报告,所有的实验都是我自己跑过的数据和截图,请放心食用!
因为这门课程性质和成分上的特殊性,好了不卖关子了,人话就是这是一门核!心!课!保研人听了打鸡血,边缘人听了想落泪…所以可见实验成为成绩的一部分也称了卷的境地,验收的时候我前面的同学一个题目用了四五种方法,让我这个想到两种方法就沾沾自喜的人无地自容,紧接着到我验收瞬间成了哑巴…可见大家对这门课的重视程度,所以emm..卷起来吧!信安er!
Anyway希望这里的内容可以帮到你!
Read More
欢迎来到软件安全测试SST!(Software Security Testing我自己翻的也不知道对不对hhh)
这里上传了所有六次实验的报告(虽然老师说可以选择不用都做hhh),所有的实验都是我自己跑过的数据和截图,请放心食用!
如果有的报告没有大title,是因为那次没有轮到我上交所以写的不是正式的实验报告,但也写了个简洁的report方便自己复习和验收前回顾一下hhh
这门课算得上我自己最喜欢的课程了,所以也一点不会觉得实验有些多(说到这,我想起来上学期网络那门课有4次实验我都嫌好多&头大…咳咳,网络,怎么到哪我都在吐槽你…)
Anyway希望这里的内容可以帮到你!
实验任务一览:
lab1: Environment Variable and SetUID
lab2: Shellshock Attack
lab3: Buffer Overflow
lab4: Format String
lab5: DirtyCow Attack
lab6: 模糊测试
ps.前五次来自教材《计算机安全导论:深度实践》上的章节最后的seedlab,最后一次是老师自定义的题目。咳咳关于最后一次实验其实自我感觉还不太深入,只是浅浅过了fuzzing的流程而已。因为当时刚比赛回来紧接着又去跑广州办美签再加上核心课的期末考试(没错就是你信息安全数学基础!)时间经历都比较匆忙,老师了解到也很理解,但我还是感觉想动手过一下模糊测试,所以…所以虚拟机跑了四天电脑一直都没关机直到验收!一直占了我一个cpu核啊!emm麻鸭我话是不是太多了,这不是树洞啊!不能一直碎碎念啊!!(好的小跑离开ing)
Read More
Afl实验报告
一、对c++程序进行afl
1.环境准备:
下载好afl,并准备两个文件夹用于存放输入的测试例子和输出的crash
准备afl插桩程序
写一个简单的C++程序afl_test.c,主要包含两个函数:main和vuln
main函数是程序的入口点,首先创建了一个字符数组buf,然后使用gets函数从标准输入读取字符串到buf。使用不安全的gets()函数,它不会去检查边界,这会导致缓冲区溢出。这里存在一个栈溢出漏洞,因为gets函数不会检查输入的长度,如果输入的字符串超过buf的大小,就会导致栈溢出。然后,使用printf函数打印buf,这里存在一个格式化字符串漏洞,因为printf函数会将buf中的内容当作格式字符串来处理,如果buf中包含%字符,就可能导致未预期的行为。最后,调用vuln函数处理buf。
vuln函数接受一个字符串作为参数。首先,计算字符串的长度。然后,检查字符串的第一个字符和长度。如果第一个字符是’A’并且长度是66,或者第一个字符是’F’并且长度是6,就会调用raise函数发送SIGSEGV信号,导致程序异常退出。否则,打印”It is good!“。
Read More
实验环境:Ubuntu12.04,因为后面的版本补上了脏牛漏洞
原理:看教材8.5
MAP_PRIVATE写时拷贝
MADV_DONTNEED丢弃
对COW用write3个步骤中2~3存在竞态条件
创建两个进程:一个写write,一个放弃madvise。执行顺序:madvise要放在write的2~3之间。While1不停循环,两个进程不停竞争,用CTRL+C结束程序
目标:放弃私有拷贝,直接在映射文件上写入
Read More
下载labsetup.zip:SEED Project (seedsecuritylabs.org)
2.1
关闭地址空间随机化,简化实验难度
2.2
编译。Makefile中已经提供了编译命令。在编译过程中,将看到一条警告消息。 此警告是由gcc编译器针对格式字符串漏洞实施的对策生成的。
2.3
进入 Labsetup文件夹,使用docker-compose.yml文件设置实验室环境。
Read More
软件安全测试第三次实验
姓名:secret! 班级:secret! 学号:secret!
1 实验概况
实验教材:Buffer_Overflow_Setuid.pdf (seedsecuritylabs.org)
实验环境:Ubuntu 20.04
2 Setup
关闭地址空间随机化(ASLR)这个针对缓冲区溢出攻击的防御措施。ASLR对程序内存中的一些关键数据区域进行随机化,包括栈的位置、堆和库的位置等,目的是让攻击者难以猜测到所注入的恶意代码在内存中的具体位置。
为了使实验成功,需要使用一个没有实现保护机制的shell,只要把/bin/sh指向这个叫做zsh的shell程序
3 Task1:熟悉shellcode
3.1 shellcode.c
通过execve()系统调用执行一个shell程序
不能编译c代码以及生成的二进制文件用于shellcode攻击,原因如下:
Read More
- 实验bash功能
Ubuntu16.04中/bin文件夹下有bash和有漏洞的bash_shellshock程序,利用教材代码进行实验,测试有漏洞的bash_shellshock和无漏洞的bash,结果如下:
foo是一个变量,以分号隔开两行指令,前面是函数定义,后面是一行命令
echo命令打印变量,declare命令打印函数
export后作为环境变量传递给子进程,而子进程是bash程序,则会将环境变量转换成一个shell变量,但当发现()开始则会转换成shell函数,所以declare能打印函数而不能打印变量,shellshock漏洞会将{}后面的指令执行出来
具体转化过程:(export之后)
Bash检查环境变量是否(){开头,若是则转化为函数定义
调用parse_and_execute()函数解析函数定义,这个函数功能很强大,不仅能解析函数定义,还能解析和运行shell 指令,所以;隔开的多个shell命令也会被解析执行
Shellshock漏洞条件:目标进程是必运行bash+攻击者通过函数有函数定义的环境变量传给目标进程
Read More