Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 6にDNSリバインディング攻撃防止機能が追加された(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

参考: DNS Rebinding ~今日の用語特別版~ | 徳丸浩の日記

Rails 6にDNSリバインディング攻撃防止機能が追加された(翻訳)

Rails 6にはDNSリバインディング攻撃から保護する機能が#33145で追加されました。この機能はdevelopment環境ではデフォルトで有効になっており、他の環境でもオプションで有効にできます。

DNSリバインディング攻撃とは

DNSリバインディング攻撃は、攻撃者が悪意のあるクライアントサイドスクリプトを仕込んだWebページを用いて標的ネットワークに侵入し、そのネットワーク内のブラウザをプロキシとしてネットワーク内の他のデバイスを攻撃することを指す。

Railsアプリで生じる影響

ローカル実行されているRailsアプリケーションに対して、攻撃者がDNSリバインディングを用いてリモートコード実行(RCE)する可能性があります。攻撃者が的確にアプローチすると、ローカルENV(環境変数)情報や、ローカルRailsアプリの全情報にアクセスできてしまうことがあります。

Rails 6の場合

試しにdevelopment環境のRails 6アプリに対して何らかのカスタムドメイン(ngrockやlvh.me、あるいはhostsファイルを編集するだけでも可能)を用いてアクセスしてみると、以下のようなエラーが表示される場合があります。

Blocked host: yourcustomdomain.com

しかしこのときlocalhostを指定すると何の問題もなくアプリにアクセスできます。このエラーの背後では、Rails 6がActionDispatch::HostAuthorizationミドルウェアの助けを借りてDNSリバインディング攻撃からの攻撃を懸命に防ごうとしています。development環境では、以下の設定がデフォルトで含まれています。

Rails.application.config.hosts = [
  IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
  IPAddr.new("::/0"),      # All IPv6 addresses.
  "localhost"              # The localhost reserved domain.
]

カスタムドメインからのアクセスを許可するには、Rails.application.config.hostsにそのドメインを追加します。たとえばdevelopment.rbに以下のように記述します。

# 'yourcustomdomain.com'からのアクセスを許可する設定
Rails.application.config.hosts << 'yourcustomdomain.com'

サブドメインからのリクエストを許可するには以下のようにします。

# 'www.yourcustomdomain.com'や'blog.yourcustomdomain.com'などの
# サブドメインを許可する設定
Rails.application.config.hosts << '.yourcustomdomain.com'

この保護を完全にバイパスして任意のドメインからのリクエストを許可する必要がある場合は、以下のようにします。

# 任意ドメインからのリクエストを許可する設定
Rails.application.config.hosts = nil

なお、development環境以外のconfig.hostsはデフォルトで空になる点にご注意ください。つまりドメインはチェックされず、保護は無効になります。

保護を有効にするのであれば、該当する環境ファイルでRails.application.config.hostsに指定したいドメイン名を値として設定します。

関連記事

Rails 6のcookieに「purpose」メタデータが追加(翻訳)

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。