はじめに
drubyとrailsを使用してCentOS内のファイル作成やディレクトリ作成などを行うプログラムを作成していた際に、表題のエラーがでてきて原因が全くつかめなかったためメモを残します。
現象
- rails app => druby 経由 => ファイル作成
- railsで作成したアプリのフォームから受け取ったパラメータに基づいてファイルの作成をした際にエラーが発生
- druby: DRb::DRbConnError connection closed
- FileUtilsやFileクラスのメソッドを使用した際に発生
原因
- drubyのstart_serviceメソッドに:safe_level => 1 を設定した際に発生
- railsからもらったパラメータを利用して、作成するディレクトリ等のパスを生成した際にもらったパラメータをいれた変数が汚染されていたため、Fileクラス系の操作を行うことができなかった。
参照:セキュリティモデル(ruby-lang.org)
http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fsafelevel.html
まったく、こちらに思い当たらず見当違いのところを調べまくっていたためえらくハマってしまいました。一緒に調べてくださった先輩に感謝です。
対策
- :safe_level => 0 にする
- こちらはとりあえず選択しませんでした
- エラーが出る元になった変数について、悪意ある内容に書き換えられないようにフィルターするなどして、対象の変数をObject.untaintし汚染を取り除く
- まだ実装途中ですが、こちらを選択する予定です。
さいごに
エラーの情報がコネクションが切れていることしか見つけられなかったため、エラーの出所をつきとめるのが難しく時間を取られました。
また、Object.taintについて意識をする機会がなかったため楽しいrubyの項目を読み返そうと思います。