Ruby on RailsのAction Packで、Strong Parametersによる属性保護を特定のコード経路で迂回できる脆弱性が公表された。開発元はHIGH、CVSS 7.5と評価。アプリケーションがeach_keyの戻り値を一括代入へ渡す場合に限って問題が成立し、修正版8.0.5.2と8.1.4.1が案内されている。
Strong Parametersの保護が特定の戻り値で失われる
開発元の11月4日付勧告によると、ActionController::Parameters#each_keyをブロック付きで呼び出すと、保護されたParametersではなく内部のHashWithIndifferentAccessが返る場合がある。この戻り値をActive Modelのnew、assign_attributes、updateなどの一括代入に渡すと、許可していない属性まで設定され得る。認可フラグなどの改変につながる可能性があるため、開発元はHIGH、CVSS v3.0 7.5と評価した。
Railsを使うだけでは成立しない
成立条件は、アプリケーション側がブロック付きeach_keyの戻り値を一括代入へ渡すこと。Rails自身はこの呼び出しを行わないと開発元は説明している。過去のCVE-2020-8164でeachなどを修正した際にeach_keyが残っていたことが背景だが、今回のGHSAに新しいCVEは記載されていない。すべてのRailsアプリで無条件に悪用可能という意味ではない。
更新とアプリケーションコードの点検
開発元はactionpack 8.0.5.2および8.1.4.1を修正版として案内している。運用担当者はGemfile.lockで導入バージョンを確認し、更新するとともに、each_keyの戻り値を一括代入に使用するコードを点検したい。すぐ更新できない場合はeach_keyの戻り値を使用せず、許可済みのParametersを明示的に渡す回避策が示されている。実際の攻撃被害や悪用確認は今回の公式勧告には記載されていない。