CodeQL 文档

无效指针解引用

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

点击查看 CodeQL 代码库中的查询

程序执行超出范围的读写操作,这会导致程序不稳定。此外,攻击者可能会利用这种情况,并实施技术来利用此漏洞执行任意代码。

建议

确保指针解引用得到适当的保护,以确保它们不能用于读取或写入分配的末尾。

示例

第一个示例分配了一个大小为 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
  }

}

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私