flawopen.com/sql-injection/Ruby

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

脆弱性の解説:SQL Injection in Ruby

Learn how to fix SQL Injection (CWE-89) in Ruby. Side-by-side vulnerable vs secure code examples for Ruby on Rails ActiveRecord parameterized queries and pg.

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

✕ 脆弱な実装
# params[:id] straight into the string
User.where(
  "id = #{params[:id]}"
)
✓ 堅牢化されたセキュアパッチ
# value bound, never interpolated
User.where(
  "id = ?", params[:id]
)
# or, more idiomatic still:
User.where(id: params[:id])

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

References