CVE-2018-5727的验证修复
CVE-2018-5727的验证修复问题描述在OpenJPEG 2.3.0中,opj_t1_encode_cblks函数(openjp2 / t1.c)中存在一个整数溢出漏洞。远程攻击者可以利用此漏洞通过精心制作的bmp文件导致拒绝服务。问题复现本次poc验证中要用到的是openjpeg2编译生成的opj_compress工具以及poc测试用例.复现步骤gitlab上克隆openjpeg2 分支e
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验证完成,皆大欢喜~
更多推荐
所有评论(0)