使用CodeQL检测C++迭代器失效问题

使用CodeQL检测迭代器失效问题

迭代器失效是C++中常见且隐蔽的一类错误,经常导致可利用漏洞。在Trail of Bits实习期间,我开发了Itergator------一组用于分析和发现迭代器失效的CodeQL类和查询。

迭代器基础

迭代器是C++中遍历容器内容的标准方式。迭代器对象至少支持两种操作:解引用(获取容器中的底层对象)和递增(获取下一个元素的迭代器)。

cpp 复制代码
std::vector<int> vec{1, 2, 3, 4, 5};
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << " ";
}

迭代器失效问题

当容器发生修改(如添加或删除元素)后,迭代器会失效。使用失效迭代器会导致未定义行为。例如:

cpp 复制代码
void zone_manager::deserialize(JsonIn &jsin) {
    jsin.read(zones);
    for(auto it = zones.begin(); it != zones.end(); ++it) {
        if(!has_type(it->get_type())) {
            zones.erase(it);  // 迭代器在此失效
        }
    }
}

CodeQL解决方案

CodeQL是GitHub开发的静态分析框架,使用类SQL语法查询代码库。Itergator包含查询和库,允许审计人员在自己的查询中使用Itergator的类:

  • Iterator:存储迭代器的变量
  • Iterated:被迭代的集合
  • Invalidator:可能导致迭代器失效的函数调用
  • Invalidation:直接使迭代器失效的函数调用

检测挑战与解决方案

检测迭代器失效面临多个挑战:

  1. 失效可能嵌套在多层函数调用中
  2. 迭代器可能在循环外声明和失效
  3. 需要支持自定义可迭代类型

通过CodeQL的全局数据流库和递归支持,Itergator能够构建潜在失效函数调用图。对于非标准迭代类型,只需扩展PotentialInvalidation抽象类。

实际案例

Itergator发现了多个现实项目中的bug,包括:

  1. Cataclysm游戏中的简单失效案例
  2. Google正则表达式库中的复杂三层循环失效
  3. LLVM链接器中12层函数调用深的失效

结论

Itergator是检测复杂迭代器失效问题的强大工具。尽管存在一些误报,但通过自动过滤和"重要性"值设置,结果审查变得非常高效。CodeQL的声明式查询语言使得静态分析易于上手。

"Trail of Bits是我工作过的最好的地方!" ------ Kevin Higgs

相关推荐
Rabbit_QL几秒前
【LLM评价指标】从概率到直觉:理解语言模型的困惑度
人工智能·语言模型·自然语言处理
墨风如雪1 分钟前
没开挂!英伟达开源“通玩千款游戏”的AI模型,只为给机器人造个脑子
aigc
呆萌很7 分钟前
HSV颜色空间过滤
人工智能
roman_日积跬步-终至千里21 分钟前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
FL162386312930 分钟前
[C#][winform]基于yolov11的淡水鱼种类检测识别系统C#源码+onnx模型+评估指标曲线+精美GUI界面
人工智能·yolo·目标跟踪
爱笑的眼睛111 小时前
从 Seq2Seq 到 Transformer++:深度解构与自构建现代机器翻译核心组件
java·人工智能·python·ai
小润nature1 小时前
AI时代对编程技能学习方式的根本变化(1)
人工智能
AI即插即用2 小时前
即插即用系列 | ECCV 2024 WTConv:利用小波变换实现超大感受野的卷积神经网络
图像处理·人工智能·深度学习·神经网络·计算机视觉·cnn·视觉检测
愚公搬代码2 小时前
【愚公系列】《扣子开发 AI Agent 智能体应用》003-扣子 AI 应用开发平台介绍(选择扣子的理由)
人工智能