人気のRuby gem「bootstrap-sass」で悪意あるリモートコード実行バックドアが発見される
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にある次の悪意あるミドルウェアコードも読み込まれます。
バックドアの概要:
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の課題の解き方を学びましょう。



