WordPress: デプロイ前にサーバ側のコアバージョンを照合して巻き戻りを防ぐ - #4
Merged
Conversation
WP コアを git 管理して mirror --delete で配信する構成では、サーバ側で自動更新が 入るとデプロイのたびにコアが古いバージョンへ巻き戻り、セキュリティ修正が失われる。 そのため自動更新を有効にできず、緊急のセキュリティリリースを取りこぼす問題があった。 before_sync の冒頭でサーバ側の version.php を読んで照合し、サーバの方が新しければ 両方のバージョンを明示して中断する。これにより wp-config.php で WP_AUTO_UPDATE_CORE を有効にしたまま運用できる。 deploy.sh は before_sync の戻り値を見ないため、中断は exit で行っている。 背景: karappo/danc.kyushu-u.ac.jp#18 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Jul 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
danc.kyushu-u.ac.jp が wp2shell(CVE-2026-63030) による攻撃を受け、不正な管理者アカウントを18個作られた。
調査と対応の記録: https://github.com/karappo/danc.kyushu-u.ac.jp/issues/18
直接の要因は
wp-config.phpのAUTOMATIC_UPDATER_DISABLEDで自動更新を止めていたこと。WordPress は 2026-07-17 に緊急リリースと強制自動更新を世界配信したが、この設定のため受け取れず、脆弱なバージョンのまま放置されて攻撃を受けた。ただしこの設定自体には理由がある。WP コアを git 管理して mirror(
--delete付き)で配信する構成では、サーバ側で自動更新が入るとデプロイのたびに古いコアへ巻き戻る。巻き戻り=セキュリティ修正の消失なので、うかつに自動更新を有効にできなかった。このPRで巻き戻りを機械的に防げるようにし、自動更新を有効にしたまま運用できる状態を作る。
変更内容
before_syncの冒頭(メンテ画面を出す前)で、サーバ側のwp-includes/version.phpを取得してリポジトリ側と照合する。中断時の出力:
サーバ側のバージョンを明記しているので、そのままコピーして手元で更新できる。
実装上のポイント
exit 1。deploy.shはbefore_syncの戻り値を見ていない(before_syncを呼ぶだけ)ため、return 1では止まらない。deploy.shは無改修で済ませているsort -V。文字列比較だと6.9.10 < 6.9.9と誤判定するためcatのみ。パース処理はローカルで行い、SSH/FTP に渡すコマンドを単純に保っている(rsync/lftp 両対応)DEP_WP_SKIP_VERSION_CHECK=1を用意影響範囲
.depinc.shは各サイトのリポジトリではなく raw URL からデプロイのたびにダウンロードされるため、マージ時点で全 WordPress サイトに反映される。影響は安全側に倒れる。
各サイトでの設定(このPRとは別作業)
このPRを入れたうえで、各サイトの
wp-config.phpを以下に変更すると、セキュリティ修正が自動で当たるようになる。順序に注意: 必ずこのPRを先にマージすること。逆にすると、自動更新が有効なのに検知の仕組みが無い期間が生まれる。
なお
AUTOMATIC_UPDATER_DISABLEDを外すと翻訳ファイルの自動更新だけはデフォルトで有効になる。wp-content/languagesを git 管理している場合は次のデプロイで巻き戻るが、version.phpは変わらないので中断はされず、実害は翻訳がわずかに古くなる程度。気になる場合はadd_filter('auto_update_translation', '__return_false');で止められる。動作確認
bash -nで構文チェック済み7.0.1 vs 7.0.2→ 中断、6.9.10 vs 6.9.9→ 通す、など)version.phpからのバージョン抽出を実ファイルで確認済み