无效指针解引用¶
ID: cpp/invalid-pointer-deref
Kind: path-problem
Security severity: 9.3
Severity: error
Precision: medium
Tags:
- reliability
- security
- external/cwe/cwe-119
- external/cwe/cwe-125
- external/cwe/cwe-193
- external/cwe/cwe-787
Query suites:
- cpp-security-extended.qls
- cpp-security-and-quality.qls
程序执行超出范围的读写操作,这会导致程序不稳定。此外,攻击者可能会利用这种情况,并实施技术来利用此漏洞执行任意代码。
建议¶
确保指针解引用得到适当的保护,以确保它们不能用于读取或写入分配的末尾。
示例¶
第一个示例分配了一个大小为 size
的缓冲区,并创建一个存储分配末尾之后的第一个字节的本地变量。然后,对该本地变量进行解引用,这会导致超出范围的写入。第二个示例在解引用之前从 end
变量中减去一。此减法确保写入操作正确更新分配的最后一个字节。
void *malloc(unsigned);
unsigned get_size();
void write_data(const unsigned char*, const unsigned char*);
int main(int argc, char* argv[]) {
unsigned size = get_size();
{
unsigned char *begin = (unsigned char*)malloc(size);
if(!begin) return -1;
unsigned char* end = begin + size;
write_data(begin, end);
*end = '\0'; // BAD: Out-of-bounds write
}
{
unsigned char *begin = (unsigned char*)malloc(size);
if(!begin) return -1;
unsigned char* end = begin + size;
write_data(begin, end);
*(end - 1) = '\0'; // GOOD: writing to the last byte
}
}