상세 컨텐츠

본문 제목

Oracle Java 인증서 검증 우회 취약점(CVE-2026-91403) 긴급 업데이트 권고

국내외 보안동향

by 알약(Alyac) 2026. 10. 24. 21:00

본문

생성형 AI 제작 이미지

 

Oracle이 Java SE와 GraalVM의 TLS 구현 컴포넌트(JSSE)에 영향을 주는 취약점 CVE-2026-91403에 대해 정기 보안 업데이트 일정과 별도로 긴급 보안 경보(Security Alert)를 발표하고 패치 버전을 배포했습니다.

 

이번 취약점은 Java 코드 자체의 결함이 아니라, 인증 기관(CA) eMudhra의 중간 CA 인증서 8종의 개인 키가 유출된 사고에서 비롯되었습니다. 이 중간 CA들은 Java가 기본으로 신뢰하는 루트 인증서로 연결되어 있기 때문에, 유출된 키를 가진 공격자는 임의의 도메인에 대해 Java가 "정상"으로 판단하는 인증서를 만들어 HTTPS 서버를 위장할 수 있습니다.

 

Chrome, Firefox, Windows, Apple 등은 이미 해당 인증서를 차단했지만, Java처럼 자체 신뢰 저장소(cacerts)를 사용하는 런타임은 운영체제나 브라우저를 업데이트해도 보호되지 않습니다. 또한 Java를 비롯한 대부분의 비브라우저 클라이언트는 인증서 투명성(CT) 기록을 검사하지 않아, 공격을 받더라도 흔적이 남지 않을 수 있습니다.

 

CVSS 9.1(Critical)로 평가된 만큼, 서버·배치 작업·개발 도구 등 Java를 사용하는 모든 환경에서 신속하게 업데이트하시기를 권고 드립니다.

 

 

취약점 개요

 

CVE CVE-2026-91403
영향 컴포넌트 Oracle Java SE / Oracle GraalVM - JSSE(Java Secure Socket Extension)
OpenJDK 기준 security-libs/javax.net.ssl
취약점 유형 유출된 중간 CA 인증서를 신뢰하여 발생하는 인증서 검증 우회
CWE-295(Improper Certificate Validation) - Red Hat 분류
CWE-284(Improper Access Control) - NVD(CISA-ADP) 분류
심각도 Critical (CVSS v3.1 9.1)
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
영향 대상 Oracle Java SE 8u511, 8u511-perf, 11.0.33, 17.0.21, 21.0.13, 25.0.5, 27.0.1 및 이전 버전
Oracle GraalVM for JDK 17.0.21, 21.0.13 / GraalVM Enterprise Edition 21.3.20
OpenJDK 기반 Java 배포판(Temurin, Corretto, Zulu 등)
실제 악용 10월 23일 기준 확인된 실제 악용 사례 없음
단, 결함 있는 키는 2025년 4월 인증서 발급 시점부터 복구 가능한 상태였으며, CT를 검사하지 않는 클라이언트에 대한 과거 악용 여부는 확인되지 않음
조치 27.0.1.0.2 / 25.0.5.0.2 / 21.0.13.0.2 / 17.0.21.0.2 / 11.0.33.0.2 / 8u511 b32 이상으로 즉시 업데이트

 

■ 사용자 권고 사항

  • 운영 서버, 배치 서버, CI 러너, 개발자 PC, 컨테이너 이미지에 설치된 Java 런타임(JDK/JRE) 버전을 모두 확인합니다.
  • Oracle JDK는 패치 버전(x.0.2 또는 8u511 b32)으로 즉시 업데이트합니다.
  • OpenJDK 기반 배포판은 각 벤더의 업데이트를 적용하고, OpenJDK 프로젝트가 권고한 추가 조치(루트 인증서 제거 또는 폐기 확인 활성화)도 함께 적용합니다.
  • 리눅스 배포판 패키지로 설치한 OpenJDK는 ca-certificates 패키지를 업데이트합니다. (Debian/Ubuntu는 Java 키스토어 재생성 필요)
  • 업데이트 후에는 실행 중인 모든 Java 프로세스(WAS, Spring Boot 서비스, Jenkins 등)를 재시작합니다.

 

 

취약점 발생 원인

 

HTTPS 통신에서 Java 클라이언트는 서버가 제시한 인증서가 "신뢰하는 루트 CA → 중간 CA → 서버 인증서"로 이어지는 체인을 이루는지 확인해 서버의 신원을 검증합니다. 이때 루트 CA 목록은 JDK에 포함된 신뢰 저장소(cacerts)를 사용합니다.

 

인도의 인증 기관 eMudhra는 2025년 4월 TLS 서버 인증서용 6종과 코드 서명용 2종, 총 8종의 중간 CA 인증서를 발급했는데, 이 인증서들의 개인 키가 잘못된 방식으로 생성되어 누구나 인증서 정보만으로 개인 키를 복구할 수 있는 상태였습니다. 2026년 10월 17일 한 제보자가 8종 모두의 개인 키로 서명한 메시지를 브라우저·OS 루트 프로그램에 제출하면서 유출 사실이 확인되었습니다.

 

이 중간 CA들은 eMudhra 루트뿐 아니라 Sectigo의 AAA Certificate Services 루트에서도 교차 서명(Cross-sign)을 받아, Java를 포함한 대부분의 신뢰 저장소에서 유효한 체인으로 인정되었습니다.

유출된 중간 CA 용도 상위 인증서
EM DV TLS CA - G3B
EM DV TLS CA - G3C
TLS 서버 인증서 (DV) emSign Root TLS CA - G3
AAA Certificate Services (Sectigo 교차 서명)
EM OV TLS CA - G3B
EM OV TLS CA - G3C
TLS 서버 인증서 (OV) emSign Root TLS CA - G3
AAA Certificate Services (Sectigo 교차 서명)
EM EV TLS CA - G3B
EM EV TLS CA - G3C
TLS 서버 인증서 (EV) emSign Root TLS CA - G3
AAA Certificate Services (Sectigo 교차 서명)
EM OV CS CA - G3B
EM OV CS CA - G3C
코드 서명 인증서 emSign Root CS CA - G3
AAA Certificate Services (Sectigo 교차 서명)

[표 1] 개인 키가 유출된 eMudhra 중간 CA 인증서

 

근본 원인 eMudhra 중간 CA 개인 키의 잘못된 생성으로, 인증서에서 개인 키 복구 가능
결과 유출된 키로 임의 도메인용 인증서를 발급하면 Java의 JSSE가 이를 신뢰된 인증서로 판단
수정 내용 중간 CA 8종과 Sectigo 교차 서명 인증서 8종, 총 16개를 lib/security/blocked.certs에 추가해 신뢰 차단
- TLS: 체인에 해당 인증서가 포함되면 TLS 세션 협상 거부
- 코드 서명: jarsigner -verify -strict 검증 실패 처리
제보자 Wayne (10월 17일 루트 프로그램에 유출 증거 제출) / Oracle 권고문에는 별도 제보자 명시 없음

※ 이번 패치는 Java 코드의 결함을 고친 것이 아니라 "어떤 인증서를 신뢰할지"를 바꾼 것입니다. OS나 브라우저를 업데이트해도, Java 런타임 자체 또는 Java가 사용하는 신뢰 저장소를 갱신하지 않으면 보호되지 않습니다.

 

 

영향 및 공격 시나리오

 

공격 조건 인증 불필요. 공격자가 Java 클라이언트와 서버 사이의 통신 경로에 위치(중간자)할 수 있으면 공격 가능
예: 공용 Wi-Fi, DNS 응답 변조, 내부망 ARP 스푸핑, 프록시 장악 등
발생 가능한 피해 HTTPS 통신 내용 탈취·변조(API 키, 인증 토큰, 개인정보), 위조 서버로의 접속 유도, 다운로드 파일 변조, 위조된 서명 JAR의 정상 코드 위장
노출되지 않는 환경 자체 신뢰 저장소에서 관련 루트를 제외한 환경, 인증서 고정(Certificate Pinning)을 적용한 클라이언트, 인증서 폐기 확인(CRL)을 활성화한 환경

 

Java 애플리케이션이 공격에 노출되는 대표적인 경로는 다음과 같습니다.

경로 노출 조건 위험도
① 아웃바운드 HTTPS 호출 HttpClient, HttpsURLConnection, Spring RestTemplate/WebClient, OkHttp, Apache HttpClient 등 JDK 기본 신뢰 저장소를 사용하는 클라이언트가 외부 API·결제·인증 서버와 통신 높음
② 빌드 및 의존성 다운로드 Maven, Gradle 등 Java 기반 빌드 도구가 HTTPS로 라이브러리·플러그인을 내려받는 과정에서 위조 저장소로 연결 높음
③ 서명된 JAR 검증 코드 서명용 중간 CA 2종으로 서명된 JAR를 정상 서명으로 인정 중간
④ Java Web Start / 애플릿 샌드박스에 의존해 외부 코드를 실행하는 클라이언트 (Oracle 권고문 명시) 중간

특히 서버에서 외부로 나가는 HTTPS 통신은 내부 시스템이 정상 요청을 보내는 것처럼 보이기 때문에, 위조 인증서가 사용되어도 일반적인 보안 장비에서 이를 구분하기 어렵습니다. 브라우저는 CT 기록이 없는 인증서를 거부하지만 Java는 CT를 검사하지 않으므로, 공격자가 CT에 기록하지 않은 인증서를 사용하면 외부에서 발급 사실을 확인할 방법도 없습니다.

 

 

영향 받는 버전 및 패치 버전

 

제품 / 버전 영향 받는 버전 패치 버전
Oracle Java SE 27 27.0.1 및 이전 27.0.1.0.2
Oracle Java SE 25 (LTS) 25.0.5 및 이전 25.0.5.0.2
Oracle Java SE 21 (LTS) 21.0.13 및 이전 21.0.13.0.2
Oracle Java SE 17 (LTS) 17.0.21 및 이전 17.0.21.0.2
Oracle Java SE 11 (LTS) 11.0.33 및 이전 11.0.33.0.2
Oracle Java SE 8 (LTS) 8u511, 8u511-perf 및 이전 8u511 b32
(1.8.0_511-b32, 8u511-perf는 Oracle 패치 제공 문서 확인)
Oracle GraalVM for JDK 17.0.21, 21.0.13 Oracle 패치 제공 문서(Patch Availability Document) 확인
Oracle GraalVM Enterprise Edition 21.3.20 Oracle 패치 제공 문서(Patch Availability Document) 확인
OpenJDK 기반 배포판 각 벤더 공지 확인 벤더 업데이트 + OpenJDK 권고 추가 조치

[표 2] CVE-2026-91403 영향 받는 버전 및 패치 버전

 

 

■ 리눅스 배포판 OpenJDK 패키지

Red Hat Enterprise Linux, Oracle Linux, Fedora 등의 OpenJDK 패키지는 운영체제의 인증서 저장소를 그대로 사용하므로 ca-certificates 패키지 업데이트로 조치됩니다. 반면 Debian/Ubuntu 계열은 ca-certificates-java 패키지의 오래된 버그로 패키지 업데이트만으로는 Java 키스토어가 갱신되지 않아 추가 작업이 필요합니다.

배포판 조치된 ca-certificates 버전 비고
RHEL 8 / 9 / 10 2026.2.92_v9.0.319-81.3.el8_10
2026.2.92_v9.0.319-90.3.el9_8
2026.2.92_v9.0.319-100.3.el10_2
RHEL 7은 준비 중
Oracle Linux 8 / 9 / 10 2025.2.80_v9.0.304-80.2.0.1.el8_10
2025.2.80_v9.0.305-91.0.1.el9
2025.2.80_v9.0.305-102.0.1.el10_2
 
Ubuntu 22.04 / 24.04 /
26.04 / 26.10
20260816ubuntu0.22.04.1
20260816ubuntu0.24.04.1
20260816ubuntu0.26.04.1
20260816ubuntu0.26.10.1
Java 키스토어
재생성 필요
Debian 12 / 13 20250419~deb12u2
20250419+deb13u1
Java 키스토어
재생성 필요
Fedora 2026.2.92_v9.0.319  
Alpine Linux 20261020-r0  

[표 3] 주요 리눅스 배포판 ca-certificates 조치 버전

 

 

조치 방법

 

 

① 사용 중인 버전 확인

• Java 버전 확인

java -version

• 서버에 설치된 Java 런타임 전체 확인 (여러 버전이 설치된 경우)

# Linux
update-alternatives --list java
find / -type f -path "*/bin/java" 2>/dev/null
# Windows
where java

• 컨테이너 이미지 내 Java 버전 확인

docker run --rm <이미지명:태그> java -version

• 신뢰 저장소의 관련 루트 인증서 포함 여부 확인 (OpenJDK 제공 점검 도구)

# CheckCerts.java 다운로드: https://cr.openjdk.org/~mr/CheckCerts.java
# JDK 11 이상
java CheckCerts.java
# JDK 8
javac CheckCerts.java && java CheckCerts

Java 런타임은 운영체제 외에도 WAS, IDE, 빌드 도구, 보안·모니터링 제품 등에 별도로 내장되어 있는 경우가 많습니다. 자산이 많은 경우 SBOM이나 자산관리 도구로 Java 런타임 설치 위치를 목록화해 점검하시기 바랍니다.

 

② 보안 업데이트 적용

설치 환경 업데이트 방법 조치 필요 여부
Oracle JDK Oracle 공식 다운로드 페이지 또는 My Oracle Support에서 패치 버전(x.0.2, 8u511 b32) 설치 필요
OpenJDK 기반 배포판
(Temurin, Corretto, Zulu 등)
각 벤더의 업데이트 적용 후, OpenJDK 권고에 따라 아래 ③의 루트 인증서 제거 또는 폐기 확인 활성화 적용 필요
업데이트 후 추가 조치 권고
리눅스 OS 패키지
(RHEL, Oracle Linux, Fedora 등)
dnf upgrade ca-certificates 등으로 인증서 패키지 업데이트 필요
리눅스 OS 패키지
(Debian, Ubuntu)
apt upgrade 후 Java 키스토어 재생성 (아래 명령어 참고) 필요
패키지 업데이트만으로는 해결 안 됨
Docker 컨테이너 Dockerfile의 베이스 이미지를 패치된 JDK 또는 최신 ca-certificates가 포함된 이미지로 변경 → 재빌드 → 재배포 필요
제품 내장 JRE WAS, IDE, 상용 솔루션에 포함된 JRE는 해당 개발사의 보안 업데이트 공지 확인 개발사 공지 확인

 

• Debian / Ubuntu Java 키스토어 재생성 (root 권한)

rm -f /etc/ssl/certs/java/cacerts
update-ca-certificates --fresh

업데이트 후에는 실행 중인 Java 프로세스(Tomcat, Spring Boot 서비스, Jenkins, Kafka 등)를 반드시 재시작해야 변경된 신뢰 목록이 적용됩니다.

 

③ 즉시 업데이트가 어려운 경우 임시 대응 및 추가 조치

※ 아래 방법 중 하나를 적용하면 되며, 모두 함께 적용할 필요는 없습니다. 적용 전 반드시 기존 파일을 백업하시기 바랍니다.

• 방법 1. 차단 인증서 목록(blocked.certs) 교체 - Oracle 권고

Oracle이 제공하는 갱신된 blocked.certs 파일로 로컬 파일을 교체합니다. 기존에 직접 추가한 차단 항목이 있다면 유지해야 합니다.

# JDK 11 이상
$JAVA_HOME/lib/security/blocked.certs
# JDK 8 (파일명이 다름)
$JAVA_HOME/jre/lib/security/blacklisted.certs

※ JDK 8을 JRE 단독으로 설치한 경우 경로는 $JAVA_HOME/lib/security/입니다. (방법 2도 동일)

• 방법 2. 관련 루트 인증서 제거 - OpenJDK 권고

# 키스토어 백업 (JDK 11 이상)
cp $JAVA_HOME/lib/security/cacerts $JAVA_HOME/lib/security/cacerts.bak

# JDK 11 이상
keytool -delete -cacerts -alias "emsigneccrootcag3 [jdk]"
keytool -delete -cacerts -alias "comodoaaaca [jdk]"

# JDK 8
keytool -delete -keystore $JAVA_HOME/jre/lib/security/cacerts -alias "emsigneccrootcag3 [jdk]"
keytool -delete -keystore $JAVA_HOME/jre/lib/security/cacerts -alias "comodoaaaca [jdk]"

 

• 방법 3. 인증서 폐기 확인 활성화

유출된 중간 CA 인증서는 eMudhra가 10월 18일, Sectigo 교차 서명 인증서는 Sectigo가 10월 19일 각각 폐기했으므로, 폐기 확인을 켜면 해당 인증서로 연결된 체인을 거부할 수 있습니다. Java 애플리케이션 실행 옵션에 다음을 추가합니다.

-Dcom.sun.net.ssl.checkRevocation=true -Dcom.sun.security.enableCRLDP=true

서명된 JAR 파일은 JDK 17 이상에서 다음 명령으로 폐기 여부까지 검증할 수 있습니다.

jarsigner -verify -revcheck -strict <서명된_JAR_파일>

※ 폐기 확인은 CRL 배포 서버에 접속해야 하므로, 외부 통신이 제한된 환경에서는 연결 지연이나 실패가 발생할 수 있습니다.

 

 

침해 여부 확인 및 조치 방안

 

점검 항목 확인 내용
TLS 인증서 체인 TLS 검사 장비·프록시 로그에서 EM DV/OV/EV TLS CA - G3B/G3C가 발급한 서버 인증서 사용 이력
DNS / 네트워크 외부 API·저장소 도메인이 평소와 다른 IP로 해석된 기록, 내부망 ARP 스푸핑 징후
서명된 JAR EM OV CS CA - G3B/G3C 체인으로 서명된 JAR 파일 존재 여부 (jarsigner -verify -verbose -certs로 확인)
빌드 산출물 빌드 시 다운로드된 의존성의 해시값이 공식 저장소 값과 다른지 여부
자격 증명 사용 이력 Java 애플리케이션이 외부로 전송하는 API 키, 인증 토큰의 비정상적인 사용 기록

침해가 의심되는 경우 해당 시스템이 HTTPS로 주고받은 API 키, 인증 토큰, DB 접속 정보 등 자격 증명을 모두 교체하고, 의심 기간에 다운로드된 의존성과 빌드 산출물을 공식 저장소 기준으로 다시 검증하시기 바랍니다.

 

 

취약점 공개 경과

 

일자 내용
2025. 04. ~ 05. eMudhra가 결함 있는 개인 키로 중간 CA 인증서 8종 발급(4월), Sectigo 교차 서명 인증서 발급(5월)
2026. 10. 17. 제보자가 8종 모두의 개인 키로 서명한 메시지를 루트 프로그램에 제출, Firefox·Chrome 차단
2026. 10. 18. eMudhra, 해당 중간 CA 인증서 8종 폐기 (사유: CA 침해)
2026. 10. 19. Sectigo, 교차 서명 인증서 8종 폐기 / 자체 신뢰 저장소를 운영하는 소프트웨어 측에 사전 통보
2026. 10. 20. 사고 내용 공개, Microsoft 차단 / Oracle 10월 정기 CPU 배포 (이번 문제는 미포함)
2026. 10. 21. Oracle Security Alert(CVE-2026-91403) 발표 및 JDK 패치 버전 배포, OpenJDK 보안 권고 공개, NVD 등록
2026. 10. 22. Apple 차단
2026. 10. 23. OpenJDK 조치 안내 페이지 갱신 (업데이트 후에도 루트 인증서 제거 또는 폐기 확인 추가 적용 권고)

※ 일자는 각 출처의 공개 기준(현지 시각)입니다.

 

 

참고 용어

 

용어 설명
JSSE Java Secure Socket Extension. Java에서 SSL/TLS 통신과 인증서 검증을 담당하는 표준 컴포넌트
CA / 중간 CA 인증 기관(Certificate Authority). 루트 CA가 중간 CA에 권한을 위임하고, 중간 CA가 실제 서버 인증서를 발급
신뢰 저장소 (cacerts) 클라이언트가 신뢰하는 루트 인증서 목록. Java는 JDK에 포함된 cacerts 파일을 사용
blocked.certs 루트 인증서 목록과 관계없이 신뢰하지 않을 인증서를 지정하는 JDK 차단 목록 파일 (JDK 8은 blacklisted.certs)
교차 서명 (Cross-sign) 하나의 중간 CA 인증서를 다른 루트 CA가 추가로 서명해, 여러 신뢰 경로를 갖도록 하는 방식
중간자 공격 (MITM) Man-in-the-Middle. 통신 당사자 사이에 끼어들어 내용을 엿보거나 변조하는 공격
CT Certificate Transparency. 발급된 인증서를 공개 로그에 기록해 부정 발급을 확인할 수 있게 하는 체계
CRL / 폐기 확인 Certificate Revocation List. 폐기된 인증서 목록을 조회해 해당 인증서를 거부하는 검증 절차
CPU / Security Alert Oracle의 정기 보안 업데이트(Critical Patch Update)와, 긴급 시 정기 일정과 별도로 배포하는 보안 경보
CWE-295 / CWE-284 CWE-295(Improper Certificate Validation): 인증서를 올바르게 검증하지 않는 취약점
CWE-284(Improper Access Control): 자원에 대한 접근 제어가 올바르지 않은 취약점

 

참고 :

https://www.oracle.com/security-alerts/alert-cve-2026-91403.html

https://www.oracle.com/java/technologies/javase/25-0-5-0-2-relnotes.html

https://openjdk.org/groups/vulnerability/advisories/2026-10-21

https://openjdk.org/emudhra

https://nvd.nist.gov/vuln/detail/CVE-2026-91403

 

관련글 더보기

댓글 영역