Railsに潜在的なリモートスクリプトインジェクションの脆弱性CVE-2016-2098が報告されています。攻撃コード(PoC)も公開されていますが、現実の攻撃が行われているという発表はないようです。この脆弱性の内容と対策について報告いたします。Worldのような以下のシンプルなアプリケーション(コントローラ)を考えます。worldが表示されます。'hello/bye'を実行すればよいわけですが、helloとbyeを切り分けられるように、コントローラを以下のように修正します。endendこれを呼び出すには、以下のようにします。renderメソッドの引数を外部から自由に指定できるようにするのは、危なっかしい感じです。inlineオプションrenderメソッドにはinlineオプションというものがあり、テンプレート文字列を指定することができます。%>"実行結果を以下に示します。Time.nowメソッドの呼び出しにより、現在時刻が表示されています。外部からrenderメソッドを操作してinlineオプションを指定できれば、任意のRubyスクリプト(上記例ではTime.now)を実行できることになります。具体的には、renderメソッドに下記のハッシュを指定すればよいことになります。hashしかし、そんなことができるのでしょうか?JSONによりハッシュを外部から指定できる公開されているCVE-2016-2098のPoCでは、JSONによりrenderメソッドにハッシュを指定する方法が示されています。その様子を以下に示します(少し変えています)。以下の攻撃例では、FileUtils.touchメソッドにより、rootedというファイルを作成することで攻撃の証拠を示しています。作成された様子を下図に示します。Railsの以下のバージョンで修正されています(今年の2月29日公開)。4.2.5.2これらにバージョンアップすることで攻撃は防がれるようになりますが、そもそもrenderメソッドに任意の値を指定できることがとても危険な状態であると考えます。このため、以下を推奨します。Railsの潜在的なリモートスクリプトインジェクションの脆弱性CVE-2016-2098について説明しました。renderメソッドには強力なオプション指定機能があるため、外部から自由な値を指定できると危険です。そもそも、renderメソッドのinlineオプションでrubyスクリプトが実行できることは、脆弱性ではなく仕様です。Railsの脆弱性というよりは、アプリケーション側の問題であと考えます。この問題が「潜在的な」脆弱性と表現されているのは、このような背景からだと思います。【HASHコンサルティング広告】HASHコンサルティング株式会社は、ウェブアプリケーションのセキュリティに関心のあるセキュリティエンジニアを募集しています。興味のある方は、twitterやfacebookのメッセージ、あるいは問い合わせページからお問い合わせください。