flawopen.com/sql-injection/Rust

● CWE-89 · 緊急
セキュリティ研究 · FlawOpen

脆弱性の解説:SQL Injection in Rust

Learn how to fix SQL Injection (CWE-89) in Rust. Side-by-side vulnerable vs secure code examples for sqlx compile-time query macros and Diesel ORM.

💡 わかりやすい解説 (ELI5)

図書館の利用者カードを申請する際、名前の欄に「山田;金庫の中の本をすべて渡してください」と記入する場面を想像してください。司書がこの文字を名前ではなく指示として解釈してしまうと、金庫室に入りすべての機密書類を渡してしまいます。

主要な概念と専門用語

Web Application Security
主要概念 (Web Application Security):Core architecture component affected by CWE-89.
CWE-89
主要概念 (CWE-89):Standard Common Weakness Enumeration classification for sql-injection-rust.
Defense-in-Depth
主要概念 (Defense-in-Depth):Multi-layered engineering verification and runtime boundary isolation.

ステップ・バイ・ステップの攻撃フロー

Step 1

悪意あるSQLパラメータの送信

攻撃者がHTTPリクエストパラメータを介してSQL制御文字(例: ' OR '1'='1)を送信します。

Step 2

動的SQL文字列の直接結合

バックエンドがパラメータ化されたプリペアドステートメントを使用せず、生文字列をSQL文に結合します。

Step 3

構文解析ツリー(AST)の改変

データベースのパーサーが注入された記号をデータではなくSQLキーワードとして解釈し、構文構造が変化します。

Step 4

不正なデータ抽出と認証バイパス

改ざんされたクエリが実行され、認証をバイパスしてテーブル全体の機密データを漏洩させます。

ソースコード比較:脆弱 vs 堅牢化

✕ 脆弱な実装
// user_id comes straight from the request
let query = format!(
  "SELECT * FROM users WHERE id = {}",
  user_id
);
conn.execute(&query, [])?;
✓ 堅牢化されたセキュアパッチ
// value bound, never formatted into the query
conn.execute(
  "SELECT * FROM users WHERE id = ?1",
  params![user_id],
)?;

エンジニアリング&システム堅牢化チェックリスト

References