gemspecにMFA必須メタデータを追加してサプライチェーン攻撃を防御
factory_bot.gemspec に rubygems_mfa_required メタデータを追加し、RubyGems.orgへのgem公開操作に多要素認証(MFA)を必須化しました。これにより、アカウント侵害を起点とするサプライチェーン攻撃への耐性が高まります。
背景
NPMのAxiosパッケージで発生したサプライチェーン攻撃を受け、gem公開操作へのMFA強制が必要と判断されました。socket.dev のレポートが示すように、メンテナーのアカウントが侵害されると、悪意あるバージョンが正規パッケージとして配布されるリスクがあります。factory_botは広く利用されるテスト用ライブラリであるため、このリスクは無視できません。
RubyGems.orgはオプトイン方式で rubygems_mfa_required メタデータのサポートを提供しており、これを設定することでリポジトリのオーナーがMFAを有効化していない場合にgem pushやyankなどの特権操作がブロックされます。詳細はRubyGemsの公式ガイドに記載されています。
技術的な変更
factory_bot.gemspec の s.metadata ハッシュに "rubygems_mfa_required" => "true" を1行追加する、最小限の変更です。
変更前:
s.metadata = {
"changelog_uri" => "https://github.com/thoughtbot/factory_bot/blob/main/NEWS.md"
}
変更後:
s.metadata = {
"changelog_uri" => "https://github.com/thoughtbot/factory_bot/blob/main/NEWS.md",
"rubygems_mfa_required" => "true"
}
この設定はgemspec内に宣言するだけで有効になり、アプリケーションコードや依存関係への影響は一切ありません。効力を持つのはRubyGems.orgサーバー側であり、gem利用者には何の変更も生じません。
設計判断
gemspecのメタデータによる宣言的な設定という方式が採用されました。
MFAの強制をRubyGems.orgのアカウント設定に委ねるのではなく、gemspec自体に埋め込むことで、リポジトリのコードベースでセキュリティポリシーを明示的に管理できます。コードレビューのプロセスを通じてポリシーの変更が追跡可能になり、意図しない設定解除を防ぐ効果があります。
まとめ
1行の追加によってgem公開パイプラインにMFAゲートを設けるこの変更は、ライブラリ利用者を守るための最小コストな防御策です。広く使われるOSSほどサプライチェーン攻撃の標的になりやすく、このようなオプトイン設定を積極的に適用する姿勢は、エコシステム全体のセキュリティ文化の醸成にもつながります。