flawopen.com/sql-injection/Swift

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

脆弱性の解説:SQL Injection in Swift

Learn how to fix SQL Injection (CWE-89) in Swift. Side-by-side vulnerable vs secure code examples for Vapor Fluent, GRDB.swift, and SQLite.swift prepared statements.

💡 わかりやすい解説 (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-swift.
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 堅牢化

✕ 脆弱な実装
// userId comes straight from user input
let query =
  "SELECT * FROM users WHERE id = \(userId)"
sqlite3_exec(db, query, nil, nil, nil)
✓ 堅牢化されたセキュアパッチ
// value bound, never interpolated
var stmt: OpaquePointer?
sqlite3_prepare_v2(db,
  "SELECT * FROM users WHERE id = ?",
  -1, &stmt, nil)
sqlite3_bind_text(stmt, 1, userId, -1, nil)
sqlite3_step(stmt)

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

References