更新 2023-06-12: スニペットはもう必要ありません。WPManageNinja は公開開示から2時間後(報告から93日後)に脆弱性を修正しました。
更新 2024-01-27: 永続的なハッシュ値に関する関連問題は現在完全に解決されました。
tl;dr 攻撃者は FluentCRM 内の連絡先詳細を表示および編集できます。WPManageNinja は90日間の責任ある開示期間内に脆弱性を修正していません。公式パッチを待つ間、脆弱性の悪用を防ぐための緩和スニペットを提供します。
本日、WPManageNinja による人気の WordPress プラグイン FluentCRM で発見した脆弱性に関する情報を公開します。この脆弱性 CVE-2023-1430 は、FluentCRM が認証制御としてメールアドレスのハッシュを不十分に使用していることに起因します。私は Google Zero の脆弱性開示ポリシーに従い、責任を持って開示しました。WPManageNinja は90日間の期間内にパッチを提供せず、期間延長の要請も行いませんでした。
本レポートにおいて、contact は FluentCRM の連絡先オブジェクトを指し、user は WordPress のユーザーオブジェクトを指します。連絡先はユーザーにリンクされる場合もありますが、必須ではありません。脆弱性の悪用に関する詳細は、公式パッチが利用可能になるまで開示しません。セキュリティ専門家は完全なレポートについて私に連絡できます ([email protected])。
FluentCRM が実行されているサイトでは、攻撃者は連絡先のメールアドレスを知ることで、その連絡先の名前、メールアドレス、リスト設定を表示および編集できます。連絡先の名前は多くの場合、マージタグを通じてニュースレターに含まれるため、攻撃者は連絡先の名前を不適切な言葉に置き換え、ウェブサイト所有者に下品なニュースレターを送信させることができます。ウェブサイト管理者が FluentCRM のショートコード (設定管理用) を有効にし、公開ウェブページに追加した場合、攻撃者は公開されたすべての個人情報 (敬称、電話番号、生年月日、住所など。FluentCRM の設定に依存) を表示および編集できます。
FluentCRM は 30,000 以上のサイトにインストールされています。FluentCRM サイトの管理者は、私の緩和スニペットを子テーマの functions.php ファイルに追加することで、脆弱性の悪用を防ぐことができます。
このスニペットは脆弱性を修正するものではありません。FluentCRM の購読解除ページ (unsubscribe.php) と設定管理ページ (manage_subscription.php) 上の脆弱なコンテンツを、連絡先にメールで連絡するよう促すエラーメッセージに置き換えます。エラーメッセージ内のメールアドレスはサイトの管理者メールアドレスです (スニペットから変更可能)。この緩和スニペットは、ログインしていない訪問者が FluentCRM の脆弱なショートコード (fluentcrm_pref) をレンダリングできないようにもします。ログインしていない訪問者には、ログインを促すエラーメッセージが表示されます。すべての文字列は、付属の POT ファイルを使用して翻訳可能です。
ウェブサイト所有者には、私が提供する緩和措置、または独自の同等の緩和措置を実装することを推奨します。また、ウェブサイト所有者は FluentCRM の連絡先データの整合性を確認し、可能であればログをチェックして潜在的なデータ漏洩がないか確認する必要があります。ログのチェックは、以下のサイトで特に重要です。
ウェブサイトのデータ管理者は、該当する法域の法律および規制に従って、個人情報の潜在的なデータ漏洩を処理する責任を負います。
FluentCRM が連絡先の設定を対応するユーザーと同期するように設定されている場合、攻撃者はユーザーの名前を変更できます。幸い、FluentCRM は連絡先からユーザーへのメールアドレスの同期は行いません。もし同期していた場合、この脆弱性によりサイトの完全な乗っ取りが可能になっていたでしょう。攻撃者はサイト管理者のメールアドレスを変更し、その後管理者のパスワードをリセットすることで権限を取得できたはずです。
ただし、他のソリューション (例: WP Fusion や FluentCRM の API) は、連絡先からユーザーへすべてのメタデータを同期できます。WP Fusion は、CRM (例: FluentCRM) と WordPress 間で連絡先のメタデータを同期するための最も一般的なサードパーティプラグインです。幸い、現バージョンの WP Fusion は、脆弱なフォームから開始されたメタデータ変更にはフックしていません。私は WP Fusion の開発者に通知しましたが、彼らは WPManageNinja が脆弱性を修正するまでこの制限に対処しないと述べています。
FluentCRM の API を使用して連絡先およびユーザーデータを更新することもできます。FluentCRM の API を使用してユーザーのメールアドレスを更新しているサイト所有者は、FluentCRM のページまたは設定管理用ショートコードから開始された場合、この更新を無効にする必要があります (または、脆弱なフォームから設定が更新されないように、私の緩和スニペットを追加してください)。
FluentCRM では、連絡先が公開ウェブページから購読解除や設定管理を行うことができます。これらのページへのリンクはすべてのニュースレターに含まれています。これらのページで行われた変更は、URL パラメータとして渡される連絡先のメールアドレスの MD5 ハッシュによって認証されます。メールアドレスの MD5 ハッシュは秘密ではなく、誰でも計算できます。攻撃者はハッシュの不適切な使用を悪用して、特定の連絡先を購読解除したり、既知のメールアドレスを持つ連絡先を大量に購読解除したりできます。
購読解除ページは認証に MD5 ハッシュのみに依存しているのに対し、設定管理ページには ce_id と呼ばれる追加の URL パラメータが必要です。この場合、ce_id は fc_subscribers テーブル内の連絡先の ID を指します。この ID は増分整数です。したがって、ce_id の値は、可能なすべての値をテストすることで簡単に見つけられます (探索空間はサイトにこれまで登録された連絡先の数です)。管理者ユーザーはおそらく低い値を持っています。
設定管理ページから、攻撃者は連絡先の secure_hash 値も抜き出すことができます。連絡先のメールアドレスを更新すると、その連絡先の "secure_hash" 値が fc_hash_secure という Cookie に保存されます。この Cookie があれば、攻撃者は FluentCRM の設定フォームショートコードによって利用可能にされたすべての連絡先情報を表示できます。
前述の "secure_hash" は、FluentCRM が(状況によって)MD5 メールアドレスハッシュの代わりに、または代替として依存する値です。FluentCRM 2.8.0 のリリース以降、購読解除ページは認証に secure_hash 値のみに依存するようになりました。設定管理ページは、新しい secure_hash 値と古い MD5 メールアドレスハッシュの両方を認証に受け入れます。
secure_hash 値はメールアドレスから導出できませんが、FluentCRM の使用法は適切なセキュリティ慣行に従っていません。secure_hash 値は連絡先ごとに一度生成されます。決して更新されることはなく、期限が切れることもありません。secure_hash 値はすべてのニュースレターに含まれているため、これは問題です。攻撃者が連絡先の受信箱にアクセスした場合、その連絡先の設定を無期限に変更できます。影響を受ける連絡先が管理者権限を持つユーザーにリンクされており、FluentCRM から WordPress へのメールアドレス変更が同期されている場合、この連絡先に送信されるすべてのニュースレターには、サイトを乗っ取るための期限切れにならないトークンが含まれることになります。
私はこの関連問題を2023年3月15日に WPManageNinja に報告しました。2ヶ月後(2023年5月15日)、WPManageNinja は、セキュリティアドバイザーが静的な secure_hash 値を問題と見なしていないと返答しました。WPManageNinja のセキュリティアドバイザーは、「連絡先を識別するために、この種の一度生成されたトークンを使用しても問題ない」と述べ、「これは SaaS サービスの API トークンに似ており、他の連絡先には配信されず、メールアドレスを所有する実際の連絡先にのみ送信される」と説明しました。
WPManageNinja は柔軟な姿勢を示し、それでもセキュリティ上の懸念があると思われる場合は知らせてほしいと述べたため、私はそのようにしました。secure_hash 値を API トークンと比較できない理由を説明しました。(API トークンは TLS 接続でのみ送信されるようにでき、アクセスを制限できます。メール内の平文値ではそうはいきません。最も重要なのは、API トークンは無効化できるのに対し、連絡先が secure_hash 値を無効化する方法がないことです。)
同日遅く、WPManageNinja は感謝を述べ、メールレコード ID とハッシュを組み合わせることを検討していると述べました。これにより、古い(時間ベースの有効期限)または以前の(カウンターベースの有効期限)secure_hash 値の自動無効化と併せて実装されれば問題は解決します。この機能はまだ実装されていませんが、この CVE の一部として静的なハッシュ値の使用を問題とは見なしていません。
2023年第1四半期、私たちは以前のニュースレターツール (Sendy) から FluentCRM への移行を開始しました。FluentCRM を Nikka Systems Academy (Project Opal) と統合する際に脆弱性を発見しました。FluentCRM の購読管理システムをカスタムプラグインに置き換えたため、FluentCRM の脆弱なフォームが私たちのサイトや顧客のデータに影響を与えることは一度もありません。
FluentCRM は優れたプラグインですが、WPManageNinja の脆弱性開示への対応には改善の余地が多くあります。以下のリストは、WPManageNinja が状況を改善するための私の提案です。
とはいえ、私は依然として WPManageNinja を信頼しています。すべてのソフトウェアにはバグがあり、単一の不適切に管理された脆弱性報告がプラグインの使用をやめる理由にはなりません。
更新 2023-06-12: 彼らが依然として変更ログで脆弱性を隠そうとしているという事実は、私に真の懸念を抱かせます。 (現在は CVE を追加しています。)