s2Memberにコード実行の脆弱性、260927以前が対象
WordPressの会員制プラグインs2Memberに、サーバー上でコードを実行されるおそれのある脆弱性が11月2日に公表されました。260927以前を使うサイトは、更新の有無を確認して修正版を適用し、難しければ無効化を検討してください。
急ぎ度: 至急
CVSS v3は9.8で、ネットワーク経由・認証不要・利用者の操作不要と評価されており、詳細とコードの該当箇所が公表直後から参照できるためです。
関係があるか
s2Memberで会員制サイトや有料コンテンツの制限を運用しているWordPressサイトが対象です。PayPalの決済通知(IPN)を受ける構成では、とくに早い確認をお勧めします。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| s2Member(WordPress用プラグイン) | 260927以前のすべての版 | 260927より新しい版(具体的な版番号は提供元の更新情報で確認) |
確かめ方
- 1WordPressの管理画面で「プラグイン」を開き、s2Memberの版が260927以前かを見ます。
- 2WP-CLIが使える環境では、
wp plugin get s2member --field=versionで版を確認できます。 - 3複数サイトを預かっている場合は、管理画面のほか、検証用・停止中のサイトにも入っていないかを洗い出します。無効化していても、プラグインのファイルが残っていれば更新対象です。
何が起きたか
WordPressのプラグインs2Memberに、外部から送られた値を足がかりにして、サーバー上で任意のコードを実行できてしまう脆弱性が見つかりました。260927以前のすべての版が対象で、深刻度はcriticalです。
問題があるのは、PayPalの決済通知に含まれるitem_nameという値の扱いです。この値はメールのひな形に埋め込まれますが、危険な記述を取り除く処理は、PHPの開始を示す記号の文字列をそのまま探して消すだけでした。しかも、値を埋め込んだあとに行うプレースホルダーの後始末で、取り除いたはずのものが有効なPHPの開始記号として組み上がってしまいます。除去処理がすり抜けられる、という構造です。
種類としてはコードインジェクション(CWE-94)にあたります。提供元のコード修正の記録が公開されており、修正の有無と版は、更新情報で確認できます。
攻撃の流れ
-
1
通知の受け口に送信
s2Memberが決済通知(IPN)を受ける処理に、細工したitem_nameを含むリクエストを送ります。
-
2
除去処理をすり抜け
PHPの開始記号を消す処理が、リテラルの文字列しか対象にしていないため、危険な記述が残ります。
-
3
メール文面へ埋め込み
値がメールのひな形に入ったあとの後始末で、有効なPHPの開始記号が組み上がります。
-
4
サーバー上で実行
攻撃者が用意したコードが、WordPressの権限で動きます。
どう悪用されるか
CVSSのベクターは、ネットワーク経由で、認証も利用者の操作も要らず、手間の少ない攻撃として評価しています。題名もUnauthenticatedとなっており、会員登録をしていない外部の人が試せる前提で考えるのが安全です。
ただし、説明文には「custom-level以上の権限を持つ認証済みの攻撃者」とも書かれていて、記述が食い違っています。どちらが正確かは提供元の告知で確認してください。それまでは認証不要として扱うほうが、見誤ったときの損害が小さく済みます。
悪用が成功すると、WordPressを動かしているユーザーの権限でコードが動きます。機密性・完全性・可用性のすべてが高く評価されており、サイトのデータの閲覧や書き換え、改ざん、別のファイルの設置、サイトの停止まで想定されます。
今すぐやること
-
1
s2Memberの版を確認する
管理画面かWP-CLIで版を見て、260927以前なら次の手順に進みます。本番だけでなく、検証用や停止中のサイトも対象に含めます。
wp plugin get s2member --field=version -
2
修正版があれば更新する
提供元の更新情報を見て、260927より新しい版が出ていれば、バックアップを取ってから更新します。更新後は、会員登録や決済通知の流れが動くかをテストします。
-
3
更新できないときは止める
修正版がまだ出ていない、または業務の都合で更新できない場合は、下記の回避策で当面しのぎます。
-
4
侵害の跡を調べる
公表直後で、悪用の有無は分かっていません。Webサーバーのアクセスログで、決済通知を受けるURLへの不審なリクエストを探します。見覚えのないPHPファイルや管理者アカウントがないか、WordPress本体のファイルが改変されていないかも見ます。
wp core verify-checksums -
5
不審な点があれば認証情報を替える
侵害が疑われる場合は、管理者パスワード、データベースの接続情報、wp-config.phpのキーとソルトを入れ替えます。同じ情報を使い回している他システムも洗い出します。
すぐ更新できないとき
修正版を当てられないあいだは、s2Memberを無効化するのが確実です。会員の登録や決済通知の処理が止まるため、影響範囲を決めてから実施してください。無効化できない場合は、WAFやWebサーバーの設定で、PayPalからの決済通知を受けるURLへのアクセス元を絞る方法があります。通知の送信元の条件はPayPalの案内で確認してください。
背景
s2Memberは、WordPressで会員制サイトや有料コンテンツの閲覧制限、定期課金を実現するプラグインです。PayPalなどの決済サービスから届く通知を受けて、会員の登録や権限の付与を自動で行います。決済側からインターネット越しに呼び出される受け口を持つため、サイトの外から誰でもアクセスできる場所にあります。今回の入力値も、その受け口で受け取った通知の一部です。
今回の原因は、危険な記述を一度取り除いたあとに、別の処理が文字列を組み立て直す構成にあります。除去は1回きりで、そのあとの後始末で、除去したはずの開始記号が再び有効な形になります。入力を取り除く対策は、あとから文字列を加工する処理と組み合わさると効かなくなるため、メールの文面づくりのように複数の処理を通すコードで起きやすい種類の問題です。
よくある質問
Q.プラグインを無効化すれば、すでに安全といえますか。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 修正版 |
|---|---|---|---|
| clavaque | s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions |
260927 以前 |
— |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
The s2Member plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, <= 260927 via the 'item_name' parameter parameter. This is due to insufficient sanitization in strip_php_tags_deep(), which only strips literal '<?' sequences, combined with a post-interpolation placeholder cleanup that reassembles a valid '<?php' opener after the attacker-controlled value has already been embedded in the email template. This makes it possible for authenticated attackers, with custom-level access and above, to execute code on the server.
出典: CVE.org (CVE Program・cvelistV5) NVD