PraisonAI 'deploy --type api'는 기본적으로 인증이 비활성화된 Flask 서버를 생성합니다.
CVE-2026-44338(GHSA-6rmh-7xcm-cpxj)에는 PraisonAI가 기본적으로 인증이 비활성화된 Flask API 서버를 생성하는 코드 생성기(praisonai.deploy.api.generate_api_server_code)를 제공한다고 문서화되어 있습니다. 문서화된 빠른 시작(praisonai 배포 --type api)을 따르는 사용자는 다음과 같은 서버를 얻습니다.
/chat 및 /agents 엔드포인트를 노출합니다.praisonai.run() 실행 — 프로세스 환경에 있는 API 키 자료를 사용한 LLM 조정PyPI 휠 praisonai==4.6.33(현재 @latest)은 여전히 auth_enabled가 기본값인 False로 생성기를 제공합니다. 수정 형태는 APIConfig(auth_enabled=True, auth_token=...)를 통해 선택됩니다.
앵커(파일:라인:기호)
praisonai==4.6.33.praisonai/deploy/models.py:29 — auth_enabled: bool = Field(default=False, ...); praisonai/deploy/models.py:30 — auth_token: Optional[str] = Field(default=None, ...).praisonai/deploy/api.py:40 — AUTH_ENABLED = {config.auth_enabled}; api.py:41 — AUTH_TOKEN = {repr(config.auth_token)}; api.py:43-49 — def check_auth(): AUTH_ENABLED가 아닌 경우: True를 반환.취약한 코드(설치된 휠의 그대로)
``파이썬
클래스 APIConfig(BaseModel): 호스트: str = 필드(기본값="127.0.0.1", 설명="서버 호스트") 포트: int = 필드(기본값=8005, 설명="서버 포트") cors_enabled: bool = 필드(기본값=True, 설명="CORS 활성화") auth_enabled: bool = Field(default=False, Description="인증 활성화") # 29행 auth_token: Optional[str] = Field(default=None, 설명="인증 토큰") # 30행
``파이썬
# praisonai/deploy/api.py (praisonai==4.6.33)
코드 = f\'\'\'...
# 인증
AUTH_ENABLED = {config.auth_enabled} # 기본적으로 False
AUTH_TOKEN = {repr(config.auth_token)} # 기본적으로 없음
데프 check_auth():
AUTH_ENABLED가 아닌 경우:
return True # 단락, 모두 허용
토큰 = request.headers.get(\'Authorization\', \'\').replace(\'Bearer \', \'\')
반환 토큰 == AUTH_TOKEN
...
\'\'\'
배포 명령의 기본 호출은 check_auth()가 True로 단락되고 인증되지 않은 /chat, /agents POST를 수락하는 서버를 내보냅니다.
``파이썬 #!/usr/bin/env python3 """ legend-c420 PoC - PraisonAI 4.6.33은 인증을 통해 Flask API 서버를 생성합니다. 기본적으로 비활성화되어 있습니다. CVE-2026-44338의 클래스 H 형제입니다.
1단계: praisonai.deploy.models.APIConfig 기본값을 반영합니다. 2단계: generate_api_server_code(기본 구성)를 호출하고 방출된 소스에는 AUTH_ENABLED = False가 포함되어 있으며 단락 복귀. 3단계: auth_enabled=True, auth_token='s3cret-bearer-value'로 다시 실행 방출된 소스가 안전한 모양으로 뒤집혀 있는지 확인합니다.
종료 코드 0 = PASS = 취약한 기본값이 확인되었습니다. """ 시스템 가져오기, 역추적
def Phase1_dataclass_defaults(): print("1단계 - praisonai.deploy.models.APIConfig 기본값") praisonai.deploy.models에서 APIConfig 가져오기 cfg = API구성() 수표 = [ ("auth_enabled", cfg.auth_enabled, False), ("auth_token", cfg.auth_token, 없음), ] 이름, 관찰됨, 검사에서 예상됨: 알았어 = 관찰됨 == 예상됨 mark = 이름이 ("auth_enabled","auth_token")에 있으면 "VULNERABLE"이고 그렇지 않으면 "ok"입니다. print(f" {name:14s} = {observed!r:18s} ({예상!r} 예상) [{mark}]") 괜찮다고 주장하다 print(" >> APIConfig 기본값은 CVE-2026-44338 모양을 재현합니다.")
def Phase2_default_generator_emits_unauth(): print("2단계 - generate_api_server_code(기본 구성)는 인증되지 않은 서버를 방출합니다.") praisonai.deploy.models에서 APIConfig 가져오기 praisonai.deploy.api에서 generate_api_server_code 가져오기 src = generate_api_server_code("agents.yaml", config=APIConfig()) ["AUTH_ENABLED = False","AUTH_TOKEN = None","AUTH_ENABLED가 아닌 경우:","return True"]의 바늘: src에서 needle을 주장합니다. f"missing: {needle!r}" print(f" [발견] {바늘!r}") print(" >> 기본 구성 생성기는 check_auth() 단락으로 Flask 서버를 생성합니다.")
def Phase3_fix_shape_available(): print("PHASE 3 - auth_enabled=보안 모양으로 True 뒤집기") praisonai.deploy.models에서 APIConfig 가져오기 praisonai.deploy.api에서 generate_api_server_code 가져오기 cfg = APIConfig(auth_enabled=True, auth_token="s3cret-bearer-value") src = generate_api_server_code("agents.yaml", config=cfg) src에서 "AUTH_ENABLED = True"를 주장합니다. src에 "AUTH_ENABLED = False"가 없다고 주장 print(" >> 토글 시 모양 수정이 작동합니다. 클래스 H 확인됨: 기본값은 안전하지 않습니다.")
데프 메인(): 인쇄("=" * 64) print("legend-c420 PoC - PraisonAI default-config AUTH_ENABLED=False") 인쇄("=" * 64) 시도해 보세요: Phase1_dataclass_defaults() Phase2_default_generator_emits_unauth() Phase3_fix_shape_available() 예외: 추적.print_exc() print("실패"); sys.exit(2) print("PASS 3/3 단계. EXIT 0.") sys.exit(0)
name == "main"인 경우: 메인()
**PoC 종속성:** PyPI의 `praisonai==4.6.33`. Python 3.11에서 테스트되었습니다.
**로그 결과 실행:** `3/3단계 통과. EXIT 0.` — 취약한 기본 형태가 확인되었습니다. 기본적으로 `auth_enabled=False`, `check_auth()`는 `True`로 단락되고, 수정 토글이 존재하지만 선택되어 있습니다.
### 영향
공급업체에서 문서화한 빠른 시작(`pip install praisonai && praisonai 배포 --type api`)을 실행하는 운영자는 프로세스 환경에서 사용자의 LLM API 키를 사용하여 공격자가 제공한 JSON에서 `praisonai.run()`을 호출하는 네트워크 연결 가능한 Flask 서버를 얻습니다. 공격자는 운영자에게 청구되는 호스트의 API 키 크레딧을 사용하여 임의의 LLM 조정(에이전트가 정의한 도구 사용 포함, PraisonAI에서 일반적으로 `python_repl`, `bash`, 파일 I/O 및 HTTP 호출을 포함)에 도달합니다.
- **신념:** CVE-2026-44338이 제출되어 분류되었습니다.
- **현실:** `praisonai==4.6.33`은 현재 PyPI(2026-05-16)의 `@latest`입니다. 생성기의 기본값은 여전히 'auth_enabled=False'입니다.
- **간격:** CVE는 수정 형태가 존재함을 인정합니다. 수정 사항은 선택 사항입니다. 기본 구성 소비자는 여전히 취약합니다.
**상위 CVE:** CVE-2026-44338 / GHSA-6rmh-7xcm-cpxj
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 98.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 98.00 |
VPI 공식 vpi-v1 기준