🇰🇷 한글 설명
Gotenberg 8.29.1 버전에서 인증되지 않은 공격자가 조작된 Gotenberg-Webhook-Url 헤더를 사용하여 서버가 임의의 내부 또는 외부 대상으로 HTTP POST 요청을 보내도록 강제할 수 있는 Blind SSRF 취약점이 발견되었습니다. 기본 설정 시 허용 및 차단 목록이 비어 있어 모든 URL이 허용되는 FilterDeadline 함수의 로직 오류가 원인입니다. 이 취약점을 통해 공격자는 내부 네트워크를 탐색하거나 클라우드 메타데이터 엔드포인트에 접근할 수 있습니다.
💡 쉬운 설명
문서 변환 도구인 Gotenberg가 공격자가 지정한 주소로 몰래 데이터를 보내게 만드는 보안 결함입니다. 이를 통해 공격자는 회사 내부 네트워크의 숨겨진 서버 정보를 캐내거나 공격을 시도할 수 있습니다.
🇺🇸 원문 (English)
Gotenberg is an API-based document conversion tool. In version 8.29.1, an unauthenticated attacker with network access can force the server to make outbound HTTP POST requests to arbitrary internal or external destinations by supplying a crafted URL in the Gotenberg-Webhook-Url request header. The FilterDeadline function in filter.go is intended to gate outbound URLs, but when both the allow-list and deny-list are empty (the default configuration), it returns nil unconditionally and permits any URL.
This is a blind SSRF: Gotenberg POSTs the converted document to the webhook URL and only checks whether the response status code is an error, but never returns the target's response body to the attacker. An attacker can use this to probe internal network infrastructure by observing whether the error callback is invoked, force POST requests against internal services that perform side effects, and confirm reachability of cloud metadata endpoints. The retryable HTTP client issues up to 4 automatic retries per request, amplifying each probe.
This issue has been fixed in version 8.31.0. As a workaround, configure the GOTENBERG_API_WEBHOOK_ALLOW_LIST environment variable to restrict webhook URLs to known receivers, or set GOTENBERG_API_WEBHOOK_DENY_LIST to block RFC-1918 and link-local address ranges.
📍 영향받는 시스템
Gotenberg version 8.29.1 and below
⚔️ 공격 벡터
Gotenberg-Webhook-Url 헤더에 조작된 URL을 삽입하여 서버가 임의의 대상에 HTTP POST 요청을 보내도록 유도
🛡️ 대응 방법
Gotenberg를 8.31.0 버전 이상으로 업데이트하거나, 환경 변수(GOTENBERG_API_WEBHOOK_ALLOW_LIST 또는 DENY_LIST)를 설정하여 웹훅 URL 범위를 제한하십시오.
🔧 검증 코드
출력된 버전 정보가 8.31.0 미만인 경우 해당 취약점에 노출된 상태입니다.
curl -s http://<gotenberg-host>:<port>/version | grep -E '8\.[0-9]{2}'