1

refileを使用して、ユーザーが S3 バックエンドに画像をアップロードできるようにします。remote_image_urlさらに、インターネット上の任意の画像への URL を (プロパティを通じて) 入力するオプションをユーザーに提供します。

入力した URL が実際のファイルを指している限り、これは正常に機能します。ただし、URL に誤りがあった場合、または無意味な入力が与えられた場合Refileは、次の例外がスローされます。

Errno::ENOENT (No such file or directory @ rb_sysopen - thiswillnotwork):
  app/controllers/my/deals_controller.rb:17:in `create'
  appsignal (0.11.2) lib/appsignal/rack/listener.rb:13:in `call'

入力された URL が無効な場合 ( validate_downloadCarrierWave のオプションと同様) を無視し、理想的には代替画像を使用するオプションはありますか?

raise_errorsオプションを に設定してアタッカーを取り付けてみましたfalseが、結果は同じでした。

私たちのプロジェクトでは と を使用Rails 4.2.0Refile 0.5.3ます。

編集:

SystemCallErrorこの例外はに由来する下位レベルでKernel.openあり、この例外タイプは Refile によってレスキューされていないことを確認しました。

rescue OpenURI::HTTPError, RuntimeError => error
  raise if error.is_a?(RuntimeError) and error.message !~ /redirection loop/
  @errors = [:download_failed]
  raise if @raise_errors
end

これを修正するために再ファイルするプルリクエストに取り組んでいます。

編集2:

これに取り組んでいる間に、潜在的な攻撃者がリモート コード実行を使用できるようにする重大なセキュリティ上の問題がに発見されました。Refile

Refile gem には、URL を指定してリモート ファイルをアップロードする機能があります。remote_image_urlこれは、フォームのようにフィールドを追加することで実行できます。ここimageで、 は添付ファイルの名前です。この機能は、open-uri を使用して、渡された URI を検証せずにこの HTTP 要求を作成していました。攻撃者は、ホスト マシンで任意のシェル コマンドを実行する URI を作成できます。

Refileバージョン0.5.0-を使用している場合は0.5.3、最新バージョンにアップグレードしてください。アップグレードすると、上記の問題も解決されます。

4

1 に答える 1