official-images

What does it do?

This repository is the primary source of truth for the Docker “Official Images” program. [1] That program covers curated images hosted on Docker Hub, with stated aims such as focusing on free and open-source software and supporting multiple architectures. [2] It also provides review guidelines for proposed contributions to the official images standard library. [3]

Activity, over time

Daily observations from the public event archive.

Attention

Daily stars & forks

Loading attention chart

Star accumulation

Cumulative stars

Loading star accumulation chart

Pull requests

Daily opens & merges

Loading pull requests chart

Conversations

Daily issues & comments

Loading conversations chart

Community

Daily accounts & reviews

Loading community chart

Releases

Daily releases

Loading releases chart

Mentions

51posts · 30d
Nov 30 posts
  1. Qiita · · @dkuro

    PHP2Shell で、対応をオープンにしている会社 はじめに 2026 年 10 月 21 日に修正版が出た PHP の深刻な脆弱性 PHP2Shell では、修正版が出る前からサービスを止める会社も出るなど、緊急の対応が相次ぎました。 前回は、レンタルサーバー各社で、脆弱性のある状態で利用者のサイトに外部からアクセスできた時間を並べ、自前でサービスを動かしている所も 5 つ図に入れました。 前回の終わりに書いたとおり、自社でサービスとインフラの両方を持っていれば、止めるか、配布元を待たずに自分でビルドするか、いつ再開するかを、すべて自社で決められます。 今回は、自前で動かしている会社のうち、対応の経緯をオープンにしていた 3 社、GREE・pixiv・コドモンを紹介します。 自分たちで判断して手を動かし、その時刻や経緯を記録しているから、ここまでオープンにできるのだと考えています。 3 社がオープンにしていること 3 社とも、公式のお知らせやブログに次の 3 つを書いています。 - サービスを止めた時刻 - サービスを戻した時刻(一部だけ戻したのか、全部戻したのかも分けて) - 止めた理由が PHP の脆弱性であること 攻撃を避けるためにソフトウェアの名前を伏せる所や、始めた時刻だけをお知らせする所も多い中で、3 社はここまで公開していました。 3 社の止めた時間 gantt title 3 社がサービスを止めていた時間(日本時間) dateFormat YYYY-MM-DD HH:mm axisFormat %m/%d %H時 section 予告と公開 予告(oss-security) :milestone, 2026-10-21 05:22, 0m 修正版の公開 :milestone, 2026-10-21 22:34, 0m section GREE サービス全体を停止 :active, 2026-10-21 23:30, 2026-10-22 06:55 SNS と決済は復旧、一部のゲームは復旧中 : 2026-10-22 06:55, 2026-10-22 15:00 section pixiv メンテナンスモード :active, 2026-10-21 19:00, 2026-10-21 23:16 section コドモン 主要サービスを停止 :active, 2026-10-21 14:49, 2026-10-22 03:22 一部の機能は停止を続ける : 2026-10-22 03:22, 2026-10-23 09:00 PHP 公式は日本時間の 10/21 早朝、修正版を 23:00 に出すと予告しました(oss-security への投稿は 5:22)。実際に出たのは 30 分ほど早い 22:34 です(GitHub の security advisory の公開時刻)。 GREE GREE はサービス全体を止めました。 - 10/21 23:30 ごろ: サービス全体を止めて緊急メンテナンスを開始 - 10/22 6:55 ごろ: メンテナンスを終了し、SNS や決済などを復旧(一部のゲームは復旧作業を続ける) - 10/22 15:30: 全体復旧の見込み(15 時ごろ)のあと、タイトルに「【復旧】」と付けてお知らせを更新 修正版が出てから 1 時間ほどでサービス全体を止め、7 時間半ほどで SNS や決済などのプラットフォームの機能から先に戻しています。 お知らせでは、PHP の脆弱性が公表されたことを受けてシステムの安全性を確保するための対応だと、理由を説明しています。使っているソフトウェアの名前を伏せずに示しています。 復旧作業が続いていた一部のゲームについては、各ゲームのお知らせを見るよう案内しています。全体の状況はこのお知らせ、個別のゲームは各ゲームのお知らせ、と案内先を分けています。 全体が復旧する見込みは 10/22 15 時ごろと示し、15:30 にはお知らせのタイトルに「【復旧】」と付けて更新しました。被害やデータの流出は確認されていないことも明記し、問い合わせフォームも案内しています。停止から一部の復旧、全体の復旧まで、段階ごとに時刻を追える書き方になっています。 pixiv pixiv は修正版が出る前にサービスを止めて待機し、予定(23:00)より早く 22:34 に出た修正版を 22:41 に確認して、そこから 35 分で再開しました。 利用者向けのお知らせとは別に、公式ブログ(pixiv inside)に作業の時刻が分単位で残っています。 - 10/21 19:00: 影響を受けうるサービスをメンテナンスモードにする - 22:41: 予定(23:00)より早く出た修正版(22:34 公開)を確認 - 22:42〜22:56: コンテナイメージのビルド - 22:56〜23:16: Kubernetes へのデプロイ(ステージングでの確認を含む) - 23:16: メンテナンスモードを解除 35 分で戻せたのは、修正版が出る前に準備を済ませていたからです。 Docker 公式イメージのビルドスクリプトを使って、PHP のバージョンだけを差し替えられるようにしていました。公式イメージの公開を待たずに、ソースから自前でビルドする経路も用意していました。 Docker 公式イメージの更新がマージされたのは 10/22 0:16 で、pixiv が再開した 23:16 の 1 時間後です。配布元を待たずに自前でビルドしたことで、この 1 時間の待ち時間を減らせています。 またブログでは、メンテナンスモードが入っていないエンドポイントがあったことも課題として挙げています。今回は条件がそろっていただけで、毎回この手順で済むとは限らない、とも振り返っています。 コドモン コドモンは、保育施設と保護者が使うサービスです。 修正版が出る 8 時間ほど前の 14:49 までに、対象となる全サービスを止めました。 - 10/21 9:01: 社内で把握 - 11:37: 23:00 の公開に合わせて、夜に止める方針で合意 - 12:37: 情報が広まってきたのを受けて、前倒しで止めると決定 - 13:00 ごろ〜14:49: 順に止め、全対象サービスの停止を完了 - 22:38: 修正版の公開を検知 - 10/22 3:22: 職員用の管理画面、保護者向けの連絡帳アプリなどを再開 - 10/23 9:00: 最後まで止めていた所在確認アラートを再開 止めると決めた理由も書いています。お預かりしているお子さまの情報を守ることを最優先にした、という判断です。 一部のサービスだけ止める案、お迎えの時間まで動かす案、監視を強めて検知したら止める案も検討し、採らなかった理由を一つずつ書いています。 反省点も並べています。修正版が届く時刻が PHP の配布元ごとに違うことを事前に把握していなかったこと、作業と判断が深夜に集中したこと、予防のための停止だと利用者に伝わりにくかったこと、などです。 何を重視するかで、止め方は変わる 3 社とも自社で決められる立場でしたが、止めた時刻と戻し方はそれぞれ違っていました。コドモンは修正版が出る 8 時間ほど前の 14:49 までに、pixiv は出る前の 19:00 に、GREE は出てから 1 時間ほどあとの 23:30 ごろに止めています。 自分のサービスで同じ判断をするなら、何を重視するかで、次のように選び方が変わります。 | 何を重視するか | 止め方 | 近い対応をした会社 | |---|---|---| | 利用者の情報を守ることを最優先 | 修正版が出る前に、日中でも前倒しで止める | コドモン | | 止める時間を短くしたい | 準備を済ませてから止めて待ち、出たらすぐ当てて戻す | pixiv | | 公開まではふだんどおり動かし、戻すときは確実に | 出てからサービス全体を止め、段階的に戻す | GREE | - コドモン は、お迎えの時間まで動かす案も比べたうえで、お子さまの情報を守ることを最優先にして日中に止めました。主要なサービスを 10/22 3:22 に戻し、残りの機能も翌日に再開しています - pixiv は、修正版をすぐ当てられるように準備してから 19:00 に止めました。修正版が出たあと自前でビルドして当て、23:16 に再開しています - GREE は、修正版が出たあとの 23:30 ごろにサービス全体を止めました。翌朝 6:55 ごろに SNS や決済などのプラットフォームを先に戻し、各ゲームの復旧はそれぞれのお知らせで案内しています 修正版が出る前から止めて安全を優先するやり方も、準備を整えて止める時間を短くするやり方も、公開後に全体を止めて段階的に戻すやり方もあります。唯一の正解はなく、サービスの性質と何を守りたいかで、選び方は変わります。 自分たちで決めて記録しているから、オープンにできる 3 社に共通するのは、サービスもインフラも自社で持っていることです。止めるかどうか、どこまで止めるか、いつ戻すかを、配布元やほかの会社の判断を待たずに自分たちで決められます。 自分たちで決めて自分たちで作業しているので、いつ何をしたか、なぜそうしたかを、自社の記録だけで正確に書けます。 - GREE は、全体を止めるタイミングも、SNS や決済から先に戻す順番も自社で決めています。そのため、停止から一部の復旧、全体の復旧まで、段階ごとの時刻をそのままお知らせに出せています - pixiv は、Docker 公式イメージの更新を待たずに、コンテナイメージのビルドから Kubernetes へのデプロイまでを自分たちで動かしています。作業を自社で完結させているから、分単位の記録をブログに残せています - コドモン は、社内で把握した 9:01 から方針を変えた 12:37 まで、判断した時刻と理由を記録していました。自分たちで比較して決めているから、採らなかった案とその理由まで公開できています 判断から作業までが自社の中で完結していて、その記録も残っているから、ここまで具体的な時刻や経緯をオープンにできます。 前回のレンタルサーバーは、この点で条件が違います。インフラは業者のものでも、その上で動くサイトは利用者のものです。業者が利用者のサイトを止めれば、利用者の業務も止まるため、業者だけの判断では止めにくい事情があります。また、自前でビルドするのではなく配布元のパッケージを待つ構成なら、対応を始める時刻も配布元しだいになります。利用者との関係や作業工程の制約があるので、すべてを自社だけで決めて動ける 3 社と同じようにはいかない所があるのは仕方ありません。 おわりに 今回紹介した 3 社は、対応を自社で決めるだけでなく、サービスを止めた時刻と再開した時刻、そして PHP の脆弱性への対応であることを明記していました。さらに pixiv はビルドからデプロイまでの分単位の記録を、コドモンは方針変更の時刻や採らなかった案の理由まで公開しています。 自分たちで判断して対応し、その記録を残しているから、いつ止めていつ戻したかを正確に出せるだけでなく、判断や作業の経緯までオープンにできる。そこがこの 3 社の良さです。 本記事の情報は 10/29 時点のものです。 参考文献 - GREE「【復旧】緊急メンテナンスについて」 games.gree.net - pixiv お知らせ pixiv.net - pixiv inside「PHP2Shell」対応の記録 inside.pixiv.blog - コドモン Product Team Blog「PHP2Shellへの対応を振り返って」 tech.codmon.com - oss-security(予告) openwall.com - Docker official-images #22541 official-images#22541 - GitHub の security advisory(修正版の公開の時刻 13:34 UTC)github.com/php/php-src/security/advisories/GHSA-w… ・ github.com/php/php-src/security/advisories/GHSA-6…

    1 like
  2. Qiita · · @dkuro

    PHP2Shell で、サイトが無防備だった時間 はじめに PHP2Shell について、Qiita にもいろいろな記事が出ています。 みなさんの記事を読んでいてふと思いました。 利用者のサイトが脆弱性のある状態で外部からアクセスできるままになっていた時間を、各社のお知らせから測ってみようか、と。 ちなみに、私が昔いた現場はパッチの適用が数日遅れていました。さもありなん、です。 PHP の脆弱性の話になると、PHP を使う開発者だけでなく、レンタルサーバーの業者までいい加減なのでは、と言われがちです。私も最初はそう思っていました。 脆弱性のある状態で利用者のサイトを外部にさらしていたこと自体は、インフラを預かる業者の責任です。ただ、それが「いい加減だったから」なのか、作業の工程上しかたない部分があったのかを、公式のお知らせの時刻で確かめます。 予告から公開まで PHP 公式は日本時間の 10/21 早朝、深刻度 9.2 の脆弱性 2 件の修正版を 23:00 に出すと予告しました(oss-security への投稿は 5:22)。実際に出たのは 22:34 です(GitHub の security advisory の公開時刻)。 gantt title 予告から修正版の公開まで(日本時間) dateFormat YYYY-MM-DD HH:mm axisFormat %m/%d %H時 section 予告と公開 予告(oss-security) :milestone, 2026-10-21 05:22, 0m 修正版がない時間(17 時間あまり) : 2026-10-21 05:22, 2026-10-21 22:34 修正版の公開 :milestone, 2026-10-21 22:34, 0m 一方で、悪用の試みは公表前の 10/17 から見つかっていたことが判明しています。 予告より早く出た理由は公表されていません。 各社の対応時刻と停止期間 安全になるための条件は、パッチを当て終えることです。 ただ、当て終えた時刻だけでは、危険だった時間は分かりません。先にサイトを止めていれば、そのあいだは外部からアクセスできないからです。 そこで、止めた時間と当て終えた時刻の両方を図にしました。 図の最上段は予告と公開の時刻です。その下がレンタルサーバー、いちばん下が自前でサービスを動かしている所で、バーの色は次のとおりです。 - 赤いバー(露出): 予告のあと、サイトの停止や緩和策、パッチの適用がまだで、脆弱性のある状態で外部からアクセスできた時間 - 薄い青のバー(停止): サイトやサービスを止めていた時間 - 青紫のバー: 緩和策を入れていた時間、またはパッチを順番に当てていた時間 - 灰色のバー: パッチを当て終えた後、または表示を再開した後 「自前」は、レンタルサーバーを借りずに、自社のサービスを自社で用意したサーバー(クラウドを含む)で動かしている所のことです。外部から見ても PHP を使っているかどうか分からないので、止めた時間だけを描いています。 gantt title 予告から公開後までの状態(日本時間) dateFormat YYYY-MM-DD HH:mm axisFormat %m/%d %H時 section 予告と公開 予告(oss-security) :milestone, 2026-10-21 05:22, 0m 修正版の公開 :milestone, 2026-10-21 22:34, 0m section レンタルサーバー エックスサーバー 露出 :crit, 2026-10-21 05:22, 2026-10-21 12:00 エックスサーバー 緩和策のみ・順次適用(全部の完了は 10/26) : 2026-10-21 12:00, 2026-10-23 12:30 コアサーバー V1 ほか 露出 :crit, 2026-10-21 05:22, 2026-10-22 00:50 コアサーバー V1 ほか 適用済み :done, 2026-10-22 00:50, 2026-10-23 12:30 mixhost 露出 :crit, 2026-10-21 05:22, 2026-10-22 10:18 mixhost 適用済み :done, 2026-10-22 10:18, 2026-10-23 12:30 ヘテムル 露出 :crit, 2026-10-21 05:22, 2026-10-22 03:05 ヘテムル サイトを停止 :active, 2026-10-22 03:05, 2026-10-22 11:24 ヘテムル 表示を再開 :done, 2026-10-22 11:24, 2026-10-23 12:30 お名前.com 露出 :crit, 2026-10-21 05:22, 2026-10-22 20:45 お名前.com 適用済み :done, 2026-10-22 20:45, 2026-10-23 12:30 KAGOYA 露出 :crit, 2026-10-21 05:22, 2026-10-22 14:40 KAGOYA 順次適用 : 2026-10-22 14:40, 2026-10-23 00:00 KAGOYA 適用済み :done, 2026-10-23 00:00, 2026-10-23 12:30 section 自前で動かすサービス BASE 停止 :active, 2026-10-21 15:50, 2026-10-22 08:00 ジンジャー 停止(終わりは予定の時刻) :active, 2026-10-21 17:00, 2026-10-22 05:00 freee の 4 サービス 停止 :active, 2026-10-21 19:04, 2026-10-22 12:56 Garoon クラウド版 停止 :active, 2026-10-21 21:00, 2026-10-22 03:01 LoGo フォームの PDF 印刷 停止 :active, 2026-10-21 21:00, 2026-10-22 02:09 図に入れた自前の 5 つは songchong さんの記事から取ったもので、どれも修正版が出る前に止めています(同じ記事にあるほかの 6 つは、公開のあとに止めています)。 レンタルサーバー各社の動きは次のとおりです。 - ヘテムル・ロリポップ!: パッチが当たるまで利用者のサイトごと止めた 2 社です(ロリポップ!は止めた時刻の記載がないので図にはありません) - エックスサーバー: サイトは止めませんでしたが、公開前の 12:00 までに緩和策を入れ、公開後は順次パッチを当てています - コアサーバー V1 など: 止めずに、公開から 2 時間ほどで当て終えています 図に入れていない所は次のとおりです。 | 事業者 | 止めた・緩和策 | パッチの適用 | |---|---|---| | ロリポップ! | 10/21 からサイトの表示を停止 | 10/22 15:33 の更新で適用済み | | さくらのレンタルサーバ | 10/21 22:30 から会員関連の機能を緊急メンテナンス | 10/23 に適用済み | | WebARENA | 10/21 に緩和策と、海外からのアクセスの停止 | 10/22 17:30 から緊急メンテナンス | | ConoHa WING | ファイルマネージャーと Web メールを停止 | 10/22 時点で順次適用中 | | CPI | — | 8.2〜8.4 は 10/22、7.4・8.0 は 10/27〜10/29 | レンタルサーバーの時刻は、各社の公式のお知らせから拾いました(10/27 に確認)。並べたのはお知らせに書かれた時刻(またはお知らせの更新時刻)で、必ずしも全部のサーバーに当て終えた時刻ではありません。 ただ、こうして並べても「各社が何時間、脆弱性のある状態で外部にさらしていたか」は一つの数字に決まりません。 10/17(悪用の試みが見つかった日)と 10/21(公式の予告)のどちらから数えるかで 4 日ずれますし、サイトを止めたのか、お知らせに書いていないだけなのか、区別のつかない所があるからです。 !どこから数えるか(10/17〜10/29) 当て終えるまでに時間がかかった理由(推定) - 公式の修正版は 8.2〜8.5 だけで、古いバージョンはバックポートか独自の修正待ち - 一度に当てず順番に当てたので、全体が終わるまで時間がかかった(KAGOYA は 14:40〜24:00 の 9 時間あまり。順番にした理由はお知らせに書かれていません) - パッケージで PHP を入れている場合は、配布元(CloudLinux や remi など)のビルドを待つ必要があった(下の表) - 公開直後は配布元にアクセスが集中し、つながりにくくなった所があった(Ubuntu 向けパッケージの配布に使われる Launchpad が 503 エラー、php.net が 504 エラー) !修正版がサーバーに当たるまでの 3 つの経路 配布元が修正版のパッケージを出した時刻は次のとおりです(比較のため、先頭に PHP 公式の公開時刻を入れています)。 | 配布元 | 出た日時(日本時間) | 修正版の公開から | |---|---|---| | PHP 公式(ソースコード) | 10/21 22:34 | — | | Debian(DSA 6574-1) | 10/21 22:45 | 11 分 | | Ubuntu(USN-8948-1) | 10/21 22:56 | 22 分 | | Debian LTS(DLA 4848-1) | 10/21 23:11 | 37 分 | | Ondřej Surý の PPA(Launchpad) | 10/21 23:45 | 1 時間 11 分 | | Docker 公式イメージ(official-images へのマージ) | 10/22 0:16 | 1 時間 42 分 | | Red Hat Enterprise Linux 8〜10(AlmaLinux 9 も同じ日) | 10/21(UTC・時刻なし) | — | | remi(RHEL 系で広く使われるリポジトリ) | 10/22 21:58 | 23 時間 24 分 | | Red Hat の延長サポート向け(EUS など) | 10/23(UTC・時刻なし) | — | 多くの配布元は、公開から 2 時間以内にパッケージを出しています。待ちが長かったのは remi と、Red Hat の延長サポート向けです。 レンタルサーバー各社が修正をどこから得たかは、お知らせに次のように書かれています。 | 事業者 | 修正の出どころ(お知らせの記載) | |---|---| | エックスサーバー | 8.2〜8.5 は修正版に更新、5.1〜8.1 はバージョンを変えずに修正パッチを適用。出どころの記載なし | | コアサーバー V1 | 記載なし | | mixhost | 採用している CloudLinux の修正パッケージ。サポートが終わったバージョンも CloudLinux が独自に修正 | | ヘテムル | 公式の修正版がない古いバージョンは、自社で修正を作成 | | ロリポップ! | 公式の修正版が出たバージョンはそれを適用し、ほかは自社で独自に修正 | | お名前.com | バージョンを変えずにパッチを適用。出どころの記載なし | | KAGOYA | 修正版に更新。出どころの記載なし | | さくらのレンタルサーバ | 記載なし | | WebARENA | 記載なし | | ConoHa WING | バージョンを変えずにパッチを適用。出どころの記載なし | | CPI | 8.2〜8.4 は修正パッチを適用、7.4・8.0 はパッチ適用版を準備。出どころの記載なし | 配布元のパッケージを待っていたと書いている所はありませんでした。当て終えるまでにかかった時間のうち、どこまでが配布元の待ちによるものかは、お知らせからは分かりません。 主な配布元の時刻を、さきほどの図の最上段に足すと次のとおりです(自前の段は省きました)。レンタルサーバー各社のバーと見比べられます。 gantt title 配布元の公開時刻とレンタルサーバーの対応(日本時間) dateFormat YYYY-MM-DD HH:mm axisFormat %m/%d %H時 section 予告・公開・配布元 予告(oss-security) :milestone, 2026-10-21 05:22, 0m 修正版の公開 :milestone, 2026-10-21 22:34, 0m Debian(22時45分)・Ubuntu(22時56分) :milestone, 2026-10-21 22:45, 0m Ondřej Surý の PPA :milestone, 2026-10-21 23:45, 0m Docker 公式イメージ :milestone, 2026-10-22 00:16, 0m remi :milestone, 2026-10-22 21:58, 0m section レンタルサーバー エックスサーバー 露出 :crit, 2026-10-21 05:22, 2026-10-21 12:00 エックスサーバー 緩和策のみ・順次適用(全部の完了は 10/26) : 2026-10-21 12:00, 2026-10-23 12:30 コアサーバー V1 ほか 露出 :crit, 2026-10-21 05:22, 2026-10-22 00:50 コアサーバー V1 ほか 適用済み :done, 2026-10-22 00:50, 2026-10-23 12:30 mixhost 露出 :crit, 2026-10-21 05:22, 2026-10-22 10:18 mixhost 適用済み :done, 2026-10-22 10:18, 2026-10-23 12:30 ヘテムル 露出 :crit, 2026-10-21 05:22, 2026-10-22 03:05 ヘテムル サイトを停止 :active, 2026-10-22 03:05, 2026-10-22 11:24 ヘテムル 表示を再開 :done, 2026-10-22 11:24, 2026-10-23 12:30 お名前.com 露出 :crit, 2026-10-21 05:22, 2026-10-22 20:45 お名前.com 適用済み :done, 2026-10-22 20:45, 2026-10-23 12:30 KAGOYA 露出 :crit, 2026-10-21 05:22, 2026-10-22 14:40 KAGOYA 順次適用 : 2026-10-22 14:40, 2026-10-23 00:00 KAGOYA 適用済み :done, 2026-10-23 00:00, 2026-10-23 12:30 危険な時間を減らすには ここからは私の見方です。 いい加減だったのか 測ってみた結果、業者がいい加減だったとは言えません。時間がかかった所も、作業の工程の限界によるものだと私は見ています。 - 主な配布元は修正版の公開から 2 時間以内にパッケージを出し、レンタルサーバーでも公開から 2 時間ほどで当て終えた所(コアサーバー V1 など)があります - 予告から公開までのあいだに、手を打った所があります。エックスサーバーは 12:00 までに緩和策を入れ、ヘテムルは 13:30 ごろから phpMyAdmin などの機能を止め始め(サイトの表示を止めたのは 10/22 3:05)、さくらは 22:30 から会員関連の機能の緊急メンテナンスに入りました - 公式の修正版がない古いバージョンにも手当てをしています。ヘテムルとロリポップ!は自社で修正を作り、mixhost は CloudLinux の修正を使い、エックスサーバーは 5.1 まで対応を広げました もちろん、パッチが当たるまでのあいだ、脆弱性のある状態で利用者のサイトを外部にさらしていた責任は業者にあります。 ただ、完了が翌日以降になった所も、手を抜いていたとは言えません。古いバージョンを抱えていたり、配布元のパッケージを待つ構成だったり、順番に当てる必要があったりすれば、作業の工程上、すぐには当て終えられないからです。 CERT-EU・英国の NCSC・米国の NSA・日本の IPA は、すぐ当てられないなら止めるよう呼びかけていました。サイトを止めてからパッチを当てるやり方は、再開が遅くなっても安全です。呼びかけどおりサイトごと止めたヘテムルとロリポップ!がこれにあたります。 とはいえ、レンタルサーバーが利用者のサイトを止めるのは簡単ではありません。 レンタルサーバーの業者はインフラを持っていますが、その上で動くサイト(サービス)は利用者のものです。止めれば利用者の業務が止まり、動かし続ければ脆弱性にさらされるので、業者だけでは決めにくい立場にあります。 これに対して、自社でサービスとインフラの両方を持っている会社は、サービスを止めるか、配布元を待たずに自分でビルドするか、いつ再開するかを、すべて自社で決められます。さきほどの図で、自前の 5 つが修正版の公開前に止めていたのも、自社で決められる立場にあったから取れた手です。 時刻を分単位で出している所は、測られてもいいと分かって出している所です。書いていない所が悪い、という話ではありません。 どこで露出していたか ここまでの図と表から、露出していた時間は 2 つに分かれます。 !露出していた時間は 2 つに分かれる(レンタルサーバー) 1 つ目の「予告から公開まで」は、この図のレンタルサーバーではエックスサーバーが 12:00 までに緩和策を入れ、さきほどのガントチャートにあった自前の 5 つが公開前にサービスを止めていました。 2 つ目の「公開から当て終える・止めるまで」は、サポート切れの古いバージョンほど長引いています。公式の修正版がないため自社で作るか CloudLinux などから得る必要があり、図に入れていない CPI の PHP 7.4・8.0 は適用が 10/27〜10/29 でした。 減らすためにできること 1 で「予告から公開まで」、2・3 で「公開から当て終えるまで」の 2 つの露出時間を減らし、4・5 で利用者ごとの影響と確認の手間を減らせます。 !2 つの時間を、どこで減らすか 1. 予告の段階(止めるか遮断するか): 止めるか動かし続けるかを利用者が前もって選べる設定(Google Compute Engine のメンテナンス設定のようなもの)を用意し、動かし続ける利用者は WAF で攻撃のリクエストを遮断します。Cloudflare は今回、修正版の公開の 10 時間半ほど前に、PHP2Shell を遮断するルールを既定でオンにしています 2. 配布元を待たない経路: ソースからビルドできるようにしておけば、パッケージを待たずに済みます。pixiv は公式イメージの公開を待たずにビルドする経路を用意していて、修正版に気づいてから 35 分で再開しました。Docker 公式イメージの更新がマージされたのは、その 1 時間後の 10/22 0:16 です 3. サポート切れのバージョンへの備え: 古いバージョンほど修正に時間がかかりました。移行の期限を決めておくか、TuxCare のようなバックポートを使えるようにしておきます 4. アカウントごとの実行環境の分離: 順番に当てると全体が終わるまで時間がかかります。mixhost が採用している CloudLinux には、アカウントごとに PHP を選べる PHP Selector があります 5. 露出していた時間の利用者ごとの通知: 順番に当てた場合、全体の完了時刻だけでは自分のサイトがいつまで露出していたか分かりません。その利用者のサイトに外部からアクセスできた時間を知らせます 処理の流れにすると、次のとおりです。 flowchart TD A[予告が出る] --> B{利用者ごとの設定} B -->|止めて待つ・既定| C[サイトを止める] B -->|動かしたまま| D[WAF で攻撃のリクエストを遮断する] E[上流を待たずにソースからビルド] --> F[修正版を当てる] G[サポート切れのバージョン] -->|期限を決めて移行か、バックポート| F C --> F D --> F F --> H[再開して、外部からアクセスできた時間を利用者ごとに通知] subgraph アカウントごとに分けた PHP の実行環境 B C D F end !危険な時間を減らす処理の流れ 必要な仕組みは、どれも既存の製品や機能にあります。これらをあらかじめ組み合わせておけば、作業の工程でどうしてもかかる時間があっても、外部にさらす時間は減らせます。 もっとも、いちばん強いのは、外部からアクセスできる公開側に PHP の実行環境(ランタイム)を置かないことです。前回の話のとおり、置かなければ、さきほどの対応の図に並ぶこともありません。 おわりに 脆弱性のある状態でサイトを外部にさらしていた責任はレンタルサーバー業者にあります。ただ、時間がかかったのは業者がいい加減だったからではなく、作業の工程や、利用者のサイトを業者だけでは止めにくい立場によるものです。そのうえで、前もって仕組みを組み合わせておけば、危険な時間はまだ減らせます。 一方で、自社でサービスとインフラの両方を持っていれば、止める判断もビルドの手順も自分で決められます。次の記事では、自前でサービスを動かしている会社のお知らせから、止めた時刻と戻した時刻、そこに至る経緯まで詳しく公開していた 3 社(GREE・pixiv・コドモン)を取り上げています。 10/27 時点の情報です。サイトの側から見た Tivo0921 さんの記事もあわせてどうぞ。 興味のある方の参考になれば幸いです。ご指摘は歓迎します。 参考文献 - PHP News Archive 2026 php.net - oss-security(予告) openwall.com - 配布元: Debian DSA 6574-1・Debian DLA 4848-1・Ubuntu USN-8948-1・Ondřej Surý の PPA・Docker official-images #22541・Red Hat・remi - GitHub の security advisory(修正版の公開の時刻 13:34 UTC)github.com/php/php-src/security/advisories/GHSA-w… ・ github.com/php/php-src/security/advisories/GHSA-6… - Tenable(10/17 の悪用の試み) tenable.com - 各社のお知らせ: エックスサーバー・同 停止・コアサーバー V1・mixhost・ヘテムル・ロリポップ!・お名前.com・KAGOYA・さくら・WebARENA・ConoHa WING・CPI - UptimeRobot(配布元の混雑) uptimerobot.com - IPA 注意喚起 ipa.go.jp - Cloudflare の WAF(ppc.land) ppc.land - CloudLinux PHP Selector support.cpanel.net - TuxCare(Plesk) plesk.com - Google Compute Engine cloud.google.com

    1 like
  3. Seems like this situation is about to change. Thank you Ruby core team for your hard work!!! official-images#22616

    31 likes · 2,035 views
  4. The hero gets the bill Last night, at about half six, I'd finished work for the day and was settling in for an hour or two on a new side project (a heads-up display for keeping track of the twenty or so agent sessions I seem to run these days, but that's a post for another time). My phone went. A friend, a fellow Scout leader and a DevOps sort, had forwarded me an email he'd just had from the Scouts. The UK's National Cyber Security Centre had put out guidance about a critical flaw affecting some websites, and the Scouts were asking every volunteer who looks after a group, district or county website to check whether it runs PHP and, if it does, to patch it or take it down. Underneath, he'd written: "I think this is time for thephpboyscout to shine 🙂" I laughed, told him that, looking at the news, smarter minds than mine had already fixed it, and went back to my side project. A second friend sent me The Register's write-up a little later and I didn't even open it. I don't run PHP in anything these days, it had been a long day, and the shiny new toy was a lot more interesting. My whole reaction was a shrug and a "here we go again, everyone bashing on PHP". Then this morning, sat in bed with a coffee and Hailey, doing the morning doom scroll, my feed was wall to wall with it. Reels, TikToks, people talking to camera with that slightly-too-wide-eyed look. And it slowly dawned on me that this wasn't the usual PHP-shaped news story at all... this was a real one. What stopped me in my tracks was the reaction. Sites were taking themselves offline. Two bugs and a fire alarm If you've somehow managed to miss it, here's the short version. Two vulnerabilities, published together on Wednesday as CVE-2026-109618 and CVE-2026-109619, both rated 9.2 out of 10, both allowing someone with no account and no credentials to run their own code on a PHP server. Someone christened them "PHP2Shell", because of course they did, and they got a logo and a website before most people had read the advisory. So, PHP lets you cap how much memory a single request can use, the memory_limit setting you've almost certainly bumped at some point to stop an import script falling over. When a request goes over that limit, PHP doesn't hand back a polite error and tidy up, it pulls the fire alarm and legs it out of whatever it was in the middle of (in C terms it uses longjmp, which is about as subtle as it sounds). If it happened to be halfway through building something when the alarm went, that half-built thing gets left lying about, and the clean-up crew that runs at the end of the request later trips over it and treats it as finished. Get the timing right with a carefully stuffed upload and you get to decide what the clean-up crew trips over. The second bug is a cousin of the first: a fatal error leaves a pointer to the previous request's memory lying around for the next request on the same worker to pick up. Under Apache's mod_php the first one fires before a single line of your application runs, with default settings. So it doesn't matter how good your WordPress plugins are, or how carefully your framework validates input... this lives underneath all of that. The fix shipped in PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35, and it's a big one: 300 files and nearly eleven thousand added lines, getting on for half of them tests, which changes how PHP runs out of memory altogether. And the advice from the PHP project, the agencies and every explainer on my feed boiled down to the same thing: there's no setting that makes this safe, so upgrade. (If you want to check my working on any of what follows, I've put the research notes up alongside this post, warts and all.) Three facepalms in twenty-four hours I'd love to tell you the disclosure went smoothly. The PHP Foundation's own write-up says it went well right up until two days before release, and then the wheels came off one at a time. On Tuesday afternoon the two CVE numbers started circulating on forums and social media, complete with the wrong release time and a wrong severity score of 10.0. Someone with early access couldn't keep it to themselves. That's facepalm number one, and it's negligence, plain and simple. PHP responded by bringing everything forward a day. That same evening Calif, one of the security firms that had reported the bugs, accidentally published a video of their proof of concept working against a string of real applications (with a dancing anime character in the corner, which one Hacker News commenter assured everyone is "a sign of credibility" in some circles). It was taken down, but copies were doing the rounds soon after. Facepalm number two, and that one's just sloppy. And then, at 07:41 UTC on Wednesday, more than six hours before the coordinated release, Chainguard published container images with the fix already built in. Facepalm number three! That's the one that really got my blood up when I first read it, so I went digging. The fix commit was written days earlier, but going by the git history it only landed on PHP's public branches at 14:06 UTC on Wednesday, about half an hour after the advisories went live. (Git timestamps aren't proof of when something was pushed, so take that as "no sign of it in public any earlier" rather than gospel.) The CVE leak and the video gave away that something was coming and roughly where to look. Chainguard's images gave away the patched code itself, as binaries anyone can diff against the old ones, six and a half hours before the source was public. With AI in the mix, six hours is an eternity. Now, in fairness, Chainguard's CEO has his side of it. He says he made the call once exploits were being reported in the wild, and he told The Register that his team had found the same bugs independently, with an AI harness, and that he wouldn't do anything differently. I get why. The reports flying about at the time turned out to be reports of attempts (more on that below), but if you really believe people are being hit, sitting on a fix feels indefensible. And later that same evening, an account called "The Chainguard Team" dropped $50,000 into the PHP Foundation's collective, and that took a fair bit of the wind out of my sails. A case of too little, too late, perhaps, but it's not nothing. What still frustrates me is the coordination. If it was right for one distributor to ship early, it was right for all of them, and Docker Hub makes that point better than I can. The official PHP image on Docker Hub has over 1.38 billion pulls (some of them mine). It's probably the single biggest way PHP gets into the containerised world, and as far as I can tell it wasn't in the early circle at all. The update was opened by a community contributor ten minutes after the advisories went public, then sat in the usual review and build pipeline, then hit a deploy glitch that left the tags visible on Docker Hub with no amd64 image behind them. People were building their own from source and asking to go to bed. It was close to three hours before most folk could pull a patched image. So the company that sells hardened images got the fix in advance, and the free default that so much of the containerised PHP world builds on got it at the same moment as the attackers did... and then dawdled! Smarter minds, and not very many of them When I told my friend that smarter minds than mine had already fixed it, I meant it. I've met a fair few of the people who work on PHP over the years at conferences and the like, and they're far more skilled and capable than I am (I'm not being modest, they really are). My grand contribution to the PHP project is helping write some tests at a couple of hackathons. So the fix being out before I'd even heard of the problem is about the order I'd expect. What I hadn't thought about was how few of them there are. The fix commit has five authors. Looking at the history of the engine core itself, about five people account for half of this year's commits (commits aren't the same thing as work, I know, but it gives you an idea). The person coordinating the security effort across the wider ecosystem is in a six-month post paid for by a grant. The maintainer of a volunteer package repository that a lot of Red Hat-family servers rely on was on holiday, and php.net's own advisory had to tell people to switch away from it because it "will not have updates today". And by teatime Mastodon was busy passing round the Patreon link for the man whose PHP packages a great many Debian and Ubuntu servers pull from. And the inbox isn't getting any emptier. PHP's own security advisories went from 14 in the whole of 2025 to 29 so far this year, with ten weeks still to run, plus over a hundred reports since July that turned out to be duplicates, invalid or impossible to reproduce. Someone from that same handful still had to open and read every one of them. The Foundation hasn't hidden any of this. Its write-up says, in as many words, "We won't pretend otherwise: the delay was a structural failure, caused by both the security team's decision process and its lack of resources". It explains that the first signs of the memory problem turned up back in 2024, when a developer the Foundation pays was fixing something else from an external audit, and that the security team, working by consensus, couldn't agree which of several imperfect fixes to ship until there was a proof that it could be exploited. They're moving to majority decisions so that doesn't happen again. And that brings me to a coincidence I had no hand in at all. This morning another post of mine went out, written weeks ago and sat in the queue, arguing that "blameless" was only ever meant to make it safe to tell the truth, and that the truth usually starts with your own share. I couldn't have asked for a better worked example if I'd tried. The PHP Foundation named its own failure first, plainly, and then named everyone else's. That's a charming coincidence on the scheduling, and it hits home all the same. If you've read the comments on a few forums today you'll know not everyone agrees they handled it well (the engineers' corners of the internet are a lot harder on them than the sysadmins'), but I think they responded about as well as anyone could have, and they've been open about the parts they got wrong. Every hero gets a bill There's a scene early on in The Incredibles that I keep coming back to. The supers are beloved. They stop the robbery, catch the villain, save the day... and then the lawsuits start. A man who was trying to jump off a building sues because he didn't want to be saved. The train passengers want compensation for their whiplash. The bill for all that heroism lands, the public turns, and the heroes end up in hiding. My first reaction to the AI part of this story was that AI was the hero, and I still think it is. Calif, OpenAI and Wiz found these flaws with frontier models in a matter of weeks, after people had been reading that code for well over a decade. That's two critical bugs found and fixed by people on our side of the fence, before (as far as anyone can yet show) anyone used them to do real harm. That's a rescue. But the bill came with it. AI made finding these bugs fast, and it made exploiting them fast too. Trail of Bits wrote working exploits for a stock MediaWiki install and their CEO said the first one took about four hours, start to finish, while being clear that it "still requires expertise, even when you're being aided by an LLM". What used to be weeks of tedious work by a rare specialist is now an afternoon for a capable one with a model at their elbow. I wrote about curl's bug bounty back in May and argued that AI had made the cheap half of security work free and left the expensive half where it was. This is the same story a little further down the line. Finding is cheap now, and fixing is still five people and a grant. That's also why, a couple of years ago, I'd have called taking your site offline over a PHP bug a massive overreaction, and today I don't. A bad actor with a model can turn an advisory into a working attack faster than most of us can get a change approved. And a dull-looking site is rarely the target in itself. It's the first door. Leak a bit of state and get code running, and that site is a foothold into the next system, and the one after that, until you reach something that matters. We've already watched a frontier model climb out of what its own makers thought was a closed sandbox to get at what it wanted. Flaws like these make that kind of hopping trivial, and that's before you get to whatever personal data leaks out along the way and turns up later in a very convincing phishing email. So I think the governments got this one right, even if it was drastic. The BSI, the Dutch NCSC, France's ANSSI, the US NSA and our own NCSC (which reached me via the Scouts!) all told people to take sites down if they couldn't patch. Japan's prime minister posted an "urgent request" late at night telling organisations to check their sites, and Japanese Wikipedia's page on PHP went from 66 visits the day before to over a hundred thousand. On one volunteer-run tracker the median site went dark for about four and a half hours, the Dutch parliament and Edinburgh council among them. And as of this morning, despite one headline talking about millions of exploit attempts, I can't find anyone who has publicly confirmed a single successful compromise. One threat-intelligence group quietly took its "exploited in the wild" label off the story early this morning, on the grounds that sprays against targets aren't proof of anyone getting in. That's good news, but it's only a day old. The question that bothers me most is the one I don't think anyone can answer. Amazon's honeypots caught an exploitation attempt on the 17th, four days before anyone outside the circle was meant to know, and the root of the problem has been documented in public for over twenty years. How many people knew about this, and used it, before any of us did? Hopes of the father Whenever PHP has a bad day, the same crowd turns up. PHP is a joke, PHP is dead, just use anything else. You've seen the threads, I'm sure. I'll grant that PHP has made some questionable decisions in its time, and plenty of what people call technical debt in the language is just the scar tissue of it growing up in public. But Rasmus Lerdorf put it together in 1994 to make web pages a bit more interactive, which makes it thirty-two years old... older than some of the people sneering at it! It's still sat at number twelve on TIOBE this month (one place behind Go, my current favourite, and somewhat bafflingly ahead of COBOL at sixteen, which makes me think I need a better yardstick than TIOBE). And it got me out of a run of humdrum menial jobs and into the career I love. It's been a long-distance relationship for a while now, but the respect has never gone anywhere. Some people will call PHP2Shell the sins of the father. I'd call it the hopes of the father. Stefan Esser described this very class of bug in July 2004, interrupting PHP at an unsafe moment by running it out of memory, and rated it critical. In 2019 a closely related bug report came in, and the maintainer looking at it wrote that "Allocation failure strictly speaking is not a crash", and the fix that followed dealt with that report and moved on. In 2024 the security team saw the first signs again, and with no known path to remote code execution, couldn't settle on a fix. Each one of those calls was reasonable when it was made. The people who built PHP built it as well as they could, with what they knew, for the world in front of them. Nobody has a crystal ball. I don't think any of those calls were wrong about the bug... where they came unstuck was the price. Each one was a bet that turning this into a working exploit was too much effort for too little reward, and for twenty years that bet paid off. The bug didn't change in 2026, but what it costs to exploit it certainly did. And that's the part of this story that isn't really about PHP at all. I'd wager most codebases that have been around long enough have a drawer of bugs that someone marked as "not exploitable in practice", and in practice was always a statement about cost. Java, the C underneath half the languages we use, and yes, my own estate. I've got private bug reports sat in a tracker right now, some marked exploitable and some marked not, and triaging them is my job and nobody else's. Reading about PHP's 2019 bug this morning, I suspect a few of mine need re-reading with fresh eyes, because the price on all of them dropped this year too. Patch now, they said So, to the advice everyone's been shouting for two days, mine included. Upgrade. It's the right advice, but it's also advice that a huge chunk of the PHP web can't simply take. WordPress publishes its own statistics on which PHP versions its installs run, and as of this morning 35.8% of them are on a version of PHP the PHP project no longer releases fixes for. PHP 7.4 alone is about one in six. Another 23.7% are on 8.2, which stops getting security fixes on the 31st of December. So by New Year, unless an awful lot changes very quickly, nearly sixty percent of WordPress will be running a PHP with no upstream fixes at all. W3Techs' survey of the wider PHP web lands in the same place by a different route, at about 48%. The PHP security team did go above and beyond here, publishing minimal source backports for 7.4, 8.0 and 8.1 so that people building from source weren't left with nothing, and the LTS vendors and Linux distributions covered a lot of servers. Debian and Ubuntu had packages out within half an hour of the advisories, which is what the embargo was for. But for a site two major versions behind on shared hosting, "just upgrade" is a project, and a fiddly one at that: a jump across breaking changes, an audit of plugins that may not have been touched in years, and a theme that might fall over the moment you look at it. And WordPress itself still says it works on 7.4, even while warning that it's past end of life. So who runs that project for the Scout group's website? Or the parish council, or the little charity, or the volunteer who looks after the cricket club on a Tuesday night? Scouting Nederland's site was dark for an hour and three quarters on Wednesday. The Scouts here were emailing their volunteers asking them to check. I've stared, hard, at more than one company still running Java 8 in production, and I'll keep doing it. But a big company on Java 8 has made a choice, and the volunteer with the group website mostly didn't know there was one to make. Time for the PHP Boy Scout to shine So my friend was half right. It was time for the PHP Boy Scout to shine... I just think it's a lot less about knowing PHP and a lot more about the old Baden-Powell line this blog's motto is borrowed from, the one about leaving things a little better than you found them. The smarter minds fixed PHP in a day. The heroes got the applause, and the bill went to five people, a few volunteers on holiday, and everyone who now has to find out what version of PHP their club website is running. As for me, I've a drawer of my own to go through. --- Originally published at phpboyscout.uk on 22 October 2026.

  5. Zenn · · @satoyoshi

    eMudhra の CA 鍵漏洩と PHP2Shell、同じ週に来た2つの緊急対応を一次ソースで整理する ! この記事は、2026/10/22 14:00(日本時間)までに公開された一次ソースをもとにまとめている。どちらの件も状況が変わり続けているので、作業の前にリンク先で最新の情報を確認してほしい。 10/21 の夜、高市首相が X にこんな投稿をしていた。 皆様に、今夜に対応して頂きたい大至急のお願いです。 多くのウェブサイトで使用されているPHPに関し、PHPのセキュリティチームが、重大な2件の脆弱性に関する注意喚起を行っています。 投稿は、23:00 に公開される修正パッチをすぐ適用できるよう準備してほしい、難しければウェブサイトを一時的に止めることも有効策の一つだ、と続く。首相が個別のソフトウェアの脆弱性について直接呼びかけるのは珍しく、ITmedia はエンジニアの反応まで記事にしていた。日経によると、首相自身のホームページもその夜から止めていたらしい。 この PHP の脆弱性(PHP2Shell)と同じ週に、もうひとつ、ブラウザ以外の TLS クライアントに広く関わる認証局の鍵の問題も明らかになっている。この記事では、2つの件をそれぞれ一次ソースで整理していく。 TL;DR この1週間で、性質のまったく違う緊急対応が2つ重なった。2つは別々の事件で、互いに関係はない。 eMudhra の中間 CA 鍵漏洩では、インドの認証局 eMudhra の中間 CA 証明書8枚について、秘密鍵を公開情報から誰でも計算できる状態だったことが分かった。この鍵があれば、任意のドメインの偽サーバー証明書を作れる。主要なブラウザは CT(後述)のおかげで偽証明書を受け付けないので、危ないのは Go / Java / Node.js / Python / Rust などで書いたプログラムや curl のような、ブラウザ以外のクライアントのほうだ。対策は言語ごとに違い、OS の更新だけでは済まないものも多い。 PHP2Shell(CVE-2026-109618 / CVE-2026-109619)は、認証なしでリモートからコードを実行できてしまう PHP 本体の脆弱性だ。修正版の PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 は、10/21 の 23:00 ごろに公開された。mod_php ではアプリのコードが1行も動く前に攻撃が成立し、PHP-FPM などほかの構成も対象になる。設定で完全に塞ぐ方法はなく、更新するしかない。 PHP を使っているなら両方に関係がある。PHP2Shell の更新に加えて、PHP から外に出る HTTPS 通信(Composer や外部 API の呼び出し)が eMudhra の件の影響を受けないかも確認しておきたい。 第1部 eMudhra の中間 CA 鍵漏洩 ! エンジニアでない人が、まず確認しておきたいこと スマートフォンと PC の OS を最新にする。Apple などはまだ対応しきれていない可能性があるので、この先しばらくはアップデートが来たらすぐ入れる ブラウザと、普段使っているアプリ(Slack や VS Code など)を最新にする この件で危ないのは、主にサーバーや開発ツールだ。会社でサービスを運営しているなら、エンジニアに「この記事のまとめにある eMudhra の確認項目を済ませたか」を聞いてもらえばいい。 何が起きたのか この件の情報は、Mozilla の Dennis Jackson さんが公開した emudhra.we-have-a-problem.com というまとめページに集まっている。冒頭にはこう書かれている。 The private keys of eight eMudhra intermediate CA certificates have been compromised. They chain to roots trusted by the Mozilla, Microsoft, Apple and Chrome root programs and by many downstream trust stores. 8枚の中間 CA 証明書の秘密鍵が漏れていて、しかもそれらは主要なルートプログラムすべてが信頼するルートにつながっている、という内容だ。この問題を見つけて報告した Wayne さんは、各中間 CA の秘密鍵で We have a problem here - Wayne というメッセージに署名し、鍵を持っていることを証明していて、まとめページのドメイン名もこの署名メッセージから来ている。 Mozilla の Bugzilla #2083449 と各社の発表をもとに、時系列を日本時間で並べた。 日時(日本時間) 出来事 2025/4/30 eMudhra の鍵生成セレモニーで問題の鍵が作られる 2026/10/18 03:05 Wayne さんが Apple / Chrome / Microsoft / Mozilla / eMudhra に報告 10/18 04:45 Chrome が CRLSet(Chrome が配信する失効リスト)で TLS 用の中間 CA 6本をブロック 10/18 07:59 Firefox が OneCRL(Firefox が配信する失効リスト)でブロック(ブラウザの更新は不要) 10/18 18:24〜 eMudhra が8本を失効 10/19〜20 Sectigo がクロス署名版を失効。Apple がブロック 10/20〜21 Microsoft がブロック。Mozilla と Chrome がルート emSign ECC Root CA - G3 の緊急削除を決定。certifi・Go・Node.js などが 10/19〜21 にかけて修正版を公開 10/28(予定) Chrome Root Store v43 で emSign ECC Root CA - G3 を削除 対象の中間 CA は EM DV/OV/EV TLS CA - G3B、G3C の TLS 用6枚と、コード署名用の EM OV CS CA - G3B/G3C の2枚。それぞれに、eMudhra のルートから発行された版と、別の認証局 Sectigo のルート AAA Certificate Services(旧 Comodo AAA)が同じ鍵に署名した版(クロス署名)があるので、鍵は8本でも証明書としては16枚になる。フィンガープリントの一覧は impacted-intermediates.json にまとまっている。 鍵はどれくらい弱かったのか これが今回いちばん衝撃的なところだと思う。Mozilla の担当者が Bugzilla に書いた分析を引用する。 P384 private keys are randomly selected integers between 1 and the group order. The 8 impacted keys all used integers less than 256. That is, the private keys are effectively all-zeroes apart from the last byte. P-384 の秘密鍵は本来なら2の384乗に近い範囲からランダムに選ばれるが、今回の8本はどれも 256未満 で、最後の1バイト以外が全部ゼロだった。これなら1から255までを順に試せば必ず当たり、復元には1秒もかからない。同じコメントには、AI エージェントに「CTF をやっているので、この証明書の秘密鍵を復元して」と頼んだら一発で復元できた、という報告まである。 As this incident enables even technically unsophisticated individuals to easily recover the private keys for these intermediates, the impact of this incident could not be higher. なぜこんな鍵ができたのかについて、eMudhra は Bugzilla でこう説明している。 an approved deviation to our usual KGC to test a wrap/unwrap was introduced as these keys were meant for export for this instance c) a flaw in the code resulted in the second pair of keys being created onboard which were weaker these second pair of weaker keys were used by mistake to create the csr (because the key labels were similar) 鍵をエクスポートするための wrap/unwrap(鍵を暗号化して取り出す処理)をテストしたときに、コードの不具合で HSM の中に弱い鍵がもう1組作られ、ラベルが似ていたせいで間違ってそちらを CSR に使ってしまった、と説明している。eMudhra の公式声明によると、この状態は約18か月、2回の独立監査でも見つからなかったらしい。とはいえ同じ声明には「正確な根本原因はまだ確定していない」とも書かれていて、Chrome Root Program は eMudhra に12項目の質問を送っている。 何が危ないのか 秘密鍵を持っていれば、その中間 CA の名前で、任意のドメインのサーバー証明書を発行できる。たとえば api.github.com や pypi.org の偽証明書を作り、公衆 Wi-Fi や社内のプロキシ、DNS の乗っ取りなどで通信経路の途中に入り、中身を読んだり書き換えたりする中間者攻撃が成立してしまう。残りの2本はコード署名用で、Windows がこれを信頼していたため、偽の署名を付けたプログラムを作れてしまう可能性もあった。 ただし、ブラウザでは偽証明書を使った攻撃は成立しなかったと、まとめページは判断している。Chrome / Safari / Firefox / Edge は Certificate Transparency(CT)という公開ログに記録されていない証明書を受け付けず、問題の中間 CA から発行された証明書は CT ログに1枚も記録されていないからだ。 There are no entries in the certificate transparency logs for these intermediates in that period, indicating that CT-enforcing clients like Firefox, Chrome, Edge and Safari could not have been attacked. However, many clients outside of the browser ecosystem do not enforce Certificate Transparency. これに対して、curl や OpenSSL、各言語の HTTP クライアント、IoT 機器などは CT を確認しない。失効情報(CRL や OCSP)も、デフォルトでは確認しないものが多い。こうしたクライアントは、攻撃者が CT に記録せずに作った偽証明書を、そのまま受け入れてしまう。しかも鍵が弱かったのは2025年4月の生成時点からなので、その間に悪用されたかどうかは誰にも分からない。 まとめページは、問題の中間 CA の証明書をわざと使ったテスト用ホストを立てていて、そこへの接続に成功したクライアントの統計も公開している。10/22 13:30(日本時間)の時点で、直近24時間の接続成功は約16.9万回あり、UA(クライアントが名乗る名前)別に見ると、iOS の WebView や Safari が上位に並び、そのあとに macOS 標準の curl のバージョンである curl/8.7.1 が続いている。 iOS が上位にいるのは意外かもしれない。まとめページは Apple も 10/19 にブロックしたとしているが、統計ではテスト用ホストのうち eMudhra のルート経由のチェーンに iOS からの接続成功が集中している。iOS の信頼ストアの更新は、まだ完全ではないのかもしれない。CT に記録されていない偽証明書なら Safari は受け付けないが、iOS のアップデートが来たら早めに入れておきたい。 macOS 26.6.2 の標準の /usr/bin/curl でテスト用ホストに接続すると普通につながり、Your client successfully connected to the site. That's bad! と返ってきてしまった。macOS の標準の curl、git、python3、perl、ruby が参照する /etc/ssl/cert.pem が、この時点ではまだ更新されていないことが原因になっている。 巻き添えで正規の証明書も止まる eMudhra から正規に証明書を買っていたサイトにも影響が出る。Mozilla と Chrome はルート emSign ECC Root CA - G3 ごと信頼を外すと決めたので、その配下の正規の証明書も信頼されなくなる。 After discussion with maintainers downstream of Mozilla's Root Store, we have decided that the circumstances warrant the emergency removal of trust in emSign ECC Root CA - G3. This will protect clients which do not use revocation information or lack a mechanism to withdraw trust in specific intermediates. Chrome の集計では、影響を受ける有効な証明書は約3万枚で、その99.9%は、米国の大学向けの証明書サービス InCommon の下位 CA から発行されたものだった。eMudhra は G1(RSA)系のルートへの移行を進めていて、Google はサイト運営者に別の認証局の証明書へすぐ切り替えるよう求めている。eMudhra の証明書を使っているサイトの運営者は、Chrome Root Store からルートが外れる 10/28 までに証明書を入れ替える必要がある。 修正の方式は2通りあるが、利用者が選ぶ必要はない ここからは、言語やツールごとの対応を見ていく。先に結論を書いておくと、ここで紹介する2つの方式は各プロジェクトが修正版の中で採った方式の違いで、利用者がどちらかを選ぶ必要はない。使っている言語やライブラリを修正版にし、Go や Rust のようにビルドして作るものは作り直せば、そのツールの方式で対策が入る。とはいえ、方式によって「OS の更新だけで足りるか」が変わってくるので、仕組みを知っておくと更新の漏れに気づきやすいと思う。 1つ目は、侵害された8本の公開鍵(SPKI)を拒否するリストを、検証の処理に組み込む方式だ。Go、Node.js、rustls-webpki(Rust)、Deno、Electron がこの方式をとり、Composer 本体も同じ仕組みを開発版に入れている。証明書ではなく公開鍵で判定するので、Sectigo のクロス署名版もまとめて拒否でき、OS の証明書ストアを使う設定でも有効になる。 2つ目は、同梱している CA バンドルからルート証明書を削除する方式で、Python の certifi、Rust の webpki-roots、Python のパッケージマネージャ uv、Elixir の castore、Perl の Mozilla::CA、composer/ca-bundle、Bun、Homebrew がこちらにあたる(どれも Mozilla のストアをもとにした CA バンドルを同梱している)。この方式は、そのバンドルを実際に使っている場合にしか意味がない。 利用者の目線で整理すると、1つ目の方式は、ツールやライブラリを修正版にすれば OS の設定に関係なく対策が入る。2つ目の方式は使い方で変わり、同梱のバンドルを使っていればツールの更新、OS のストアだけを使う設定なら OS の更新で直り、pip や Node.js の --use-system-ca のように両方を併用するツールなら両方の更新が要る。 つまり、利用者がやることは次の3つで足りると思う。 使っている言語・ライブラリを修正版にし、Go や Rust などビルドするものは作り直す OS の証明書を更新し、コンテナはイメージを作り直す 更新したら、長時間動いているプロセスを再起動する Java はどちらの方式とも違い、blocked.certs というファイルで証明書を1枚ずつブロックしていて、OS のパッケージで入れた JDK なら OS の更新で足り、単体で配布されている JDK は本体の更新が必要になる。macOS の /etc/ssl/cert.pem や RHEL のように修正がまだ出ていない環境は、後述の回避策を使う。他社が配布している Go 製の CLI や Electron アプリは利用者の側では直せないので、配布元の更新を待つしかなくなってしまう。 certifi のメンテナは、2つ目の方式しかとれない理由をこう書いている。 there's no facility for revoking an intermediate only もうひとつ気をつけたいのが、Node.js の --use-system-ca や pip(24.2 以降)のように、同梱バンドルに OS の証明書ストアを追加して使うツールだ。OS を更新してルートが消えても、古い同梱バンドルにルートが残っていれば、信頼されたままになってしまう。Node.js のドキュメントにも次のように書かれている。 Node.js currently does not support distrust/revocation of certificates from another source based on system settings. 言語・ランタイム別の対応状況 対象 修正版 仕組み やること Go 1.27.3 / 1.26.10(10/20) crypto/x509 に侵害された中間 CA の拒否リスト(CVE-2026-111943) 修正版の Go で再ビルドして再デプロイ Node.js 22.23.4 / 24.22.1 / 26.12.1(10/21) NSS 3.131.1 のルート更新と、SPKI 拒否リストの両方 Node 本体を更新。コンテナはイメージを作り直す Java (OpenJDK) advisory は 27.0.1 / 25.0.5 / 21.0.13 / 17.0.21 / 11.0.33 / 8u512 以前を影響ありとしている(CVE-2026-91403) blocked.certs で証明書を個別にブロック 単体配布の JDK は更新。OS パッケージの JDK は OS の証明書更新で足りる、と advisory にある Python certifi 2026.10.18 / 2026.10.19 10.18 で emSign のルートをまとめて削除し、10.19 で影響のない3本を戻した。いま外れているのは emSign ECC Root CA - G3 pip install -U certifi。requests は certifi しか見ないので必須 pip 26.2.2(10/20) 同梱の certifi を更新 python -m pip install -U pip uv 0.13.4(10/20) 同梱バンドルからルートを削除 uv self update rustls-webpki 0.103.16(10/20) SPKI 拒否リスト cargo update -p rustls-webpki して再ビルド webpki-roots 1.0.10(10/19) ルートを削除 cargo update して再ビルド Deno 2.9.8(10/21) rustls-webpki と webpki-roots の修正を取り込み deno upgrade。deno compile したバイナリは作り直す Electron 44.9.1 / 43.8.1 / 42.11.16(10/20) SPKI 拒否リスト アプリ開発者が更新して再配布 Bun 修正は main にマージ済みで、リリースは未公開 ルートを削除 次のリリースを待つ Elixir castore 1.0.22(10/20) ルートを削除 mix deps.update castore Perl Mozilla::CA 20261020 ルートを除外 cpanm Mozilla::CA Homebrew ca-certificates 2026-10-20 ルートを除外 brew upgrade ca-certificates。Homebrew の curl / OpenSSL / Python が参照する Ruby / .NET / CPython の ssl 本体の修正なし 多くの環境で OS のストアを使う OS の証明書を更新する 表の中では Electron が見落としやすい。Chrome は CRLSet という仕組みでブロックリストを配信しているが、Electron はこれを受け取らないので、Chromium を内蔵していても Chrome と同じ保護は受けられない。Electron の PR にもそのまま書かれている。 add entries to the compiled-in SPKI blocklist that Chrome ships via CRLSet, which Electron does not consume. Java のバージョン番号は、まとめページの表(8u511 など)と OpenJDK の advisory(8u512 以前が影響)で食い違っていて、記事の時点では確定できなかった。Oracle JDK の情報も確認できていないので、Java を使っている人は配布元で直接確認してほしい。 OS・ディストリビューション別の対応状況 対象 修正版 内容 Ubuntu USN-8944-1(22.04 以降は 20260816ubuntu0.<リリース番号>.1)、USN-8944-2(ESM) emSign ECC Root CA - G3 を削除。ESM 版は Comodo AAA も削除 Debian DSA-6572-1(trixie 20250419+deb13u1)、DLA-4845-1(bookworm 20250419~deb12u2) G3 と Comodo AAA を無効化 Fedora ca-certificates-2026.2.92_v9.0.319 G3 と AAA を削除 RHEL 6〜10 記事の時点で RHSA は未公開 当面は2つのルートを手動でブロックするよう案内している Alpine ca-certificates 20261020-r0 上流の更新に追従してルートを削除 Arch ca-certificates-mozilla 3.131.1-1 同上 FreeBSD SA-26:73 G3 を untrusted に curl の cacert.pem 2026-10-20 版 Mozilla のストアに追従 macOS /etc/ssl/cert.pem は未更新 後述の回避策を参照 Windows Microsoft の自動更新(Disallowed CTL)で配信済み ルートはそのままで、中間 CA の証明書をブロック(まとめページによると16枚) Ubuntu の通常版が Comodo AAA を無効化していないのは、Mozilla のストアにこのルートがすでに入っておらず、最新の ca-certificates にも含まれていないためだ。古いバンドルを使い続けている ESM 版や Debian、Fedora は、念のため AAA も無効化している。 RHEL と Amazon Linux の ca-certificates の更新と、Android の公式発表は、記事の時点では見当たらない。 どの OS でも、ca-certificates を更新したあとは、長時間動いているプロセス(Java や Node.js のサーバーなど)を再起動しておきたい。起動時に読み込んだ証明書を持ち続けるプログラムがあるからだ。 コンテナは作り直さないと直らない コンテナイメージには、ビルドした時点の ca-certificates が入っている。ホストの OS を更新してもコンテナの中は古いままなので、イメージを作り直す必要がある。 Docker の公式イメージは、Debian を 10/20 に、Alpine を 10/21 に更新している。Debian のベースイメージには ca-certificates が入っていないので一見関係なさそうだが、派生イメージの再ビルドを促すために、あえて更新したらしい。 The Debian images don't contain ca-certificates, but many downstream images do… updating Debian is the simplest way to trigger downstream rebuilds. node:24 や python:3.14 のような浮動タグを使っている場合も、docker pull し直してからビルドしないと古いレイヤーが使われてしまうので注意したい。 PHP の場合 PHP 本体(php-src)にはこの件の修正は入っていないが、openssl 拡張も curl 拡張も、OS の証明書ストアか、openssl.cafile / curl.cainfo で指定したファイルを見る作りなので、OS の ca-certificates を更新すれば対策になる。 では、Composer まわりはどうか。composer/ca-bundle は 1.6.0 / 1.4.16 で同梱の cacert.pem から emSign ECC Root CA - G3 を抜いた。ただ、CaBundle::getSystemCaRootBundlePath() は SSL_CERT_FILE、openssl.cafile、OS の既知のパスの順に探し、同梱ファイルは最後の手段としてしか使わないので、OS のストアが見つかる普通の環境では、この削除の影響はほぼないと思う。PR の本文にも、次のように書かれている。 Removing the root from our bundle does not help users whose system CA store is used, so clients like Composer can use this to reject such connections. そのため ca-bundle には、SPKI でチェーンを判定する CaBundle::findDistrustedCertificate() という API が追加され、これを使って Composer 本体が接続を拒否する PR #13146 も 10/21 に main にマージされたものの、記事の時点ではまだリリースされていない。それまでは、Composer を実行するマシンの OS の証明書を更新しておくのが確実だと思う。 ちなみに、Guzzle は composer/ca-bundle に依存しておらず、デフォルトでは OS のストアを使う。WordPress が使っている HTTP ライブラリの WordPress/Requests は、2.0.21 で対応済みだ。 自分の環境が影響を受けるか確認する いちばん手軽なのは、まとめページが用意しているテスト用ホストに、普段使っているクライアントで接続してみることだ。 curl dv-g3b-emudhra.we-have-a-problem.com curl dv-g3b-aaa-emudhra.we-have-a-problem.com 証明書エラー(curl: (60) など)になれば安全で、Your client successfully connected to the site. That's bad! が返ってきたら、まだ問題の中間 CA を信頼している。上が eMudhra のルート経由、下が Sectigo のクロス署名経由のチェーンなので、両方試すのがいいと思う。 curl だけでなく、アプリが実際に使っている言語で同じ URL にアクセスしてみるほうが確実だ。 Python (requests) python -c "import requests; print(requests.get('dv-g3b-emudhra.we-have-a-problem.com').text)" Node.js node -e "fetch('dv-g3b-emudhra.we-have-a-problem.com').then(r=>r.text()).then(console.log)" PHP php -r "echo file_get_contents('dv-g3b-emudhra.we-have-a-problem.com');" どれも、エラーで落ちれば安全だ。 証明書バンドルのファイルに、問題のルートが残っているかを直接見ることもできる。 B=/etc/ssl/certs/ca-certificates.crt # RHEL 系は /etc/pki/tls/certs/ca-bundle.crt、macOS は /etc/ssl/cert.pem awk '/-----BEGIN CERTIFICATE-----/{c=""} {c=c $0 "\n"} /-----END CERTIFICATE-----/{cmd="openssl x509 -noout -subject -fingerprint -sha256 | paste - -"; printf "%s", c | cmd; close(cmd)}' "$B" \ | grep -E "emSign ECC Root CA - G3|AAA Certificate Services" || echo "not found (OK)" not found (OK) と出れば、そのバンドルには残っていない。 OS の更新が来ていないときの回避策 まとめページには、更新が出ていない環境向けの回避策が載っている。とはいえ、ページ自身が上級者向けとしていて、Linux 向けの手順には一般のユーザーにはおすすめしないとも書かれているので、自分で戻せる人だけが使ってほしい。以下はまとめページのコマンドをそのまま引用している。 macOS の /etc/ssl/cert.pem から2つのルートを外す場合(バックアップを取ってから書き換える)。 sudo cp -p /etc/ssl/cert.pem /etc/ssl/cert.pem.bak && sudo awk '/^(###|===) /{skip=0} /^=== .*\/CN=(AAA Certificate Services|emSign ECC Root CA - G3)$/{skip=1} !skip' /etc/ssl/cert.pem.bak | sudo tee /etc/ssl/cert.pem > /dev/null Debian / Ubuntu の場合。 sed -i \ -e 's|^mozilla/emSign_ECC_Root_CA_-_G3.crt|!&|' \ -e 's|^mozilla/Comodo_AAA_Services_root.crt|!&|' \ /etc/ca-certificates.conf && update-ca-certificates Fedora / RHEL / Rocky / Alma / Amazon Linux 2023 の場合。 d=/etc/pki/ca-trust/source/blocklist; [ -d $d ] || d=/etc/pki/ca-trust/source/blacklist trust extract --overwrite --format=pem-bundle \ --filter='pkcs11:object=Comodo%20AAA%20Services%20root;type=cert' \ $d/Comodo_AAA_Services_root.pem && trust extract --overwrite --format=pem-bundle \ --filter='pkcs11:object=emSign%20ECC%20Root%20CA%20-%20G3;type=cert' \ $d/emSign_ECC_Root_CA_-_G3.pem && update-ca-trust Comodo AAA まで外すと、正規の Sectigo の証明書が壊れないか気になるところだと思う。Chrome はこのルートを2025年4月に削除していて、Mozilla のストアにもすでに入っていない。AAA のクロス署名つきチェーンを返す Sectigo のサイトに、AAA を抜いたバンドルで接続してみると、新しい OpenSSL / LibreSSL は、別の正規のルートまでチェーンを構築し直して問題なく接続できた。かなり古い OpenSSL のようにチェーンを構築し直さないクライアントでは、失敗することもあると思う。 Windows は自動更新でブロックが配信されているので通常は何もしなくてよく、自動更新を受け取らない端末向けには、まとめページに PowerShell スクリプトが用意されている。 第2部 PHP2Shell ! エンジニアでない人が、まず確認しておきたいこと レンタルサーバー(さくら、ロリポップ!、エックスサーバーなど)でサイトを運営しているなら、管理画面で PHP のバージョンを確認する。8.1 以前なら、バックアップを取ってから 8.2 以上に切り替える。8.2 以上なら、事業者のお知らせで修正済みとなっていれば作業は終わり VPS や自社のサーバーで動かしているなら、エンジニアに「PHP を修正版に更新して、PHP-FPM や Apache を再起動したか」を確認してもらう なお、WordPress 本体を最新にしても、この脆弱性は直らない。直す必要があるのはサーバー側の PHP だ。 何が起きたのか こちらは PHP 本体の脆弱性で、CVE-2026-109618 と CVE-2026-109619 の2件をまとめて PHP2Shell と呼んでいる。どちらも CVSS v4.0 で 9.2。PHP の公式発表では、影響する範囲をこう書いている。 Who is at risk: all PHP installations serving web requests, including PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed. We consider the risk highest for mod_php, with a demonstrated exploit where an unauthenticated request can trigger the attack before any application code runs. Web リクエストを処理しているすべての PHP が対象で、とくに mod_php では、認証なしのリクエストで、アプリのコードが動く前に攻撃が成立することが検証環境で実証されている。cron やコマンドラインだけで PHP を使っている場合については、公式は個別に触れていない。 経緯を PHP Foundation のブログと各社の公開記事をもとに並べた。 日時 (JST) 出来事 2024年 外部監査(Quarkslab)の指摘を修正していた PHP のコア開発者が、CVE-2026-109618 の原因になる OOM の問題の最初の兆候に気づく 2026年8月 Calif と OpenAI が 8/11 に、Wiz が 8/24 に、それぞれ独立に PHP へ報告 10/21 00:00 頃 CVE 番号が SNS やフォーラムで出回り始める(誤った CVSS 10.0 つき) 10/21 04:30 PHP が事前告知。当初の予定(10/22)を1日前倒しし、10/21 23:00 JST にリリースすると発表 10/21 05:00 頃 Calif が PoC の動画を誤って公開した(PHP Foundation による) 10/21 16:41 Chainguard が修正入りのコンテナイメージを先行して公開。PHP Foundation は、情報公開の取り決め(エンバーゴ)を破ったと批判している 10/21 22:34 GitHub Security Advisory 公開 10/21 23:00 ごろ 修正版を公開(予告は 23:00 だったが、実際の公開は数分〜十数分ほど早かった) 情報が予定より早く漏れたため、リリースを1日前倒しした。PHP Foundation は、ディストリビューションのパッケージングがまだ終わっていない中での判断だったと書いている。 Moving the release forward by one day was the best compromise between acting quickly, giving people time to prepare, and making sure everyone had a simple update path when the vulnerabilities were disclosed. 2つの脆弱性の中身 公式の GHSA によると、2件の内容はこうなっている。 CVE-2026-109618(GHSA-w8hw-w9fx-j79w「RCE via OOM corruption」)。PHP はメモリ不足(OOM)のとき、longjmp() で処理を強制的に抜ける。ところが、リクエスト用のメモリが初期化しきれていない途中でメモリ確保が失敗すると、壊れた状態のままリクエストの終了処理に進んでしまう。攻撃者は、post_max_size の範囲に収まる multipart リクエストで、各パートのヘッダーを大量に送ったり、空のファイル欄をネストさせたりして、意図的に memory_limit を使い切らせる。mod_php では、この一連の流れがアプリのコードの実行前に起きる。 CVE-2026-109619(GHSA-6wmf-4rv5-p3rp「RCE via stale global state」)。PHP のワーカーは、前のリクエストの状態をグローバル変数に持っていて、次のリクエストの前にリセットする。前のリクエストが致命的エラーで落ちるとそのリセットが飛び、解放済みのメモリを指したままの状態が残る。次のリクエストが通常の初期化より前にそれを触ると、use-after-free になる。確認されている経路のひとつが session upload progress で、これはデフォルトで有効、しかもアプリが session_start() を呼んでいなくても経路になる。 修正は両方まとめて1つのコミット("Avoid state corruption via bailout")に入っているので、どちらか片方だけ直す、という選択肢はない。 発見者の Wiz の記事では CVE 番号の割り当てが公式と逆になっている(upload progress の経路を 109618 としている)。この記事では公式の GHSA の割り当てに合わせた。 どの構成が危ないのか 公式の GHSA に書かれた内容を、実行方式(SAPI)ごとに表にした。 SAPI CVE-2026-109618 CVE-2026-109619 Apache + mod_php アプリに依存しない RCE を実証済み 実証済み PHP-FPM ソース解析上は影響あり。完全な攻撃はまだ実証されていない session upload progress 経由で実証済み。成功するかはアプリの処理内容にも左右される FrankenPHP アプリに依存しない攻撃が成立する可能性が高い デフォルト構成では未確認 LiteSpeed 可能性あり(未検証) 条件次第 デフォルトの memory_limit(128M)と post_max_size(8M)のままで RCE が成立したと書かれているので、デフォルト設定のままのサーバーもそのまま対象になると考えたほうがよく、Wiz も「Hello World だけのアプリでも影響を受けうる」と書いている。nginx + PHP-FPM の構成でも、アプリに依存しない攻撃がまだ見つかっていないだけで、安全が確認されたわけではない。実際、PHP Foundation のブログは、CVE-2026-109618 についても PHP-FPM でアプリ側の処理を経由した RCE を確認したと書いていて、GHSA の記述より一歩踏み込んでいる。 影響を受けるバージョンと直し方 公式の advisory が影響ありとしているのは、次の修正版より前のバージョンだ。 PHP 8.5.12 未満 PHP 8.4.27 未満 PHP 8.3.36 未満 PHP 8.2.35 未満 php.net の advisory が挙げているのはサポート中の 8.2〜8.5 だけだが、古いバージョンが安全という意味ではない。発見者の Wiz と Calif は PHP 5.4 以降のほぼすべてが影響を受けるとしていて、Google Cloud のセキュリティ情報も 5.4〜8.5 を対象として扱っている。PHP のセキュリティチーム自身も、サポートが終わった 7.4 / 8.0 / 8.1 向けにソースのパッチを用意していて、後述のとおり、ディストリビューションも古いバージョンに修正を入れている。 PHP 8.1 and older no longer receive updates from the PHP project. 対策は、上の修正版(またはディストリビューションの修正済みパッケージ)に更新することしかない。PHP の公式発表にも、はっきりそう書かれている。 There are no complete mitigations, updating is the only safe choice. バージョンを確認するときは、php -v で表示されるのが CLI の版だという点に注意したい。Web で実際に動いている PHP-FPM や mod_php が別のバージョンのこともあるので、php-fpm -v や、一時的に置いた phpinfo() で確かめるといい(確認したら phpinfo() は消しておく)。ディストリビューションによっては、コマンド名が php-fpm8.3 のようにバージョンつきになっている。更新したあとは、PHP-FPM や Apache を再起動しないと古いプロセスが動き続けるので、再起動まで済ませてほしい。 ディストリビューションのパッケージは、修正をバックポートしていてバージョン番号が upstream と一致しないことがあるので、その場合はパッケージの changelog に CVE 番号が載っているかで判断する。Docker の公式イメージには php:8.5.12-fpm などのタグが 10/22 未明(JST)に出ているが、php:8.4 のような浮動タグは pull し直さないと古いままだ。remi のリポジトリは、当日中には更新しないと告知されていた。 すぐ更新できないときの緩和策 公式は、いくつかの緩和策を挙げつつ、どれも「特定の攻撃経路を減らすだけで、安全にはならない」と念を押している。 If you cannot update immediately: while only an update is a complete solution, the following measures reduce exposure to specific attack paths but do not make an installation safe. 挙げられている主なものはこのあたりになる。 session.upload_progress.enabled=0 にして、全ワーカーを再起動する。php.ini や FPM のプール設定など、リクエストの解析より前に読み込まれる場所で設定する必要があり、ini_set() や .user.ini では意味がない。これで塞がるのは CVE-2026-109619 の確認済みの session 経路だけ。 PHP 8.5 では fatal_error_backtraces=0 にする。 memory_limit=-1 をアプリから上書きできない形で設定する。とはいえ、OS 側のメモリ確保失敗では同じ経路に入りうると書かれている。メモリの上限がなくなるので、サーバー全体のメモリを使い切られないよう、コンテナや cgroup の上限とあわせて使う。 post_max_size を下げ、フロント(リバースプロキシや WAF)でリクエストのサイズ、パーツ数、ヘッダー数を制限する。multipart を使わないアプリなら、フロントで multipart を止める。 パッチを当てたあとも、upload progress の機能を使っていないなら無効のままにしておくことを GHSA はすすめている。 ディストリビューションとホスティングの対応 主なディストリビューションは、10/21〜22 にかけて更新を公開している。バックポートで修正しているため、バージョン番号が upstream と違うものが多い。 提供元 修正版の例 備考 Debian trixie 8.4.27-1~deb13u1(DSA-6574-1)、bookworm 8.2.35-1~deb12u1(DLA-4848-1) forky / sid は修正版 8.4.27-1 がアップロード済みで、記事の時点では反映待ち Ubuntu 24.04 8.3.6-0ubuntu0.24.04.13、22.04 8.1.2-1ubuntu2.28 など 番号は古いままで修正入り RHEL 記事の時点で確認できたのは RHEL 8 の php:7.4 向けのみ ほかのストリームは AlmaLinux が先行して出している AlmaLinux 全ストリームで .alma.1 つきの版 Red Hat より先に出している Amazon Linux 2023 php8.2〜8.5 で ALAS2023-2026-3301〜3304 php8.1 と AL2 core は修正予定なし Alpine php83 8.3.36-r0、php84 8.4.27-r0、php85 8.5.12-r0 cPanel(CloudLinux) ea-php52〜ea-php85 を更新 ea-php84 は 8.4.26 のまま修正入り、と明記されている ondrej/php PPA 8.5.12-1 などに加え、5.6〜8.1 の EOL 版にも修正版 Docker 公式 php イメージ 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 のタグ 浮動タグは pull し直す AlmaLinux のブログにも、確認は php -v ではなくパッケージのバージョンで、と書かれている。RHEL 系なら rpm -q php-common、Debian 系なら dpkg -l | grep php でバージョンを調べ、changelog に CVE 番号が載っているかを確かめるのがいいと思う。 クラウドの PaaS も対応を進めていて、AWS は Elastic Beanstalk の PHP プラットフォームと Lightsail の blueprint の更新を案内している(Lightsail の既存インスタンスは作り直して移行する必要がある)。Google Cloud は App Engine や Cloud Run で、自動更新を有効にしていない場合は再デプロイが必要としている。Azure App Service(Linux)と Heroku も 10/21 に修正版を公開した。 国内のレンタルサーバーでは、さくらのレンタルサーバが 10/21 23:00〜10/22 06:30 の緊急メンテで PHP を更新し、ロリポップ!は予防措置として一部のサービスを止めてメンテナンスに入っていた。レンタルサーバーやマネージドの環境では事業者が対応することが多いが、古い PHP のバージョンを選んでいる場合は切り替えを求められることがあるので、管理画面のお知らせは見ておくと安心だと思う。 アプリ側では、WordPress が「WordPress 本体の更新は不要で、予定もない」と発表し、Drupal も PHP の更新が唯一の完全な対策だとしている。PHP2Shell は WordPress ではなくサーバー側の PHP の脆弱性なので、WordPress を最新版にしても対策にはならない。 WAF での暫定対応 Cloudflare は、修正版公開の約11時間前にあたる 10/21 12:02(日本時間)から、無料プランも含めてデフォルトで保護ルールを有効にしている。AWS WAF、Akamai、Fastly もルールを公開していて、AWS のブログでは、PHPSESSID と PHP_SESSION_UPLOAD_PROGRESS を両方含む POST を止めるカスタムルールが紹介されている。ただ、Cloudflare は攻撃者がペイロードを書き換えて回避を試みているとも報告しているので、WAF はあくまで更新までのつなぎと考えたほうがよさそうだ。 悪用はされているのか 悪用の状況は情報が錯綜しているので、攻撃の試行が観測された話と、侵入に成功した話を分けて読む必要がある。 AWS は、公開前の 10/17 からハニーポットで試行を観測していたと発表した。その試行が成功したかは不明としつつ、10/21 11:00(日本時間)ごろに PoC が出回ってからは試行が急増し、PHP2Shell はすでに広く悪用されている、と書いている。 Cloudflare、Patchstack、Hadrian、watchTowr なども、10/21 に試行を観測したと報告している。 一方で PHP Foundation は「公開時点で、実際の攻撃に使われている exploit は確認していない」としている。CISA の KEV(悪用が確認された脆弱性のカタログ)にも、記事の時点では載っていない。 記事の時点で、侵入に成功した具体的な事例の報告は見当たらない。とはいえ、PoC が出回って大量のスキャンが始まっている以上、更新していないサーバーは狙われている前提で動いたほうがいいと思う。 日本では、JPCERT/CC と IPA が 10/22 に注意喚起を公開した。海外では、CISA がすぐに更新できない場合や PHP 8.1 以前を使い続けている場合はシステムをオフラインにすべきだとし、英国の NCSC もオフラインにすることを検討するよう求めている。冒頭の高市首相の「ウェブサイト等を一時的に停止させることも有効策の一つ」という呼びかけも、同じ考え方になる。 まとめ エンジニアでない人は、まず第1部と第2部の冒頭のボックスに書いたことを確認してほしい。以下は、サーバーを自分で管理しているエンジニア向けの確認項目になっている。 eMudhra の件で確認すること。 テスト用ホストに、curl と、実際にアプリが使っている言語のクライアントで接続して、証明書エラーになるか確かめる OS の ca-certificates を更新する(macOS の /etc/ssl/cert.pem は未更新) Go / Rust / Deno のバイナリは修正版で再ビルドする。Node.js と Java は本体を更新し、Electron 製のアプリはアプリの更新を待つ Python は certifi と pip を更新する コンテナイメージは、ベースイメージを pull し直して作り直す 更新したら、長時間動いているプロセスを再起動する eMudhra の証明書を使っているサイトは、10/28 までに別の認証局の証明書に入れ替える PHP2Shell で確認すること。 PHP を 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 以上に更新し、PHP-FPM や Apache を再起動する(ディストリビューションのパッケージは changelog で CVE 番号を確認する) すぐ更新できないなら、session.upload_progress.enabled=0 などの緩和策を入れたうえで、できるだけ早く更新する 8.1 以前は、ディストリビューションの修正済みパッケージがあればまずそれを入れ、そのうえでサポートのあるバージョンへの移行を急ぐ 参考リンク eMudhra の件。 emudhra.we-have-a-problem.com Mozilla Bugzilla #2083449 Mozilla dev-security-policy のスレッド Google のブログ eMudhra の声明 PHP2Shell。 PHP の発表(php.net) GHSA-w8hw-w9fx-j79w(CVE-2026-109618) GHSA-6wmf-4rv5-p3rp(CVE-2026-109619) PHP Foundation のブログ Wiz の記事 Calif の記事

    1 like
  6. DEV · · @alanwest

    php2shell (CVE-2026-109618): How to Check and Patch the PHP Your Server Runs If you run Apache with mod_php, an unauthenticated HTTP request could get code execution on your server before a single line of your application ran. PHP's own advisory says so. The php2shell fix for CVE-2026-109618 and CVE-2026-109619 shipped on 21 October 2026 as PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35. What's left is making sure the fixed binary is the one actually answering your web requests. Running php -v in a shell won't tell you that. A correction first, because it went viral. These are not "CVSS 10.0". That number came from a Tell HN post whose author gave the source as "trust me, bro." The PHP security team scored both bugs CVSS v4.0 9.2 with vector AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H, which means network-reachable, no auth, high complexity. Red Hat's CVSS 3.1 score is 8.1. Neither number is a reason to wait. What php2shell actually is Both bugs live in PHP core, underneath whatever WordPress plugins or Composer packages you run. Here's how the php.net advisory and the two GitHub advisories describe them. CVE-2026-109618: RCE via OOM corruption Advisory: GHSA-w8hw-w9fx-j79w. On an out-of-memory error, PHP longjmp()s out of the current context. If that happens while request memory is reachable but only partly initialized, request shutdown later reads that garbage as valid state. The advisory lists cheap ways for an attacker to make memory run out: multipart bodies with no usable Content-Length slip past the first post_max_size check, multipart parts can carry unlimited headers, and empty file controls build metadata arrays without counting toward max_file_uploads. The fix replaces the longjmp() with a delayed soft OOM at the next VM safe point plus a hard _exit() at a higher threshold. CVE-2026-109619: RCE via stale global state Advisory: GHSA-6wmf-4rv5-p3rp. Persistent workers keep global error, session and extension state that can point into the previous request's freed heap. Request A leaves that state behind through a fatal error, an OOM or a diagnostic emitted during shutdown. Request B, on the same worker, reads it before normal init resets it, and that's a use-after-free. The confirmed cases are PHP 8.5's fatal_error_backtraces and the session upload progress lifecycle. The reporters credited on both advisories include accounts whose names point to Wiz (sagitzadik-wiz), Areion (tomash-areion) and OpenAI (amyb-oai). Which setups are exposed: mod_php vs PHP-FPM vs the rest Every branch below the fixed releases is affected. How exposed you are depends on the SAPI, and the advisories go into detail on each one: | SAPI | CVE-2026-109618 | CVE-2026-109619 | |---|---|---| | Apache mod_php | Confirmed, full unauth RCE with default limits and prefork | Confirmed | | PHP-FPM | Susceptible per source analysis, no full exploit shown | Session upload progress path validated | | FrankenPHP | Likely, similar to mod_php | No early consumer found by default, not immune | | LiteSpeed (LSAPI) | Likely, unvalidated | Conditional | | php-cgi | Listed at risk by php.net | Listed at risk by php.net | So mod_php goes to the front of the queue. Red Hat points out that standard RHEL deployments use FPM and calls RCE there difficult in practice. Fine, schedule the FPM boxes second. Just don't drop them off the list. Fixed PHP versions per branch | Branch | Fixed upstream | |---|---| | 8.5 | 8.5.12 | | 8.4 | 8.4.27 | | 8.3 | 8.3.36 | | 8.2 | 8.2.35 (EOL 31 Dec 2026) | | 8.1 and older | No release. Minimal source backports for 7.4, 8.0, 8.1 | Is php2shell exploited in the wild? Depends who you ask Word of the bugs leaked on 20 October. Per Hadrian's timeline, the Tell HN post went up around 15:20 UTC, and PHP moved the release forward to 21 October at 14:00 UTC. The name comes from the leaked exploit tool, "PHP2Shell", a screenshot of which has been making the rounds. Since then the reports have pointed in both directions: - Hadrian, 11:35 UTC on 21 Oct: "We are now seeing php2shell exploited in the wild at scale," mostly through the session upload progress path. - watchTowr says it is observing exploitation attempts against both CVEs. It gives no counts. - Cloudflare's CTO reportedly said they were seeing early attacks. I only have that second-hand, through Hadrian. - Huntress had seen no exploitation across its partner base as of 10am ET on 21 Oct. - CISA's alert says: "CISA has not observed exploitation of these vulnerabilities as of the time of publication." "Attempts" and "compromises" are different claims. I'm not going to wait for KEV to settle the argument. Step 1: check the PHP version your web server actually runs The CLI and the web SAPI often use different binaries and different php.ini files. To see what the web actually runs, drop a throwaway file in the docroot, request it once, then delete it: <?php echo PHP_VERSION, ' ', PHP_SAPI, ' ', php_ini_loaded_file(); Then check the real processes: apachectl -M 2>/dev/null | grep -i php # mod_php loaded? ps -eo cmd | grep -E 'php-fpm: master' # which FPM master is running php-fpm8.3 -v # that FPM's version, adjust per branch Distro packages don't follow the upstream numbering. Ubuntu 24.04 fixes this in php8.3 8.3.6-0ubuntu0.24.04.13, and PHP_VERSION still starts with 8.3.6. If you grep for "8.3.36" on that box you'll conclude it's still vulnerable after you patched it. Check the package version instead: dpkg -l 'php*' | awk '/^ii/{print $2, $3}' rpm -q --changelog php-common | grep -m3 'CVE-2026-10961' On Docker, check inside the image you actually deploy. The tag won't settle it, since your image is only as fixed as the last time you rebuilt it: docker run --rm --entrypoint php your-app:prod -r 'echo PHP_VERSION, PHP_EOL;' Step 2: install the patched PHP packages - Ubuntu: USN-8948-1/-2. 22.04, 24.04, 26.04 and 26.10 get it under standard support, and 20.04 and older need Pro ESM. Run sudo apt update && sudo apt install --only-upgrade '?name(^php[0-9.]+$)'. - Debian (tracker): trixie is fixed in php8.4 8.4.27-1~deb13u1 (DSA-6574-1) and bookworm in php8.2 8.2.35-1~deb12u1 (DLA-4848-1). Sid was still unfixed when I checked. - Sury (packages.sury.org, Ondřej's repos) is reported to ship 8.5.12, 8.4.27, 8.3.36 and 8.2.35, plus backports for 8.1, 8.0, 7.4, 7.3, 7.2, 7.1 and 5.6. - Remi: php.net says plainly that rpms.remirepo.net "will not have updates today" and recommends switching to distro packages or building from source. That's rough if your RHEL-family servers pull PHP from that one volunteer-maintained repo. - RHEL/AlmaLinux: Red Hat had no fixed packages when AlmaLinux posted on 21 Oct. Alma was backporting to its module streams and said its builds would ship ahead of RHEL. - Docker official images: the library file lists 8.5.12, 8.4.27, 8.3.36 and 8.2.35. Run docker pull, rebuild with --pull, redeploy. - Managed hosting: ask your host for the exact package version. "We're aware" doesn't tell you anything. Then restart. FPM and mod_php keep the old code mapped in memory until the workers die, so a box with the new package installed and the old workers still running is unpatched. If you can't patch today PHP is blunt about this: none of these settings make you safe, they just cut off the known paths. ; set in php.ini or php_admin_value, never ini_set() or .user.ini session.upload_progress.enabled = 0 memory_limit = -1 ; partial: closes the controllable OOM path post_max_size = 8M ; 32M if you need uploads upload_max_filesize = 2M ; keep below post_max_size fatal_error_backtraces = 0 ; PHP 8.5 only Restart every worker after the change. At the proxy, cap request size, multipart part count and header count, including for requests with no usable Content-Length. Don't reach for RLIMIT_AS/RLIMIT_DATA, because they can cause the vulnerable allocation failure. pm.max_requests=1 narrows 109619 if you can take the performance hit. PHP 8.1, 7.4 and other EOL versions If you're on 8.1 or older, you're relying on your vendor, Sury's backports or PHP's source-only patches for 7.4/8.0/8.1. CISA's advice for anything that can't be patched is to take it offline. For an internet-facing PHP 7.4 box I agree. Patch first, then read your logs. Huntress suggests watching for php-fpm, httpd or apache2 spawning sh, curl or nc. How long does a PHP security patch take to reach your production servers: hours, days, or "whenever the base image updates"? Be honest in the comments. Sources - PHP security advisory and releases, advance notice - GHSA-w8hw-w9fx-j79w, GHSA-6wmf-4rv5-p3rp - CISA alert, Red Hat - Huntress, watchTowr, Hadrian - Ubuntu, Debian tracker, AlmaLinux, Docker official images - HN thread

    2 reactions
  7. Hacker News · · on PHP 8.2.35 · adlpz

    I have zero internal info, just guessing, but there's a PR from 5min ago asking to add someone as a reviewer for PHP images: official-images#22544 Maybe the guy that has to click OK is asleep?

  8. Ah, indeed... I thought the GA push was the final step but there's another manual process between that and updating the Docker Hub image tags: official-images#22541 It should definitely have a 'high impact' workflow that bypasses some of those manual steps.

  9. It was merged a minute ago official-images#22541

  10. X · · @koni

    11時に集合したが、DockerにPHPのパッチが来なくてやれることがないw もうメンテ開けている会社はDocker使ってない勢 世界中が待っているdocker-library/official-imagesへのPHPのパッチのPR↓ official-images#22541

    16 likes · 2,036 views

Latest stargazers

The last 10 distinct accounts we observed this year.

Most active participants

PR, issue, comment & review events in the past year.

Packages

1
PackageVersionDownloads · 30dTrend · 30d
containerv0.1.0
v0.1.0——

README badges

Embed a badge in your README or website.

Live mentions · last 30 days
docker-library/official-images mentions in the last 30 days