极市导读
AI首次发现真实世界中的重大安全漏洞?SQLite中的一个漏洞,幸运地被谷歌研究者的AI Agent发现了,修复后并未造成任何损失。莫非AI再进化一番,微软的全球蓝屏事故就可以永久避免了?这个可能性令人激动不已。>>加入极市CV技术交流群,走在计算机视觉的最前沿
用LLM在真实世界中「捉虫」
方法架构
Project Naptime
-
代码浏览工具(Code Browser)使AI Agent能够浏览目标代码库,这与工程师使用Chromium Code Search的方式类似。它提供了查看特定实体(如函数、变量等)源代码的功能,并能识别函数或实体被引用的位置。
-
Python工具让AI Agent能够在隔离的沙盒(Sandbox)环境中运行Python脚本,用于执行中间计算并生成精确而复杂的目标程序输入。
-
调试器工具(Debugger)为AI Agent提供了程序交互能力,可以观察程序在不同输入下的行为表现。它支持断点设置并能在断点处评估表达式,从而实现动态分析。
-
报告工具(Reporter)为AI Agent提供了一个结构化的进度通报机制。AI Agent可以发送任务完成信号,触发控制器验证是否达成成功条件(通常表现为程序崩溃)。当无法取得进一步进展时,它还允许AI Agent主动中止任务,避免陷入停滞状态。
发现漏洞
7476: struct sqlite3_index_constraint {
7477: int iColumn; /* Column constrained. -1 for ROWID */
7478: unsigned char op; /* Constraint operator */
7479: unsigned char usable; /* True if this constraint is usable */
7480: int iTermOffset; /* Used internally - xBestIndex should ignore */
7481: } *aConstraint; /* Table of WHERE clause constraints */
这种模式产生了一个边缘案例,所有使用该字段的代码都需要正确处理这种情况,因为按照常规预期,有效的列索引值应该是非负的。 seriesBestIndex函数在处理这个edge case时存在缺陷,当处理包含rowid列约束的查询时,导致写入了带有负索引的堆栈缓冲区。 在研究者提供给AI Agent的编译版本中,debug assertion功能已启用,这种异常情况会被第706行的断言检查所捕获:
619 static int seriesBestIndex(
620 sqlite3_vtab *pVTab,
621 sqlite3_index_info *pIdxInfo
622 ){
...
630 int aIdx[7]; /* Constraints on start, stop, step, LIMIT, OFFSET,
631 ** and value. aIdx[5] covers value=, value>=, and
632 ** value>, aIdx[6] covers value
633 const struct sqlite3_index_constraint *pConstraint;
...
642 for(i=0; i
nConstraint; i++, pConstraint++){ 643 int iCol; /* 0 for start, 1 for stop, 2 for step */
644 int iMask; /* bitmask for those column */
645 int op = pConstraint->op;
...
705 iCol = pConstraint->iColumn - SERIES_COLUMN_START;
706 assert( iCol>=0 && iCol
707 iMask = 1
...
713 if( pConstraint->usable==0 ){
714 unusableMask |= iMask;
715 continue;
716 }else if( op==SQLITE_INDEX_CONSTRAINT_EQ ){
717 idxNum |= iMask;
718 aIdx[iCol] = i;
719 }
720 }
然而,在发布版本中,这个断言检查并不存在。 在研究者的测试环境中(具体表现会因编译器和优化级别而异),第718行的后续写入操作会越界写入aIdx缓冲区下方的内存区域,导致pConstraint指针的最低有效32位被破坏。 当这个被破坏的指针在循环的下一次迭代中被取消引用时,就会产生潜在的可利用漏洞条件。 不过,即使有了这样的漏洞说明,对于人类研究员来说,要精确理解如何触发这个漏洞仍然不易。 虽然针对ROWID列设置约束显然是个不错的切入点,但要完全理解,还需要深入研读代码。 而 AI 智能体似乎已经掌握了比人类研究员更多的SQLite相关知识,这使它能够更高效地定位问题! 这种情况的一个典型例子,就是LLM在生成测试用例时会直接使用generate_series虚拟表。 (虽然研究者也观察到模型会先研究可用的虚拟表的情况,但很明显,它能够在这里直接运用已有的知识)。 执行过程重点分析
在这次基于Gemini 1.5 Pro的成功测试中,seed commit为 [1976c3f7],这是一个规模较大、复杂的代码变更。 而研究者的AI Agent发现的漏洞,与该seed commit中的变更仅存在松散关联——这种情况在手动变种分析中较为常见,因为在理解代码库中的某个漏洞时,研究人员往往会由此发现其他潜在问题。 以下是关键节点摘要,其中,所有ASSISTANT块中的内容均直接来自AI Agent。 AI Agent对差异中的变化进行了合理的评估,并以此作为研究的切入点: ASSISTANT 通过引入termFromWhereClause函数,CL改进了在虚拟表查询中处理OR分支共享的WHERE条件的方式。该函数在考虑嵌套子句的情况下,从WhereClause中检索特定的条件。 在此更改之前,由于条件索引映射不正确,共享的条件可能未被正确处理,可能导致低效的查询计划或错误的结果。 最可能出现的问题涉及在allocateIndexInfo和whereLoopAddVirtualOne函数中不正确地处理WHERE子句约束,其中 CL 修改了如何使用新的辅助函数来处理约束偏移量。 我将首先检查allocateIndexInfo函数。 在经过数个步骤探索相关代码后,AI Agent形成了一个更明确的测试假设——它试图通过运行patch中测试用例的修改版本来验证这个假设,但未能成功。 原因在于patch中的测试用例依赖于一个在当前配置环境中未启用的扩展模块: TOOL(debugger_run ) 程序在未崩溃或命中断点的情况下退出。退出代码为1。 STDERR输出为: Runtime error near line 2: no such module: tcl Parse error near line 3: no such table: x1 ASSISTANT 程序终止是因为TCL模块不可用。测试依赖于TCL虚拟表模块,需要在编译SQLite时启用该模块。提供的程序的输入基于bestindexC.test文件,它使用TCL模块来测试虚拟表的最佳索引选择。 为了解决这个问题,需要更改程序输入,使用不需要TCL模块的其他虚拟表。然而,该漏洞与虚拟表的查询计划有关,所以我们仍然需要一个虚拟表来触发此问题。 我将使用code_browser_source工具来检索SQLite中的内置虚拟表示例。然后,我将调整输入,使用其中一个虚拟表,并重新在whereLoopAddVirtualOne中设置断点。 AI Agent很好地应对了这个问题,准确识别出了修复测试用例所需的各个步骤,并在后续几个步骤中成功收集到了所有构建测试用例所需的信息,最终实现了触达whereLoopAddVirtualOne的目标: ASSISTANT sqlite3_create_module函数用于注册虚拟表模块。shell.c文件包含了多个这样的实例,包括generate_series、fsdir、completion和expert模块。其中json表的实现也很值得关注。 我首先关注的是generate_series,然后构造出一个使用该模块的查询,从而触发错误的约束处理。 需要注意的是,在最初发现和复现该漏洞时,AI Agent对于它试图触发的「不正确约束处理」的描述相当模糊。 在这种情况下,完整的执行轨迹读起来颇似人类研究员的思维过程——从一个想法开始,在调查过程中产生其他几个想法,最终生成了一个可以复现略有不同漏洞的测试用例。 在本例中,当whereLoopAddVirtualOne在generate_series表上被调用时,执行流程最终会进入seriesBestIndex,在那里约束确实被错误处理了。 特别有趣的是,一旦程序崩溃,模型会在解释问题时表现得更为出色——在生成根因分析(root-cause analysis)和完整崩溃报告时,我们可以看到AI Agent清晰地构造了一个测试用例来触发特定的已识别边缘案例: ASSISTANT 相关的字段是sqlite3_index_constraint结构体中的iColumn。该字段表示约束的列编号。要导致断言失败,我们需要对索引大于3或小于-1的列设置约束。 让我们构建一个涉及这些列约束的SQL查询。generate_series表有名为value、start、step和stop的列。它们的索引是: – value: 0 – start: 1 – step: 2 – stop:3 要触发此漏洞,我们可以对ROWID施加一个约束,并对ROWID的约束使用iColumn = -1。 示例查询如下: SELECT * FROM generate_series(1,10,1) WHERE ROWID = 1; 该查询将导致seriesBestIndex函数崩溃。 最终,得到了一个清晰准确的问题总结,几乎可以直接用于漏洞报告! TOOL(debugger_run) 程序崩溃:SIGABRT at :0 STDERR输出为: sqlite3: src/shell.c:6816: int seriesBestIndex(sqlite3_vtab *, sqlite3_index_info *): Assertion `iCol>=0 && iCol ASSISTANT(report_success) 程序在执行SELECT * FROM generate_series(1,10,1) WHERE ROWID = 1;时因seriesBestIndex函数中的断言失败而崩溃。 断言assert(iCol>=0 && iCol 这导致iCol被计算为-2,从而导致断言失败。 关于模糊测试
一个显而易见的问题是:为什么传统的模糊测试没有更早发现这个漏洞? 答案就在模糊测试工具链的配置上。 OSS-Fuzz使用的工具并没有启用generate_series扩展,而替代的fuzzingshell.c工具包含的是旧版本的seriesBestIndex函数,未受此漏洞影响。 虽然SQLite AFL仓库中包含一个针对研究者提供给Big Sleep智能体的、相同CLI二进制文件的模糊测试配置,但似乎并未被广泛使用。 这个漏洞是否真的容易发现? 为此,研究者尝试通过模糊测试重新发现它。 他们遵循SQLite文档中的模糊测试说明,并使用CLI目标。在启动AFL运行之前,他们还验证了模糊测试语料库中包含所需的generate_series和rowid关键字。 然而,经过150个CPU小时的模糊测试,问题仍未被发现。 随后,他们尝试通过将必要的关键字添加到AFL的SQL字典中,来简化模糊测试的任务。 然而,似乎只有当语料库包含与导致崩溃的输入非常接近的示例时,漏洞才能被快速发现,因为代码覆盖率对这个特定问题并不是可靠的指标。 诚然,AFL并不是针对像SQL这种基于文本的格式最适合的工具,大多数输入在语法上无效,会被解析器拒绝。 然而,如果将这一结果与Michal Zalewski在2015年关于模糊测试SQLite的博客文章进行比较,会发现十分有趣的事。 那时,AFL在发现SQLite漏洞方面相当有效;经过多年的模糊测试,该工具似乎已经达到自然的饱和点。 虽然研究者迄今为止的结果与AFL发布时带来的显著效果相比显得微不足道,但它有自己的优势——有概率能够有效地发现一组不同的漏洞。 结论
对于团队来说,这个项目无疑成功了。 在广泛使用且模糊化的开源项目中找到漏洞,非常一个令人兴奋! 这也就意味着:当提供正确的工具时,当前的LLMs可以进行漏洞研究。 不过,研究者想重申,这些都是高度实验性的结果。 Big Sleep 团队表示:目前,在发现漏洞方面,针对特定目标的模糊器可能至少同样有效。 研究者希望,未来这项工作将为防御者带来显著优势—— 不仅有可能找到导致崩溃的测试用例,还能提供高质量的根本原因分析,使得问题的分类和修复变得更便宜且更有效。 谷歌研究者表示,会继续分享自己的研究成果,尽可能缩小公共技术前沿和私有技术前沿之间的差距。 Big Sleep团队也会将继续努力,推进零日计划的使命,让0-day变得更加困难。 团队介绍
Dan Zheng
团队中唯一的华人Dan Zheng是谷歌DeepMind的研究工程师,从事代码和软件工程的机器学习,以及编程语言的研究。 此前,他曾参与Swift for TensorFlow的工作,专注于Swift中的可微分编程。 他在普渡大学获得了计算机科学专业的学士学位。毕业后,他做了多年的学生研究员,期间研究成果颇丰。 参考资料: https://googleprojectzero.blogspot.com/2024/10/from-naptime-to-big-sleep.html
公众号后台回复“数据集”获取100+深度学习各方向资源整理
极市干货
技术专栏:多模态大模型超详细解读专栏|搞懂Tranformer系列|大视觉模型 (LVM) 解读|扩散模型系列|极市直播 技术综述:小目标检测那点事|大模型面试八股含答案|万字长文!人体姿态估计(HPE)入门教程 点击阅读原文进入CV社区
收获更多技术干货
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...