Magento の cms_block に仕込まれ、閲覧者の localStorage に居座るローダーを掃除する
Magento を中心とする EC サイトで、データベースの cms_block テーブルにローダーが仕込まれ、受け取ったコードを閲覧者ブラウザーの localStorage(fpCode)に保存して毎回再実行する。テーマファイルだけでなく CMS ブロック・ページを点検し、DB に書き込める入口(Web シェル・不正管理者・漏れたパスワード)を塞いでから消す。
手口(Sansec)
- 挿入先は店舗ページの部品を保存する
cms_blockテーブル。同社スキャナーは 148 のサーバー環境でcms_blockから検出し、設定テーブルやテーマファイルからは検出なし。 - 10 月 23 日の更新で、ローダーがブラウザー自動操作の痕跡・GPU・画面サイズ・言語などを送り、サーバー側が配信内容を選ぶ方式に変更。自動ブラウザーの検査では HTTP 200 でも追加の内容が返らず、検査で見えにくい。
- 新しい配信先
deepveindrilling[.]comは 83 店舗で確認(うち 60 店舗は以前から侵害)。 - 受け取ったコードは localStorage の
fpCodeに保存され、ページを開くたびに再実行。配信ドメインを遮断しても、一度受け取った閲覧者では実行が続く。店舗内の読み出し用スクリプトを除去すれば、この経路での再実行は止まる。
点検
- 管理画面の「コンテンツ → ブロック/ページ」、または DB で
cms_block・cms_pageのcontentに外部<script>、難読化 JS、localStorage・fpCodeなどの文字列がないか調べる。例:sqlSELECT block_id, identifier, update_time FROM cms_block WHERE content LIKE '%<script%' OR content LIKE '%localStorage%' OR content LIKE '%deepveindrilling%'; - ファイルだけを見るスキャンでは見落とす。DB の中身も検査対象に入れる。
掃除の順番
- Web シェル、不審な管理者アカウント・プロセスを除去する。
- DB・管理者・API 連携のパスワードを変更する。
- PolyShell 向け APSB26-73、SessionReaper 向け APSB25-88 の修正を適用する。
- その後で
cms_blockのローダーを削除し、時間をおいて再スキャンする。
コアパッチを全部当てていた店舗でも、不正な管理者とバックドアが残っていたためにクリーンなスキャンの 1 時間後に再挿入された。スクリプトだけ消しても DB へ書き込める状態が残れば戻ってくる。順番の考え方は 配布物に混入したプラグインのバックドアは「再生成の仕組み」から止める(Rank Math SEO PRO 3.0.123 事例) と同じ。