
SQLite3 の sqlite3_str_vappendf 関数における整数オーバーフロー。
CVSS 6.7 AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H
CVE-2022-35737 は SQLite バージョン 1.0.12 で導入され、2022年7月21日に公開されたリリース 3.39.2 で修正されました。この脆弱性は64ビットシステムで悪用可能であり、悪用可能性はプログラムのコンパイル方法に依存します。スタックカナリアなしでライブラリがコンパイルされている場合は任意のコード実行が確認されていますが、スタックカナリアが存在する場合は未確認です。サービス拒否はすべての場合で確認されています。
sqlite3_str_vappendf 関数への大きな文字列入力は、フォーマット指定子が %q、%Q、または %w の場合に符号付き整数オーバーフローを引き起こす可能性があります。これにより、ユーザーが制御するデータがスタック上に割り当てられたバッファの境界外に書き込まれ、プログラムのクラッシュ、無限ループ、または任意のコード実行が発生する可能性があります。
このリポジトリには、この脆弱性の悪用を実証する概念実証 (Proof-of-Concept) コードが含まれています。
snprintf-good-example.csqlite3_snprintf が既存のすべての単一引用符文字を正しくエスケープし、短い文字列の先頭と末尾に単一引用符を追加することを示します。
期待される結果:
$ ./snprintf-good-example
src: hello, 'world'!
dst: 'hello, ''world''!'
snprintf-crash.csqlite_snprintf が十分に大きな文字列を指定して呼び出されたときにクラッシュすることを示します。
期待される結果: SIGSEGV
$ ./snprintf-crash
Segmentation fault (core dumped)
snprintf-control-pc.cバッファオーバーフローの長さを制御して、スタックカナリアや保存された戻りアドレスなどのスタック上の対象データを上書きできることを示します。
期待される結果: SIGABRT
$ ./snprintf-control-pc
*** stack smashing detected ***: terminated
Aborted (core dumped)
snprintf-livelock.c脆弱なプログラムをほぼ無限に (2^64 回の反復) ループさせることが可能であることを示します。
期待される結果: (現実的な時間スケールで) 無限ループ
$ ./snprintf-livelock
<no output>
^C
pdo-sqlite3-quote-poc.phpCVE-2022-35737 が、デフォルト以外のメモリ制限で実行された場合に PHP インタプリタから到達可能であることを示します。
期待される結果: SIGSEGV
$ php pdo-sqlite3-quote-poc.php
Segmentation fault (core dumped)
必要に応じて、SQLite ライブラリの脆弱なバージョンに依存関係が固定された Docker コンテナ内で概念実証コードを実行できます。
$ docker build -t cve-2022-35737 .
$ docker run -it --rm cve-2022-35737 /bin/bash
root@289cef859649:/poc# ./snprintf-crash
Segmentation fault (core dumped)