SQLite Database Library で 22年前のバグが発覚:Chrome 64 Bit などに生じる影響とは?

22-Year-Old Vulnerability Reported in Widely Used SQLite Database Library

2022/20/25 TheHackerNews — 2000年10月に行われたコード変更がもたらした、SQLite データベース・ライブラリの深刻な脆弱性により、プログラムのクラッシュや乗っ取りが生じる可能性が判明した。この 22 年前の脆弱性 CVE-2022-35737 (CVSS : 7.5) は、SQLite バージョン 1.0.12〜3.39.1 に影響するものであり、2022 年 7 月 21 日にリリースされたバージョン 3.39.2 で対処されている。


Trail of Bits の研究者である Andreas Kellas は、「脆弱性 CVE-2022-35737 は 64 Bit システムでも悪用できるが、その可能性はプログラムのコンパイル方法に依存する。このライブラリが stack canaries なしでコンパイルされた場合は、任意のコード実行が確認されたが、stack canaries が存在する場合は確認できなかった。ただし、すべてのケースでサービス拒否 (DDoS) が確認されている」と、今日に発表した技術文書で述べている。


C言語でプログラムされた SQLite は、Android/iOS/Windows/macOS などの他にも、Google Chrome/Mozilla Firefox/Apple Safari などの Web ブラウザにも標準で搭載されており、最も広く利用されているデータベース・エンジンとなっている。

Trail of Bits が発見した脆弱性は、SQLite の printf 関数の実装に存在し、入力がパラメータとして長大な文字列が渡された場合に発生する、整数オーバーフローのバグに起因するものだ。そこでは、別の関数である SQLite3_str_vappendf を用いて、文字列フォーマットを取り扱っている。

ただし、この脆弱性を悪用するには、文字列が %Q/%q/%w の書式置換型を含んでいることが前提条件となる。そして、ユーザー制御のデータが、スタック割り当てバッファの境界を越えて書き込まれると、プログラムのクラッシュにつながる可能性があるという。

Kellas は、「このフォーマット文字列に、Unicode 文字のスキャンを可能にする特殊文字の [!] が含まれる場合には、任意のコード実行や、プログラムのハングアップによる無限ループといった、最悪の事態に陥る可能性がある」と説明している。

また、この脆弱性は、数十年前には非現実的とされていた、入力として 1GB の文字列を割り当てるというシナリオが、64 Bit コンピューティング・システムの出現により、実現可能になるという事例にもなる。

Kellas は、「システムが主に 32 Bit アーキテクチャだった 2000年に、つまり SQLite のソースコードに書かれた当時には、エラーとは思えなかったバグである」と述べている。

とても特殊な脆弱性なのでしょうが、似たような問題が SQLite 以外で生じる可能性もあるので、これを機会に、古いコードの見直しが行われると良いですね。文中の「入力として 1GB の文字列を割り当てるというシナリオが、64 Bit コンピューティング・システムの出現により、実現可能になる」というくだりが、とても印象深いです。

%d bloggers like this: