🇰🇷 한글 설명
PraisonAI 4.5.126 이상 4.6.59 미만의 Async Jobs API는 webhook_url을 요청 파싱 시점과 Job 객체 생성 시점에 두 번 검증하지만, 실제 네트워크 요청 시점에는 재검증하지 않습니다. 공격자가 공인 IP로 해석되는 호스트명을 등록하면 webhook 전송 시 루프백, 사설망, 클라우드 메타데이터 주소로 해석되도록 만들어 SSRF 방어를 우회할 수 있습니다. 이는 GHSA-8frj-8q3m-xhgm 패치의 불완전성으로 보이며 4.6.59에서 수정되었습니다.
💡 쉬운 설명
이 프로그램은 작업이 끝나면 지정된 주소로 알림을 보내는데, 처음 확인한 뒤 실제 전송할 때는 다시 확인하지 않습니다. 공격자가 이 허점을 이용해 서버 내부 시스템이나 클라우드 설정 정보에 접근하도록 유도할 수 있습니다.
🇺🇸 원문 (English)
PraisonAI is a multi-agent teams system. From version 4.5.126 to before version 4.6.59, PraisonAI's Async Jobs API validates webhook_url when a job request is parsed and again when the internal Job object is constructed. That validation blocks direct loopback/private targets, but it is not bound to the later network request. When a job completes, _send_webhook() passes the original hostname to httpx.AsyncClient.post() with no send-time validation, IP pinning, or guarded transport. An attacker-controlled hostname can therefore resolve to a public IP during Pydantic validation and later resolve to loopback/private/cloud-metadata infrastructure during webhook delivery. This bypasses the intended SSRF guard in current supported releases. This appears to be an incomplete fix / patch bypass for GHSA-8frj-8q3m-xhgm. This issue has been patched in version 4.6.59.
📍 영향받는 시스템
PraisonAI 4.5.126 이상 4.6.59 미만 버전
⚔️ 공격 벡터
공격자가 공인 IP로 해석되는 악성 호스트명을 webhook_url로 등록한 뒤, 전송 시점에 내부 IP나 메타데이터 주소로 바뀌도록 DNS를 조작하여 서버가 내부 자원에 요청을 보내게 함
🛡️ 대응 방법
PraisonAI를 4.6.59 이상으로 업데이트하고, webhook 전송 시점에도 대상 IP를 검증하며 내부 네트워크 대역으로의 아웃바운드 요청을 차단
🔧 검증 코드
출력된 버전이 4.5.126 이상 4.6.59 미만이면 취약하며, 4.6.59 이상이면 패치가 적용된 것입니다.
pip show praisonai 2>/dev/null | grep -i '^version'