🇰🇷 한글 설명
Wanderer는 모험 경로를 저장하고 공유하기 위한 셀프 호스팅 트레일 데이터베이스입니다. 0.20.0 이전 버전에서 PUBLIC_PRIVATE_INSTANCE가 true로 설정되지 않은 경우, 인증되지 않은 POST /api/v1/trail/download 핸들러가 공격자가 제어하는 url 필드를 event.fetch()에 그대로 전달하고 가져온 응답을 반환합니다. 이로 인해 내부 서비스(db:8090, search:7700), 클라우드 메타데이터 주소 등 내부 네트워크 대상에 대한 요청이 가능해져 데이터 노출, 내부 정찰 또는 서비스 거부가 발생할 수 있습니다.
💡 쉬운 설명
공격자가 이 취약한 서버를 통해 외부에서는 접근할 수 없는 내부 시스템에 대신 요청을 보낼 수 있습니다. 그 결과 내부 데이터가 노출되거나 내부 네트워크 구조가 파악될 수 있습니다.
🇺🇸 원문 (English)
Wanderer is a self-hosted trail database for saving and sharing adventures. Prior to 0.20.0, when PUBLIC_PRIVATE_INSTANCE is not set to true, the unauthenticated POST /api/v1/trail/download handler passes the attacker-controlled JSON url field directly to event.fetch() and returns the fetched response. This allows requests to internal services such as db:8090 and search:7700, cloud metadata addresses, and other network destinations, exposing returned data and permitting internal network reconnaissance or denial of service. This issue is fixed in version 0.20.0.
📍 영향받는 시스템
Wanderer 0.20.0 미만 버전 중 PUBLIC_PRIVATE_INSTANCE가 true가 아닌 셀프 호스팅 인스턴스
⚔️ 공격 벡터
인증 없이 POST /api/v1/trail/download 요청의 JSON url 필드에 내부 주소를 넣어 서버가 대신 요청하도록 하는 SSRF 공격
🛡️ 대응 방법
Wanderer를 0.20.0 이상으로 업그레이드하고, 필요하지 않다면 외부 노출을 제한하며 내부 서비스 네트워크 접근을 차단하십시오.
🔧 검증 코드
출력된 이미지 태그나 package.json의 version 값이 0.20.0 미만이면 취약, 0.20.0 이상이면 패치 적용된 상태입니다. 아무 결과도 없다면 이 호스트에 Wanderer가 설치되어 있지 않은 것입니다.
docker ps --format '{{.Image}}' 2>/dev/null | grep -i wanderer; dpkg -l wanderer 2>/dev/null | grep -E '^ii'; cat /opt/wanderer/package.json 2>/dev/null | grep '"version"'