链接的 PHP2Shell 漏洞可根源到 25 个服务器,包括美国政府的服务器
更新时间:2026 年 10 月 29 日。

Dream Research 团队在发现该安全事件后,持续分享最新进展,并与 Palo Alto Networks(帕洛阿尔托网络)合作进行调查。更多细节已在相关邮件中披露,更多信息可在 Palo Alto Networks 官方网站查阅。
此次攻击涉及自定义的 PHP2Shell 漏洞与内核本地权限提升(LPE)漏洞的组合利用,目标为 Palo Alto Networks PAN-OS 防火墙的特定版本。
10 月 25 日,Dream 的研究人员发现了疑似由中国人工智能协助的攻击活动痕迹。该活动成功入侵了 25 台服务器,其中包括位于美国政府附属环境中的系统。攻击者将 PHP2Shell 远程代码执行漏洞与内核特权升级漏洞相结合,以危害暴露的系统。
受影响设备运行的是 Palo Alto Networks PAN-OS 的特定版本。攻击面主要集中在 PAN-OS 管理 Web 服务器及 GlobalProtect 门户。Palo Alto Networks 旗下的 Unit 42 部门已独立验证了攻击者的工具及相关结果。
在入侵防火墙后,攻击者发起了针对 Active Directory(AD)的攻击。恢复的数字取证证据证实了凭证提取和目录枚举行为。
这一行动揭示了暴露的管理接口如何成为组织身份基础设施的攻击通道。对于政府防御者而言,发现漏洞仅是开始,真正的挑战在于从识别受损系统到理解和控制攻击入口的全过程。
以下研究基于 Dream 公司的自主网络研究产品 Hero 完成。
发现详情
Dream 研究人员确定了一个完整的攻击操作链条,其中包括对 PHP2Shell 漏洞链 (CVE-2026-109618/CVE-2026-109619) 的自定义武器化,结合 Fragnesia 内核特权升级漏洞 (CVE-2026-46300)。此外,还发现了目标列表、漏洞日志以及约 40 个自定义的后渗透脚本。
这些证据显示,攻击者已在美国、日本、台湾和韩国境内根植了 25 台 PAN-OS 防火墙及管理服务器。一旦获得控制权,攻击者进一步渗透了三个特定的美国政府附属环境服务器。
恢复的证据揭示了一个从实验室环境开发漏洞开始,最终以持续访问美国政府组织内部 Active Directory 域结束的操作流程。
攻击中使用的人工智能
研究人员在部分攻击基础设施中观察到了人工智能辅助工具的痕迹:
- 安装了 Claude Code;
- 存在一个名为 Aiscan 的人工智能驱动攻击性安全平台;
- 发现了中国侦察平台 FOFA 的 API 密钥。
虽然目前没有直接证据表明 AI 工具专门用于编写漏洞利用代码或后渗透脚本,但代码结构、注释风格以及这 40 个脚本的高度一致性暗示了其可能由 AI 辅助开发。尽管如此,这次行动似乎并非完全自主的国家级攻击。
两个漏洞连结成一个请求
攻击者开发了两个独立的漏洞并将其链接在一起,使得在任何面向互联网的 PAN-OS 防火墙上实现 root 权限成为可能。整个攻击过程只需单个 HTTP 请求,无需任何凭据即可在脆弱的构建上运行。
PHP2Shell (CVE-2026-109618 / CVE-2026-109619) 远程代码执行
恢复的实现是一个自定义的非公开构建,并非任何已知 PHP2Shell 公开漏洞的副本。它遵循相同的基本概念,但似乎是独立开发并专门为 PAN-OS 定制的。
该漏洞针对 PAN-OS 管理 Web 服务器 (appweb) 中 PHP 的 session.upload_progress 机制。PAN-OS 使用 PHP 8.0.30 且具有高内存限制,这使得攻击的内存损坏阶段得以实现。
攻击分为四个阶段进行:
- A1 内存耗尽 (~383MB): 攻击者用精心设计的多部分 POST 请求淹没服务器,每个请求都包含大量的文件名和会话进度数据。这将 PHP 的内存分配器推向极限,迫使系统进入可预测的内存布局。
- B1 信息泄露: 第二个请求利用 A1 阶段伪造的过时会话 ID 长度,强制读取出界。服务器的 Set-Cookie 响应头带有泄露的指针值,使攻击者能够获取 libphp.so 在运行时的基址。
- A2 陈旧引用设置 (~500MB): 另一轮内存压力初始化了一个会话,留下
http_session_vars作为一个活的zend_reference,然后触发第二次 OOM,导致mod_data=NULL,创建一个攻击者可以在 B2 阶段伪造的陈旧引用。 - B2 代码执行: 最后的请求在释放的内存区域中伪造了一个 PHP HashTable 条目。伪造的
pDestructor回调指向zif_system(PHP 的system()函数),其数据指向一个 shell 命令字符串。当 PHP 的清理处理器遍历 HashTable 时,它会调用伪造的析构函数,从而以无人值守的方式执行任意命令。
Fragnesia (CVE-2026-46300) 内核特权升级
由于 SELinux 限制了 httpd_t 修改系统文件,为了完成 root 提权,攻击者连锁使用了第二个漏洞:Linux 内核 XFRM ESP-in-TCP 子系统中的漏洞。
Fragnesia 利用页面缓存写入覆盖 /etc/pam.d/su,用 pam_permit.so(接受所有认证)取代其原有的认证规则。由于 PAM 文件仅有 774 字节,该漏洞使用每字节拼接变体来精确写入文件。重写完成后,执行 su root 无需密码即可成功。
这两种漏洞都在单个 B2 HTTP 请求中运行。从未验证的 HTTPS 连接到持久的 root webshell,整个攻击链在 15 分钟内即可完成。
实验室:规模化的版本分析
这并非一个单一的“点火即忘”载荷。它需要精确的内存偏移量,而这些偏移量在不同 PAN-OS 版本之间有所不同,包括 zval_ptr_dtor 的地址、zif_system 的地址、HashTable 结构大小,以及每个阶段控制堆布局的内存几何参数。
研究人员发现了 11 个 JSON 版本档案,每个 PAN-OS 版本对应一个:
| PAN-OS 分支 | PHP 版本 | 配置文件状态 | 备注 |
|---|---|---|---|
| 11.1 | 7.4.33 | 2 个临时配置 | PHP 7.4 RCE 未在实验室验证,全链未校准(基本构建加一个快速修复变体) |
| 12.x | 8.0.30 | 1 个校准配置,8 个临时配置 | 有一个完全经过实验室测试的基础形状;其他配置继承其几何参数或与邻近构建共享偏移量 |
每个配置文件都包含从该版本的 libphp.so 二进制文件中提取的精确偏移量、每个库的 SHA256 哈希值、ELF 构建 ID 以及通过实验室测试调整的精确内存几何参数(块大小、填充数量、排水数量、喷雾偏移量)。
“校准”和“临时”配置文件之间的区别值得注意:“校准”意味着攻击者对该版本的运行虚拟机进行了漏洞测试,并确认内存几何参数有效;“临时”则意味着他们从二进制文件中计算了偏移量,但未在实时实例上进行验证。
活动轨迹:从 19,000 个发现到 25 个被利用
攻击者准备了 9 个可利用版本的漏洞和配置文件。
第一阶段:全球发现 (19,000 个目标)
通过使用类似于 Shodan 的中国互联网资产搜索引擎 FOFA,攻击者在在全球范围内识别了大约 19,000 个面向互联网的 PAN-OS 防火墙。识别方法主要依赖证书指纹和 HTTP 响应签名。
第二阶段:版本指纹识别(5,000 个存活)
一个定制的版本扫描器以 200 个并发线程对全部 19,000 个目标进行扫描,识别出哪些设备实际在线以及运行的是哪个 PAN-OS 版本。约有 5,000 台设备响应了版本信息。
第三阶段:地理和版本过滤 (240 个目标)
在 5,000 台在线设备中,攻击者筛选出仅位于美国、日本、台湾和韩国的服务器。随后,他们进一步筛选出版本与其漏洞利用配置文件相匹配的设备(运行 PHP 8.0.30 的 PAN-OS 12.1 和 12.2 分支)。最终生成的目标列表包含 240 台防火墙。
选择美国、日本、台湾和韩国作为目标,是因为它们是中国在太平洋地区网络行动的主要战略对手和情报目标。
第四阶段:自动利用 (24 个 Root)
这 240 个目标被输入到一个自动化批量运行器中,一次运行 5 个目标,每个目标的时间为 1800 秒 (30 分钟)。对于每一个成功的攻击,批次执行以下步骤:
- 运行完整的 PHP2Shell + Fragnesia 链;
- 在防火墙 (/unauth/php/change_password.php) 上的公开可访问目录中植入一个 103 字节的 PHP root webshell;
- 通过 webshell 执行
id命令验证 root 权限; - 将目标的 hostname 和 IP 记录到成功 CSV 文件中;
- 移动到下一个目标。
此时,24 台防火墙已被成功植入 root 权限。
第五阶段:分类 (优先处理 2 台防火墙)
对于 24 台被植入 root 权限的防火墙中的 22 台,攻击者除了植入 webshell 外没有采取进一步行动。没有持久化措施,没有隧道,也没有后渗透工具。这些服务器实际上处于“拥有并停放”的状态,允许攻击者随时通过 webshell 返回。
有两台看似属于同一目标的服务器超越了这一阶段。这两台服务器似乎都属于美国政府附属环境。
第六阶段:横向移动 (从防火墙转向域)
在 24 台被植入 root 权限的防火墙中,两台属于一个美国政府附属组织。从第一台防火墙中提取的运行配置显示出一个具有政府附属特征的环境:CAC (Common Access Card) 认证、特定的命名前缀以及标准化的政府风格资产命名。配置文件包含了该组织的完整内部网络拓扑:域控制器、中央防火墙管理服务器、Keycloak SSO 服务器、GitLab 实例、GlobalProtect VPN 网关以及 Active Directory 域。
第一台防火墙在 10 月 23 日 18:14 UTC 的自动批量运行中被植入 root 权限。但在不久后崩溃——可能是由于约 900MB 的利用流量所致——并且再也没有上线。攻击者通过 240 次自动探测监控了两小时,等待其恢复,但它没有回来。第二台防火墙的证书数据明确将其与目标组织联系起来,但在原始批量运行中超时。
认识到从第一台防火墙配置中揭示的组织价值后,攻击者创建了一个单独的专用战役,并于 10 月 24 日 10:09 UTC 成功利用了第二台防火墙。
在几个小时内,攻击者:
建立了通往内部网络的持久隧道。
一个 8 端口的反向 SSH 隧道将被入侵的防火墙连接回操作员的基础设施,转发访问权限至:
- 域控制器 (LDAP, LDAPS, RDP);
- 内部防火墙管理服务器;
- GlobalProtect VPN 基础设施;
- 用于任意内部网络访问的 SOCKS5 代理。
该隧道包裹在一个 systemd 服务和一个 rc.local 启动钩子中,两者都从 /usr/local/lib/.panops/ 启动脚本——这意味着它在重启后依然存活并会自动重新连接。
通过隧道利用管理服务器。 在 11:35 UTC,即在植入第二台防火墙 root 权限不到 90 分钟后,攻击者利用新获得的服务器访问权限以及相同的 PHP2Shell + Fragnesia 链攻击了第三台政府服务器——即只能通过隧道访问的内部防火墙管理服务器。该服务器集中管理组织的所有防火墙。攻陷它使攻击者能够访问所有受管防火墙的配置、凭证和网络设置。这将受攻击服务器的总数增加到 25 台。
从管理服务器发起 AD 攻击战役。 由于管理服务器已经具有到 Active Directory 的 LDAP 连接性(它需要此连接来验证 VPN 用户),攻击者将其用作域攻击的发射平台:
- 解密 LDAP 服务账户密码——设备配置存储加密后的密码,但拥有 root 权限的攻击者掌握主密钥。他们提取了明文密码并将其硬编码到后续每个脚本中。
- 通过 LDAP 查询枚举域中的每个用户和组。
- 使用组织主题密码对所有用户账户进行密码喷洒。该域的
lockoutThreshold=0——意味着没有账户锁定,允许无限次的喷洒尝试。 - 试图创建后门 AD 账户——包括一个用户账户(在每个 OU 中尝试)和一个机器账户(利用默认的
MachineAccountQuota设置)。 - 分析 AD ACL 链以寻找特权升级路径。
- 试图从 Keycloak IdP 配置中提取 SAML 签名密钥。
- 探测 Keycloak SSO 的身份验证绕过漏洞。
攻击结果——无论是密码喷洒是否找到有效凭证、后门账户是否创建成功,还是 SAML 密钥是否被提取——都保留在管理服务器的本地文件系统中,并未包含在恢复的证据中。这意味着目前尚不清楚妥协的全面程度。
管理服务器 → Active Directory
| 状态 | 活动 |
|---|---|
| ✓ | 从配置中解密 LDAP 密码 |
| ✓ | 完整的用户和组枚举 |
| ? | 密码喷洒(所有用户,无锁定) |
| ? | 后门用户 + 机器账户创建 |
| ? | SAML 签名密钥提取 |
攻击者当前拥有的资源
根据恢复的证据,可以确认攻击者拥有:
- 通过能在重启后存活的反向隧道和 SOCKS 代理,对组织内部网络的持久





