WP Cerber Security 9.9
English version: WP Cerber Security 9.9
概要
WP Cerber 9.9 がリリースされました。今回のリリースは、システムの堅牢性向上に重点を置いています。プラグイン設定の自己修復メカニズムを構築し、Traffic Inspector の難読化 JavaScript 検出器における複数の検出回避策を無効化し、特定のホスティング環境でサイトをダウンさせる可能性のある致命的なエラーを修正しました。アクセス数の多いサイトやレガシーホスティング環境で WP Cerber を使用している場合、今回のアップデートによりインストール環境の堅牢性が大幅に向上します。
主なポイント
- 新機能:プラグイン設定の自動バックアップと復元機能。復元が行われた際には明確なレポートが表示されます。
- セキュリティ:トラフィックインスペクターで使用される難読化JavaScript検出器に対する複数回の強化ラウンドを実施し、実際のバイパス経路を遮断しました。
- 信頼性: WP Cerberは、PHPに最新のmysqlndデータベースドライバが搭載されていない従来のホスティング環境でも正しく動作するようになりました。
- バグ修正: PHP 8 で発生するサイトクラッシュの原因となる設定破損シナリオと、16 進数エスケープされた JavaScript の検出に関する不具合が修正されました。
新機能
プラグイン設定の自動バックアップと復元
今回のリリースにおける目玉機能は、WP Cerberがプラグインのキーバリューストレージに、最後に有効だった設定のコピーを保持するようになったことです。このバックアップは、設定の更新、インポート、プラグインのアップグレード、および日々のメンテナンス作業が成功するたびに更新されます。既存のバックアップを置き換えることができるのは有効な設定のみであるため、不正な状態が正常な状態を上書きすることはありません。
なぜこれが重要なのでしょうか?データベースに保存されているプラグイン設定が読み取れなくなった場合、WP Cerberは破損を検知し、バックアップから設定を自動的に復元します。これにより、ファイアウォールルール、アクセスリスト、通知設定が工場出荷時のデフォルト設定に戻されることなく維持されます。
復旧プロセスは完全に透明です。すべての結果はプラグインの課題監視機能を通じて報告されます。
- 自動復元が正常に完了すると、何が起こったのか、どのような処置が取られたのか、そして確認すべき事項を説明する警告が表示されます。この警告は非表示にできます。設定を確認して保存すると、通知は自動的に消えます。
- バックアップが見つからない、無効である、または復旧が失敗した場合、シリアル化された設定やストレージの内部構造を公開することなく、対処可能なガイダンスと関連する診断メタデータとともに重大な問題が登録されます。
- 矛盾する問題や重複する問題の状態は防止されるため、矛盾する通知が表示されることはありません。
復旧が不可能な場合は、既存の最終手段としてデフォルト設定にフォールバックする機能が維持され、そのデフォルト設定がデータベースに永続化されるため、プラグインは決定論的な状態から起動します。また、復元パスにおける古いオプションキャッシュの影響を軽減するため、復元された値が書き込まれる前に破損した値が明示的に削除され、バックアップはオブジェクトキャッシュをバイパスして保存およびロードされるため、永続的なデータベースレコードのみが信頼されます。
mysqlndドライバがインストールされていないホスト向けの注意喚起
「システム準備状況」ウィジェットに新しいアドバイザリ検出機能が追加され、PHPのmysqli拡張機能が最新のmysqlndではなく、旧式のlibmysqlclientライブラリをベースに構築されているサーバーを特定できるようになりました。この通知は情報提供を目的としており、WP Cerberが互換性のあるフォールバック機能で引き続き動作すること、そして完全な互換性とパフォーマンス向上のためにmysqlndを有効にすることを推奨しています。これにより、ホスティングプロバイダーに報告できる具体的で実行可能な診断情報が得られます。
セキュリティとアクセス制御の変更
Traffic Inspectorにおける難読化JavaScriptの検出機能強化
トラフィックインスペクターは、公開されているリクエストフィールドを検査して難読化されたJavaScriptを検出しますが、今回のリリースでは、誤検出率の低いモデルを維持しながら、その検出器におけるいくつかの検出ギャップと回避経路を解消しています。
エスケープシーケンスの検出範囲が拡大しました。以前は、完全にエスケープされた文字列内の\xNN 16 進エスケープのみを検出していましたが、現在は\uNNNNおよび\u{...} Unicode エスケープも検出します。これには、サポートされている形式が混在する文字列も含まれます。デコードは ASCII コードポイントに限定され、誤検出を避けるため、部分的なエスケープと任意の式は意図的に検出対象外となっています。
fromCharCode() 呼び出しに隠されたプリミティブの検出。明示的なString.fromCharCode()構築からデコードされたペイロードは、外部 URL や IP アドレスだけでなく、実行、DOM、ネットワーク、およびシステム プリミティブについてもチェックされるようになりました。デコードは検証済みの 10 進数および 16 進数のリテラルに限定され、複数回の呼び出し、大文字の0Xプレフィックス、およびオプションの末尾のカンマをサポートし、JavaScript の ToUint16 セマンティクスを適用して、デコードされた値がブラウザが実際に生成するものと一致するようにします。識別子境界を使用したトークン認識プリミティブマッチングにより、「description」や「evaluation」などの通常の単語は、 evalまたはscriptサブストリングではマッチングされなくなりました。
ラップされた整数バイパスの緩和。String.fromCharCode String.fromCharCode()はすべての引数に ToUint16 を適用するため、ASCII コードに 65536 の倍数を加えると、同じ文字になります。以前は、検出器は最大 6 桁のリテラルしか受け付けなかったため、ラップされた 7 桁以上の値は検出を完全にバイパスしていました。検出器は現在、JavaScript のNumber.MAX_SAFE_INTEGERまでの符号なし 10 進数および 16 進数のリテラルを受け付け、プラットフォームの整数サイズに関係なく、各トークンを決定論的に ToUint16 コード単位に変換します。変換中にトークンの長さが制限されるため、大きすぎるリテラルがパブリック リクエストで桁ごとの無制限の処理を引き起こすことはなく、潜在的な DoS ベクトルが閉じられます。
単一の不正トークンによる抑制はなくなりました。以前は、範囲外または曖昧なトークンが1つあるだけで、デコードされた呼び出し全体が破棄されていたため、攻撃者は検出可能なペイロードにサポートされていない値を1つ追加することで、検出を抑制することができました。構造的に有効だがサポートされていないトークンは、センチネル文字にマッピングされ、呼び出しの残りの部分は引き続きデコードされます。呼び出し全体がスキップされるのは、引数リストが不正な形式であるか、数値でない場合に限ります。
コメントで区切られたペイロードはもはや盲点ではありません。以前は、検出器の入力圧縮で一般的な空白文字のみが削除されていたため、JavaScriptのコメントはそのまま残り、 String.fromCharCode(101,/*x*/118,97,108,40,49,41,59)のようなコメントで区切られた数値引数が検出を回避できていました。今回の変更により、検出器はヒューリスティックを実行する前に、JSブロックコメント、行コメント、引用符で囲まれた文字列の外側の字句的な空白文字を削除し、複数行にわたる引数リストも処理できるようになりました。
WordPressサイトの所有者にとって、実際の結果は単純明快です。攻撃者が難読化されたJavaScriptをトラフィックインスペクターをすり抜けて送り込むために使用できる現実的な手法のいくつかはもはや機能せず、検出器は正当なトラフィックを誤って検出しない程度に保守的なままです。
信頼性の向上
従来のデータベースドライバとの互換性
WP Cerber は、PHP が最新の mysqlnd データベースドライバを提供していないホスティング環境でも正しく動作するようになりました。データベース層は、mysqlnd の高速パスを使用する前に、 mysqli_fetch_all()が利用可能かどうかを確認します。利用できない場合は、互換性のあるメソッドを使用して結果セットを 1 行ずつ取得し、行の順序、結果の形状、および既存のエラー処理契約を維持します。致命的なエラーが発生する代わりに、処理速度は遅くなりますが、完全に機能するフォールバックと、前述の警告メッセージが表示されます。
バグ修正
設定が破損しているサイトで発生する致命的なエラー(PHP 8)
データベース内の破損した、非シリアル化不可能な設定値が原因で、PHP 8 のプラグイン読み込み時にarray_merge()で致命的なTypeError発生し、サイト全体がダウンしていました。設定の読み込み時に保存された値が検証され、解析できない場合はデフォルト設定にフォールバックするようになりました。このエラーは永続的な重大な問題として記録され、管理者が設定を再保存すると自動的に解決されます。破損の問題は、空でない保存値が実際に非シリアル化に失敗した場合にのみ発生するため、設定がまだ存在しないことを意味する空の値は、誤検出を引き起こすことはありません。新しいバックアップおよびリカバリ機能と組み合わせることで、サイトがクラッシュするシナリオが自己修復シナリオへと変わります。
mysqlnd がないホストで致命的なエラーが発生しました
mysqli_result::fetch_all()というデータベース層は、mysqlnd ドライバを必要としますが、libmysqlclient に対して mysqli を実行しているホストには存在しないため、致命的なエラーが発生します。高速パスは現在保護されており、上記の信頼性のセクションで説明されているように、行単位のフェッチにフォールバックします。
16進数エスケープされたJavaScript検出における回帰
難読化された JavaScript 検出機能の不具合により\xNNシーケンスのみで構成される文字列がデコードされないという問題が発生していました。正規化ステップで、文字マスク付きのtrim()関数が使用され、最初のエスケープ文字の先頭のバックスラッシュと開始引用符が削除されたため、デコードガードがスキップする奇数長の文字列が生成されていました。その結果、デフォルトで有効になっている Traffic Inspector のリクエストフィールドパスでは、 eval 、 script 、 XMLHttpRequestなどの 16 進エスケープされたプリミティブが検出されませんでした。現在はデコードが正しく機能し、これらの難読化されたプリミティブの検出が回復しています。
コメントで区切られた文字コード引数によるバイパス
fromCharCode()関数呼び出しにおいて、コメントで区切られた有効な数値引数が、入力圧縮時に JavaScript コメントがそのまま残されるため、検出を回避していました。この問題は、上記のセキュリティのセクションで説明されているように修正されました。
まとめ
バージョン9.9は、おそらく皆さんが気づかないであろうリリースです。それが重要な点です。データベースが破損しても設定が失われるのではなく、保持されるようになりました。以前はプラグインをクラッシュさせていたホスティング環境の不具合も、適切に機能低下し、ホスティング会社に修正を依頼すべき箇所を正確に知らせてくれます。管理者にとっては、使い慣れたダッシュボードが日常的に利用でき、障害発生時に自動的に復旧し、悪意のあるトラフィックをより少ない死角で検査できる基盤の上で動作します。