言語ランタイムの脆弱性
PHP・Node.js・Python・Ruby・Java・BIND
アプリを書いていなくても当事者になる層。修正版・暫定緩和・見落としやすい穴まで。2026.10.26
今回の主戦場は言語ランタイム本体でした。PHPは未認証RCE、Node.jsは同梱Brotliの境界外書き込み、PythonはSSLContextのUAF、RubyはOnigmo。アプリのコードを1行も変えていなくても当事者になるのが、この層の怖さです。
1. PHP ―「php2shell」確認済み
| CVE | 深刻度 | 内容 |
|---|---|---|
| CVE-2026-109618 GHSA-w8hw-w9fx-j79w | 9.2 | memory_limit 超過時に longjmp() で中断した際、内部データの初期化途中でクリーンアップが走り、未初期化メモリを有効なデータとして扱う。mod_phpではアプリのコードが動く前の1リクエストで発火 |
| CVE-2026-109619 GHSA-6wmf-4rv5-p3rp | 9.2 | fatal error 後にリクエスト所有の内部状態が解放済みメモリに残り、同一ワーカーの後続リクエストが正常な初期化より先にそれを使う |
影響は8.5.12/8.4.27/8.3.36/8.2.35 未満、およびEOLの8.1以下。Webリクエストを処理するすべてのPHP(FPM・mod_php・php-cgi・FrankenPHP・LiteSpeed)が対象で、mod_phpが最も危険。CMSを更新してもPHP本体は直りません。
① 109618:アプリから上書きできない形(php_admin_value 等)で memory_limit=-1、post_max_size を8〜32Mに下げて upload_max_filesize を下回らせる。ただし RLIMIT_AS/RLIMIT_DATA は脆弱な経路を誘発するので使わない。② 109619:session.upload_progress.enabled=0 を設定して全ワーカー再起動(ini_set() や .user.ini に頼らない)。PHP 8.5では fatal_error_backtraces=0 も有効。
| 日時 | 悪用の観測 |
|---|---|
| 10/17(公表4日前) | AWSのハニーポット(MadPot)で悪用試行を検知。発信元は商用匿名化ネットワーク。エンバーゴ中の検知で、情報入手経路は不明 |
| 10/21 02:00 UTC〜 | エンバーゴ解除(14:00 UTC)前に複数のPoCが出現 |
| 10/21 公表後 | Cloudflare観測で45分で数万件、2時間で数十万件、数時間で数百万件 |
AIfrontierの見解 更新適用に加えて、10/17以降の侵害痕跡(不審プロセス・Webシェル・設定変更)の調査が必要です。JPCERT/CCも10月22日に注意喚起(JPCERT-AT-2026-0033)を出しています。
2. Node.js/Bun ―「Node2Shell」=「HTTP2Shell」確認済み
CVE-2026-111497(CVSS 4.0で9.2)。根本原因はNode.jsではなくGoogle Brotli Cライブラリ(c/dec/decode.c)の境界外書き込みです。ブロック型を宣言したストリームが途中で型を切り替えても排除されず、無効な状態のまま復号が続いてバッファ外へ書き込みます。
上流修正は2026年2月27日にgoogle/brotliへコミット済みだったのに、リリースとアドバイザリは10月21日まで出ていませんでした(Brotli 1.0.10/1.1.1/1.2.1)。報告はOpenAI Codex SecurityのKhai Tran氏・Sylvie Mayer氏。10月22日に公開PoC、無修正のNode.js 24.22.0イメージ(arm64)でのコード実行が報告されています。
| コンポーネント | 影響 | 修正版 |
|---|---|---|
| Node.js 26.x/24.x/22.x | 26.12.1/24.22.1/22.23.4 未満 | 26.12.1/24.22.1/22.23.4 |
| Node.js 25/23/20以下 | EOL(修正なし) | 22系/24系へ移行 |
| Bun | 1.4.4 未満 | 1.4.4(bun build --compile の生成物も再ビルド) |
| Google Brotli 本体 | 1.0.3〜1.0.9/1.1.0/1.2.0 | 1.0.10/1.1.1/1.2.1 |
| Python brotli/brotlicffi | 同一デコーダーを同梱 | 1.2.1/1.2.1.0 |
| Envoy Proxy/Istio | Brotli展開フィルター | Envoy 1.40.0/1.39.3/1.38.6/1.37.8、Istio 1.29.9/1.30.6/1.31.2 |
① Express 5/body-parser 2.x(express.json() だけで到達すると報告)。Koa系・@fastify/compress も同様。② fetch() の自動展開(攻撃者管理下のサーバーからの応答)。③ node:zlib のBrotli関数。Express 4/body-parser 1.x は br 本文を展開しません。
緩和は、プロキシ/WAFで Content-Encoding: br を拒否、express.json({inflate:false})、Envoy/IstioのBrotliフィルター無効化。「Accept-Encoding から br を外す」だけでは、サーバーがBrotliで返す応答は防げません。Vercelは10/21からWAFルールを自動適用、Cloudflareも10/25に緊急WAFルール2件をLogモードで追加しています。
同時に10件が修正されました。TLSホスト名検証バイパス(CVE-2026-105483/106069/105482/106072)は中間者攻撃につながるため、外部通信するランタイム・CIから優先的に更新します。randomUUID()/randomInt() のエントロピーキャッシュ(CVE-2026-106074)も含まれます。
node:24.22.0-alpine のようなピン留めタグは、再ビルドしても脆弱なままです。ベースイメージを修正版へ引き直してください。GitHub上の「PoC」「スキャナ」はマルウェア混入の恐れがあるため隔離環境でのみ実行を。3. Python ― SSLContextとeMudhra確認済み
| CVE | 深刻度 | 内容 |
|---|---|---|
| CVE-2026-19445 | 9.2 | SSLContextのUAF。sni_callback がコンテキストを切り替えると元の参照が保持されず、未認証のTLSクライアントがクラッシュや解放済みポインタ経由の呼び出しを起こせる |
| CVE-2026-19553 | 7.6 | wrap_bio() が server_hostname を検証せず、check_hostname=True でもホスト名を渡さないと検証が黙って省略される |
修正版は 3.10.22/3.11.17/3.12.15/3.13.16/3.14.8(3.15.0は修正済み)。加えてeMudhra問題で10月21日に緊急リリース(3.15.1/3.14.9/3.13.17、pip 26.2.2・certifi 2026.10.19同梱)、10月24日にはsslモジュールで問題の中間CA鍵を拒否する対応がCVE-2026-115557として開発ブランチにマージされています(10/21リリースには未収録)。
python -m pip --version/pip show certifi で個別に棚卸しを。②OSの信頼ストアから証明書を消してもpipは守れません。pipはOSストアに加えて内蔵certifiを読みます。REQUESTS_CA_BUNDLE や --cert は「追加」であって、内蔵の問題CAの無効化にはなりません。4. Ruby ― resolvとOnigmo確認済み
| CVE | 種別 | 内容 |
|---|---|---|
| CVE-2026-80212 | DoS | 悪意あるDNS応答でメモリ枯渇。攻撃者が影響を与えられるホスト名(webhook宛先・ユーザー指定URL)を解決するアプリで、ライブラリが恒久的に保持してしまう応答を返され、繰り返しでプロセスが肥大化 |
| CVE-2026-80213 | 検証迂回 | ホスト名検証の迂回。許可リストやSSRFフィルタで検査した後に別のドメインを引かされ、許可していないホストへ接続しうる |
影響は resolv gem 0.4.0〜0.7.1 と 0.3.1以前。影響するのはresolv経由の名前解決のみ(Resolv直呼び/resolv-replace/同様に解決する依存gem)。Net::HTTP など通常のソケットはOSリゾルバを使うため影響しません。→ resolv 0.7.2(3.3系は0.3.2)へ。
もう一系統がOnigmoです。GitLabのCVSS 10.0×2を含む正規表現系4件の根本原因で、10月23日の Ruby 4.0.9/3.4.12/3.3.13 で修正されました。
| GitLabのCVE | Ruby側のバグ | 修正を含む最初のリリース |
|---|---|---|
| CVE-2026-89078 | 選択(alternation)後のパターン解析失敗時の二重解放 | 4.0.0/3.4.12/3.3.13 |
| CVE-2026-93577/97229 | コンパイル済みパターンのサイズ計算での整数オーバーフロー | 4.0.8/3.4.12/3.3.13 |
| CVE-2026-110264 | 多数の繰り返しを含むパターンでの内部IDオーバーフロー | 4.0.9/3.4.12/3.3.13 |
Regexp.new/Regexp.union//#{input}/)が対象です。自作リテラルだけなら影響しません。そしてRegexp.timeout では防げず、パターン長の制限も緩和策になりません(短いパターンで発火する例があります)。5. Oracle Java SE ― コード欠陥ではなく「信頼の欠陥」確認済み
CVE-2026-91403(CVSS 3.1で9.1、JSSE)。実体は認証局 eMudhra の中間CA証明書8枚の秘密鍵漏えいです。連鎖するルート証明書がJDK同梱の cacerts にあったため、攻撃者が漏えい鍵で発行した偽証明書をJavaアプリが正規として信頼してしまいます。影響は TLSなりすまし・中間者攻撃による窃取・改竄、署名付きJARの検証もすり抜けうる。
対象は 8u511/11.0.33/17.0.21/21.0.13/25.0.5/27.0.1、GraalVM for JDK 17.0.21/21.0.13、GraalVM Enterprise 21.3.20。修正は該当ルートを含まない最新のJava更新(Oracle Patch Availability Document CPU426)。OpenJDKディストリ(Temurin・Corretto等)やOSのCAパッケージでも同様の失効対応を確認してください。
キーストアをバックアップの上、該当ルート4件を削除して再起動します。
keytool -delete -cacerts -alias "emsignrootcag1 [jdk]"
keytool -delete -cacerts -alias "emsignrootcag2 [jdk]"
keytool -delete -cacerts -alias "emsigneccrootcag3 [jdk]"
keytool -delete -cacerts -alias "comodoaaaca [jdk]"JDK 8は -keystore $JDK_HOME/jre/lib/security/cacerts を指定。または失効確認を有効化(-Dcom.sun.net.ssl.checkRevocation=true -Dcom.sun.security.enableCRLDP=true)。署名付きJARはJDK 17以降で jarsigner -verify -revcheck -strict。可用性の注意:削除によりeMudhra系の正規証明書を使う接続先とのTLSが失敗する場合があります。業務上の接続先を先に確認してください。
6. ISC BIND 9 ― 回避策なし確認済み
10月21日に4件が一斉開示。中心はCVE-2026-94300(CVSS 3.1で8.1)。GSS-TSIG(Kerberos認証をTSIG署名に組み合わせる動的更新)の実装不備で、取得済みの署名付きUDPメッセージをリプレイすると named のメモリが壊れ、サービス停止やRCEに至る恐れがあります。JPRSは10月22日に緊急技術情報を発出しました。
| CVE | スコア | 内容 |
|---|---|---|
| CVE-2026-94300 | 8.1 | GSS-TSIGの同時メッセージでメモリ破壊 → DoS/RCE |
| CVE-2026-19630 | 7.5 | リゾルバの資源枯渇型DoS(増幅) |
| CVE-2026-96888 | 7.5 | redirectゾーン+strict QNAME最小化でアサーション失敗 |
| CVE-2026-97313 | 7.5 | 複数RPZゾーンの recursive-only 混在で異常終了 |
影響は 9.11.0〜9.18.50/9.20.0〜9.20.29/9.21.0〜9.21.26。9.18系などEOL系列に修正版はありません。→ 9.20.30/9.21.27(プレビュー版は 9.20.30-S1)へ。ISCは「No workarounds known」、JPRSも「一時的な回避策は存在しません」と明言しています。GSS-TSIGの使用有無は named.conf の tkey-gssapi-keytab/update-policy で確認できますが、使用していなくても更新対象です。適用後は named -v → named-checkconf → 再起動まで。
出典
- php.net「PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35 released」(2026-10-21) https://www.php.net/archive/2026.php#2026-10-21-5
- CERT-EU Security Advisory 2026-018 https://cert.europa.eu/publications/security-advisories/2026-018
- AWS Security Blog(MadPotによる公表前の悪用検知) https://aws.amazon.com/blogs/security/amazon-threat-intelligence-identifies-php2shell-exploitation-prior-to-public-disclosure-in-madpot/
- JPCERT/CC JPCERT-AT-2026-0033 https://www.jpcert.or.jp/at/2026/at260033.html
- Node.js「October 2026 Security Releases」(2026-10-21) https://nodejs.org/en/blog/vulnerability/october-2026-security-releases
- Aikido Security「Node2Shell」 https://www.aikido.dev/blog/node2shell-nodejs-brotli-rce-cve-2026-111497
- GitHub Advisory GHSA-9v8h-qqgm-4m35(Python brotli) https://github.com/advisories/GHSA-9v8h-qqgm-4m35
- Python Software Foundation Blog(3.10.22ほか) https://blog.python.org/2026/10/python-31022-31117/
- Ruby公式「セキュリティアドバイザリ: CVE-2026-80212 / 80213」 https://www.ruby-lang.org/ja/news/2026/08/27/multiple-vulnerabilities-in-resolv/
- Ruby公式「Regexp fixes for GitLab CVEs」(2026-10-23) https://www.ruby-lang.org/en/news/2026/10/23/regexp-fixes-for-gitlab-cves/
- Oracle Security Alert CVE-2026-91403 https://www.oracle.com/security-alerts/alert-cve-2026-91403.html
- Oracle「Distrusting eMudhra Intermediate Certificates in Oracle JDK」(2026-10-24更新) https://ops.java/emudhra
- JPRS 緊急技術情報(BIND 9、2026-10-22) https://jprs.jp/tech/security/2026-10-22-bind9-cve-2026-94300.html
- ISC KB CVE-2026-94300 https://kb.isc.org/docs/cve-2026-94300