rootdirective-sec/CVE-2026-44338-Lab

GitHub: rootdirective-sec/CVE-2026-44338-Lab

针对 PraisonAI 身份验证绕过漏洞 CVE-2026-44338 的本地 Docker 复现实验环境,提供漏洞版本与修复版本的对比演示。

Stars: 0 | Forks: 0

# CVE-2026-44338 PraisonAI 身份验证绕过实验室 CVE-2026-44338 的本地 Docker 实验环境,该漏洞是 PraisonAI 旧版 Flask API 服务器中的一个身份验证绕过漏洞。 本实验室演示了旧版 API 路由上的未经身份验证的访问条件。它有意使用安全的路由级别复现,而不是完整的 PraisonAI 部署,因此概念验证仅专注于身份验证缺陷,不会触发真实的代理工作流或外部 LLM 调用。 ## 概述 CVE-2026-44338 影响 PraisonAI 版本 `>= 2.5.6` 且 `<= 4.6.33`。 在存在漏洞的旧版 API 服务器中,身份验证默认被禁用。因此,能够访问该 API 服务器的未经身份验证的调用者,可以在没有 bearer token 的情况下访问 `/agents` 并触发 `/chat` 工作流路由。 该问题在 PraisonAI `4.6.34` 中已修复,修复方法是将默认行为更改为要求身份验证,除非明确将其禁用。 ## 根本原因 在存在漏洞的版本中,旧版 API 服务器使用了不安全的身份验证默认设置: ``` AUTH_ENABLED = False AUTH_TOKEN = None def check_auth(): if not AUTH_ENABLED: return True ``` 由于当身份验证被禁用时,`check_auth()` 会返回 `True`,受保护的路由未能安全关闭(fail-open)。 受影响的路由包括: * `GET /agents` * `POST /chat` 修补后的版本更改了默认姿态,因此除非通过配置明确禁用,否则身份验证处于启用状态。 ## 源码级修复详情 核心问题并非一个复杂的漏洞利用原语。它源于旧版 Flask API 服务器中不安全的默认设置。 ### `v4.6.33` 中的易受攻击行为 在 `v4.6.33` 中,身份验证默认被禁用: ``` AUTH_ENABLED = False AUTH_TOKEN = None ``` 随后,身份验证检查未能安全关闭(fail-open): ``` def check_auth(): if not AUTH_ENABLED: return True ``` 这意味着每当身份验证被禁用时,请求都会被接受,即使调用者没有发送 `Authorization` 标头。 易受攻击的流程为: ``` AUTH_ENABLED = False ↓ check_auth() returns True ↓ GET /agents is allowed POST /chat is allowed ↓ unauthenticated caller can access agent metadata and reach the workflow trigger route ``` 敏感部分在于 `/chat` 不仅仅是一个状态端点。它接收用户消息,然后使用 `agents.yaml` 调用 PraisonAI 工作流运行器。 ### `v4.6.34` 中的修复行为 在 `v4.6.34` 中,默认行为已更改为要求身份验证,除非操作员明确将其禁用: ``` AUTH_ENABLED = os.environ.get("PRAISONAI_API_AUTH", "enabled").strip().lower() != "disabled" AUTH_TOKEN = os.environ.get("PRAISONAI_API_TOKEN") or None ``` 修补后的版本还改进了 token 处理行为: * 身份验证默认启用 * 禁用身份验证需要明确的配置选择 * 如果在启用身份验证时未提供 token,服务器将生成一个随机 token * token 比较使用 `secrets.compare_digest()` * API 服务器默认绑定到 `127.0.0.1`,而不是在所有接口上暴露自己 修复后的流程为: ``` AUTH_ENABLED = True by default ↓ request must include a valid Bearer token ↓ missing or invalid token returns 401 ↓ /agents and /chat are no longer reachable anonymously ``` 本实验室反映了该源码级别的差异: ``` vuln -> auth disabled by default, unauthenticated requests return 200 patched -> auth required by default, unauthenticated requests return 401 ``` ## 实验室设计 本实验室包含两个本地服务: | 服务 | URL | 行为 | | --------- | ----------------------- | --------------------------------------------- | | `vuln` | `http://127.0.0.1:8081` | 复现易受攻击的 fail-open 身份验证行为 | | `patched` | `http://127.0.0.1:8082` | 要求 bearer-token 身份验证 | 这两个服务均仅绑定到 `127.0.0.1`。 `/chat` 路由使用一个虚拟运行器,而不是真实的 PraisonAI 工作流。这提供了可观察的证据,证明未经身份验证的请求到达了工作流触发路径,而不会引起外部副作用。 ## 仓库结构 ``` . ├── docker-compose.yml ├── vuln │ ├── Dockerfile │ └── start_server.py ├── patched │ ├── Dockerfile │ └── start_server.py ├── poc │ └── poc.py └── .gitignore └── README.md ``` ## 运行 ``` docker compose up --build -d python3 poc/poc.py ``` ## 预期结果 易受攻击的服务允许未经身份验证的访问: ``` === vuln === [unauthenticated] GET /agents status: 200 [unauthenticated] POST /chat status: 200 verdict: LIKELY_VULNERABLE ``` 修补后的服务阻止未经身份验证的访问: ``` === patched === [unauthenticated] GET /agents status: 401 [unauthenticated] POST /chat status: 401 verdict: NOT_VULNERABLE_OR_PROTECTED ``` 最终预期摘要: ``` vuln: LIKELY_VULNERABLE patched: NOT_VULNERABLE_OR_PROTECTED ``` ## 手动验证 检查易受攻击的路由: ``` curl -i http://127.0.0.1:8081/agents ``` 预期易受攻击的响应: ``` HTTP/1.1 200 OK ``` 检查修补后的路由: ``` curl -i http://127.0.0.1:8082/agents ``` 预期修补后的响应: ``` HTTP/1.1 401 UNAUTHORIZED ``` 服务器日志应清晰地显示差异: ``` vuln: "GET /agents HTTP/1.1" 200 patched: "GET /agents HTTP/1.1" 401 ``` ## 清理 ``` docker compose down -v ``` ## 安全提示 本实验室仅供本地安全研究使用。 此概念验证 (PoC) 不会: * 执行 shell 命令 * 使用真实的 API 密钥 * 调用外部 LLM 提供商 * 扫描外部网络 * 触发真实的 PraisonAI 代理工作流 ## 参考文献 * GitHub 公告:GHSA-6rmh-7xcm-cpxj [https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-6rmh-7xcm-cpxj](https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-6rmh-7xcm-cpxj) * NVD:CVE-2026-44338 [https://nvd.nist.gov/vuln/detail/CVE-2026-44338](https://nvd.nist.gov/vuln/detail/CVE-2026-44338) * OSV:GHSA-6rmh-7xcm-cpxj [https://osv.dev/vulnerability/GHSA-6rmh-7xcm-cpxj](https://osv.dev/vulnerability/GHSA-6rmh-7xcm-cpxj) * 易受攻击的源码:PraisonAI `v4.6.33` `src/praisonai/api_server.py` [https://raw.githubusercontent.com/MervinPraison/PraisonAI/v4.6.33/src/praisonai/api_server.py](https://raw.githubusercontent.com/MervinPraison/PraisonAI/v4.6.33/src/praisonai/api_server.py) * 修补后的源码:PraisonAI `v4.6.34` `src/praisonai/api_server.py` [https://raw.githubusercontent.com/MervinPraison/PraisonAI/v4.6.34/src/praisonai/api_server.py](https://raw.githubusercontent.com/MervinPraison/PraisonAI/v4.6.34/src/praisonai/api_server.py)
标签:AI Agent 安全, API 安全, CISA项目, CVE-2026-44338, Docker 靶场, Flask API, Insecure Defaults, LLM 安全, PoC, PraisonAI, Python, Web 安全, 安全实验室, 无后门, 暴力破解, 未授权访问, 漏洞分析, 漏洞复现, 网络安全, 认证绕过, 请求拦截, 路径探测, 身份验证绕过, 逆向工具, 隐私保护, 默认配置不当