/note/tech

WordPress 4.9.7 のまま8年 — ISMS認証11日後の不正アクセスと、アドオンが招く塩漬けの構造

要約:

■ 1. 事案の概要と時系列

  • テレビ朝日メディアプレックスの公表:
    • 2026年7月3日、同社が自社サーバへの不正アクセスに関するお知らせとお詫びを公表
  • 時系列:
    • 4月17日、ISMS(ISO/IEC 27001)認証取得を自社サイトで公表
    • 4月28日、第三者による不正アクセスを確認し、関係サーバの停止と外部ネットワーク遮断を実施
    • 6月19日、個人情報を含む情報の一部が漏えいした恐れが判明
    • 7月3日、公表
  • 時間差の意味:
    • 認証取得の公表から侵害まではわずか11日
    • 発見から公表までは66日
    • この時間差に今回いちばん学べるものがある

■ 2. 外部から観測できた構成

  • 公開情報からの観測:
    • 同社サイトはWordPressで構築されている
    • 一般公開されているHTTPヘッダとHTMLの中に構成がそのまま出ていた
    • curlでトップページのver=指定とwp-login.phpのServerヘッダを確認できる
  • 読み取れる構成:
    • WordPress 4.9.7(2018年7月リリース)
    • PHP 7.1.33(2019年にサポート終了)
    • Contact Form 7 5.0.3(2018年)
    • OpenSSL 1.0.2k(2017年、サポート終了)
    • テーマは独自製のカスタムテーマ
  • 2018年で止まった時間:
    • 構成のほぼ全体が2018年で時間が止まっている
    • Apacheだけ比較的新しいが、クラウド側のイメージ更新でついでに上がっただけと見るのが自然

■ 3. 受託サービスとの対照

  • モダンな受託サービス群:
    • 動画配信サービスはCloudFrontとエッジ処理の構成で、WordPressの痕跡はまったくない
    • 同社の公開事例でも疎結合CMS、コンテナ、Blue/Greenデプロイと説明されている
  • 止まっていたのは自社サイトだけ:
    • 客に納めるものはしっかり作られ、モダンに保たれている
    • 凍結していたのは自社のコーポレートサイトのみ
  • 紺屋の白袴:
    • 技術力がないのではなく、優先順位の問題
    • 他人の袴は仕立てるが自分は白袴のまま、という古い言葉そのもの

■ 4. 塩漬けの構造とERPの失敗

  • 8年アップグレードできなかった原因:
    • 原因はおそらく凝ったカスタムテーマそのもの
    • デザインを作り込むほど、WordPressのコアやプラグインの標準的な挙動から離れる
    • 独自PHPコードがコア関数に深く依存すると、コア更新の瞬間にサイトが壊れる
    • 結果としてアップグレードできず、放置するしかなくなる
    • 「動いているものに触るな」として2018年で凍結した
  • ERPで繰り返されてきた失敗:
    • SAPをはじめとするERPで何十年も繰り返されてきた失敗とまったく同じ構造
    • 導入時、標準機能(バニラ)では業務に合わない部分を埋めるためアドオンを大量に作り込む
    • 数年後のベンダーのバージョンアップ時に、そのアドオンが足枷になる
    • 標準に手を入れすぎたシステムは、上げようとすると壊れる
    • アップグレードの改修費が新規導入並みに膨らみ、塩漬けになる
    • アドオンを抱えたまま古いバージョンで動かし続けるのが日本中のERPが陥ってきた道
  • Clean Core:
    • SAPがこの反省から掲げるようになった、アップグレード可能な状態を維持する設計思想
    • コアには手を入れず、標準はバニラのまま保つ
    • 拡張はBTPなどの外側の拡張基盤に出す
    • そうすればコアはいつでも安全にアップグレードできる
    • パッケージはバニラで使い、カスタマイズは外出しするという昔からの主張とも一致する
  • WordPressでの相似形:
    • カスタムテーマという「アドオン」がコアに絡みつき、アップグレードを止めた
    • ERPほど規模が大きくないため、誰も深刻に受け止めなかっただけ
  • フロントWebで代償が露呈する怖さ:
    • ERPは業務システムのため、塩漬けの代償はまず社内の不便や非効率として現れる
    • フロントのWebはインターネットに直接晒されている
    • 同じ病でも、代償がセキュリティ侵害として外から公然と暴かれる
    • Webは規模が小さいから軽く見られ、コアとの結合を安易に考えられる
    • 小さいからこそ放置され、真っ先に狙われる

■ 5. ISMS認証と適用範囲

  • 単純な揶揄は不正確:
    • ISMSを取ったのに会社サイトが古いままと笑うのは正確ではない
    • 認証の適用範囲は会社全体ではなく、テクノロジーソリューション事業本部
    • 認証範囲の文言は顧客要求事項に基づくソフトウェアの設計、開発などで、対象は顧客向け業務
  • 本質は運用上の隙間:
    • 認証された範囲と、実際にインターネットに晒されている資産のあいだに隙間が生まれうる
    • 凍結していた自社コーポレートサイトは、おそらく最初からスコープの外にいた
  • 枠の外は守られない:
    • 認証は枠組みであり、枠の外まで自動的に守ってくれるわけではない
    • 攻撃者から見れば、認証の外側に取り残された資産こそ一番柔らかい入口

■ 6. 利益率に入っていないリスク

  • コスト構造:
    • 売上を生む客向けサービスには金をかけ、動画配信基盤はモダンに保たれCDNで守られている
    • 直接売上を生まない自社サイトの保守は、コストとして真っ先に削られる
    • 利益率を追えば自然とそうなる
  • 計上されないセキュリティリスク:
    • 保守を止めれば短期的には支出が減る
    • 一方で「侵害される確率 × 侵害されたときの損害」という見えないコストが積み上がる
    • 66日間の対応、外部専門機関の費用、公表による信用毀損は、削った保守費をおそらく大きく上回る
  • 多くの組織に共通する盲点:
    • リスクを利益率の計算に入れていないのは一社の問題ではない
    • 目に見える支出は削れるが、目に見えないリスクは削れず後ろに溜まっていく

■ 7. 漏えいした情報の推定

  • 公告の記載:
    • 公告は「当社が持つ個人情報を含む情報の一部」としか書いていない
    • コーポレートサイトは会員機能もECもない、問い合わせ、採用、資料請求中心のB2Bサイト
    • 大量の個人情報が集まる構造ではない
  • 受託サービスへの波及:
    • 動画配信サービス等の運用受託先は別ドメイン、別インフラで物理的に離れている
    • そちらへの波及を示す発表は現時点でない
  • 漏えいした情報の見立て:
    • 抜けたのは自社サイトDBにあった問い合わせ、応募、登録情報と見るのが素直
    • 件数は多くなくても、個人情報保護法上は報告対象になる
    • 見えているサイトに大した情報がないのに漏れたという違和感が、入口の性質を物語る
  • 侵入経路の仮説:
    • Contact Form 7 5.0.3は、2026年時点では既知の脆弱性を抱えた古い系統に属する
    • 断定はできないが、フォーム周辺を起点にファイルを置かれ内部へ、という筋書きは観測構成と矛盾しない

■ 8. 古さが調査も遅らせる

  • 範囲特定まで52日:
    • 発見から漏えい範囲の特定まで52日かかった
  • 古い構成の調査上の弱さ:
    • 2018年の構成には、いまの環境が持つ監査ログや検知の仕組みが乏しい
    • 侵入は分かっても、何が持ち出されたかを追いきれない状態になりやすい
    • そのため外部専門機関に頼り、それでも結論は「漏えいの恐れ」に留まった
  • 二重の代償:
    • 古さが侵入を許し、古さが調査も遅らせた
    • 新しい構成なら数日で範囲を切れたかもしれない

■ 9. ひと手間で防げる初手

  • 初手はどれもひと手間:
    • 防御の初手はどれもひと手間で済む
    • 実際にこの記事を書きながら自分のサイトも見直した
  • オリジンをCDNの裏に隠す:
    • サイトのIPが直接見えていると、WAFを迂回してサーバを直接叩かれる
    • AWSはCloudFrontとAWS WAF
    • AzureはFront Doorと統合WAF
    • GCPはCloud CDNとCloud Armor
    • apexドメイン(wwwなし)をCDNに向けるDNS対応も含め、半日あれば終わる
  • メールのなりすまし対策:
    • DMARCをp=none(検知のみ)からp=reject(拒否)へ変更する
    • SPFを~allから-allへ変更する
    • 作業は数分で済む
    • 放置すると自社ドメインを騙るフィッシングメールが素通りする
  • 依存関係を「見る」こと:
    • これが本題

■ 10. 依存関係の可視化とSCA

  • 見えなくなる依存関係:
    • 凝ったカスタムテーマはWordPress.orgの自動更新から外れる
    • プラグインも「動いているから」と放置されやすい
    • こうして依存関係は少しずつ見えなくなり、8年が過ぎる
    • Clean Coreを守れなかったERPが、自分が何を抱え込んでいるか分からなくなるのと同じ
  • SCA(Software Composition Analysis):
    • 見えなくなった依存を機械的に洗い出す仕組み
    • CVE公表の瞬間に、自環境のどの部品にどの脆弱性があるかを教えてくれる
    • 見えなくなっていたリスクを、再びコストの計算に載せられるようにする道具
  • 可視化の必要性:
    • 脆弱性は毎日公表され、公表から数時間で攻撃コードが出回る
    • 自動スキャナが世界中のサイトを舐めていく
    • 可視化すれば、自分のサイトが今どう狙われうるかが手に取るように分かる
    • 可視化していなければ、8年間まったく気づかないことが現実に起きる
  • 完璧でなくても持てる姿勢:
    • 人手も時間も足りず、完璧な運用は難しい
    • それでもCVEを持ち、追いかける姿勢は持てる
    • 依存を可視化し、警告が来たら動くだけで「気づかないまま8年」は避けられる

■ 11. 結論: 凝ることと守ること

  • 作る力と守る力は別物:
    • 凝るほどコードは増え、コアに絡みつき、標準の更新から外れる
    • やがて作った人にしか触れないブラックボックスになる
    • ERPで何十年も繰り返した失敗を、フロントエンドでより小さく無防備な形で繰り返している
  • 守るための原則:
    • コアはバニラに保つ
    • 拡張は外に出す
    • 自分が何に依存しているかを常に見える状態にしておく
  • 認証に実を伴わせるもの:
    • 認証という枠組みに実を伴わせるのは、結局そうした地道な運用
    • 凝ることと守ることに同じ熱量を注ぐべき