攻撃者は「下見」してから撃つ ── ある一日のアクセスログに映ったJCE狙いの偵察
先日、当サイトの30日分のアクセスログを解析し、Joomlaのエディタ拡張JCE(Joomla Content Editor)の緊急脆弱性CVE-2026-48907を狙った自動攻撃が、毎日休みなく届いていることを報告しました。今回はその続きとして、たった一日、7月8日のログだけを取り出して詳しく見ます。単日に絞ると、30日の集計では埋もれていた攻撃者の「作法」が、より鮮明に見えてきました。
結論から言えば、この日も侵害の兆候はありませんでした。しかしこの日のログには、これまで意識していなかった一手 ── 攻撃の前の「偵察」 ── がはっきり記録されていました。旧バージョンを放置したサイトが、なぜ狙い撃ちにされるのか。その理由が、生のログから読み取れます。
なお前置きとして、筆者はセキュリティの専門家ではありません。以下は自サイトのアクセスログという一次データを、公開されている脆弱性情報と突き合わせて整理したものです。
まず、この脆弱性の最小限のおさらい
CVE-2026-48907は、JCEの未認証リモートコード実行(RCE)脆弱性です。CVSSスコアは最高の10.0。認証も利用者の操作も要らず、サーバー上に任意のPHPコードを書き込んで実行できます。攻撃は2段構えで、まず未認証でファイルアップロードを許す偽のエディタプロファイルを作らせ、次にそれを使って`.php`や`.phtml`のWebシェルをサーバーにアップロードしてWebから実行する、という流れです。
影響を受けるのはJCE 1.0.0から2.9.99.4まで。修正版は2.9.99.5以降に出ており、現時点で開発元が全サイトに推奨するバージョンは2.9.99.9です。米国CISAは6月16日にこの脆弱性を「悪用が確認された脆弱性」に指定し、連邦機関に3日間という異例の短さの修正期限を課しました。動作する攻撃コードが公開され、攻撃が自動化されているためです。
余談ですが、この推奨版2.9.99.9は、奇しくも本稿が扱う7月8日その日にリリースされています。攻撃が絶え間なく届いていたまさにその日に、開発元は最新の修正を出していた。守る側と狙う側の、静かな追いかけっこがここにあります。
詳しい背景は前回の記事に譲り、ここからは7月8日という一日の観測に入ります。
その日のログ、31,260行
7月8日、当サイト(3つのプロパティ合算)のアクセスログは31,260行でした。その大半は正常なアクセスです。応答ステータスは200番台の正常応答が全体の7割以上を占め、攻撃や探索を弾いた記録(403、404、401)はごく一部でした。機密ファイルを狙った探索に成功した記録は、この日もゼロです。
その「ごく一部」の中に、いつもの攻撃と、新しい発見がありました。
いつもの攻撃 ── 変わらず、届いていた
JCEおよび類似のページビルダー系コンポーネントを狙うエクスプロイトPOSTは、この日も複数の接続元から届いていました。手口は前回観測したものと同一です。プロファイルのインポート機能を悪用しようとするPOSTを連打し、その後にWebシェルらしきファイルの設置を試みる。ファイル名には既知の攻撃で流通しているパターン(`nx`で始まる名前など)が並んでいました。
結果は、すべて空振りです。攻撃POSTはリダイレクトの末にエラーページへ着地し、Webシェル設置の試みはすべてブロックされていました。狙われたコンポーネントがそもそも当サイトのフロントに露出していないため、攻撃が刺さる先がなかったのです。
つまり、記事を書いている今この瞬間も、このキャンペーンは現在進行形で続いています。これは特定の日の特別な出来事ではなく、日常の背景ノイズになっている、ということです。
新しい発見 ── 攻撃の前に「下見」があった
この日、これまで意識していなかった挙動がはっきり記録されていました。総当たりのPOSTだけではなかったのです。
いくつかの接続元が、攻撃を仕掛ける前に、各コンポーネントのマニフェストファイルを読もうとしていました。具体的には、`com_jce/jce.xml`、`com_sppagebuilder/sppagebuilder.xml`、`com_pagebuilderck/pagebuilderck.xml`といったXMLファイルへのアクセスです。
このXMLファイルには、何が書かれているか。その拡張機能のバージョン番号です。Joomlaの拡張機能は、それぞれマニフェストと呼ばれるXMLに名前やバージョンを記録しており、これが読めれば「このサイトにJCEが入っているか」「入っているなら、パッチ前の脆弱なバージョンか」が一目で分かります。
これがどういう意味を持つか。攻撃者は、やみくもに撃っているのではありません。まず下見をして、脆弱なコンポーネントが、しかも古いバージョンで入っているサイトを見極めてから、本命の攻撃を仕掛けようとしているのです。狙いを定めてから引き金を引く。当日のログは、その「照準合わせ」の瞬間を捉えていました。
当サイトでは、これらのマニフェストへのアクセスもすべてブロックされ、バージョンを読み取られてはいません。しかし、この偵察の存在そのものが、重い意味を持ちます。旧バージョンを放置したサイトは、優先的に狙い撃ちにされる。アップデートを先延ばしにすることは、単に「穴が開いたまま」なのではなく、「穴が開いていることを攻撃者に教えている」に等しいのです。
この一日から言えること
単日のログを丁寧に読むと、攻撃が「偵察 → 本攻撃」という段階を踏んでいることが見えてきます。そして偵察の狙いがバージョン特定である以上、防御の初手はやはり明快です。
JCEを2.9.99.9に上げる。使っていないなら削除する。これに尽きます。バージョンを古いまま放置している限り、偵察に引っかかり、標的リストに載り続けます。逆に最新版まで上げてしまえば、たとえマニフェストを読まれても「狙う価値のないサイト」として素通りされる公算が高い。偵察されることそのものは防げなくても、偵察の結果を「無害」にすることはできます。
もうひとつ、当サイトのように攻撃が空振りに終わっていても、それは「侵害されなかったことの証明」ではありません。ログ解析で言えるのは「侵害成立の痕跡が見つからなかった」ところまでです。だからこそ、アップデートと並行して、一度自分の目で確認しておくことをお勧めします。開発元が挙げている、具体的な目印はこうです。
管理画面の「コンポーネント → JCE Editor → Editor Profiles」を開き、自分が作った覚えのないプロファイルがないか見てください。攻撃で作られた不正なプロファイルは、無意味な自動生成の名前を持ち、一覧の先頭に来るよう並べられていることが多いとされます。加えて、`images`、`media`、`tmp`フォルダに、置いた覚えのない`.php`ファイル(`foo.php.xml`のようにファイル名にphpを含むものも含む)がないか。これらのフォルダには本来PHPファイルは入りません。プロファイルがアップロード先を指定していない場合の既定の置き場所はimagesフォルダなので、まずそこから見るのが効率的です。もうひとつの兆候として、フロントエンドのエディタから通常のツールバーが消え、ボタンが一つだけ、あるいは何もない状態に変わっていたら、それも黄信号です。単独では確証になりませんが、見覚えのないプロファイルと重なれば、強い兆候です。
そして開発元が最も強調しているのは、順序です。アップデートは侵入口を塞ぐが、すでに侵入されたサイトを掃除はしない。もし侵害の可能性があるなら、不審なプロファイルとファイルは消す前にコピーを取り、先にアップデートで穴を塞いでから駆除し、その上で管理者・データベース・ホスティングの各パスワードを変更する——この順で進めるべきとされています。
おわりに
一日分のログは、30日分の集計とはまた違うものを見せてくれます。集計では「毎日attackが来ている」という量になってしまう出来事が、単日に絞ると「相手はまず下見をして、バージョンを確かめてから撃つ」という質として立ち上がってきます。
攻撃側がバージョンを気にしているという事実は、裏返せば、防御側にとって最も分かりやすい指針です。バージョンを上げること。それが、下見に来た相手を空振りさせる、いちばん確実な一手です。
この情報を出すことについて
正直に書いておきます。こうした情報を提供するのには、訳があります。一般的なユーザーレベルにすぎない私が、こんな情報を出していいのか——最初はそう悩みました。それでも、日本で一人でも多くのJoomlaサイト運営者へ、数少ない情報を届けられればと思って書いているだけで、誰かに頼まれた義務があるわけではありません。
ですから、正確性についても率直に申し上げます。この分野で確かな一次情報は、現状ほとんどが海外のサイトにあり、それを自分の目で見て判断するしかありません。本稿もそうやって、公開されている脆弱性情報と自サイトのログを突き合わせて書いたものです。もし記述に古い点や誤りを見つけたら、開発元やCISAの公式情報を優先してください。それでも、英語圏の情報にたどり着く前の誰か一人にとって、この記事が最初の手がかりになるのなら、書いた意味はあります。
*本稿は当サイトのアクセスログという一次データに基づいて整理したものです。筆者はセキュリティの専門家ではなく、記述には推定を含む箇所があります。ご自身のサイトの対処にあたっては、開発元およびCISAの公式情報を必ず併せてご確認ください。*