概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Rails 6 adds guard against DNS rebinding attacks – Saeloun Blog
- 原文公開日: 2019/10/30
- 著者: Aditya Narsapurkar
- サイト: Saeloun -- Ruby on Railsのコンサルティング会社で、Rails + React開発のほかに、React Nativeによるモバイルアプリ開発も手がけています。
参考: 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
に指定したいドメイン名を値として設定します。