Security SOP

PHP2Shell 漏洞檢測與修復手冊

CVE-2026-109618 / CVE-2026-109619 CVSS v4.0: 9.2 Critical 執行日期:2026-10-23 主機:www.smallh.org
⚠ 遠端程式碼執行 (RCE) — 正被積極利用中

攻擊者無需認證即可在伺服器上執行任意程式碼。影響自 PHP 5.4 起所有版本,涵蓋 mod_php、PHP-FPM、php-cgi、FrankenPHP、LiteSpeed 等所有 SAPI。Cloudflare 及 Amazon 已觀察到攻擊流量。

Step 1 — 檢測 檢查目前 PHP 版本

確認主機上安裝的 PHP 版本是否在受影響範圍內。已修復版本為 8.2.35、8.3.36、8.4.27、8.5.12 及以上。

Terminal
$ php --version
本機輸出(修復前)
PHP 8.1.2-1ubuntu2.28 (cli) (built: Oct 19 2026 18:54:45) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.28
判讀方式 PHP 8.1 已 EOL,且版本低於任何已修復版本 — 受影響

Step 2 — 檢測 檢查已安裝模組與執行方式

記錄目前安裝的 PHP 套件,以便升級後安裝對應版本。同時確認 PHP 透過何種 SAPI 對外服務。

列出已安裝的 PHP 套件
$ dpkg -l 'php8.1-*' | grep '^ii' | awk '{print $2}'
本機輸出
php8.1-cli
php8.1-common
php8.1-opcache
php8.1-readline
php8.1-sqlite3
確認 Apache 載入的 PHP 模組
$ apache2ctl -M | grep -i php
本機輸出
php_module (shared)  ← mod_php 直接曝露,受影響

Step 3 — 檢測 確認對外曝露狀態

檢查 Apache 啟用的站台設定,確認哪些網站正透過有漏洞的 PHP 對外服務。

檢查啟用的站台與執行中的服務
$ ls /etc/apache2/sites-enabled/
$ systemctl list-units --type=service --state=running | grep -iE 'php|apache|nginx'
本機輸出
000-default.conf
www.smallh.org-le-ssl.conf
www.smallh.org.conf

apache2.service   loaded active running   The Apache HTTP Server
項目狀態風險
PHP 版本 8.1.2 (EOL) Critical
執行方式 Apache mod_php 直接曝露
對外站台 www.smallh.org (HTTP + HTTPS) 生產環境
Ubuntu 更新 無可用修補 需手動升級

Step 4 — 修復 加入 PHP 安全更新來源 (PPA)

由於 PHP 8.1 已 EOL,Ubuntu 官方倉庫不會提供修補。使用 Ondřej Surý(Debian/Ubuntu 官方 PHP 維護者)的 PPA 取得 PHP 8.3.36 已修復版本。

加入 PPA 並更新套件索引
$ sudo add-apt-repository -y ppa:ondrej/php
$ sudo apt-get update
確認可用版本
$ apt-cache policy php8.3-cli
本機輸出
php8.3-cli:
  Installed: (none)
  Candidate: 8.3.36-1+ubuntu22.04.1+deb.sury.org+1
為什麼選 PHP 8.3? PHP 8.3 是目前最廣泛部署的穩定分支,修復版本 8.3.36 於 2026-10-21 釋出,與 PHP 8.1 的 API 向下相容度最好。PHP 8.2 同樣可行(需 8.2.35+)。

Step 5 — 修復 安裝已修復的 PHP 8.3

根據 Step 2 記錄的模組清單,安裝對應的 PHP 8.3 套件。模組名稱只需將 8.1 替換為 8.3。

安裝 PHP 8.3 及對應模組
$ sudo apt-get install -y \
    php8.3 \
    php8.3-cli \
    php8.3-common \
    php8.3-opcache \
    php8.3-readline \
    php8.3-sqlite3 \
    libapache2-mod-php8.3
依你的環境調整 若原先還有安裝其他模組(如 php8.1-mysql、php8.1-curl、php8.1-mbstring 等),請一併安裝 php8.3 版本。可用 dpkg -l 'php8.1-*' | grep '^ii' 取得完整清單。

Step 6 — 修復 切換 Apache 模組並重啟

安裝時若偵測到舊版模組已啟用,不會自動切換。需手動停用 8.1 模組、啟用 8.3 模組,再重啟 Apache。

切換 Apache PHP 模組
$ sudo a2dismod php8.1
$ sudo a2enmod php8.3
$ sudo systemctl restart apache2
本機輸出
Module php8.1 disabled.
Considering dependency mpm_prefork for php8.3:
Module mpm_prefork already enabled
Enabling module php8.3.
--- apache2 restart ---
Exit code: 0

Step 7 — 驗證 確認修復結果

從三個面向驗證:CLI 版本、Apache 載入的模組、網站回應狀態。

驗證 PHP CLI 版本
$ php --version
本機輸出(修復後)
PHP 8.3.36 (cli) (built: Oct 21 2026 14:31:50) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.36, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.36
驗證 Apache 模組 & 網站狀態
$ apache2ctl -M | grep -i php
$ curl -s -o /dev/null -w "%{http_code}" https://www.smallh.org/
本機輸出
php_module (shared)   ← PHP 8.3 mod_php
200                    ← 網站正常回應

修復完成

項目修復前修復後
PHP 版本 8.1.2 8.3.36
Apache 模組 mod_php8.1 mod_php8.3
CVE-2026-109618 受影響 已修復
CVE-2026-109619 受影響 已修復
網站狀態 200 OK 200 OK
後續清理(選用) 確認一切正常後,可移除舊版 PHP 8.1 套件:sudo apt purge php8.1*
然後執行 sudo apt autoremove 清理不再需要的相依套件。