4 つの主要なデータベースで 100 以上の脆弱性を 1 日に自動的に発見、浙江大学の研究が SIGMOD 2023 の最優秀論文を受賞

機械の心臓コラム

ハート・オブ・ザ・マシーン編集部

この論文では、浙江大学の研究者が、Transformed Query Synthesis (TQS) と呼ばれる手法を提案しました。24 時間の実行後、TQS は 115 件の脆弱性の発見に成功しました。そのうち 31 件は MySQL、30 件は MariaDB、31 件は TiDB、23 件は PolarDB でした。

2023 ACM SIGMOD/PODS International Conference on Data Management (SIGMOD 2023) は、現地時間 6 月 18 日から 23 日まで米国シアトルで開催されます。このカンファレンスは最近、最優秀論文のリストを発表し、Microsoft Researchの「Predicate Pushdown for Data Science Pipelines」と浙江大学の「Detecting Logic Bugs of Join Optimizations in DBMS」が賞を受賞した。この会議が1975年に始まって以来、中国本土の研究チームが同会議の最優秀論文賞を受賞するのは初めてである。その中で、浙江大学の研究は、MySQL、MariaDB、TiDB、PolarDB などのデータベース管理システムの論理的な抜け穴を自動的に発見できる新しい方法を提案しました。

写真

過去数十年にわたって、最新のデータベース管理システム (DBMS) は、クラウド プラットフォームや HTAP などのさまざまな新しいアーキテクチャをサポートするように進化してきました。これらのアーキテクチャでは、クエリ評価のためにますます高度な最適化が必要になります。クエリ オプティマイザー (クエリ オプティマイザー) は、DBMS で最も複雑かつ重要なコンポーネントの 1 つであると考えられています。その機能は、入力 SQL クエリを解析し、組み込みのコスト モデルを利用して効率的な実行プランを生成することです。クエリ オプティマイザー実装のエラーは、クラッシュ バグやロジック バグなどのバグを引き起こす可能性があります。クラッシュが発生するとシステムが即座に停止するため、クラッシュの脆弱性は簡単に検出できます。ただし、論理ホールがあると DBMS が検出が難しい誤った結果セットを返す可能性があるため、論理ホールは見落とされがちです。このペーパーでは、これらのサイレント脆弱性の検出に焦点を当てます。

DBMS の論理ホールを検出する新しいアプローチは、ピボット クエリ合成 (PQS) です。このメソッドの中心的な考え方は、テーブルからピボット行 (ピボット行) をランダムに選択し、この行を結果として含むクエリを生成することです。合成されたクエリがデータ行を返せない場合は、ロジック ホールが検出されました。PQS は主に単一テーブルのオプション クエリをサポートするために使用され、報告された脆弱性の 90% は単一テーブル クエリのみに関係しています。異なる結合アルゴリズムと結合構造を使用する複数テーブル クエリ (単一テーブル クエリよりもエラーが発生しやすい) については、大きな研究ギャップがあります。

以下の図は、MySQL の結合クエリにある 2 つの論理的な抜け穴を示しています。どちらの脆弱性も、この文書で提案されている新しいツールを使用して検出できます。

写真

図 1: DBMS の接続最適化に対する論理的脆弱性の例

図 1 (a) は、MySQL 8.0.18 のハッシュ結合の論理ホールを示しています。この例では、最初のクエリはブロックネストされたループ結合を使用して実行されたため、正しい結果セットを返しました。ただし、内部ハッシュ結合を使用する 2 番目のクエリには問題があり、誤って空の結果セットが返されました。これは、基礎となるハッシュ結合アルゴリズムが 0 が -0 に等しくないという誤った想定を行っているためです。

図 1 (b) のロジック ホールは、MySQL 8.0.28 のセミ結合処理に起因します。最初のクエリでは、ネストされたループの内部結合によってデータ型 varchar が bigint に変換され、正しい結果セットが取得されます。ただし、ハッシュ準結合を使用して 2 番目のクエリを実行すると、データ型 varchar が double に変換され、データの精度が失われ、等価比較でエラーが発生します。
複数テーブル結合クエリのロジック脆弱性検出問題にクエリ合成手法を使用することは、単一テーブル クエリよりもはるかに難しく、次の 2 つの課題があります。

  • 结果验证:为了验证查询结果的正确性,之前的方法采用的是差分测试策略。其思路是使用不同的物理执行计划(physical plan,即数据库系统实际执行查询语句的方式)来处理查询。如果这些规划返回的结果集不一致,那么就可能是检测到了逻辑漏洞。但是,差分测试方法有两个缺点。其一,某些逻辑漏洞可影响多个物理执行计划并让它们全部生成同样的错误结果。其二,当观察到不一致的结果集时,需要人工检查生成正确结果的是哪一个执行计划,从而导致成本开销变得高昂。这个问题有一个可能的解决方案,即为任意测试查询构建真值(ground-truth)结果,但现有的工具并不支持这种操作;

  • 搜索空间:对于给定的数据库模式,可生成的连接查询的数量随表格和列的数量呈指数级变化。由于我们不可能为了验证而枚举出所有可能的查询,因此就需要一种有效的查询空间探索机制,以便让我们尽可能高效地检测出逻辑漏洞。

针对以上难题,浙大的研究者提出了一种名为 Transformed Query Synthesis(TQS)的方法。在检测 DBMS 中连接优化的逻辑漏洞任务上,TQS 是一种普适且成本高效的全新工具。

针对上述第一个挑战,研究者提出的应对方法是 DSG,即数据驱动的模式和查询生成(Data-guided Schema and query Generation) 。给定表示为一个宽表数据集,DSG 可基于检测到的范式将该数据集拆分为多个表格。为了加快发现漏洞的速度,DSG 还会向生成的数据库中注入一些人工噪声数据。首先,将该数据库模式转换成一个图(graph),其中节点是表 / 列,边是节点之间的关系。DSG 会在模式图上使用随机游走来为查询选择表格,然后再使用这些表格来生成连接(join)。对于涉及多表的特定连接查询,我们可以轻松从宽表格中找到其真值结果。这样一来,DSG 就能有效地为数据库验证生成 (查询,结果) 集合了。

针对上述第二个挑战,研究者设计的方法是 KQE,即知识引导的查询空间探索(Knowledge-guided Query space Exploration) 。该方法首先是将模式图扩展成一个规划迭代图(plan-iterative graph),其表示整个查询生成空间。然后将每个连接查询表示为一个子图。为了给生成的查询图评分,KQE 采用了一种基于嵌入的图索引,其可以在已经探索过的空间中搜索是否有结构相似的查询图。根据覆盖度分数引导随机游走查询生成器,以尽可能多地探索未知的查询空间。

为了展现该方法的通用性和有效性,研究者在四个常用 DBMS 上对 TQS 进行了评估:MySQL、MariaDB、TiDB 和 PolarDB。运行了 24 小时后,TQS 成功找到了 115 个漏洞,包括 MySQL 中 31 个、MariaDB 中 30 个、TiDB 中 31 个、PolarDB 中 23 个。通过分析根本原因,可归纳出这些漏洞的类型,其中 MySQL 中的漏洞有 7 种、MariaDB 有 5 种、TiDB 有 5 种、PolarDB 有 3 种。研究者已经将发现的漏洞提交给相应的社区并且收到了积极的反馈。

下面将通过数学形式描述所要解决的问题以及浙大提出的解决方案。

问题定义

数据库的漏洞有两种:崩溃和逻辑漏洞。崩溃漏洞来自于操作系统和 DBMS 的执行过程。它们会导致 DBMS 被强行终止,原因包括内存等资源不足或访问了无效内存地址等。因此,崩溃漏洞很容易被发现。相较而言,逻辑漏洞则更难以发现,因为数据库依然会正常运行,处理查询后也会返回看似正确的结果(并且大多数情况下它们确实会返回正确结果,但在少数情况下却可能读取错误的结果集)。这些无声漏洞就像是隐形炸弹,要更加危险一些,因为它们难以检测到,还可能影响到应用的正确性。

这篇论文为多表连接查询问题引入了查询优化器来检测逻辑漏洞。研究者将这些漏洞称为连接优化漏洞(join optimization bugs)。使用表 1 给出的标记法,连接优化漏洞检测问题可以形式化地定义为:
定义:对于查询工作负载写真中的每个查询写真,令查询优化器通过多个实际规划执行写真 的连接,并使用基本真值 写真 验证其结果集写真。如果写真,则发现了一个连接优化漏洞。

写真表 1:符号说明表

方案概述

图 2 给出了 TQS 的架构概况。给定一个基准数据集和目标 DBMS,TQS 通过基于数据集生成查询来搜索 DBMS 可能存在的逻辑漏洞。TQS 有两大关键组件:数据引导的模式和查询生成(DSG)和知识引导的查询空间探索(KQE)

写真

图 2:TQS 概况**

DSG 将输入数据集视为一个宽表,并且除了原始元组外,DSG 还会刻意合成一些有易错值(比如空值或非常长的字符串)的元组。针对连接查询,DSG 会为该宽表创建一个新模式,其方法是将该宽表分成多个表,确保这些表符合基于功能依赖性的范式。DSG 会将该数据库模式建模成一个图,然后在该模式图上通过随机游走来生成逻辑 / 概念查询。DSG 会将逻辑查询具体化为物理执行计划,并通过不同的提示对该查询进行变换,使 DBMS 能够执行多个不同的物理执行计划,以搜索漏洞。对于一个连接查询,其基本真值结果是通过将连接图映射回宽表而得到。

在完成模式设置和数据拆分之后,KQE 将该模式图扩展为一个规划迭代图。每个查询都表示为一个子图。KQE 为历史中的查询图(即在已探索过的查询空间中)的嵌入构建一个基于嵌入的图索引。直观地说,KQE 的作用是确保新生成的查询图尽可能地远离其在历史中的最近邻,即这是为了探索新的查询图,而不是重复已有的查询图。为此,KQE 通过基于结构相似性(与历史中的查询图)为生成的查询图评分,同时使用自适应随机游走方法来生成查询。

算法 1 总结了 TQS 的核心思想,其中第 2、10、12 行是 DSG,第 4、8、9 行是 KQE。

写真

给定一个数据集写真和从写真 采样得到的宽表写真,DSG 将单个宽表写真 拆分成多表,这些表格组成符合 3NF 的数据库模式写真(第 2 行)。模式写真可以被视为一个图写真,其中表格和列是顶点,边代表的是顶点之间的关系。DSG 在 写真上使用随机游走来生成查询的连接表达(第 10 行)。事实上,连接查询可以被投射为写真 的子图。通过将子图映射回宽表格写真,DSG 可轻松地检索到该查询的基本真值结果(第 12 行)。

KQE 将模式图扩展为一个规划迭代图(第 4 行)。为避免测试相似的路径,KQE 会构建一个基于嵌入的图索引写真来索引已有查询图的嵌入(第 9 行)。KQE 根据当前查询图与已有查询图的结构相似性来更新规划迭代图 G 的边权重 π (第 8 行)。KQE 为下一条可能路径评分,其引导着随机游走生成器,从而更倾向于探索未知的查询空间。

クエリの場合 、TQS は写真ヒント セットを通じて写真クエリを変換し、いくつかの異なる実際のクエリ プランを実行します (11 行目)。最後に、クエリ写真 の結果セットがグラウンド トゥルースと比較されます写真 (14 行目)。一致しない場合は、接続最適化の脆弱性が検出されました (15 行目)。

DSG と KQE の詳細については、元の論文をお読みください。

実験結果
TQS は、MySQL、MariaDB、TiDB、PolarDB などのデータベース管理システムの論理的な脆弱性を発見することに成功し、MySQL の脆弱性 7 種類、MariaDB の脆弱性 5 種類、TiDB の脆弱性 5 種類、計 20 種類に分類されています。 PolarDB の脆弱性は 5 種類あり、以下の表に示す 3 種類があります。

写真

他の方法と比較して、浙江大学が提案したTQSの全体的なパフォーマンスも非常に印象的であり、多くの指標で大幅に優れた結果を達成しており、各コンポーネントの有効性も変数実験を制御することによってテストされています。

写真

しかし、研究者らはまた、TQS は現在、等価結合クエリに重点を置いているとも述べています。それにもかかわらず、DSG と KQE の考え方は、非等価結合の場合にも拡張できます。唯一の課題は、クエリのグラウンド トゥルース結果を生成および管理する方法です。非等結合の場合、結果のサイズは指数関数的に増大します。この点については、今後さらに研究される必要があります。

おすすめ

転載: juejin.im/post/7234146188508332092