From 4e12e3829391f41e461b7402eabde3731fe2e205 Mon Sep 17 00:00:00 2001 From: wbsong111 Date: Fri, 7 Aug 2026 14:05:05 +0900 Subject: [PATCH] =?UTF-8?q?add-keycloakx:=20micrometer=20=EC=98=A4?= =?UTF-8?q?=EB=B2=84=EB=A0=88=EC=9D=B4=20=EC=B6=94=EA=B0=80=20(CI=20?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=83=88=EB=A1=9C=20=EC=9E=A1=ED=9E=8C=20?= =?UTF-8?q?=EC=B0=A8=EB=8B=A8=202=EA=B1=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI(31148639764)의 trivy 취약점 DB 가 로컬보다 최신이라 로컬 스캔에는 없던 CVE-2026-40983·CVE-2026-40984(io.micrometer:micrometer-core)가 차단으로 잡혔다. netty·jackson 과 동일한 성격의 번들 jar CVE 라 같은 오버레이 메커니즘으로 처리한다. micrometer 1.16.3 → 1.16.6. netty 와 같은 이유로 CVE 가 붙은 micrometer-core 만이 아니라 패밀리 전체 4종(commons·core·observation·registry-prometheus-simpleclient)을 함께 올린다 — 아티팩트 간 버전 혼용이 비지원이다. Dockerfile 의 ARG 선언을 처음에 빠뜨렸는데 overlay-jars.sh 의 `: "${VAR:?}"` 가드가 설계대로 빌드를 세웠다("parameter null or not set"). 조용히 통과하지 않는다. 재빌드 결과(로컬 trivy DB 캐시를 지우고 CI 와 같은 최신 DB 로 재판정): 차단 0건 — 게이트 PASS docker.io/paasup/keycloak:26.7.1-bci15.7-hardened-20260807 push 완료 태그는 빌드일 기준이라 같은 날 재빌드가 같은 태그를 덮는다(프레임워크 설계대로). 직전에 push 된 것은 micrometer 취약점이 남아 있던 빌드이고 어디에도 소비되지 않았다. Co-Authored-By: Claude Opus 5 (1M context) --- images/keycloak/README.md | 22 +++++++++++++++++----- images/keycloak/overlay-jars.sh | 8 +++++--- images/keycloak/suse.Dockerfile | 2 ++ images/keycloak/suse.build.env | 8 +++++++- images/keycloak/verify.sh | 2 ++ 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/images/keycloak/README.md b/images/keycloak/README.md index 8af1a26..bae510d 100644 --- a/images/keycloak/README.md +++ b/images/keycloak/README.md @@ -107,11 +107,23 @@ Security Advisory 실측). 스캔 시점 trivy DB 에 아직 없어 게이트에 이미지 SBOM 의 rpm 44종을 근거로 정했다. `sed`·`grep` 은 **없으면 안 된다** — `bin/kc.sh` 가 `/bin/sh` 스크립트로 `esceval()` 에서 `sed`, 인자 파싱에서 `grep` 을 쓰는데 `bci-micro` 에는 `sed` 가 없다. -2. **취약 jar 오버레이** (`overlay-jars.sh`) — `lib/lib/main/` 의 netty·jackson· - postgresql-jdbc jar 를 **파일명은 유지하고 내용만** 수정 버전으로 바꾼다. Quarkus - fast-jar 의 클래스패스가 파일명을 그대로 참조하기 때문이다. trivy 는 jar 내부 - `META-INF/maven/**/pom.properties` 를 읽으므로 SBOM 에는 새 버전이 정확히 잡힌다 - — 파일명으로 버전을 위장하는 것이 아니라 실제 내용이 새 버전이다. +2. **취약 jar 오버레이** (`overlay-jars.sh`) — `lib/lib/main/` 의 jar 를 **파일명은 + 유지하고 내용만** 수정 버전으로 바꾼다. Quarkus fast-jar 의 클래스패스가 파일명을 + 그대로 참조하기 때문이다. 대상은 `suse.build.env` 의 `*_OLD`/`*_VERSION` 이 정의한다: + + | 그룹 | 대상 | 버전 | + | --- | --- | --- | + | `io.netty` | 패밀리 전체 17종 | `4.1.135.Final` → `4.1.136.Final` | + | `com.fasterxml.jackson.core` | `jackson-core`, `jackson-databind` | `2.21.2` → `2.21.4` | + | `org.postgresql` | `postgresql` | `42.7.11` → `42.7.12` | + | `io.micrometer` | 패밀리 전체 4종 | `1.16.3` → `1.16.6` | + + netty·micrometer 는 CVE 가 붙은 아티팩트만이 아니라 **패밀리 전체**를 함께 올린다 — + 둘 다 아티팩트 간 버전 혼용이 비지원이다. jackson 은 2.21.x 안에서 호환이 보장되고 + `jackson-annotations` 는 `2.21` 로 별도 버저닝돼 있어 CVE 있는 둘만 바꾼다. + + 위장이 아니다 — trivy 는 jar 내부 `META-INF/maven/**/pom.properties`(없으면 sha1↔GAV + 인덱스)로 버전을 판정하므로 SBOM 에는 새 버전이 정확히 잡히고, 실제 내용도 새 버전이다. 3. **`bin/client/` 제거** — `keycloak-admin-cli-.jar` 는 jackson 을 shade 로 품은 uber-jar 라 jar 교체로 고칠 수 없다(SBOM 실측: `jackson-databind@2.21.2` 의 FilePath 가 이 파일). 서버 JVM 이 로드하지 않는 독립 CLI(`kcadm.sh`/`kcreg.sh`)이므로 diff --git a/images/keycloak/overlay-jars.sh b/images/keycloak/overlay-jars.sh index 5a0a589..953e096 100755 --- a/images/keycloak/overlay-jars.sh +++ b/images/keycloak/overlay-jars.sh @@ -29,9 +29,10 @@ M2="${M2_BASE:-https://repo1.maven.org/maven2}" [ -d "$LIB" ] || { echo "FAIL: $LIB 가 없다 — 배포본 레이아웃이 바뀌었는지 확인"; exit 1; } -: "${NETTY_OLD:?}" "${NETTY_VERSION:?}" -: "${JACKSON_OLD:?}" "${JACKSON_VERSION:?}" -: "${PGJDBC_OLD:?}" "${PGJDBC_VERSION:?}" +: "${NETTY_OLD:?}" "${NETTY_VERSION:?}" +: "${JACKSON_OLD:?}" "${JACKSON_VERSION:?}" +: "${PGJDBC_OLD:?}" "${PGJDBC_VERSION:?}" +: "${MICROMETER_OLD:?}" "${MICROMETER_VERSION:?}" # groupId(파일명 프리픽스) | groupPath(Maven 경로) | artifact 필터 | OLD | NEW # artifact 필터가 '*' 이면 해당 groupId + OLD 버전의 모든 jar 가 대상이다. @@ -40,6 +41,7 @@ SPECS=( "com.fasterxml.jackson.core|com/fasterxml/jackson/core|jackson-core|${JACKSON_OLD}|${JACKSON_VERSION}" "com.fasterxml.jackson.core|com/fasterxml/jackson/core|jackson-databind|${JACKSON_OLD}|${JACKSON_VERSION}" "org.postgresql|org/postgresql|postgresql|${PGJDBC_OLD}|${PGJDBC_VERSION}" + "io.micrometer|io/micrometer|*|${MICROMETER_OLD}|${MICROMETER_VERSION}" ) fetch() { # $1=url $2=출력경로 diff --git a/images/keycloak/suse.Dockerfile b/images/keycloak/suse.Dockerfile index adf6c0b..2355e92 100644 --- a/images/keycloak/suse.Dockerfile +++ b/images/keycloak/suse.Dockerfile @@ -42,6 +42,8 @@ ARG JACKSON_OLD ARG JACKSON_VERSION ARG PGJDBC_OLD ARG PGJDBC_VERSION +ARG MICROMETER_OLD +ARG MICROMETER_VERSION # (a) 런타임 rootfs 구성. # diff --git a/images/keycloak/suse.build.env b/images/keycloak/suse.build.env index de725c3..1ad81b5 100644 --- a/images/keycloak/suse.build.env +++ b/images/keycloak/suse.build.env @@ -54,5 +54,11 @@ JACKSON_VERSION=2.21.4 # postgresql jdbc: CVE-2026-54291 PGJDBC_OLD=42.7.11 PGJDBC_VERSION=42.7.12 +# micrometer: CVE-2026-40983, CVE-2026-40984 (micrometer-core) +# netty 와 같은 이유로 패밀리 전체(commons·core·observation·registry-prometheus- +# simpleclient)를 함께 올린다. 이 2건은 2026-08-07 로컬 스캔에는 없었고 같은 날 +# CI(더 최신 trivy DB)에서 처음 잡혔다 — 로컬 DB 가 뒤처질 수 있다는 실례다. +MICROMETER_OLD=1.16.3 +MICROMETER_VERSION=1.16.6 -BUILD_ARGS="KEYCLOAK_VERSION BUILDER_BASE MICRO_BASE RUNTIME_PACKAGES NETTY_OLD NETTY_VERSION JACKSON_OLD JACKSON_VERSION PGJDBC_OLD PGJDBC_VERSION" +BUILD_ARGS="KEYCLOAK_VERSION BUILDER_BASE MICRO_BASE RUNTIME_PACKAGES NETTY_OLD NETTY_VERSION JACKSON_OLD JACKSON_VERSION PGJDBC_OLD PGJDBC_VERSION MICROMETER_OLD MICROMETER_VERSION" diff --git a/images/keycloak/verify.sh b/images/keycloak/verify.sh index 3271872..c6bdd8e 100755 --- a/images/keycloak/verify.sh +++ b/images/keycloak/verify.sh @@ -22,6 +22,7 @@ KEYCLOAK_VERSION="${KEYCLOAK_VERSION:?build.env 에서 전달돼야 한다}" NETTY_OLD="${NETTY_OLD:?}" ; NETTY_VERSION="${NETTY_VERSION:?}" JACKSON_OLD="${JACKSON_OLD:?}" ; JACKSON_VERSION="${JACKSON_VERSION:?}" PGJDBC_OLD="${PGJDBC_OLD:?}" ; PGJDBC_VERSION="${PGJDBC_VERSION:?}" +MICROMETER_OLD="${MICROMETER_OLD:?}" ; MICROMETER_VERSION="${MICROMETER_VERSION:?}" WORK="$(mktemp -d)" CID="" @@ -124,6 +125,7 @@ check_jar "io.netty.netty-codec-${NETTY_OLD}.jar" check_jar "com.fasterxml.jackson.core.jackson-databind-${JACKSON_OLD}.jar" "$JACKSON_VERSION" check_jar "com.fasterxml.jackson.core.jackson-core-${JACKSON_OLD}.jar" "$JACKSON_VERSION" check_jar "org.postgresql.postgresql-${PGJDBC_OLD}.jar" "$PGJDBC_VERSION" +check_jar "io.micrometer.micrometer-core-${MICROMETER_OLD}.jar" "$MICROMETER_VERSION" docker rm -f "$CCID" >/dev/null 2>&1 || true CCID=""