top of page
IMG_0546.JPG

Rubyが危ない?!クラス汚染が引き起こす“アプリ全崩壊”の可能性:2025/02/06

  • 執筆者の写真: 晋次 宮田
    晋次 宮田
  • 2025年2月6日
  • 読了時間: 2分

クラス汚染とは?


2024年10月2日付で公開されたDoyensecのブログ記事では、Rubyにおける「クラス汚染(Class Pollution)」という概念が取り上げられました。

  • クラス汚染(Class Pollution):「Rubyの動的機能(eval, send, class_eval など)を悪用して、既存クラスの定義や挙動を 意図せず書き換えてしまう(汚染する) 攻撃」を指す。

Rubyの動的再定義・メタプログラミングは非常に強力で便利ですが、使い方を誤ると攻撃者にとっての“裏口”になります。

「あ〜evalインジェクション?そもそもeval使わね〜し」

と思うかもしれませんが、改めてリマインド的にご紹介します。

(タイトルがちょっと釣りっぽくてすみません。。)


どんな攻撃があるのか?


● eval の悪用例

# 危険な例
def run_user_input
  user_code = params[:code]    # ユーザー入力
  eval(user_code)              # 文字列をそのまま実行
end
  • 攻撃者が「system('rm -rf /')」のようなコードを送れば、サーバー上で任意のコマンドを実行できます。

● send の悪用例

def call_dynamic_method
  method_name = params[:method]
  SomeModel.send(method_name)
end
  • method_name に「destroy_all」などが指定されると、データの削除や不正操作が行われる可能性があります。

● class_eval でクラスを書き換え

FooClass.class_eval(params[:body])
  • 受け取った文字列で既存クラスを上書きし、アプリ全体が侵害されるリスクがあります。



なぜ危険?


  • コードインジェクション: これらの動的メソッドを誤用すると、任意のRubyコードが実行できてしまい、サーバーをほぼ自由に操られます。

  • SQLインジェクション以上の範囲: データベースだけでなく、ファイル操作やネットワーク操作まで踏み込めるため、より広範な被害に発展する恐れがあります。



対策は?


  1. 危険メソッドを使わない

    • そもそもevalやclass_evalは極力使わず、通常のRuby構文で実装する。

  2. ホワイトリスト方式

    • send を使う場合は呼び出すメソッドを限定し、自由に指定させない。

  3. サンドボックス化

    • どうしても動的コードを実行するなら、Dockerなど隔離環境で行う。

  4. 依存ライブラリのチェック

    • 使用中のGemがeval系メソッドを乱用していないか、CVEや脆弱性情報を定期的に確認する。

  5. 権限を絞る

    • 万一突破されても被害を最小にするため、root権限での実行は避ける。



まとめ


とりあえずこの記事を書きながら「念の為、動的コードを使っているかだけ確認しておこうかな」という気持ちにはなりました。



引用元

この記事の元になっている詳細情報は、Doyensecの2024年10月2日付ブログで解説されています。より詳しく知りたい方は、下記リンクをご覧ください。

 
 
bottom of page