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 安全, 安全实验室, 无后门, 暴力破解, 未授权访问, 漏洞分析, 漏洞复现, 网络安全, 认证绕过, 请求拦截, 路径探测, 身份验证绕过, 逆向工具, 隐私保护, 默认配置不当