Skip to main content

Snykを使ったRuby Gemfileセキュリティ改善のステップバイステップガイド

著者
Headshot of DeveloperSteve Coochin

DeveloperSteve Coochin

blog feature ruby security

2021年8月10日

0 分で読めます

Rubyは仕様が明確でよく練られた言語で、1990年代半ばから使われています。2004年、RubyはパッケージマネージャーとしてRubyGemsを採用しました。RubyGemsは、gemと呼ばれる自己完結型の形式でライブラリや依存関係を管理するために使用されます。RubyGemsのインターフェースは、Rubyランタイムと連携するコマンドラインツールで、プロジェクトへのGemfileの追加や更新ができます。

3つのRubyプラットフォームを調べたところ、私自身も驚くような脆弱性が見つかりました。Ruby Gemfileのセキュリティを強化するために確認すべき点と、脆弱性が見つかった場合の対処方法をご紹介します。

パッケージ管理の役割

ほかの言語と同様、Rubyにもパッケージ管理の選択肢がいくつかあります。アプリケーション管理で広く使われているものの1つがBundlerで、実はRuby gemとして最初からインストールされています。

Bundlerのようなパッケージマネージャーを使えば、Gemfileにある多数のgemをまとめてインストールできます。一方、RubyGemsではgem installを使って1つずつインストールする必要があります。大量のgemを管理したり、アプリケーションにインストールしたりする場合、Rubyのパッケージ管理を効率化できます。

パッケージマネージャーは、アプリケーション内のライブラリや依存関係を管理するうえで、間違いなく作業を楽にしてくれます。しかし、何を使っているのか、またスタックにどのようなリスクが潜んでいる可能性があるのかを把握することが重要です。セキュリティスキャンのような簡単な方法でも、問題をすばやく特定できます。早期に対処すれば、時間やコストを節約し、最終的にはエンドユーザーの信頼を守ることにつながります。

脆弱性を調べる

以前使ったことのあるプラットフォームをスキャンして見つかった問題を詳しく見る前に、いくつかお伝えしておきたいことがあります。

  • これらのプラットフォームのユーザー/開発者として、今回の調査結果には驚きました。セキュアな開発には、継続的な意識向上と教育が欠かせないということを改めて実感しました。

  • 以下のすべてのケースで、各コミュニティに連絡し、脆弱性について話し合うとともに、問題を認識していることを確認しました。多くの場合、すでに修正が行われていました。

Spree Commerce

Spreeは、Rubyエコシステムで広く利用されているECプラットフォームの1つです。私がオープンソースのECプラットフォームを選ぶ際、いつも候補にしてきました。Spreeは2007年から提供されており、多くの開発者や企業が保守に携わる大規模なコミュニティがあります。

スキャンの最初の手順は、Snyk CLIツールでスキャンできるGemfile.lockマニフェストを作成することです。spree repositoryをクローンしてBundle installを実行すると、プロジェクトのGemfileマニフェストにあるライブラリと依存関係を含むロックファイルが作成されます。

MariaDBをインストール済みのOSXおよびbrewユーザー向けのヒントです。Bundlerのインストール中にMySQL2 gemのインストールでエラーが発生することがあります。まずbrew install opensslを実行し、export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/でパスを設定する必要がありました。

ロックファイルを作成したら、[snyk test](https://snyk.io/blog/snyk-cli-cheat-sheet/)を実行します。私の環境では、次の中程度の深刻度の脆弱性が検出されました。

Tested 142 dependencies for known issues, found 2 issues, 84 vulnerable paths.

Issues with no direct upgrade or patch:
  ✗ Information Exposure [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-ACTIONCABLE-20338] in actioncable@6.1.4
    introduced by spree@4.3.0.alpha > spree_core@4.3.0.alpha > active_storage_validations@0.9.5 > rails@6.1.4 > actioncable@6.1.4 and 1 other path(s)
  No upgrade or patch available
  ✗ Web Cache Poisoning [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-RACK-1061917] in rack@2.2.3
    introduced by actionpack@6.1.4 > rack@2.2.3 and 81 other path(s)
  No upgrade or patch available

上記のスキャンでは、中程度の深刻度の問題が2件特定されています。

情報漏えいは、spree_coreの間接的な依存関係にあるalphaというgemを介して持ち込まれます。名前のとおり、コアプラットフォームからリモートでデータを取得される可能性があります。

もう1つ特定された脆弱性はWebキャッシュポイズニングで、actionpackというgemとの間接的な依存関係を介して持ち込まれます。これにより攻撃者は、正当なリクエストに対してサーバーキャッシュが悪意のある応答を返すよう仕向けることができます。詳しくは、キャッシュポイズニングに関するこちらの記事をご覧ください。

Sinatra

Sinatraは軽量で移植性に優れたWebサーバーです。デモや小規模なアプリに最適なだけでなく、アプリを非常にすばやく簡単に立ち上げられます。これまでに1億6,000万回以上ダウンロードされ、さまざまなプロジェクトで幅広く利用されています。

今回はBundlerを使い、新しいディレクトリでbundle initを実行して空のGemfileを作成し、ファイルの末尾にgem 'sinatra'を追加しました。また、フロントエンドの迅速な開発によく使われるHTMLテンプレート用gemのerubisも追加しました(Sinatraとの相性も抜群です)。

# frozen_string_literal: true

source "https://rubygems.org"

gem 'sinatra'
gem 'erubis'

Gemfileを保存したら、bundler installを実行して必要なgemの依存関係をすべてインストールします。数秒待つと、パッケージマネージャーがGemfile.lockマニフェストを作成し、セキュリティスキャンを実行できる状態になります。スキャンでは次の結果が得られました。

Tested 7 dependencies for known issues, found 2 issues, 3 vulnerable paths.

Issues with no direct upgrade or patch:
  ✗ Cross-site Scripting (XSS) [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-ERUBIS-20482] in erubis@2.7.0
    introduced by erubis@2.7.0
  No upgrade or patch available
  ✗ Web Cache Poisoning [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-RACK-1061917] in rack@2.2.3
    introduced by sinatra@2.1.0 > rack@2.2.3 and 1 other path(s)
  No upgrade or patch available

erubis gemの脆弱性(CWE-79)について詳しく調べました。ドキュメントに誤ったエスケープ方法が記載されており、アプリケーションがXSS攻撃を受ける可能性があります。erubisのドキュメントでは、多くの例で<%= expr %>が使われていますが、これは保存されたテンプレート変数をエスケープしません。適切にエスケープし、保存されたHTML要素がテンプレートに出力されないようにするには、次のように<%== expr %>と記述する必要があります。

開発者は、コードレベルで脆弱性をスキャンするだけでなく、開発セキュリティのデューデリジェンスの一環として脅威を理解することも常に重要です。

Ruby on Rails

Railsは、Rubyエコシステムで最も広く使われているgemの1つです。RubyGemsでの累計ダウンロード数は2億9,300万回を超えており、Webアプリケーション開発で人気の高い定番の選択肢です。

Snyk Vulnerability Databaseで調査したところ、注意が必要なバージョンがいくつか見つかりました。ただし、執筆時点での現行バージョン(6.1.4)には、既知の脆弱性はありません。

gem install railsを実行してから、rails new myappを実行して空のRailsプロジェクトを作成します。アプリの土台となる新しい空のRailsテンプレートが作成されます。ライブラリと依存関係を設定した後、[snyk test](https://snyk.io/blog/snyk-cli-cheat-sheet/)を使ってセキュリティスキャンを実行しました。その結果、パッケージマニフェスト内で次の脆弱性が検出されました。

Tested 72 dependencies for known issues, found 2 issues, 36 vulnerable paths.

Issues with no direct upgrade or patch:
  ✗ Information Exposure [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-ACTIONCABLE-20338] in actioncable@6.1.4
    introduced by rails@6.1.4 > actioncable@6.1.4
  No upgrade or patch available
  ✗ Web Cache Poisoning [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-RACK-1061917] in rack@2.2.3
    introduced by capybara@3.35.3 > rack@2.2.3 and 34 other path(s)
  No upgrade or patch available

さらに詳しく調べたところ、Railsの依存関係であるAction Cable gemに、情報漏えいの可能性を示すアラートがありました。この問題は2016年に特定されたようですが、コアフレームワークのライブラリでは修正されていません。Snyk Vulnerability Databaseに記載されたPRを詳しく確認すると、問題を緩和するコードベースの回避策が見つかりました。これは2019年に提案されたものです。

もう1つの問題はRack gemによって持ち込まれるもので、先ほどのSpree Commerceの問題と同じWebキャッシュポイズニングに関するものです。

コミュニティに貢献して支援する

私はコードに実際に触れるのが大好きです。特に、脆弱性を特定した後に調査を重ね、コードレベルで理解を深めることにやりがいを感じます。

少しスキャンするだけで、利用しているライブラリ、コード、プラットフォームに既知の脆弱性がないか確認できます。時間を節約し、エンドユーザーの安全を守ることにもつながります。本番環境でこれらのプラットフォームを使っている開発者やチーム、企業は、何が取り込まれているのか気づいていないかもしれません。このブログが、チームの安全確保に少しでも役立てば幸いです。

こうしたコミュニティは、誰もが使えるライブラリを作るために素晴らしい仕事をしています。できる範囲で貢献することも大切です。ドキュメントの改善やリリース候補版のテストだけでも役に立ちます。私は一人の開発者にすぎず、これは1つのブログにすぎません。セキュリティに大きな変化をもたらすために、ぜひ皆さん自身でプロジェクトをテストし、修正に貢献してください。

Capture the Flagを始めよう

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

続きを読む

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに対応するセキュリティ

AI駆動型開発のスピードに、従来のセキュリティワークフローは追いついていません。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。

blog feature ai violet
Blog

VulnBump:AIエージェントはビルドを壊さずに脆弱な依存関係を修正できるか?

VulnBumpは、実際の依存関係アップグレード307件を対象にAIエージェントをテストします。脆弱性が解消され、ビルドとテストが成功した場合にのみ、修正としてカウントされます。

Blog

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

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