この記事の要点と4つの章のご案内
| 章構成 | 主なテーマ | 要点と確認ポイント |
|---|---|---|
| 1. 基本と全体像 | この記事の3つの要点(まずここだけ読めば安心です) | 「更新していないから安全」ではなく「放置された動的プログラム」が狙われます: 5〜10年前に制作したホームページで、サーバー上のPHP(バージョン5.x / 7.x / 8.0等のサポート終了版)やCMSプラグインがそのまま動いていると、自動巡回ボットによって数分で乗っ取られる危険があります。 |
| 2. 現場での進め方と対策 | なぜ日本全国の企業・医院・団体のホームページが次々と書き換えられているのか? | 改ざんされたサイトは「偽のブランド通販サイト」や「詐欺メールの送信元」に悪用されます: トップページは一見普通に見えても、検索エンジン経由でアクセスした時だけ偽のショッピング画面を表示する「条件付き改ざん(クローキング)」が多発しています。 |
| 3. 関連する制度とルール | いま稼働している自社サイトの「危険度比較」と、安全な見直し手順 | まずは本ページの図解と3項目チェックリストでご自身でできる範囲からお試しください。もし設定や判断に迷われたときは、過度な営業のないご相談窓口(お助け隊・お問い合わせ窓口)へいつでもご相談いただけます。 |
| 4. 詳しい技術仕様としくみ | PHP-CGI 引数インジェクション(CVE-2024-4577)のバイト列解剖とRead-Only Static Edge境界検証 | ——「昔作ったホームページをそのままにしている」ことが、なぜ今、自社と訪問者を傷つける最大の入り口になるのか |
サポート終了PHPと古いCMS放置による
国内サイト大量改ざんの実態と、根本からの解決策
——「昔作ったホームページをそのままにしている」ことが、なぜ今、自社と訪問者を傷つける最大の入り口になるのか
この記事の3つの要点(まずここだけ読めば安心です)
- 01. 「更新していないから安全」ではなく「放置された動的プログラム」が狙われます: 5〜10年前に制作したホームページで、サーバー上のPHP(バージョン5.x / 7.x / 8.0等のサポート終了版)やCMSプラグインがそのまま動いていると、自動巡回ボットによって数分で乗っ取られる危険があります。
- 02. 改ざんされたサイトは「偽のブランド通販サイト」や「詐欺メールの送信元」に悪用されます: トップページは一見普通に見えても、検索エンジン経由でアクセスした時だけ偽のショッピング画面を表示する「条件付き改ざん(クローキング)」が多発しています。
- 03. 公開サーバーからPHPとデータベースをなくす「静的Web化(Astro+Rust)」で改ざんリスクは消滅します: 頻繁なシステム更新が難しい会社案内サイトこそ、サーバー上でプログラムを実行しない静的HTML配信へ移行することで、毎月のプラグイン保守と改ざんリスクを同時にゼロにできます。
1. なぜ日本全国の企業・医院・団体のホームページが次々と書き換えられているのか?
「うちのホームページは会社案内だけで、ネット通販も個人情報入力もしていないから狙われない」と思われがちです。しかし攻撃者が求めているのは、あなたの会社が長年培ってきた「ドメインの社会的信用(検索エンジンからの評価)」と「サーバーの送信機能」です。正規の企業ドメインを乗っ取って偽の詐欺ページを何千ページも勝手に生成することで、一般の消費者を騙す踏み台にしているのです。
図1:事象の発生構造と3段階の対策フロー
CVSS 9.8:認証なしで遠隔から命令実行
Windows環境等のPHP-CGIにおける文字コード変換の隙を突き、ログインすら不要でサーバーを乗っ取る深刻な脆弱性が国内外で悪用されています。
本体を更新しても20個の追加機能が穴になる
動的CMSでは、お問い合わせフォームやSEO用プラグインの1つにでも脆弱性が見つかると、そこからデータベース全体が書き換えられます。
「自社名で検索すると偽ブランド品が出る」被害
管理者が直接URLを開くと正常に見えるよう偽装されるため、取引先や顧客からの指摘で初めて発覚するケースが後を絶ちません。
場面別の実務確認ポイント
2. いま稼働している自社サイトの「危険度比較」と、安全な見直し手順
現在のホームページがどのような仕組みで動いているかによって、必要な対策と今後の維持コストが大きく変わります。以下の表で現状を確認してみてください。
| 構成タイプ | 改ざん・乗っ取りリスク | 毎月の保守・更新負担 | 推奨される今後の対策 |
|---|---|---|---|
| 古いPHP(5.x / 7.x / 8.0)+ 未更新の動的CMS | 極めて高い(自動攻撃ボットの即時標的) | 放置状態(更新すると画面が崩れるため触れない) | 早急に公開サーバーから動的PHPを撤去し、静的Web構成へ移行する |
| 最新PHP + 毎月プラグインを手動更新している動的CMS | 中〜高(ゼロデイ脆弱性や更新忘れの隙が残る) | 毎月数時間〜数万円の保守・バックアップ確認が必要 | ログイン画面のIP制限・パスキー化を順守するか、静的配信(Astro)へ移行する |
| Astro + Rust WASM 静的生成(本サイト 2026.ok.st の構成) | 極小(公開サーバー上にPHPもDBも存在しない) | 毎月のプラグイン更新作業ゼロ・表示速度も0.3秒以下 | 読み取り専用配信のため改ざん耐性が極めて高く、長期にわたり安心が続く |
今日から無理なく進めるための4ステップ実践手順
現状の棚卸しと「見えにくいリスク」の把握
新しい機器やソフトを購入する前に、現在使っている機器・アカウント・契約先を紙1枚に書き出します。被害の大半は「昔作ったまま誰も管理していない古い機器や共有アカウント」から始まります。
費用をかけずにできる「3つの基本設定」
01 パスキー(FIDO2)または二要素認証の有効化、02 ルーター・VPN・OSの自動更新設定、03 バックアップ用外付けHDDの常時接続解除(切り離し保管)の3点を実施します。
異変に気づいたときの「責めない連絡ルール」
不審なリンクを開いたり偽警告が出たりした際、「怒られるかも」と隠すことが被害を広げます。「迷ったら6秒深呼吸して手を止め、すぐ共有してくれた人を褒める」ルールを共有します。
定期的な復元テストと第三者の落ち着いた確認
季節の変わり目ごとに「バックアップから実際に1つのファイルを戻せるか」を試すとともに、退職・異動に伴うアカウント整理を行い、迷う点は専門窓口で点検します。
現場で陥りやすい3つの落とし穴と、安全な回避策
落とし穴 01:改ざんされたファイルを「手動で消しただけ」で復旧したと思い込む
一度侵入されたサーバーには、目に見えない別のフォルダやデータベース内部、定期実行タスク(cron)に複数の裏口(バックドア)が仕掛けられています。表面上の不正ファイルを削除しただけでは、数日後に必ず再改ざんされます。
落とし穴 02:制作会社に「納品後の保守契約」がないまま5年以上放置している
「制作費のみで月額保守なし」で納品された動的CMSサイトは、誰もPHPやプラグインのアップデートを行っていないケースが大半です。まずは現在のPHPバージョンとプラグイン一覧を確認してください。
落とし穴 03:テスト用に作った古いフォルダ(/test/ や /old/)をサーバーに残している
本番サイトを新しく作り直した際、同じサーバーの別フォルダに昔のWordPressや古いPHPプログラムを残していると、その古いフォルダ経由でサーバー全体が乗っ取られます。
今日からできる3項目セルフチェック(クリックして確認)
達成状況:0 / 3 項目ご家庭や職場で現在できている項目にチェックを入れてみてください。すべてお使いのブラウザ内でのみ計算され、外部へ送信されることはありません。
会社案内やお知らせ掲載が中心のホームページにおいて、改ざん被害と毎月の保守コストを根本からなくす最も効果的な設計はどれでしょうか?
よくあるご質問と、迷ったときの判断基準
Q1. 社内に専任のシステム担当者がいないのですが、自分たちだけで始められますか?
はい、始められます。まずは費用や特別な契約を伴わない「基本の3項目(パスキー・自動更新・切り離し保管)」から1つずつ進めてみてください。途中で設定画面の見方が分からなくなったときだけ、相談窓口を頼っていただければ十分です。
Q2. 外部の営業担当者から「今すぐ専用機器(UTM等)をリース契約しないと手遅れになる」と言われました。
その場で即決せず、必ず見積書を持ち帰ってセカンドオピニオンを確認してください。公的ガイドラインや2026年SCS評価制度(★3)が求めているのは、特定メーカーの高額機器ではなく「基本的な管理の仕組み」です。
Q3. このページの内容を印刷して、職場や家族に配ってもよいですか?
もちろんです。本サイトの図解やチェックリストは、地域の企業・医院・学校・ご家庭の安全を守るための公開技術資料として掲載しています。ブラウザの印刷機能(A4縦)でそのまま読みやすく印刷できます。
PHP-CGI 引数インジェクション(CVE-2024-4577)のバイト列解剖とRead-Only Static Edge境界検証
本節では、CVE-2024-4577(CVSS 9.8)において Windows Shift_JIS(CP932)等の Best-Fit 文字マッピングが Unicode ソフトハイフン(0xAD)を ASCII ハイフン(0x2D)へ変換することで CGI 引数エスケープを突破するメカニズムを解剖し、これを前段で無力化する検査ロジックと静的配信設計を示す。
1. プロトコル内部構造・数理モデルと設計根拠
1. 【CVE-2024-4577 における CP932 Best-Fit Mapping の脆弱性構造】 かつての CVE-2012-1823 への対策として、PHP-CGI はクエリ文字列の先頭(デコード後)が ASCII ハイフン 0x2D(-)で始まる場合にコマンドラインオプション解析を抑止していた。しかし Windows のマルチバイト文字変換 API(WideCharToMultiByte)は、CP932(日本語 Shift_JIS)等のロケールにおいてソフトハイフン 0xAD を「最も近い文字(Best-Fit)」として ASCII ハイフン 0x2D に正規化する。この結果、HTTP層での 0x2D 検査をすり抜けた %ADd+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input が php-cgi.exe の引数配列 argv[] に直接注入され、POSTボディ内の任意のPHPコードが即時実行される。
2. 【動的CMSにおける攻撃面(Attack Surface)の指数関数的増大】 サーバー上でチューリング厳密なスクリプト解釈器(PHP)と可変ファイルシステム(wp-content/uploads 等)を同居させる構成では、プラグイン数 M に対して潜在的ガジェット連鎖が O(M^2) で増大する。これに対し、ビルド時に全ページを純粋な静的アセットへコンパイルし、不変ファイルシステム(OpenZFS readonly=on)から配信するアーキテクチャでは、RCE攻撃面が数学的にゼロ(\mathcal{A}RCE = ∅)となる。
2. 技術パラメータ・検証仕様一覧
| 攻撃ベクトル | 動的PHP / Legacy CMS の挙動 | Astro + Rust Static Edge の挙動 | リスク低減率 |
|---|---|---|---|
| CVE-2024-4577 (%ADd CGI RCE) | argv注入により php://input を即時コード実行 | CGIインタプリタ不在・静的404/400応答で即時破棄 | 100% (物理消滅) |
| SQL Injection (Union / Blind) | 動的クエリ連結の不備からDB全件漏洩・改ざん | 公開エッジにRDBMS接続自体が存在しない | 100% (物理消滅) |
| Malicious Webshell Upload | 書込可能ディレクトリへ .php を配置し永続化 | ZFS readonly=on かつ .php 実行ハンドラ非搭載 | 100% (物理消滅) |
| SEO Cloaking / Defacement | User-Agent分岐でGooglebotに偽通販HTMLを返却 | SHA-256ダイジェスト固定の静的ファイル配信 | 100% (改ざん検知) |
#![forbid(unsafe_code)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RequestSafety {
SafeStaticPath,
BlockedPhpCgiBestFitInjection,
BlockedLegacyCmsProbe,
}
/// Inspects raw URI query & path bytes for CVE-2024-4577 (0xAD soft-hyphen best-fit)
/// and legacy CMS backdoor probes before hitting the static file server.
pub fn inspect_http_target(path: &str, raw_query: Option<&str>) -> RequestSafety {
let lower_path = path.to_ascii_lowercase();
if lower_path.ends_with(".php")
|| lower_path.contains("/wp-admin")
|| lower_path.contains("/wp-login")
|| lower_path.contains("/xmlrpc.php")
{
return RequestSafety::BlockedLegacyCmsProbe;
}
if let Some(q) = raw_query {
let lower_q = q.to_ascii_lowercase();
if lower_q.contains("%ad")
|| lower_q.contains("allow_url_include")
|| lower_q.contains("auto_prepend_file")
|| lower_q.contains("php://input")
{
return RequestSafety::BlockedPhpCgiBestFitInjection;
}
for b in q.as_bytes() {
if *b == 0xAD {
return RequestSafety::BlockedPhpCgiBestFitInjection;
}
}
}
RequestSafety::SafeStaticPath
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn blocks_cve_2024_4577_encoded_payload() {
let verdict = inspect_http_target(
"/index.html",
Some("%ADd+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"),
);
assert_eq!(verdict, RequestSafety::BlockedPhpCgiBestFitInjection);
}
}
動的CMS/PHPランタイム攻撃面(CVE-2024-4577等)の解剖とAstro+Rust静的分離設計
プロトコル仕様・数理モデル・Rust 2024 実装コードの詳細は、専門技術モノグラフにて公開しています。
あわせて読みたい関連ガイド
まずは本ページの図解とチェックリストでご自身でできる対策からお試しください。関連する手順や、自分たちだけでは判断に迷われたときの相談窓口も以下からご覧いただけます。