67 lines
8.9 KiB
Markdown
67 lines
8.9 KiB
Markdown
# 2026-09-22 최신 의존성 보안 권고 대조
|
|
|
|
**판정: 최신 권고 기준 무취약점으로 승인할 수 없다.** 배포 라이브러리 6종이 보안 권고의 영향 버전에 해당한다. 이것은 앱에서 실제 악용이 입증된 취약점 6건이라는 뜻이 아니다. 현재 소스에서 전제 기능이 없는 항목과 운영 설정 확인이 필요한 항목을 분리했다. 앞선 캐시 검사 0건은 출시 근거에서 제외한다.
|
|
|
|
## 실제 조회 범위와 증거
|
|
|
|
- 대상: 제품 소스 `1848394`, 앞선 live WAR와 동일한 해시. 이후 커밋은 문서만 변경했다.
|
|
- Maven 의존성 및 WAR 내부 메타데이터로 **81개 좌표/버전**을 OSV 온라인 API에 조회했다. test/provided/shaded/packaged-tool을 포함하며 WAR **43개 JAR 전부**가 조회 목록과 매칭됐다. 좌표 수와 JAR 수는 shaded 및 테스트 의존성 때문에 다르다.
|
|
- OSV batch 응답 2026-09-22 02:53:22 UTC: 런타임 5종에서 **9개 고유 권고** 매칭. 추가 jarmode-tools 조회 0건. 페이지 토큰 없음.
|
|
- 공식 공급자 권고를 추가 대조했다. Tomcat 19개 CVE와 Spring 4개 CVE가 현재 버전 범위에 해당한다. OSV와 합쳐 **28개 고유 CVE + CVE 미부여 GHSA 1개**를 검토 대상으로 정리했다. 모든 알려지지 않은 취약점을 포함하는 전수 보증은 아니다.
|
|
- NVD 실시간 API의 `cveIds` 조회: **28개 요청/28개 응답**, 응답 시각 `2026-09-22T02:56:02.312` UTC. OSV의 CVE 없는 GHSA는 공급자 권고로 확인했다.
|
|
- [온라인 OSV 응답](../../.atp/work-session/20260922-114058/artifacts/latest-osv-results.json), [권고 상세](../../.atp/work-session/20260922-114058/artifacts/latest-osv-advisories.json), [NVD 실시간 응답](../../.atp/work-session/20260922-114058/artifacts/latest-nvd-targeted.json), [WAR 목록](../../.atp/work-session/20260922-114058/artifacts/war-inventory.json).
|
|
|
|
## 버전별 판단
|
|
|
|
아래 수정 버전은 검토한 권고를 해소하는 기준이며, 현재 프로젝트에서 빌드·기능 호환성까지 검증한 업그레이드 결과는 아니다.
|
|
|
|
| 배포 구성요소 | 현재 | 권고 대응 버전/경로 | 앱 적용성 판단 |
|
|
| --- | --- | --- | --- |
|
|
| Tomcat | 10.1.55 | 공개 배포본 10.1.59 이상 | 19개 CVE 영향 범위. HTTP/2·Realm 인증·RewriteValve·WebSocket·UDS 등 조건별 확인 필요. 저장소에는 해당 설정/endpoint가 없지만 운영 WAS의 외부 설정은 미확인 |
|
|
| Spring Framework | 6.2.19 | 6.2.20 상용 지원 또는 7.0.9 이상을 포함하는 호환 Boot 계열 | 아래 4건은 영향 버전이나 해당 SpEL/자동 생성 List/함수형 SSE 사용이 소스에서 발견되지 않음 |
|
|
| Jackson databind | 2.21.4 | 같은 계열 2.21.5 이상, BOM 정합 유지 | 3개 권고 매칭. JsonView/JsonUnwrapped/JsonIgnoreProperties/외부 타입 속성 조합이 소스에 없음 |
|
|
| PostgreSQL JDBC | 42.7.11 | 42.7.12 이상 | channelBinding=require + TLS 인증서 조건. 로컬 구성에 require 없음; 운영 DB 연결 정책은 미확인 |
|
|
| jsoup | 1.17.2 | 1.23.1 이상 | 버전은 영향 범위지만 현재 sanitizer가 raw-text 태그를 허용하지 않아 이 권고의 전제는 불충족 |
|
|
| Log4j API | 2.24.3 | 2.25.5 또는 2.26.1 이상 계열 | MapMessage JSON 직렬화가 전제. 현재 Logback 사용, 해당 호출/레이아웃 없음 |
|
|
|
|
### Tomcat: 버전 범위와 실제 사용 기능을 분리
|
|
|
|
검토 CVE: `CVE-2026-73180`, `68763`, `68569`, `68525`, `66422`, `66299`, `65927`, `65905`, `65637`, `65183`, `65182`, `59084`, `59083`, `55956`, `55955`, `55276`, `53434`, `53404`, `50229` (각 축약 번호의 접두사는 `CVE-2026-`).
|
|
|
|
대표적으로 HTTP/2 메모리 누수 DoS `CVE-2026-68763`은 HTTP/2 활성화 여부가 중요하다. DIGEST/FORM/Realm/서블릿 선언적 제약 관련 권고를 커스텀 `UserController` 로그인 취약점으로 단정하지 않는다. 예제 앱 관련 항목은 WAR에 Tomcat examples가 없어 배포 내용상 해당하지 않는다. 나머지는 각각 외부 WAS/TLS/클러스터 설정과 대조해야 한다.
|
|
|
|
공식 권고는 10.1.58 릴리스 투표가 통과하지 않았으므로 실제 배포 수정본으로 10.1.59를 사용하도록 명시한다. OSV의 `fixed=10.1.58`만 보고 배포 버전을 정하면 안 된다. [Apache 공식 권고](https://tomcat.apache.org/security-10.html).
|
|
|
|
### Spring: 공급자 공지로 OSV 조회 공백 보완
|
|
|
|
- [CVE-2026-59282](https://spring.io/security/cve-2026-59282/): 외부 property path를 self-populating List에 바인딩하는 조건. 해당 List/DataBinder 구성이 소스에 없다.
|
|
- [CVE-2026-59283](https://spring.io/security/cve-2026-59283/): SimpleEvaluationContext와 활성 SpEL compiler 조합. 관련 사용이 없다.
|
|
- [CVE-2026-47886](https://spring.io/security/cve-2026-47886/): 외부 SpEL 및 BigInteger/BigDecimal 거듭제곱 조건. 외부 표현식 평가 코드가 없다.
|
|
- [CVE-2026-59313](https://spring.io/security/cve-2026-59313/): 함수형 MVC의 텍스트 SSE. RouterFunction/ServerResponse.sse 사용이 없다.
|
|
|
|
위 판단은 현재 저장소의 정적 대조이며 런타임에 외부로 주입되는 코드/설정까지 보증하지 않는다. [Boot 3.5.16 공식 발표](https://spring.io/blog/2026/06/25/spring-boot-3-5-16-available-now/)는 이를 3.5 계열의 마지막 OSS 릴리스로 명시한다. Spring jar 하나만 올리는 방식보다 지원되는 Boot 계열로의 이전 또는 상용 패치 경로를 결정해야 한다.
|
|
|
|
### 나머지 권고와 소스 근거
|
|
|
|
- Jackson: [CVE-2026-59889](https://github.com/FasterXML/jackson-databind/security/advisories/GHSA-5gvw-p9qm-jgwh), [CVE-2026-54515](https://github.com/FasterXML/jackson-databind/security/advisories/GHSA-5jmj-h7xm-6q6v), [GHSA-mhm7-754m-9p8w](https://github.com/FasterXML/jackson-databind/security/advisories/GHSA-mhm7-754m-9p8w). `JamScoringController.java:73`은 `@RequestBody Map<String,Object>`이며 위 권고에 필요한 POJO annotation 조합은 현재 소스에서 검색되지 않았다.
|
|
- PostgreSQL: [CVE-2026-54291 공급자 권고](https://github.com/pgjdbc/pgjdbc/security/advisories/GHSA-j92g-9f8w-j867). 영향 버전과 `channelBinding=require`의 실제 사용 여부는 별개다. 운영 설정 값/비밀번호는 수집하거나 보고서에 출력하지 않았다.
|
|
- jsoup: [CVE-2026-71497 공급자 권고](https://github.com/jhy/jsoup/security/advisories/GHSA-pmhh-3w7g-xqp8). `PostMarkdownService.java:26`은 `basicWithImages()`에 `h1/h2/h3/hr`만 추가한다. style/script 등 raw-text 태그를 허용하지 않으므로 현재 sanitizer 설정에는 해당 조건이 없다. `OgPreviewService.java:52`는 HTML parsing 용도다.
|
|
- Log4j API: [CVE-2026-49844 공급자 권고](https://logging.apache.org/security.html#CVE-2026-49844). WAR의 Logback/Log4j-to-SLF4J 구성과 소스 검색에서 MapMessage/JsonTemplateLayout 경로가 없다. Log4Shell 발견으로 표현하지 않는다.
|
|
|
|
## NVD 갱신 시도와 제한
|
|
|
|
검증용 POM에서만 `autoUpdate=true`, `skipProvidedScope=false`, JSON/HTML 출력을 설정했다. 원본 `pom.xml`은 수정하지 않았다. 첫 전체 동기화는 네트워크 오류와 `NoDataException`으로 실패했다. 회사 CA를 **이번 실행 전용 truststore**에 로드하고 IPv4를 지정한 재시도는 갱신 단계에 진입했으나 NVD 전체 395,957건 초기 복제를 요구했다.
|
|
|
|
필요한 28건의 NVD 실시간 조회와 WAR 전수 OSV 조회가 성공한 뒤 전체 복제 프로세스를 중단했다. 따라서 **최신 NVD DB 기반 Dependency-Check 전체 실행 PASS로 기록하지 않는다.** 그 실행의 캐시도 완전 갱신된 것으로 취급하면 안 된다. TLS 인증서 검증은 끄지 않았다. 최신 직접 조회 결과와 bulk sync 상태는 별개다.
|
|
|
|
OSS Index는 인증정보 미제공으로 사용하지 않았다. OS/JDK/컨테이너 이미지의 시스템 패키지, CDN 리소스, 앱 자체의 미공개 결함은 이번 Maven/WAR 의존성 대조 범위 밖이다.
|
|
|
|
## 다음 작업
|
|
|
|
1. 운영 HTTP/2·Realm/Valve·TLS·DB channel binding 설정을 확인하고 미확인 조건을 닫는다.
|
|
2. 위 수정 버전 또는 이를 관리하는 지원 Boot BOM을 선택한다. Spring 6.2.20은 공식 권고상 상용 경로이므로 공개 Maven Central에 있다고 가정하지 않는다.
|
|
3. 버전 변경 후 전체 테스트, WAR 내부 버전, DB 연결, JSP·WebGL·마크다운·JSON 경로를 재검증하고 동일 온라인 조회를 다시 수행한다.
|
|
4. 재현 가능한 정기 검사에는 NVD 갱신 성공/데이터 시각/대상 개수/제외 범위를 종료 조건으로 두고, 갱신 실패 후 캐시 fallback을 출시 PASS로 쓰지 않는다.
|
|
|
|
제품 버전 변경이나 배포는 이번 검증에 포함하지 않았다. 현재 확인된 증거는 **업데이트 또는 근거 있는 적용성 예외 검토가 필요한 상태**이며, 즉시 악용 가능한 취약점이 재현됐다는 판정은 아니다.
|