diff --git a/CHANGELOG.md b/CHANGELOG.md index edee395..06d6594 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,18 @@ The source of truth for the entries below is [docs/changelog.md](docs/changelog. ## [Unreleased] +## [3.1.1] — Fix uppercase-scheme bypass in the LLM tool-input guard + ### Security - **Uppercase-scheme bypass in the LLM tool-input guard fixed.** `JsonToolInputGuard` collected candidate URLs with a case-sensitive `http://` / `https://` prefix test, so an uppercase-scheme tool-input URL (`HTTP://169.254.169.254/…`) was never collected and skipped policy validation entirely — bypassing the host allowlist and IP-literal checks. Detection is now case-insensitive. Affects `ssrf-guard-springai` and `ssrf-guard-langchain4j`. +### Migration + +Drop in v3.1.1 — no consumer code changes. If your app exposes an LLM tool that +takes a URL and you rely on `ssrf-guard-springai` / `ssrf-guard-langchain4j` to +screen tool input, upgrade to pick up the fix. + ## [3.1.0] — LLM core extraction, LangChain4j, WebClient DNS gap, GraalVM hints ### Added diff --git a/docs/changelog.ko.md b/docs/changelog.ko.md index 4a3f667..ba65156 100644 --- a/docs/changelog.ko.md +++ b/docs/changelog.ko.md @@ -6,6 +6,16 @@ ssrf-guard의 주요 변경 사항을 기록합니다. ## [Unreleased] +## [3.1.1] — LLM 툴 입력 가드의 대문자 스킴 우회 수정 + +### Security + +- **LLM 툴 입력 가드의 대문자 스킴 우회 수정.** `JsonToolInputGuard`가 후보 URL을 대소문자 구분(`http://` / `https://` 접두사)으로 수집해서, 대문자 스킴으로 쓴 툴 입력 URL(`HTTP://169.254.169.254/…`, `HtTpS://evil.com/`)이 수집조차 되지 않고 정책 검증을 통째로 건너뛰었습니다 — 호스트 allowlist와 IP-literal 검사를 우회. URI 스킴은 대소문자를 구분하지 않으며(RFC 3986 §3.1) 바로 뒤의 스킴 검사는 이미 `equalsIgnoreCase`를 사용하므로, 수집 단계만 영향받은 불일치였습니다. 이제 대소문자를 구분하지 않고 감지합니다. 툴 입력을 이 가드로 거르는 `ssrf-guard-springai`, `ssrf-guard-langchain4j` 모두 영향. + +### Migration + +v3.1.1로 그대로 교체 — 소비자 코드 변경 없음. URL을 받는 LLM 툴을 노출하고 `ssrf-guard-springai` / `ssrf-guard-langchain4j`로 툴 입력을 거른다면, 이 수정을 반영하도록 업그레이드하세요. + ## [3.1.0] — LLM 코어 추출, LangChain4j, WebClient DNS 공백 메움, GraalVM hints ### Added diff --git a/docs/changelog.md b/docs/changelog.md index 0e8c47a..76ead5d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -6,10 +6,16 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and ## [Unreleased] +## [3.1.1] — Fix uppercase-scheme bypass in the LLM tool-input guard + ### Security - **Uppercase-scheme bypass in the LLM tool-input guard fixed.** `JsonToolInputGuard` collected candidate URLs with a case-sensitive `http://` / `https://` prefix test, so a tool-input URL written with an uppercase scheme (`HTTP://169.254.169.254/…`, `HtTpS://evil.com/`) was never collected and skipped policy validation entirely — bypassing the host allowlist and IP-literal checks. URI schemes are case-insensitive (RFC 3986 §3.1) and the downstream scheme check already used `equalsIgnoreCase`, so this only affected the collection step. Detection is now case-insensitive. Affects `ssrf-guard-springai` and `ssrf-guard-langchain4j`, which both route tool input through this guard. +### Migration + +Drop in v3.1.1 — no consumer code changes. If your app exposes an LLM tool that takes a URL and you rely on `ssrf-guard-springai` / `ssrf-guard-langchain4j` to screen tool input, upgrade to pick up the fix. + ## [3.1.0] — LLM core extraction, LangChain4j, WebClient DNS gap, GraalVM hints ### Added diff --git a/gradle.properties b/gradle.properties index bd3fbac..5c83b80 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ # Project coordinates GROUP=kr.devslab -VERSION=3.1.0-SNAPSHOT +VERSION=3.1.1-SNAPSHOT # Project metadata for Maven Central POM POM_NAME=SSRF Guard