Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2019-11932 — CVE-2019-11932 的技术分析文章与利用代码,针对 WhatsApp Android 版中的一个双重释放漏洞,该漏洞可通过特制 GIF 文件导致远程代码执行。 | Kitploit
工具/GitHubGitHub/infiniteloopers/cve-2019-11932
Android安全漏洞分析漏洞利用移动安全学习与教育二进制利用
GitHubinfiniteloopers/cve-2019-11932

CVE-2019-11932

CVE-2019-11932 的技术分析文章与利用代码,针对 WhatsApp Android 版中的一个双重释放漏洞,该漏洞可通过特制 GIF 文件导致远程代码执行。

查看仓库
4296年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2019-11932

WhatsApp中的一个双重释放漏洞如何变为RCE

我将分享我在Android版WhatsApp中发现的一个双重释放漏洞,以及我如何将其转变为远程代码执行。我已将此漏洞告知Facebook。Facebook确认并已在WhatsApp 2.19.244版本中正式修复。Facebook帮助为此问题保留了CVE-2019-11932。

WhatsApp用户,请更新到最新版本的WhatsApp(2.19.244或更高版本),以避免此漏洞的影响。

步骤如下:

0:16 攻击者通过任何渠道向用户发送GIF文件

其中一种方式是通过WhatsApp以文档形式发送(即按回形针按钮,选择文档发送损坏的GIF文件) 如果攻击者在用户的联系人列表中(即好友),则损坏的GIF文件会在没有任何用户交互的情况下自动下载。

0:24 用户想向其任何WhatsApp好友发送媒体文件。因此,用户按回形针按钮并打开WhatsApp图库,选择要发送给好友的媒体文件。

请注意,用户无需发送任何内容,因为仅打开WhatsApp图库就会触发漏洞。按下WhatsApp图库后无需额外操作。

0:30 由于WhatsApp会显示每个媒体(包括收到的GIF文件)的预览,这将触发双重释放漏洞和我们的RCE利用程序。

libpl_droidsonroids_gif中decoding.c的DDGifSlurp函数存在双重释放漏洞

当WhatsApp用户打开WhatsApp中的图库视图以发送媒体文件时,WhatsApp会使用一个名为libpl_droidsonroids_gif.so的本机库解析该文件,以生成GIF文件的预览。libpl_droidsonroids_gif.so是一个开源库,其源代码可在https://github.com/koral–/android-gif-drawable/tree/dev/android-gif-drawable/src/main/c 获取。

一个GIF文件包含多个编码帧。为了存储解码后的帧,使用了一个名为rasterBits的缓冲区。如果所有帧大小相同,则重用rasterBits来存储解码后的帧,无需重新分配。但是,如果满足以下三个条件之一,就会重新分配rasterBits:

width * height > originalWidth * originalHeight

width - originalWidth > 0

height - originalHeight > 0

重新分配是free和malloc的组合。如果重新分配的大小为0,则只是简单地free。假设我们有一个GIF文件,包含3个帧,大小分别为100、0和0。

第一次重新分配后,我们得到了大小为100的info->rasterBits缓冲区。

第二次重新分配大小为0时,info->rasterBits缓冲区被释放。

第三次重新分配大小为0时,info->rasterBits再次被释放。

这导致了双重释放漏洞。触发位置可以在decoding.c中找到:

int_fast32_t widthOverflow = gifFilePtr->Image.Width - info->originalWidth; int_fast32_t heightOverflow = gifFilePtr->Image.Height - info->originalHeight; const uint_fast32_t newRasterSize = gifFilePtr->Image.Width * gifFilePtr->Image.Height; if (newRasterSize > info->rasterSize || widthOverflow > 0 || heightOverflow > 0) { void *tmpRasterBits = reallocarray(info->rasterBits, newRasterSize, <<-- 此处双重释放 sizeof(GifPixelType)); if (tmpRasterBits == NULL) { gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM; break; } info->rasterBits = tmpRasterBits; info->rasterSize = newRasterSize; }

WhatsApp中的一个双重释放漏洞如何变为RCE 14分钟阅读 本页内容 演示 libpl_droidsonroids_gif中decoding.c的DDGifSlurp函数存在双重释放漏洞 控制PC寄存器 应对ASLR和W^X 综合所有因素 受影响版本 攻击向量 在这篇博客文章中,我将分享我在Android版WhatsApp中发现的一个双重释放漏洞,以及我如何将其转变为远程代码执行。我已将此漏洞告知Facebook。Facebook确认并已在WhatsApp 2.19.244版本中正式修复。Facebook帮助为此问题保留了CVE-2019-11932。

WhatsApp用户,请更新到最新版本的WhatsApp(2.19.244或更高版本),以避免此漏洞的影响。

演示 https://drive.google.com/file/d/1T-v5XG8yQuiPojeMpOAG6UGr2TYpocIj/view

如果上述链接无法访问,可通过Google Drive链接下载 https://drive.google.com/open?id=1X9nBlf5oj5ef2UoYGOfusjxAiow8nKEK

步骤如下:

0:16 攻击者通过任何渠道向用户发送GIF文件 其中一种方式是通过WhatsApp以文档形式发送(即按回形针按钮,选择文档发送损坏的GIF文件) 如果攻击者在用户的联系人列表中(即好友),则损坏的GIF文件会在没有任何用户交互的情况下自动下载。 0:24 用户想向其任何WhatsApp好友发送媒体文件。因此,用户按回形针按钮并打开WhatsApp图库,选择要发送给好友的媒体文件。 请注意,用户无需发送任何内容,因为仅打开WhatsApp图库就会触发漏洞。按下WhatsApp图库后无需额外操作。 0:30 由于WhatsApp会显示每个媒体(包括收到的GIF文件)的预览,这将触发双重释放漏洞和我们的RCE利用程序。 libpl_droidsonroids_gif中decoding.c的DDGifSlurp函数存在双重释放漏洞 当WhatsApp用户打开WhatsApp中的图库视图以发送媒体文件时,WhatsApp会使用一个名为libpl_droidsonroids_gif.so的本机库解析该文件,以生成GIF文件的预览。libpl_droidsonroids_gif.so是一个开源库,其源代码可在 https://github.com/koral–/android-gif-drawable/tree/dev/android-gif-drawable/src/main/c 获取。

一个GIF文件包含多个编码帧。为了存储解码后的帧,使用了一个名为rasterBits的缓冲区。如果所有帧大小相同,则重用rasterBits来存储解码后的帧,无需重新分配。但是,如果满足以下三个条件之一,就会重新分配rasterBits:

width * height > originalWidth * originalHeight width - originalWidth > 0 height - originalHeight > 0 重新分配是free和malloc的组合。如果重新分配的大小为0,则只是简单地free。假设我们有一个GIF文件,包含3个帧,大小分别为100、0和0。

第一次重新分配后,我们得到了大小为100的info->rasterBits缓冲区。 第二次重新分配大小为0时,info->rasterBits缓冲区被释放。 第三次重新分配大小为0时,info->rasterBits再次被释放。 这导致了双重释放漏洞。触发位置可以在decoding.c中找到:

int_fast32_t widthOverflow = gifFilePtr->Image.Width - info->originalWidth; int_fast32_t heightOverflow = gifFilePtr->Image.Height - info->originalHeight; const uint_fast32_t newRasterSize = gifFilePtr->Image.Width * gifFilePtr->Image.Height; if (newRasterSize > info->rasterSize || widthOverflow > 0 || heightOverflow > 0) { void *tmpRasterBits = reallocarray(info->rasterBits, newRasterSize, <<-- 此处双重释放 sizeof(GifPixelType)); if (tmpRasterBits == NULL) { gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM; break; } info->rasterBits = tmpRasterBits; info->rasterSize = newRasterSize; } 在Android中,大小为N的内存发生双重释放会导致后续两次大小为N的内存分配返回相同的地址。

(lldb) expr int $foo = (int) malloc(112) (lldb) p/x $foo (int) $14 = 0xd379b250

(lldb) p (int)free($foo) (int) $15 = 0

(lldb) p (int)free($foo) (int) $16 = 0

(lldb) p/x (int)malloc(12) (int) $17 = 0xd200c350

(lldb) p/x (int)malloc(96) (int) $18 = 0xe272afc0

(lldb) p/x (int)malloc(180) (int) $19 = 0xd37c30c0

(lldb) p/x (int)malloc(112) (int) $20 = 0xd379b250

(lldb) p/x (int)malloc(112) (int) $21 = 0xd379b250

WhatsApp中的一个双重释放漏洞如何变为RCE 14分钟阅读 本页内容 演示 libpl_droidsonroids_gif中decoding.c的DDGifSlurp函数存在双重释放漏洞 控制PC寄存器 应对ASLR和W^X 综合所有因素 受影响版本 攻击向量 在这篇博客文章中,我将分享我在Android版WhatsApp中发现的一个双重释放漏洞,以及我如何将其转变为远程代码执行。我已将此漏洞告知Facebook。Facebook确认并已在WhatsApp 2.19.244版本中正式修复。Facebook帮助为此问题保留了CVE-2019-11932。

WhatsApp用户,请更新到最新版本的WhatsApp(2.19.244或更高版本),以避免此漏洞的影响。

演示 https://drive.google.com/file/d/1T-v5XG8yQuiPojeMpOAG6UGr2TYpocIj/view

如果上述链接无法访问,可通过Google Drive链接下载 https://drive.google.com/open?id=1X9nBlf5oj5ef2UoYGOfusjxAiow8nKEK

步骤如下:

0:16 攻击者通过任何渠道向用户发送GIF文件 其中一种方式是通过WhatsApp以文档形式发送(即按回形针按钮,选择文档发送损坏的GIF文件) 如果攻击者在用户的联系人列表中(即好友),则损坏的GIF文件会在没有任何用户交互的情况下自动下载。 0:24 用户想向其任何WhatsApp好友发送媒体文件。因此,用户按回形针按钮并打开WhatsApp图库,选择要发送给好友的媒体文件。 请注意,用户无需发送任何内容,因为仅打开WhatsApp图库就会触发漏洞。按下WhatsApp图库后无需额外操作。 0:30 由于WhatsApp会显示每个媒体(包括收到的GIF文件)的预览,这将触发双重释放漏洞和我们的RCE利用程序。 libpl_droidsonroids_gif中decoding.c的DDGifSlurp函数存在双重释放漏洞 当WhatsApp用户打开WhatsApp中的图库视图以发送媒体文件时,WhatsApp会使用一个名为libpl_droidsonroids_gif.so的本机库解析该文件,以生成GIF文件的预览。libpl_droidsonroids_gif.so是一个开源库,其源代码可在 https://github.com/koral–/android-gif-drawable/tree/dev/android-gif-drawable/src/main/c 获取。

一个GIF文件包含多个编码帧。为了存储解码后的帧,使用了一个名为rasterBits的缓冲区。如果所有帧大小相同,则重用rasterBits来存储解码后的帧,无需重新分配。但是,如果满足以下三个条件之一,就会重新分配rasterBits:

width * height > originalWidth * originalHeight width - originalWidth > 0 height - originalHeight > 0 重新分配是free和malloc的组合。如果重新分配的大小为0,则只是简单地free。假设我们有一个GIF文件,包含3个帧,大小分别为100、0和0。

第一次重新分配后,我们得到了大小为100的info->rasterBits缓冲区。 第二次重新分配大小为0时,info->rasterBits缓冲区被释放。 第三次重新分配大小为0时,info->rasterBits再次被释放。 这导致了双重释放漏洞。触发位置可以在decoding.c中找到:

int_fast32_t widthOverflow = gifFilePtr->Image.Width - info->originalWidth; int_fast32_t heightOverflow = gifFilePtr->Image.Height - info->originalHeight; const uint_fast32_t newRasterSize = gifFilePtr->Image.Width * gifFilePtr->Image.Height; if (newRasterSize > info->rasterSize || widthOverflow > 0 || heightOverflow > 0) { void *tmpRasterBits = reallocarray(info->rasterBits, newRasterSize, <<-- 此处双重释放 sizeof(GifPixelType)); if (tmpRasterBits == NULL) { gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM; break; } info->rasterBits = tmpRasterBits; info->rasterSize = newRasterSize; } 在Android中,大小为N的内存发生双重释放会导致后续两次大小为N的内存分配返回相同的地址。

(lldb) expr int $foo = (int) malloc(112) (lldb) p/x $foo (int) $14 = 0xd379b250

(lldb) p (int)free($foo) (int) $15 = 0

(lldb) p (int)free($foo) (int) $16 = 0

(lldb) p/x (int)malloc(12) (int) $17 = 0xd200c350

(lldb) p/x (int)malloc(96) (int) $18 = 0xe272afc0

(lldb) p/x (int)malloc(180) (int) $19 = 0xd37c30c0

(lldb) p/x (int)malloc(112) (int) $20 = 0xd379b250

(lldb) p/x (int)malloc(112) (int) $21 = 0xd379b250

下载工具