🇰🇷 한글 설명
jackson-databind의 JDKFromStringDeserializer가 InetSocketAddress를 생성할 때 new InetSocketAddress(host, port)를 사용해 역직렬화 시점에 호스트명을 즉시 DNS 조회합니다. 이로 인해 신뢰할 수 없는 JSON을 InetSocketAddress 필드가 포함된 타입으로 바인딩하면 애플리케이션 검증 이전에 공격자가 지정한 DNS 질의가 발생합니다. 2.18.8, 2.21.4, 3.1.4에서 createUnresolved를 사용하도록 수정되었습니다.
💡 쉬운 설명
JSON 데이터를 자바 객체로 변환하는 과정에서 주소를 해석하기 위해 외부 DNS 서버에 조회가 발생합니다. 공격자는 이를 이용해 서버가 임의의 주소로 질의하도록 유도할 수 있습니다.
🇺🇸 원문 (English)
jackson-databind contains the general-purpose data-binding functionality and tree-model for Jackson Data Processor. From 2.0.0 until 2.18.8, 2.21.4, and 3.1.4, JDKFromStringDeserializer constructed InetSocketAddress with new InetSocketAddress(host, port), which performs eager DNS name resolution for hostname inputs at deserialization time. An application that binds untrusted JSON into a type containing an InetSocketAddress field issues an attacker-chosen DNS query during readValue, before any application-level validation or connect logic. The fix uses InetSocketAddress.createUnresolved(host, port), deferring DNS to an explicit connect. This vulnerability is fixed in 2.18.8, 2.21.4, and 3.1.4.
📍 영향받는 시스템
jackson-databind 2.0.0 ~ 2.18.8 미만, 2.21.0 ~ 2.21.4 미만, 3.0.0 ~ 3.1.4 미만을 사용하는 Java 애플리케이션
⚔️ 공격 벡터
공격자가 InetSocketAddress 필드를 포함한 타입으로 바인딩되는 JSON 입력을 전달하여 서버가 지정된 호스트명에 대해 DNS 질의를 수행하게 함
🛡️ 대응 방법
jackson-databind를 2.18.8, 2.21.4, 3.1.4 이상으로 업데이트하고 신뢰되지 않은 입력에 InetSocketAddress 필드를 사용하지 않도록 설계를 점검
🔧 검증 코드
출력된 Implementation-Version이 2.18.8, 2.21.4, 3.1.4 중 해당 브랜치의 수정 버전 이상이면 패치 완료이고, 그보다 낮은 버전이면 취약합니다.
find / -name 'jackson-databind*.jar' 2>/dev/null | xargs -I{} sh -c 'echo {}; unzip -p {} META-INF/MANIFEST.MF 2>/dev/null | grep -i implementation-version'