PostgreSQLにあるSQLインジェクションの脆弱性が9年以上発見されずアメリカ財務省への侵入に使用されてしまう
2024年12月30日、「中国政府が支援する高度で持続的な脅威攻撃者」がアメリカ財務省の機密データを管理するシステムを侵害しました。この侵入にはPostgreSQLに9年以上存在していたのに誰も気付いていなかったSQLインジェクションの脆弱(ぜいじゃく)性が使用されたことが判明しており、ソフトウェアエンジニアのニック・アグリアーノ氏が記事にまとめています。
Hidden Messages in Emojis and Hacking the US Treasury
https://slamdunksoftware.substack.com/p/hidden-messages-in-emojis-and-hacking
SQLインジェクションは多くのセキュリティの教科書の冒頭に載っているような非常に有名な攻撃手法で、SQLインジェクションを通して攻撃者はSQL文を書き換えられるためシステムに重大な影響を及ぼします。
SQLインジェクションはあまりにも有名かつ影響の大きい攻撃なので非常に警戒されているにもかかわらず、多数の開発者が精査している大規模なオープンソースプロジェクトのPostgreSQLに約10年もSQLインジェクションを可能にする脆弱性が潜んでいたことについてアグリアーノ氏は「全く驚くべき事だ」と述べました。
SQLインジェクションは、SQL文にユーザーからの入力内容を挿入する際のエスケープ処理の誤りによって発生します。特に「'(シングルクオート)」は文字列リテラルの区切りとなるため、攻撃を防止する際には適切な処理が重要です。
今回侵入されたアメリカ財務省のシステムでは、ユーザーからの入力を安全な形にエスケープするサニタイズ処理でPHPのpg_escape_stringメソッドを使用していました。pg_escape_stringは内部で実際にエスケープ処理を行うPQescapeStringInternalを呼び出しており、PQescapeStringInternalはエスケープ処理の際にマルチバイトUnicode文字の長さを調べる関数「pg_utf_mblen」を使用しています。
今回の攻撃では、16進数で「C027」、2進数で「11000000 00100111」という文字コードが使用されました。この文字は、先頭の3ビットが「110」のためマルチバイトUnicode文字の仕様に従って「2バイト文字」と判定されます。その後、文字を表す残りのビット部分を読み取ると16進数で「27」という文字コードとなり、「27」はシングルクオートを表す文字コードのためシングルクオートが挿入されてSQLインジェクションが成立してしまったとのこと。
ただの「'」はエスケープ処理が入るものの、先頭にビットを追加して2バイト文字にするとエスケープ処理をスキップできてしまっていたというわけです。
攻撃者はSQLインジェクションによってPostgreSQLに付属する対話型インターフェースであるpsqlを自由に使用できるようになり、データベースへのアクセスだけでなくpsqlを経由して任意のシステムコマンドを入力可能になっていたとのこと。
なお、今回の脆弱性は2025年2月11日に修正されています。
・関連記事
レーザー光を照射してチップの脆弱性を突くオープンソースのツール「RayV Lite」誕生、約7万円で作成可能で既存ツールの何百倍も安価 - GIGAZINE
Googleがコードの脆弱性をAIで見つけ出す「Big Sleep」で未知のバグを発見したと報告 - GIGAZINE
GoogleやMicrosoftの著名なオープンソースプロジェクトからGitHubトークンが漏えいしていたことが判明 - GIGAZINE
「XZ Utils」に仕掛けられたサイバー攻撃と同様のものが他のプロジェクトにも仕掛けられているとOpenSSFが警告 - GIGAZINE
オープンソースツール「node-ip」の軽度な脆弱性が「緊急対応を要する重大な脆弱性」として報告され連絡が殺到し開発者がリポジトリを一時アーカイブ - GIGAZINE
・関連コンテンツ
in ソフトウェア, セキュリティ, Posted by log1d_ts
You can read the machine translated English article SQL injection vulnerability in PostgreSQ….