powermail 安全通知
如果您收到了我发来的指向此页面的电子邮件,是因为您的网站似乎正在运行 powermail(由 in2code
开发的 TYPO3 表单扩展,Composer 包名为 in2code/powermail,位于您的文件
typo3conf/ext/powermail/ 中,或在 Composer 安装下位于 vendor/in2code/powermail/)的一个版本,
该版本处于已知安全问题的受影响范围内。本页面解释了该问题是什么、如何判断它是否适用于您的网站、
应更新到哪个版本,以及如何检查是否已有人利用它攻击过您。
在其他一切之前,关于此通知最重要的事实是:处于受影响范围内的版本本身并不意味着您的网站已暴露。 下面描述的问题仅在表单中存在被标记为发件人姓名的字段时才会起作用,而我无法从外部看到您的表单是 如何配置的:
- 该问题仅影响至少有一个字段勾选了 “此字段包含发件人姓名” 复选框(英文界面为 “This field contains the Name of the sender”,位于 TYPO3 后台中该字段的 Extended(扩展) 选项卡上)的 powermail 表单。如果您的任何表单都没有使用该标记,那么即使版本受影响,此问题也不影响您。
- 话虽如此,该标记很常见。表单向导的标准 姓名 字段通常会设置它,而且厂商自己的公告称这种配置 “常见且接近默认”。因此请务必检查,而不要凭假设。
我可以从公开文件中读取您的 powermail 版本,但无法读取您的表单设置,所以此通知是预防性的提醒, 而不是对您网站的确认结论。
该问题是 CVE-2026-77136(TYPO3 公告 TYPO3-EXT-SA-2026-022),是该扩展邮件处理中的一个 无需身份验证的服务器端模板注入。它影响 10.9.3 之前的所有 powermail 版本、12.6.1 之前的所有 11.x 和 12.x 版本,以及 13.2.1 之前的所有 13.x 版本。该问题已在 10.9.3、12.6.1 和 13.2.1 中修复,三个版本均于 2026 年 8 月 25 日发布,每条 TYPO3 版本线各一个。不存在因足够老 而不受影响的版本:这一弱点是该扩展最初设计的一部分,而不是某个后来版本才引入的。
关于紧迫性的说明,因为这是一份有条件的通知。如果您的任何表单都没有被标记为发件人姓名的字段, 那么更新只是日常维护。如果有表单包含这样的字段,请把更新当作优先事项处理:厂商公告报告称此问题 正在被积极利用,在那种配置下,一个完全没有账户的访客就能让您的服务器执行其选择的模板代码, 这可能泄露您的配置、环境变量和源代码,并且视安装情况而定,可能导致远程代码执行。
这是扩展的缺陷,不是 TYPO3 核心的缺陷。即使 TYPO3 完全保持最新,如果 powermail 扩展本身处于 受影响版本,也不能保护您。
这封邮件是真实的吗?
是的。这是一位独立安全研究员出于善意、遵循负责任披露原则发出的通知。我不向您索要金钱、密码或 网站访问权限,也没有试图入侵您的网站、提交您的任何表单或向其发送任何内容。
我所做的只是查看您的网站向每位访客公开提供的文件(就像您的首页是公开的一样),并记下该扩展自身 资源所标识的版本。我特意没有提交任何表单,没有向任何地方发送模板语法,也没有接近该扩展的 邮件处理功能。这项检查完全不涉及您的数据、您的后台或网站的任何私密部分(详见下文 我做了什么、没做什么)。
如果您想核实我的身份,请查看本页底部的联系方式以及关于页面。
为什么这很重要
Powermail 为大量 TYPO3 网站构建联系表单和咨询表单。当访客提交表单时,该扩展会向网站配置的收件人 发送一封邮件,并从编辑者标记为包含发件人姓名的那些表单字段中取值,填入这封邮件的发件人姓名。
Powermail 允许编辑者在某些邮件设置中写入 TYPO3 的 Fluid 模板语言的小片段,例如让邮件主题显示为 “Message from {firstname}”。对于编辑者输入的值来说,这是一个有意为之的功能。而在受影响版本中, 由访客自己的输入拼装出的发件人姓名被交给了同一个模板引擎,就好像它是编辑者写的一样。因此, 访客可以在公开表单的姓名字段中输入 Fluid 语法,服务器就会在构建收件邮件时执行它。
由此引出两点,方向相反。第一,只有当某个表单字段确实带有发件人姓名标记时这才有影响;表单不使用 这类字段的网站无法通过此问题被触及。第二,在标记已设置的地方,不需要账户、不需要密码、 也不需要任何人的配合:表单本来就是面向公众开放的,攻击者唯一要做的就是提交它。厂商将此问题评为 危急(CVSS 4.0 评分 9.5),其公告称该问题正在被积极利用。
我只在网站所有者采取行动所需的层面上描述此事,不再深入。我不会公布能让人复现它的细节,也请您 不要对自己或任何他人的网站尝试。按下文所述检查您的表单字段和版本,就足以让您决定该怎么做。
如果我的邮件提到了此问题,意味着您网站资源所标识的版本处于受影响范围内。我没有测试您的网站是否 可被利用,也看不到您的表单是如何构建的。我观察到的只有版本。
我受影响吗?
由两个问题决定,按此顺序。
第一步:是否有任何表单字段带有发件人姓名标记?
这是决定性的问题,只有您能回答。检查自己的表单完全安全,也正是本页面的意义所在。
- 登录 TYPO3 后台,打开存放您 powermail 表单的页面(或文件夹)。每个表单是一条记录,包含一个或 多个页面,每个页面包含字段。
- 打开每条字段记录,在其 Extended(扩展) 选项卡上查找 “此字段包含发件人姓名” 复选框。 它最常被勾选在访客填写姓名的那个字段上。
- 如果您所有表单的任何字段都没有勾选该复选框,那么即使版本受影响,此问题也触及不到您的 网站,不过作为日常维护,更新仍然值得做。
- 如果任何字段勾选了它,此问题就与您相关,您应尽快更新(见如何更新)。 如果无法立即更新,请在每个勾选了该复选框的字段上取消勾选:这是厂商自己推荐的缓解措施, 它本身就能关闭此问题。代价是表单发送的邮件中将不再填入发件人姓名,直到您完成更新并重新勾选。
请不要对自己或任何他人的网站尝试复现此问题;回答上面的问题并不需要这样做。
第二步:您正在运行哪个版本?
您不必只听我的一面之词。请注意,TYPO3 扩展没有像 WordPress 插件那样的公开版本文件,因此可靠的 读取方式都在您的安装内部:
从 TYPO3 后台(权威来源): 进入 管理工具(Admin Tools),然后进入 扩展(Extensions)。 已安装扩展列表会显示每个扩展的版本;找到 powermail。(在基于 Composer 的安装中,该列表为只读, 但仍会显示已安装的版本。)
从命令行(Composer 安装): 在项目目录中运行 composer show in2code/powermail。versions
一行就是已安装的版本。
从文件: 打开扩展文件夹内的 ext_emconf.php(经典安装为 typo3conf/ext/powermail/,Composer
安装为 vendor/in2code/powermail/),在文件开头附近查找 'version' 条目。
然后应用以下规则,注意版本按数字而非字母比较(10.9.2 比 10.8.2 新,13.2.1 比 13.2.0 新):
- 13.0.0 至 13.2.0: 可能受影响,取决于上面的标记问题。请更新到 13.2.1 或更高版本。
- 11.0.0 至 12.6.0: 可能受影响,取决于上面的标记问题。请更新到 12.6.1 或更高版本。 这包括每一个 11.x 版本:没有单独的 11.x 修复,而 12.6.1 与 11.x 运行在相同的 TYPO3 版本 (12.2 至 12.5)上,因此这是一次纯粹的扩展更新,无需升级 TYPO3。
- 10.9.2 及所有更早版本: 可能受影响,取决于上面的标记问题。如果您在 9.x 或 10.x (TYPO3 11.5)上,请更新到 10.9.3 或更高版本。如果您在 7.x 或 8.x(TYPO3 8.7 至 10.4) 上,请看下一段。
- 13.2.1、12.6.1 或 10.9.3 及各自版本线内的更高版本: 就此问题而言已经修复。
如果您在 powermail 7.x 或 8.x 上,没有能运行在您的 TYPO3 版本上的修复版本:10.9.3 要求 TYPO3 11.5。对这些网站,厂商的指示是采用上述缓解措施,即在每个勾选了“此字段包含发件人姓名”的 字段上取消勾选,并规划将 TYPO3 升级到有修复版 powermail 可用的受支持版本线。这些老版本所运行的 TYPO3 本身早已停止支持,这也是规划这次升级的第二个理由。
有一种检查方式不可行,请不要依赖它。 查看页面源代码时,您会看到扩展资源后面附着一长串数字,
例如 .../JavaScript/Powermail/Form.min.js?1785752971(或嵌入在文件名中,如
Form.min.1785752971.js)。这个数字是 TYPO3 为清除缓存而附加的文件时间戳,不是版本号,肉眼无法
从中读出版本。碰巧我的检查用的正是它(方式在下文解释),但值得信赖的是上面那些读取方式。
如何更新
修复版本已发布在 TYPO3 扩展仓库(TER)、Packagist 和 GitHub 上,所以这是一次普通的扩展更新。 请先备份,然后通过与您网站安装方式相符的机制进行更新:
- 在进行更改之前备份您的网站(文件和数据库)。大多数托管服务商都提供一键备份。
- Composer 安装(TYPO3 12 和 13 上的大多数网站,以及 11 上的许多网站):在项目目录中运行
适用于您版本线的依赖更新,例如 TYPO3 13 上运行
composer require "in2code/powermail:^13.2.1",TYPO3 12 上为"in2code/powermail:^12.6.1", TYPO3 11.5 上为"in2code/powermail:^10.9.3"。然后执行您常规的更新后步骤(TYPO3 12 和 13 上为vendor/bin/typo3 extension:setup,或您的部署所用的等效命令)并清空缓存。 - 经典安装(非 Composer): 在 TYPO3 后台进入 管理工具(Admin Tools),然后 扩展(Extensions),将下拉菜单切换为 获取扩展(Get Extensions),搜索 powermail, 并将其更新到您版本线的修复版本。如果您的网站无法访问 TER,厂商公告中直接链接了各版本的压缩包 (见参考);通过 扩展 及其上传按钮上传压缩包。之后清空缓存。
- 更新后,用上面的步骤确认新版本(13.2.1、12.6.1 或 10.9.3,取决于您的版本线),并提交一次您 自己的表单作为测试,确认邮件仍能正常送达。
顺便也值得确认 TYPO3 本身和您的其他扩展都是最新的,因为同样的原则适用于它们全部。
更新之后:此问题是否已被用于攻击您?
更新关闭了此问题,对许多网站来说这就是全部任务。本页面是预防性通知,不是事件报告:我无法得知您的 网站上是否发生过什么,也没有去查看。
但由于厂商报告此问题已在实际环境中被利用,有一项后续检查值得做,它同样取决于上面的标记问题。 如果您的网站在运行受影响版本期间有带发件人姓名字段的表单,那么就有人有可能通过该表单在您的服务器 上运行过模板代码,而更新无法撤销可能已被读取的内容。厂商公告给出了一个简单的自查方法,做一次毫无 成本:
- 查看您的表单收到过的发件人姓名。 检查表单发给您的邮件,以及存储在 TYPO3 后台
(powermail 自带的 Mails 模块)或数据库表
tx_powermail_domain_model_mail中的提交记录, 查找包含 Fluid 语法的发件人姓名,例如f:、v:或{namespace。真实访客的姓名 绝不会是那个样子。 - 如果找到了任何此类记录,厂商的指引是将系统视为可能已被入侵。由于此问题可能暴露配置和环境
变量,此时明智的应对是轮换您网站持有的机密:数据库密码、TYPO3 的
encryptionKey、 Install Tool 密码,以及存储在配置或环境中的任何 API 密钥或凭据。检查后台用户中是否有您不认识的 账户,查找服务器上的异常文件;如果您的组织有 IT 安全团队或国家级 CERT,请让他们参与。 - 如果什么也没找到,尤其是当一开始就没有字段带该标记时,仅更新就足够了。
为明确定位:这是一次自查,不是您的网站已遭攻击的声明。此通知基于版本指纹,而非任何事件证据。
我做了什么、没做什么
为了对我邮件背后的检查完全透明:我只读取了您的网站本来就向每位访客提供的文件,具体是您的首页 以及写在其中的 powermail 资源地址。我没有访问您的 TYPO3 后台、数据库、表单配置或网站的任何 私密部分。
尤其是,我从未提交过您的任何表单,也从未向您或任何他人的网站发送过模板语法。没有提交、测试或 利用任何东西。这一点在这里比在大多数此类页面上更重要,因为提交表单正是此问题所涉及的那个动作, 所以“我没有碰它”正是披露与入侵之间的全部区别。
版本是如何识别的,鉴于 TYPO3 扩展不发布版本文件:TYPO3 会把每个资源的最后修改时间附加到其
URL 上,如 Form.min.js?1785752971。在用 Composer 安装的网站上,这个时间就是该版本发布的时刻,
因为 Composer 在解包时会保留它,所以这个数字能精确标识版本:每个 powermail 版本都有自己的数字。
我将您网站提供的数字与已发布版本的时间进行了比对,只有完全匹配时才给您写信。其他任何情况
(通常是通过扩展管理器安装或以复制文件方式部署的网站所提供的),都被视为“未知”,那些网站我根本
没有联系。
这个方法有一个已知的盲区,而它偏向于谨慎一侧。修复只更改了扩展的 PHP 代码,没有更改其公开资源。 因此,如果您的网站是通过只替换代码来修补的(手工热修补而非完整更新),其资源仍带着旧版本的时间戳, 即使已受保护也会被读作受影响版本。如果您已通过其他方式修复了此问题,则无需采取任何行动, 对打扰深表歉意。
我也有意不公布会帮助他人利用此问题的细节。上面的描述止步于网站所有者所需的层面,我不会链接任何 概念验证代码。
这是一次基于版本的观察:您网站的资源标识出一个处于受影响范围内的版本。这并不是说您的网站在 我检查时可被利用。由于此问题取决于一个我看不到的表单字段设置,处于该范围内的网站很可能根本没有 暴露,而且处于该范围内的网站也可能另外受到其他手段(例如 Web 应用防火墙)的保护。
我没有网站管理员 / 我卡住了
如果您不是维护网站的人,请将此页面转发给负责维护的人(您的网站开发者、代理公司或托管服务商)。 他们会很快看懂上面的步骤。
如果您自己维护网站并且遇到困难,我很乐意免费为您指明方向。请通过下面的联系方式与我联系。
联系方式
Evan Harris,安全研究员
- 邮箱:security@mail.mcpsec.dev
- X:@Evan__Harris
- GitHub:eharris128
- LinkedIn:Evan Harris
我就此类问题主动联系,纯粹是为了帮助运营者保护自己的网站。如果您不希望再次收到联系,请告诉我, 我会遵从。
参考
官方公告与追踪
开发者 / 扩展