
CVE-2026-44848용 PoC: Portainer의 Docker 플러그인 엔드포인트에서의 인가 누락 -> 호스트 RCE (GHSA-rrmm-9v76-h3p4). 표준 라이브러리만 사용하는 Python.
CVE-2026-44848에 대한 개념 증명(PoC)입니다. Portainer의 인증 누락(CWE-862) 취약점으로, Docker 엔드포인트 접근 권한이 있는 비관리자(non-admin) 사용자가 권한 있는 Docker 플러그인 작업을 수행하여 완전한 호스트 RCE에 도달할 수 있게 합니다.
GitHub Security Advisory: GHSA-rrmm-9v76-h3p4 · CVSS 9.4 (치명적).
Portainer는 Docker API 위에서 역할 기반 접근 제어(RBAC)를 적용하며, 요청을 리소스별 핸들러를
통해 프록시하여 인가 검사를 수행합니다. 그러나 Docker 플러그인 관리 엔드포인트(/plugins/*)는
핸들러로 등록되지 않았기 때문에 인가 계층이 해당 엔드포인트에 대해 실행되지 않습니다. 그 결과,
Standard User(역할 2) — 또는 엔드포인트 수준 접근 권한이 부여된 모든 역할 — 는 기본 Docker 데몬에
대해 직접 권한 있는 플러그인 작업을 호출할 수 있습니다:
POST /plugins/pull — 임의의 레지스트리에서 임의의 플러그인을 가져옵니다(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이 버그의 핵심이자 안전하게 재현 가능한 원시 동작(primitive)은 다음과 같습니다: 표준(비관리자)
사용자가 인가 없이 Portainer 프록시를 통해 권한 있는 /plugins/* Docker API에 도달할 수 있습니다.
이 PoC는 실제 취약한 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는 인가 우회를 입증하는 데서 멈추며, 파괴적이거나 악의적인
플러그인을 활성화하지 않습니다. 소유한 시스템 또는 테스트가 승인된 시스템에 대해서만 사용하십시오.