posts
10月はNginxとPHPに危険な脆弱性が続いたので、自分のサーバーが大丈夫か確かめた
2026年10月は、Webサーバーまわりで怖いニュースが続きました。10月半ばにNginx、その1週間後にPHPで、どちらも「最悪の場合、外から好きなプログラムを動かされる」レベルの脆弱性(セキュリティの穴)が公表されました。
このブログはNginxで動いているので、他人事ではありません。自分のサーバーが当てはまるのか、何をすればいいのかを確かめました。
先に結論です。
| 確かめたこと | 結果 |
|---|---|
| 自分のNginxは対象のバージョンか | すでに修正済みのバージョン(1.24.0-2ubuntu7.19)になっていた |
| 危ない設定を使っているか | 使っていなかった |
| PHPは入っているか | 入っていなかった(このブログはHugoで作った静的サイトなので、PHPを使わない) |
| なぜ直っていたのか | Ubuntuの自動更新(unattended-upgrades)がオンになっていた |
| やったこと | たまっていたほかの更新14個を入れた。レスポンスにNginxのバージョンを出さないようにした |
10月に何があったのか
| 日付 | 何に | どんな問題 |
|---|---|---|
| 10月14日 | Nginx | 11件の脆弱性。うち3件は10点満点で9.2点の「緊急」。特定の設定を使っていると、Nginxを落とされたり、好きなプログラムを動かされたりする可能性がある |
| 10月21日 | PHP | 2件の脆弱性(どちらも9.2点)。細工したリクエストを1回送るだけで、ログインなしで好きなプログラムを動かされる可能性がある。公表のすぐあとから、攻撃が始まったと報じられた |
Nginxの問題
緊急の3件は、どれも「特定の設定を使っているとき」に起きるものです。
| 番号 | どこの問題か | ざっくり言うと |
|---|---|---|
| CVE-2026-15176 | alias の設定まわり |
特定の書き方をしていると、メモリがあふれる |
| CVE-2026-97205 | SSI(include virtual)とAIOを使ったとき |
使い終わったメモリを使ってしまう |
| CVE-2026-93479 | map で正規表現を使ったとき |
特定の書き方をしていると、メモリがあふれる |
残りの8件は、Kubernetes用のNginxや、HTTP/3、njs(Nginxの中で動くJavaScript)など、このブログでは使っていない機能の問題でした。
Ubuntuも10月下旬に、修正したNginxを配り始めました(USN-8955-1)。このブログと同じUbuntu 24.04なら、1.24.0-2ubuntu7.19 以降が修正済みのバージョンです。
PHPの問題
PHPのほうは、もっと条件がゆるい問題でした。
| 番号 | ざっくり言うと |
|---|---|
| CVE-2026-109618 | メモリが足りなくなったときの処理で、中途半端な状態のデータが残り、メモリが壊れる |
| CVE-2026-109619 | 前のリクエストの使い終わったデータを、次のリクエストが読んでしまう |
PHPそのものの問題なので、WordPressやプラグイン、テーマを最新にしても直りません。 PHP-FPM、Apacheのmod_php、php-cgiなど、PHPを動かすほとんどの方法が対象です。修正版は、PHP 8.5.12、8.4.27、8.3.36、8.2.35です。
WordPressは、PHPで動いています。もしこのブログをWordPressで作っていたら、こちらが本番だったと思います。
確かめたこと1:自分のNginxのバージョン
サーバーにSSHでログインして、入っているNginxのバージョンを確かめます。
dpkg -l | grep nginx
最初、これをPCのPowerShellで打ってしまい、「用語 ‘dpkg’ は認識されません」と出ました。dpkg はUbuntuのコマンドなので、SSHでサーバーに入ってから打つ必要があります。
ii nginx 1.24.0-2ubuntu7.19 amd64 small, powerful, scalable web/proxy server
ii nginx-common 1.24.0-2ubuntu7.19 all small, powerful, scalable web/proxy server - common files
ii python3-certbot-nginx 2.9.0-1 all Nginx plugin for Certbot
nginx -v でもバージョンは出ますが、こちらは 1.24.0 のように大まかな数字しか出ません。Ubuntuは、Nginxの数字はそのままで、後ろの ubuntu7.19 の部分を上げて修正を配るので、dpkg -l で後ろまで見る必要があります。
結果は 1.24.0-2ubuntu7.19 で、すでに修正済みのバージョンでした。 自分では何もしていないのに、いつの間にか直っていました。理由は、このあと確かめています。
確かめたこと2:危ない設定を使っているか
設定ファイルの中に、緊急の3件に当てはまる書き方があるか探しました。
grep -rnE '\b(alias|map|ssi)\b' /etc/nginx/
/etc/nginx/koi-utf:2:# This map is not a full koi8-r <> utf8 ma: it does not contain
/etc/nginx/koi-utf:3:# box-drawing and some other characters. Besides this map contains
/etc/nginx/koi-utf:5:# If you need a full and standard map, use contrib/unicode2nginx/koi-utf
/etc/nginx/koi-utf:6:# map instead.
/etc/nginx/win-utf:1:# This map is not a full windows-1251 <> utf8 map: it does not
/etc/nginx/win-utf:2:# contain Serbian and Macedonian letters. If you need a full map,
/etc/nginx/win-utf:3:# use contrib/unicode2nginx/win-utf map instead.
いくつか引っかかりましたが、どれも行の頭に # が付いたコメント(説明文)の中の「map」という英単語でした。文字コードの変換表に付いている説明で、設定としては使われていません。
このブログの設定は、root で公開するフォルダを指定して、return 301 で www ありを www なしに転送しているだけです(→ 第5回 環境づくり編、番外編1)。alias も map もSSIも使っていませんでした。
grep は文字が一致すれば何でも出してくるので、出てきた行が本当に設定なのか、コメントなのかを自分で見分ける必要がある、というのも今回の発見でした。
確かめたこと3:PHPが入っているか
php -v
Command 'php' not found, but can be installed with:
apt install php8.3-cli # version 8.3.6-0ubuntu0.24.04.9, or
apt install php-cli # version 2:8.2+93ubuntu1
apt install php8.2-cli # version 8.2.12-1ubuntu2
Command 'php' not found なので、PHPは入っていません。このブログは、Hugoで作ったHTMLファイルをNginxで配っているだけなので、PHPの問題はこのサーバーには関係ありませんでした。
なぜ、何もしていないのに直っていたのか
Ubuntuには、セキュリティの更新を自動で入れてくれる「unattended-upgrades」という仕組みがあります。設定を見てみました。
cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
どちらも "1" なので、「毎日、更新があるか確かめて、セキュリティの更新を自動で入れる」設定がオンになっていました。 自分で設定した覚えはないので、Ubuntuを入れたときから最初からオンになっていたようです。Nginxの修正版も、自分がニュースに気づく前に、これが入れてくれていました。
やったこと:たまっていたほかの更新を入れる
ただ、ログインしたときの画面には、こう出ていました。
14 updates can be applied immediately.
自動で入るのはセキュリティの更新だけなので、それ以外の更新は残ったままになります。いい機会なので、まとめて入れました。
apt update && apt upgrade -y
The following packages will be upgraded:
apparmor cloud-init gir1.2-glib-2.0 libapparmor1
libglib2.0-0t64 libglib2.0-bin libglib2.0-data
libopeniscsiusr open-iscsi open-vm-tools snapd tmux
ubuntu-pro-client ubuntu-pro-client-l10n
14 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
この14個の中にNginxは入っていません。Nginxは、もう自動で最新になっていたからです。
更新が終わると、最後に「あとで再起動が必要なサービス」がいくつか出ました。まとめて反映させるために、サーバーを再起動して、ブログがいつもどおり表示されることを確かめました。
reboot
ちなみに、ログイン画面には New release '26.04.1 LTS' available. とも出ていました。これはUbuntuそのものを新しい版に上げる案内で、普段の更新とは別物です。今の24.04も、まだ何年もセキュリティの更新が続くので、今回は上げていません。
ついでにやったこと:バージョンを外に見せない
Ubuntuに入れたNginxは、最初の設定のままだと、返事(レスポンス)の中に自分のバージョンを書いて返します。PCのPowerShellから、こう打つと確かめられます。
curl.exe -I https://noluckblog.com/
最初の設定のままだと、Server: nginx/1.24.0 (Ubuntu) のような行が出ます。Server: の行に、Nginxのバージョンとサーバーの種類が出ているということです。攻撃する側から見ると、「このサイトは、あのバージョンのNginxだな」と最初から分かってしまいます。
隠すのはかんたんで、サーバーの /etc/nginx/nginx.conf の http { } の中にある1行の # を外すだけです。
# server_tokens off;
↓
server_tokens off;
nginx -t
systemctl reload nginx
最初、サーバーに入ったまま curl.exe -I を打ってしまい、curl.exe: command not found と出ました。curl.exe はWindowsでの名前なので、exit でサーバーから抜けて、PCのPowerShellで打ち直します。
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html
Connection: keep-alive
Accept-Ranges: bytes
Server: nginx だけになり、バージョンが消えました。
もちろん、バージョンを隠しても穴がふさがるわけではありません。アップデートが本当の対策で、これは「わざわざ教えない」くらいのおまけです。
問題と対策のまとめ
今回調べたことを、表にまとめておきます。
| 何の問題か | 何が起きうるか | 当てはまる人 | 対策 |
|---|---|---|---|
Nginxの alias / map / SSI まわり |
Nginxを落とされる。好きなプログラムを動かされる | その設定を使っているNginx | apt update && apt upgrade で修正版にする。すぐにできないなら、map で名前のない正規表現を使わない |
| Nginxのバージョンが外から見える | 攻撃する側に、狙える穴があるか見当をつけられる | server_tokens を設定していないNginx |
server_tokens off; を書く |
| PHPのメモリの問題(2件) | ログインなしで、好きなプログラムを動かされる | PHPで動いているサイト全部(WordPressも) | PHPを修正版(8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 以降)にする。すぐにできないなら session.upload_progress.enabled を切り、post_max_size を小さくする |
| WordPressのプラグインやテーマ | プラグインの穴から乗っ取られる | WordPressのサイト | 使っていないプラグインは消す。自動更新をオンにする |
| アップデートのし忘れ | 直った穴が、自分のサーバーだけ開いたまま | サーバーを自分で管理している人全員 | unattended-upgradesで、セキュリティ更新を自動で入れる。それ以外の更新も、月1回は手で入れる |
| SSHのパスワードログイン | パスワードを総当たりで当てられる | パスワードでSSHに入れる設定のサーバー | 鍵認証だけにする(→ SSHの点検) |
感想
もしセキュリティ関係の仕事に就いたら、毎日のように出てくる新しい脅威からシステムを守らなければなりません。だから、ニュースや情報を自分から集めにいく力も大事なのだと思いました。
それと、新しい脅威は予定とは関係なくやってきます。ガントチャートでしっかり計画を立てても、こういう「例外」は必ず起きます。だからこそ、日ごろから定期的な更新を欠かさないことが大事だと感じました。
これからやること
- 月に1回は、サーバーで
apt update && apt upgradeを打つ - 自動更新(unattended-upgrades)がちゃんと動いているか、ときどき確かめる
- Nginxの設定を足すときは、何をしている1行なのかを調べてから書く
- 今後WordPressを触るときは、PHPのバージョンも気にする
あわせて読みたい
- VPSのSSHを点検したら、パスワードログインが有効のままで、使っていない鍵も残っていた — 前にやったサーバーの点検
- 【第5回】環境づくり編 — SSH・ufw・Nginx・Hugoを準備する — このブログのNginxの設定
- 【番外編1】www統一編 — wwwあり・なしのURLを1つにまとめる —
wwwを転送している設定