CVE-2018-5727的验证修复

问题描述

在OpenJPEG 2.3.0中,opj_t1_encode_cblks函数(openjp2 / t1.c)中存在一个整数溢出漏洞。远程攻击者可以
利用此漏洞通过精心制作的bmp文件导致拒绝服务。

问题复现

本次poc验证中要用到的是openjpeg2编译生成的opj_compress工具以及poc测试用例.

复现步骤

gitlab上克隆openjpeg2 分支eagle/2.3.0

git clone https://gitlab.deepin.io/debian-patch/openjpeg2.git -b eagle/2.3.0

清理编译残余文件

./deban/rules clean

删除.pc/文件夹

rm –r .pc

在openjpeg2-2.3.0目录下创建build文件夹

mkdir build

进入build目录下,cmake启用ubsan输出并生成Makefile文件

cmake ../ -DCMAKE_C_FLAGS="-fsanitize=undefined"

make编译生成opj_compress等二进制文件工具

make -j4

等待编译完成,测试用例下载到build/bin/目录下

wget https://raw.githubusercontent.com/ProbeFuzzer/poc/master/openjpeg/openjpeg_2-3_opj_compress_integer-overflow_opj_t1_encode_cblks.bmp

进行poc测试用例测试现象

./opj_compress -n 1 -i openjpeg_2-3_opj_compress_integer-overflow_opj_t1_encode_cblks.bmp -o /tmp/null.j2k

现象如下:
在这里插入图片描述
可以看到由POC触发opj_t1_encode_cblks函数(src / lib / openjp2 / t1.c)中存在整数溢出,输出了运行
时错误:带符号整数溢出:322385710 * 64无法以类型’int’表示错误信息.

补丁处理方法

Index: openjpeg2-2.3.0/src/lib/openjp2/t1.c
===================================================================
--- openjpeg2-2.3.0.orig/src/lib/openjp2/t1.c
+++ openjpeg2-2.3.0/src/lib/openjp2/t1.c
@@ -2168,9 +2168,18 @@ OPJ_BOOL opj_t1_encode_cblks(opj_t1_t *t
                         t1->data = tiledp;
                         t1->data_stride = tile_w;
                         if (tccp->qmfbid == 1) {
+                            /* Do multiplication on unsigned type, even if the
+                             * underlying type is signed, to avoid potential
+                             * int overflow on large value (the output will be
+                             * incorrect in such situation, but whatever...)
+                             * This assumes complement-to-2 signed integer
+                             * representation
+                             * Fixes https://github.com/uclouvain/openjpeg/issues/1053
+                             */
+                            OPJ_UINT32* OPJ_RESTRICT tiledp_u = (OPJ_UINT32*) tiledp;
                             for (j = 0; j < cblk_h; ++j) {
                                 for (i = 0; i < cblk_w; ++i) {
-                                    tiledp[tileIndex] *= (1 << T1_NMSEDEC_FRACBITS);
+                                    tiledp_u[tileIndex] <<= T1_NMSEDEC_FRACBITS;
                                     tileIndex++;
                                 }
                                 tileIndex += tileLineAdvance;

POC重新验证

复现步骤

gitlab上克隆openjpeg2 分支eagle/2.3.0

git clone https://gitlab.deepin.io/debian-patch/openjpeg2.git -b eagle/2.3.0

将openjpeg2更名为openjpeg2-2.3.0

mv openjpeg2 openjpeg2-2.3.0

清理编译残余文件

./deban/rules clean

删除.pc/文件夹

rm –r .pc

在上层目录生成源码包

dh_make --createorig -s

应用补丁

dpkg-source -b ./

在openjpeg2-2.3.0目录下创建build文件夹

mkdir build

进入build目录下,cmake启用ubsan输出并生成Makefile文件

cmake ../ -DCMAKE_C_FLAGS="-fsanitize=undefined"

make编译生成opj_compress等二进制文件工具

make -j4

等待编译完成,测试用例下载到build/bin/目录下

wget https://raw.githubusercontent.com/ProbeFuzzer/poc/master/openjpeg/openjpeg_2-3_opj_compress_integer-overflow_opj_t1_encode_cblks.bmp

进行poc测试用例测试现象

./opj_compress -n 1 -i openjpeg_2-3_opj_compress_integer-overflow_opj_t1_encode_cblks.bmp -o /tmp/null.j2k

现象如下:
在这里插入图片描述
可看到直接返回了错误信息,并不会造成整数溢出问题.

poc验证完成,皆大欢喜~

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐