Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-22038 — CVE-2026-22038 的详细分析,这是 AutoGPT Stagehand 模块中的一个高危漏洞,会以明文形式记录 API 密钥,包括根本原因、影响和修复措施。 | Kitploit
工具/GitHubGitHub/sivaadityacoder/cve-2026-22038
漏洞分析代码分析秘密检测学习与教育日志分析
GitHubsivaadityacoder/cve-2026-22038

CVE-2026-22038

CVE-2026-22038 的详细分析,这是 AutoGPT Stagehand 模块中的一个高危漏洞,会以明文形式记录 API 密钥,包括根本原因、影响和修复措施。

查看仓库
4个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-22038 — AutoGPT Stagehand 模块以明文形式将 API 密钥记录到日志中

CVE ID: CVE-2026-22038
产品: AutoGPT 平台(Stagehand 集成)
受影响版本: 所有版本,包括 autogpt-platform-beta-v0.6.45
修复版本: autogpt-platform-beta-v0.6.46
漏洞类型: CWE-532 — 将敏感信息插入日志文件
严重性: 高
报告人: Panuganti Siva Aditya (@sivaadityacoder)
报告日期: 2025 年 12 月 19 日
GitHub 安全公告: GHSA-rc89-6g7g-v5v7


我的分析过程

AutoGPT 是一个开源平台,允许用户构建和运行自主 AI 代理。它包含一个 Stagehand 集成,用于连接浏览器自动化和 LLM 提供商,如 OpenAI、Anthropic 和 Groq。

在对 Stagehand 模块进行代码审查时,我注意到凭据对象被直接传递到 logger.info() 调用中。我追踪了每条日志语句,发现 .get_secret_value() 被内联调用——明确绕过了 Pydantic 提供的 SecretStr 保护。

存在漏洞的文件:

root@kitploit:~
autogpt_platform/backend/backend/blocks/stagehand/blocks.py

三个模块受到影响,每个模块都有相同的模式:

StagehandObserveBlock(第 185–188 行)

root@kitploit:~
logger.info(f"OBSERVE: Stagehand credentials: {stagehand_credentials}")
logger.info(
    f"OBSERVE: Model credentials: {model_credentials} for provider "
    f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)

StagehandActBlock(第 285–288 行)

root@kitploit:~
logger.info(f"ACT: Stagehand credentials: {stagehand_credentials}")
logger.info(
    f"ACT: Model credentials: {model_credentials} for provider "
    f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)

StagehandExtractBlock(第 373–376 行)

root@kitploit:~
logger.info(f"EXTRACT: Stagehand credentials: {stagehand_credentials}")
logger.info(
    f"EXTRACT: Model credentials: {model_credentials} for provider "
    f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)

为了确认可利用性,我使用有效凭据运行了每个 Stagehand 模块,并搜索了应用程序日志:

root@kitploit:~
grep "secret:" /var/log/autogpt/application.log

输出确认真实的 API 密钥以明文形式出现:

root@kitploit:~
[INFO] OBSERVE: Model credentials: ... secret: sk-proj-abc123xyz789...
[INFO] ACT: Model credentials: ... secret: sk-ant-api03-def456uvw...
[INFO] EXTRACT: Model credentials: ... secret: sk-1234567890abcdef...

根本原因

AutoGPT 代码库正确使用了 Pydantic 的 SecretStr 类型来存储 API 密钥。当 SecretStr 对象被包含在 f-string 中或以正常方式打印时,它会显示为 **********——这种保护是有意设计的。

根本原因在于开发人员在 logger.info() 语句中直接调用了 .get_secret_value()。这会显式解包密钥并将原始字符串值传递给记录器,完全绕过了 SecretStr 的内置掩码功能。

日志级别为 INFO,这意味着这些语句在正常的生产环境中也会执行——而不仅仅是在本地调试会话中。每次这些模块之一使用凭据运行时,密钥都会被写入日志文件。


影响

  • 凭据窃取 — 明文 API 密钥存在于日志文件中,任何有权访问日志的人都能获取
  • 经济损失 — 被盗密钥被用于发起昂贵的 API 调用,费用由受害者承担
  • 数据访问 — 被盗凭据可能授予攻击者访问受害者在这些服务中数据的权限
  • 配额耗尽 — 攻击者可以故意消耗速率限制以拒绝服务
  • 长期暴露窗口 — 日志文件通常保留 30–90 天,因此使用一次的密钥可能会暴露数月
  • 合规问题 — 记录密钥违反 PCI-DSS、SOC 2 和 GDPR 要求

攻击场景:

  1. 攻击者通过配置错误的聚合系统(Splunk、ELK、Datadog、CloudWatch)、被入侵的监控账户或过度的内部访问权限获得日志文件的读取权限。
  2. 他们搜索类似 secret:、sk-proj- 或 sk-ant- 的模式。
  3. 他们从日志输出中提取真实的 API 密钥。
  4. 他们验证密钥:
root@kitploit:~
curl https://api.openai.com/v1/chat/completions \
  -H "Authorization: Bearer sk-proj-abc123xyz789..." \
  -H "Content-Type: application/json" \
  -d '{"model": "gpt-4", "messages": [{"role": "user", "content": "test"}]}'
  1. 有了有效密钥,他们就可以发起 API 调用、耗尽配额或访问受害者的数据。

暴露的凭据: Stagehand / Browserbase API 密钥、OpenAI API 密钥、Anthropic API 密钥、Groq API 密钥,以及 Stagehand 模块中配置的任何 LLM 提供商凭据。


修复

autogpt-platform-beta-v0.6.46 中的补丁从 logger.info() 语句中移除了 .get_secret_value() 调用。

推荐方法 — 完全从日志中移除密钥:

root@kitploit:~
# 修复前(存在漏洞):
logger.info(
    f"OBSERVE: Model credentials: {model_credentials} for provider "
    f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)

# 修复后(已修复):
logger.info(
    f"OBSERVE: Model credentials for provider {model_credentials.provider} (API key redacted)"
)

替代方案 — 脱敏处理,保持日志结构完整:

root@kitploit:~
def redact_secret(value: str) -> str:
    if len(value) <= 8:
        return "***"
    return f"{value[:4]}...{value[-4:]}"

logger.info(
    f"OBSERVE: Model credentials for provider {model_credentials.provider} "
    f"secret: {redact_secret(model_credentials.api_key.get_secret_value())}"
)

脱敏方法仅暴露前 4 个和后 4 个字符——足以识别使用了哪个密钥,而不会泄露完整密钥。


关键要点

  1. 切勿在日志语句中调用 .get_secret_value()。 如果你的框架提供了密钥掩码类型(SecretStr、SecretBytes 等),请让它发挥其作用。在记录器中调用解包方法会完全破坏其目的。

  2. INFO 是生产级别的日志记录。 调试风格的凭据转储绝不应达到 INFO 级别。如果你确实需要确认哪些凭据处于活动状态,只记录非敏感的元数据(提供商名称、密钥前缀、最后 4 个字符)。

  3. 日志文件是攻击面。 将它们视为任何其他敏感数据存储——限制访问、定期轮换并审计写入内容。聚合工具(Splunk、ELK、Datadog)通常具有广泛的读取权限,因此任何日志行中的密钥实际上也等同于这些系统中的密钥。

  4. 修复总是比漏洞本身更简单。 删除两行日志(或用脱敏版本替换)即可完全消除此暴露。因"临时调试日志"遗留到生产环境而产生的安全债务很常见,并且可以通过代码审查来预防。

  5. SecretStr 保护是选择加入的,而非自动的。 开发人员必须理解,只有在没有人显式解包该值的情况下,保护才有效。代码审查应标记任何在认证路径之外使用 .get_secret_value() 的情况。


时间线

日期事件
2025 年 12 月 19 日通过 Huntr 和 GitHub 安全公告向 AutoGPT 维护者报告
2025–2026 年维护者 Nicholas Tindle 确认了该报告
2026 年 4 月之前在 autogpt-platform-beta-v0.6.46 中修复
2026 年 4 月 25 日分配 CVE-2026-22038

参考资料

  • GitHub 安全公告 GHSA-rc89-6g7g-v5v7
  • CWE-532:将敏感信息插入日志文件
  • OWASP 日志记录速查表
  • Trickest CVE 数据库条目
下载工具