我正在为我的谷歌浏览器漏洞的本科学位写一篇论文,在最近的Chrome bug博客上报道了这篇论文:
bool SampleAuxiliaryInformationOffset::Parse(BoxReader* reader)
{
RCHECK(reader->ReadFullBoxHeader());
if (reader->flags() & 1)
RCHECK(reader->SkipBytes(8));
uint32_t count;
RCHECK(reader->Read4(&count) &&
reader->HasBytes(count * (reader->version() == 1 ? 8 : 4)));
offsets.resize(count);
for (uint32_t i = 0; i < count; i++)
{
if (reader->version() == 1)
{
RCHECK(reader->Read8(&offsets[i]));
}
else
{
RCHECK(reader->Read4Into8(&offsets[i]));
}
}
return true;
}
这里有更多信息 https://bugs.chromium.org/p/chromium/issues/detail?id=679641
以下是溢出发生的描述:
“从mp4文件读取计数,介于0x0和0xffffffff之间。当reader-&gt; version()== 1时,count * 8将整数溢出,这会绕过reader-&gt; HasBytes RCHECK。 更重要的是,偏移定义为std :: vector offsets;,offsets.resize(count)将malloc count * sizeof(uint64_t)字节,这也会溢出,导致越界写入。“
我的问题是关于offsets.resize(count)溢出,我不太确定为什么它会溢出,我知道count可以达到(2 ^ 32)所以4个字节和sizeof(uint64_t)是8个字节含义用malloc分配的32个字节。为什么这会溢出?