2026年4月21日、Rubyの標準的なテンプレートエンジンであるERBにおいて、深刻なセキュリティ脆弱性 (CVE-2026-41316) が公開されました。
この脆弱性は、信頼できないデータに対して Marshal.load を実行した際に、ERBが本来持っているはずの保護機能を回避して、攻撃者が任意のコードを実行できてしまうというものです。
特にRuby on Railsなどのフレームワークを利用している開発者は、環境への影響を確認し、迅速に対応する必要があります。
脆弱性 CVE-2026-41316 の詳細
今回の脆弱性は、ERBオブジェクトがデシリアライズされる際の「ガード機能」の不備に起因しています。
ここではそのメカニズムと具体的な問題点について詳しく解説します。
@_init ガードのバイパス
ERBには、Marshal.load を通じて不適切なデータからERBオブジェクトが再構築された際、不正なコードが実行されるのを防ぐための @_init というガード変数が存在します。
しかし、特定のメソッドを経由することで、このガード変数のチェックを完全に回避できることが判明しました。
脆弱性の対象となるのは以下の3つのメソッドです。
ERB#def_methodERB#def_moduleERB#def_class
これらのメソッドはテンプレートソースを評価しますが、その過程で @_init の状態を適切に確認しません。
特に def_module は引数を必要としないため、デシリアライズ時のガジェットチェーン (一連の処理の連鎖) に組み込みやすく、攻撃者にとって極めて利用しやすい経路となります。
影響を受ける環境とスコープ
この脆弱性が悪用されるためには、特定の条件が重なる必要があります。
しかし、多くの一般的なRubyプロジェクトがその条件に合致しているため、警戒が必要です。
脆弱性が成立する条件
以下の2つの条件を同時に満たすアプリケーションは、任意コード実行の危険にさらされています。
- 信頼できない入力ソースからのデータに対して
Marshal.loadを実行している。 erbとactivesupportの両方がメモリ上にロードされている。
特に警戒が必要なケース
Ruby on Railsアプリケーションは、デフォルトでActiveSupportとERBの両方を使用するため、最も大きな影響を受けます。
具体的には以下のケースが該当します。
- 外部から受け取ったシリアライズデータを、キャッシュ、データインポート、またはプロセス間通信 (IPC) のために
Marshal.loadで処理しているRailsアプリ。 - CookieのセッションシリアライズにMarshalを使用している古いバージョン (Rails 7.0以前など) のアプリケーション。
Marshal.loadを利用してデータを読み込むRuby製の各種ツール。
修正バージョンと対策
この問題を解決するには、erb gemを修正済みのバージョンへアップデートすることが唯一の直接的な対策です。
修正済みバージョンのリスト
プロジェクトの状況に合わせて、以下のバージョン以降に更新を行ってください。
| 影響を受ける系列 | 修正済みバージョン |
|---|---|
| erb gem 4.0.x | 4.0.3.1, 4.0.4.1 |
| erb gem 6.0.x | 6.0.1.1, 6.0.4 |
上記以外の erb gem 6.0.3 以下のバージョンはすべて本脆弱性の影響を受けます。
アップデートと検証の例
Gemfile を更新し、bundle update erb を実行して、依存関係が正しく更新されたか確認してください。
# Gemfile.lock で現在のバージョンを確認する例
# 修正済みバージョン (例: 6.0.4) になっていることを確認してください
# 概念的な脆弱性のデモンストレーション (悪用厳禁)
require 'erb'
require 'active_support/all'
# 信頼できないソースから読み込まれたと仮定したデータ
untrusted_payload = "..."
# 脆弱な環境では、以下のデシリアライズ過程でコードが実行される可能性がある
begin
# 修正後のバージョンでは、適切に保護されます
Marshal.load(untrusted_payload)
rescue => e
puts "Safe: デシリアライズの実行を遮断しました (#{e.message})"
end
まとめ
今回の CVE-2026-41316 は、ERBの保護機能を巧妙にすり抜ける設計上の脆弱性です。
デシリアライズを悪用した攻撃は、アプリケーションの権限を完全に奪取される恐れがあるため、非常に危険です。
まずは速やかに erb gemを最新の状態にアップデートしましょう。
また、これを機に、アプリケーション内で Marshal.load を安易に使用していないか、より安全なシリアライズ方式 (JSONなど) に移行できないかを再検討することをお勧めします。
