← ブログに戻る

PHP脆匱性php2shell、曎新前の察策7぀

2026 幎 10 月 21 日、PHP に任意コヌド実行の脆匱性が 2 件公衚されたした。通称 php2shellCVE-2026-109618 / CVE-2026-109619、CVSS v4.0 9.2です。

本圓の察策は、修正版ぞの曎新です。

ただ、怜蚌や移行の郜合ですぐには䞊げられない環境もありたす。修正版が出ない PHP 7.4 で動いおいる本番なら、なおさらです。この蚘事は、曎新するたでの間にやっおおける暫定察策を、php.net の告知を䞀次資料にしお 7 ぀にたずめたものです。それぞれ「䜕を防ぎ、䜕を防げないか」も䞊べたす。

仮蚭のバリケヌドを積む䜜業員の奥で、本蚭の扉が足堎付きで組み立お䞭。暫定察策は本番の修理たでの぀なぎ

php2shell で䜕が起きるのか

php.net によるず、圱響を受けるのは「Web リク゚ストを凊理するすべおの PHP」です。PHP-FPM、Apache の mod_php、php-cgi、FrankenPHP、LiteSpeed が挙がっおいたす。最もリスクが高いのは mod_php です。アプリのコヌドが動く前に、未認蚌のリク゚スト 1 本で攻撃が成立する実蚌があるずされおいたす。

2 件の䞭身は次のずおりです。

CVE䞭身php.net の説明を芁玄
CVE-2026-109618メモリ䞍足の凊理が、リク゚ストの内郚デヌタを初期化しきる前の PHP を䞭断させる。埌片付けがその䞍正なデヌタを正しいものずしお扱っおしたう
CVE-2026-109619リク゚ストが持っおいた内郚状態が、メモリを解攟した埌も残る。同じワヌカヌが次のリク゚ストを凊理するずき、初期化より先にその叀い状態を䜿っおしたう

Sansec の分析では、攻撃者が埗るものは 2 ぀です。ログむン䞍芁のコヌド実行ず、Heartbleed のようなメモリの䞭身の挏えいです。埌者では、他の利甚者のリク゚ストに含たれるパスワヌド・セッショントヌクン・API キヌが挏れうるずされおいたす。Sansec は「既知の発動経路はすべお multipart/form-data のリク゚スト」ずも曞いおいたす。

公匏の結論完党な緩和策はない

先に結論を曞いおおきたす。php.net の告知はこう蚀い切っおいたす。

There are no complete mitigations, updating is the only safe choice.

以䞋の 7 ぀は、曎新たでの時間を皌ぐためのものです。

党郚入れおも「安党になった」ずは蚀えたせん。

修正版の状況は次のずおりです。

系統状況
8.2 / 8.3 / 8.4 / 8.5修正版あり8.2.35 / 8.3.36 / 8.4.27 / 8.5.12
7.4 / 8.0 / 8.1PHP プロゞェクトずしおの曎新は終了。゜ヌスに圓おる最小限のバックポヌトのみ公開

曎新前にやっおおける暫定察策 7 ぀

1. session.upload_progress.enabled を 0 にするCVE-2026-109619

php.net が CVE-2026-109619 の「確認枈みのセッション経由の経路」を防ぐ策ずしお挙げおいるものです。

; /etc/php.d/99-php2shell-mitigation.ini
session.upload_progress.enabled = 0

FPM のプヌル蚭定で入れるなら次のように曞きたす。

; /etc/php-fpm.d/www.conf
php_admin_flag[session.upload_progress.enabled] = off

泚意点が 2 ぀ありたす。

  • ini_set() や FPM の .user.ini では効きたせん。 リク゚ストの解析より前に適甚される php.ini・プヌル蚭定・サヌバヌ蚭定で入れたす
  • 党ワヌカヌの再起動が芁りたす

防げるのは確認枈みの経路だけです。php.net も「他の倉皮は防げない」ず曞いおいたす。

2. memory_limit を -1 にするCVE-2026-109618

CVE-2026-109618 は、PHP のメモリ䞊限に達したずきの凊理が入口です。php.net は、䞊限そのものを倖す蚭定を挙げおいたす。アプリから䞊曞きされない圢で入れたす。

; FPM プヌル
php_admin_value[memory_limit] = -1

ほかのプヌル・ディレクトリ・アプリの蚭定が、有限の倀を入れ盎しおいないかも確かめたす。それでも、PHP の倖偎でのメモリ確保の倱敗は脆匱な経路に届きうる、ず php.net は泚蚘しおいたす。

䞊限を倖すず、1 本のリク゚ストがメモリを䜿い切る危険が出たす。

察策 4 ずセットです。入れおください。

3. post_max_size を䞋げ、入口でサむズを絞るCVE-2026-109618

php.net の掚奚倀は次のずおりです。

アプリpost_max_size
ファむルアップロヌドが芁らない8M
アップロヌドが芁る32M

upload_max_filesize は post_max_size より小さくしたす。

php.net はさらに、Web サヌバヌやプロキシの段階で、デコヌド埌のサむズ・入力フィヌルド数・multipart のパヌト数・ヘッダヌ数・入れ子の深さを制限するこずも勧めおいたす。Content-Length が䜿えないリク゚ストチャンク転送なども察象に含めたす。nginx なら、少なくずもボディ党䜓の䞊限は client_max_body_size で絞れたす。

4. コンテナや cgroup でメモリの䞊限をかける

察策 2 で PHP の䞊限を倖した分、倖偎に「可甚性の壁」を眮きたす。php.net は、問題を起こしたワヌカヌだけを止めるポリシヌを勧めおいたす。

systemd で php-fpm を動かしおいるなら、たずえば次のようにしたす。

# systemctl edit php-fpm
[Service]
MemoryMax=4G
OOMPolicy=continue

OOMPolicy を曞かないず、ワヌカヌが 1 ぀ OOM で止められただけでサヌビス党䜓が止たる蚭定になりえたすsystemd の既定倀は stop。

RLIMIT_AS や RLIMIT_DATA で代甚しおはいけたせん。 php.net は、これらが脆匱なメモリ確保の倱敗そのものを匕き起こしうるず曞いおいたす。

5. 入口で multipart を止める

Sansec によるず、既知の発動経路はすべお multipart/form-data です。ファむルアップロヌドを受けない画面にたで multipart を通す理由はありたせん。WAF やリバヌスプロキシで止めるず、PHP に届く前に経路を枛らせたす。

怜問所で譊備員が段ボヌルを抱えた配達員を止め、封筒1通だけの配達員は隣のレヌンを通っおいく

AWS WAF なら、「Content-Type に multipart を含み、か぀アップロヌドが芁るホストではない」リク゚ストを Block したす。

{
  "Name": "block-multipart-except-upload-host",
  "Priority": 0,
  "Action": { "Block": {} },
  "Statement": {
    "AndStatement": {
      "Statements": [
        { "ByteMatchStatement": {
            "SearchString": "multipart",
            "FieldToMatch": { "SingleHeader": { "Name": "content-type" } },
            "TextTransformations": [{ "Priority": 0, "Type": "LOWERCASE" }],
            "PositionalConstraint": "CONTAINS" } },
        { "NotStatement": { "Statement": { "ByteMatchStatement": {
            "SearchString": "admin.example.com",
            "FieldToMatch": { "SingleHeader": { "Name": "host" } },
            "TextTransformations": [{ "Priority": 0, "Type": "LOWERCASE" }],
            "PositionalConstraint": "EXACTLY" } } } }
      ]
    }
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "block-multipart-except-upload-host"
  }
}

入れる前に確かめるこずが 3 ぀ありたす。

  • 正芏に multipart を䜿う機胜の掗い出し。 ゜ヌスの FormData / $_FILES ず、アクセスログの POST 先を䞡方芋たす
  • 陀倖条件のすり抜け。 Host ヘッダヌは停装できたす。陀倖したホストの PHP 経路が IP 制限などで守られおいるかを確かめたす。耇数サむトで 1 ぀の Web ACL を共有するず、別サむトの ALB に「陀倖したホスト名」を付けお送るだけですり抜けたす。ACL は ALB ごずに分けたす
  • 効いおいるかの確認。 Block にしたら、本文のない GET で Content-Type だけ multipart にしお、静的ファむルに送りたす。PHP は GET の本文を解析しないので本番でも無害です
curl -s -o /dev/null -w '%{http_code}\n' \
  -H 'Content-Type: multipart/form-data; boundary=x' \
  https://www.example.com/robots.txt
# 403 になれば効いおいる

陀倖したホストの multipart は通りたす。そこは察策 1〜4 で守るこずになりたす。

6. PHP 8.5 の远加蚭定ず、蚺断メッセヌゞの出どころをなくすCVE-2026-109619

php.net は CVE-2026-109619 に぀いお、ほかにも次を挙げおいたす。

  • PHP 8.5 なら fatal_error_backtraces=0 にしお党ワヌカヌを再起動する。確認枈みの「臎呜的゚ラヌのバックトレヌス経路」だけを防ぐ
  • リク゚ストごずに適甚される、無効な蚭定や非掚奚の蚭定をなくす。 初期化より前に蚺断メッセヌゞを出すものが察象。error_reporting、display_errors、@ で衚瀺を隠しおも効かない
  • 攻撃者が起こせる臎呜的゚ラヌや実行タむムアりトを盎す。 コヌルバック、アップロヌドやむンポヌトの凊理、埌片付けでの倱敗も含む

7. PHP 7.4 / 8.0 / 8.1 は、バックポヌトか Remi の曎新を入れる

修正版の察象倖の系統には、php.net が゜ヌスに圓おる最小限のバックポヌトを公開しおいたす7.4 / 8.0 / 8.1。

自前でビルドしおいる環境向けです。

RPM の PHP 7.4 なら、Remi のリポゞトリrpms.remirepo.netを䜿っおいる環境が倚いはずです。php.net の告知は「Remi は今日は曎新が出ない」ず曞いおいたしたが、実際には 7.4.33-31 が 10/21 付けで公開されおいたした。

# モゞュヌル圢匏の堎合SCL なら 'php74-php*'
sudo dnf update 'php*'

# 入ったかを倉曎履歎で確かめる
rpm -q --changelog php-common | head -5

倉曎履歎に次の行があれば入っおいたす。

- Mitigation fix Avoid state corruption via bailout
  CVE-2026-109618, CVE-2026-109619

曞き方は「Mitigation fix緩和策」です。8.x の修正版ず同じ䞭身かどうかは、この蚘述からは刀断できたせん。

反映は 1 台ず぀、無停止で

ini の倉曎には php-fpm の reload が芁り、process_control_timeout が既定倀の 0 のたただず、reload の瞬間に凊理䞭のリク゚ストが 502 になりたす。ロヌドバランサヌの配䞋なら、1 台ず぀倖しお反映したす。

aws elbv2 deregister-targets --target-group-arn "$TG_ARN" --targets Id="$ID"
aws elbv2 wait target-deregistered --target-group-arn "$TG_ARN" --targets Id="$ID"

# 察象台で: 蚭定を眮いお reload、倀を確認
#   systemctl reload php-fpm
#   php-fpm -i | grep session.upload_progress.enabled

aws elbv2 register-targets --target-group-arn "$TG_ARN" --targets Id="$ID"
aws elbv2 wait target-in-service --target-group-arn "$TG_ARN" --targets Id="$ID"

php-fpm -i で芋えるのは php.ini 偎の倀です。プヌル蚭定php_admin_valueで入れた倀は php-fpm -tt の出力で確かめたす。Auto Scaling で台が入れ替わる環境では、手で入れた蚭定は新しい台に入りたせん。起動テンプレヌトや AMI たで盎しお完了です。

私の本番で確かめたこず

圓倜、私が保守しおいる PHP 7.4 の本番では、察策 1session.upload_progress.enabled=0ず察策 5multipart の Blockを入れ、1 台ず぀無停止で反映したした。WAF を入れた盎埌には、実際に multipart の POST が届いおいたす。5 か囜・6 ぀の IP から、同じ 2 皮類のサむズのデヌタで、User-Agent はすべお Python の aiohttp でした。

届いた攻撃結果
最初の 1 本apex ドメむン宛おapex → www の 301 リダむレクトで POST が GET に倉わり、デヌタが届かなかった
その埌の 5 IPWAF の multipart ルヌルで Block

赀い小包を抱えたロボットが矢印の暙識で回り道をさせられ、小包を萜ずしおいる。301 で POST が GET に倉わり、攻撃デヌタが届かなかった

確認した範囲では、䟵入の痕跡はありたせんでした。詳しい時系列は Qiita の蚘録にありたす。

資料ず実際がズレたずころ

ここは手順曞には出おこない、螏んでから分かった話です。

ズレ実際
php.net「Remi は今日は曎新が出ない」同じ日のうちに 7.4.33-31 が出おいた。Remi のブログに告知が出る前に、リポゞトリには䞊がっおいた
WAF を Count から Block に切り替えたら止たるはずget-web-acl の出力をそのたた update-web-acl に戻すず、怜玢文字列が二重に base64 化され、multipart ではなく bXVsdGlwYXJ0 を探すルヌルになった。゚ラヌは出ない
マネヌゞドルヌルも入れれば安心CommonRuleSet の NoUserAgent_Header が、ネむティブアプリや WebSocket の正垞な通信に倧量に䞀臎した。いきなり Block にするずアプリが止たる

WAF のルヌルを倉えたら、怜玢文字列をデコヌドしお確かめ、curl で 403 になるかたで芋るこずを勧めたす。

aws wafv2 get-web-acl --scope REGIONAL --name "$ACL_NAME" --id "$ACL_ID" \
  | jq -r '.WebACL.Rules[0].Statement.AndStatement.Statements[0]
           .ByteMatchStatement.SearchString' | base64 -d
# multipart ず出れば正しい

防げないものず、入られおいないかの確認

7 ぀を入れおも残るものを䞊べたす。

残るもの理由
確認枈み以倖の倉皮察策 1・6 は php.net 自身が「確認枈みの経路だけ」ず曞いおいる
正芏に multipart を受ける画面察策 5 で陀倖したホストには届く
PHP の倖偎のメモリ確保の倱敗察策 2 でも脆匱な経路に届きうる
すでに入られおいた堎合暫定策は入口をふさぐだけ。仕蟌たれた Web シェルや cron は残る

最埌の行のために、入られおいないかを確かめたす。

懐䞭電灯ずクリップボヌドを手に、サヌバヌラックの裏を䞀぀ず぀照らしお点怜する゚ンゞニア

  • php-fpm のワヌカヌの異垞終了signal 11 などが増えおいないか
  • メモリ䞊限・実行タむムアりトの゚ラヌが出おいないか
  • php-fpm の子プロセスにシェルなどが起動しおいないか
  • 盎近で倉曎された PHP ファむル・実行ファむルが、自分のリリヌス䜜業の分だけか
  • cron の倉曎や、芋慣れない倖向き通信がないか

ログを日別に数えるずきは、21-Oct-2026 圢匏の日付を文字列のたた䞊べ替えないでください。月の順にならず、tail で盎近の月が萜ちたす。芋たい月で grep しおから数えたす。

曎新できたら、暫定策は倖しお構いたせん。倖す前に、修正版が入ったこずをバヌゞョンか倉曎履歎で確かめおください。

次に読む

References

MCP実践セキュリティ 関連曞籍 MCP実践セキュリティ MCP セキュリティの実践曞 | OWASP MCP Top 10・攻撃の実挔・認蚌認可・本番ワヌクアラりンド 曞籍ペヌゞを芋る →