总结
7-Zip 支持从复合文档中提取。Compound 处理程序中的 Null 指针取消引用可能会导致拒绝服务。
项目
7-拉链
测试版本
详
空指针数组写入尝试NArchive::NCom::CHandler::GetStream
当 是 [1] 处的某个大数时,可能会溢出并变为零。请注意,在 [2] 处进行检查并不能阻止无符号整数溢出。然后 [3] 处的向量调用不会分配任何内存,内部向量指针保持 。这会导致 [4] 的空指针写入尝试。item.Size
(item.Size + clusterSize - 1) >> bsLog
numClusters64
if (numClusters64 >= ((UInt32)1 << 31))
ClearAndReserve
null
Z7_COM7F_IMF(CHandler::GetStream(UInt32 index, ISequentialInStream **stream))
{
...
const UInt64 numClusters64 = (item.Size + clusterSize - 1) >> bsLog; // <----- 1
if (numClusters64 >= ((UInt32)1 << 31)) // <----- 2
return E_NOTIMPL;
streamSpec->Vector.ClearAndReserve((unsigned)numClusters64); // <----- 3
UInt32 sid = item.Sid;
UInt64 size = item.Size;
if (size != 0)
{
for (;; size -= clusterSize)
{
if (isLargeStream)
{
if (sid >= _db.FatSize)
return S_FALSE;
streamSpec->Vector.AddInReserved(sid + 1); // <----- 4
PoC 在使用 ASAN 编译并提取时触发空指针写取消引用,例如:7zz
7zz e -so compound-crash.poc
==2387581==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x5615317c0993 bp 0x7ffcb31a1350 sp 0x7ffcb31a1300 T0)
==2387581==The signal is caused by a WRITE memory access.
==2387581==Hint: address points to the zero page.
#0 0x5615317c0993 in CRecordVector<unsigned int>::AddInReserved(unsigned int) ../../Archive/../../Common/MyVector.h:249:18
#1 0x5615317bfe66 in NArchive::NCom::CHandler::GetStream(unsigned int, ISequentialInStream**) /src/7-zip/CPP/7zip/Bundles/Alone2/../../Archive/ComHandler.cpp:866:28
#2 0x5615317bea3d in NArchive::NCom::CHandler::Extract(unsigned int const*, unsigned int, int, IArchiveExtractCallback*) /src/7-zip/CPP/7zip/Bundles/Alone2/../../Archive/ComHandler.cpp:806:20
#3 0x561531e94bbb in DecompressArchive(CCodecs*, CArchiveLink const&, unsigned long, NWildcard::CCensorNode const&, CExtractOptions const&, bool, IExtractCallbackUI*, IFolderArchiveExtractCallback*, CArchiveExtractCallback*, UString&, unsigned long&) /src/7-zip/CPP/7zip/Bundles/Alone2/../../UI/Common/Extract.cpp:235:23
#4 0x561531e8fdf1 in Extract(CCodecs*, CObjectVector<COpenType> const&, CRecordVector<int> const&, CObjectVector<UString>&, CObjectVector<UString>&, NWildcard::CCensorNode const&, CExtractOptions const&, IOpenCallbackUI*, IExtractCallbackUI*, IFolderArchiveExtractCallback*, IHashCalc*, UString&, CDecompressStat&) /src/7-zip/CPP/7zip/Bundles/Alone2/../../UI/Common/Extract.cpp:542:5
#5 0x561531f49d3a in Main2(int, char**) /src/7-zip/CPP/7zip/Bundles/Alone2/../../UI/Console/Main.cpp:1378:21
#6 0x561531f55ae4 in main /src/7-zip/CPP/7zip/Bundles/Alone2/../../UI/Console/MainAr.cpp:162:11
在 Windows 上,即使没有 ASAN,测试相同的 PoC 也会使官方 7-Zip 版本崩溃。
冲击
此问题可能会导致拒绝服务。
CWE
- CWE-476:空指针取消引用