RSA 공개키만으로 모든 권한 획득 가능, pac4j-jwt 치명적 취약점
pac4j-jwt 라이브러리에서 RSA 공개키를 이용해 인증을 우회하는 치명적인 취약점(CVSS 10.0) 발견
공격자는 서버의 RSA 공개키(Public Key)만으로 임의의 사용자 권한을 획득 가능
취약점은 JWE(Encrypted JWT) 사용 시, 서명 검증 단계가 생략되는 로직에서 발생
패치 적용 및 보안 권고 발표, 오픈소스(Open Source) 생태계의 취약점 대응 중요성 강조
AI 코드 리뷰어(Code Reviewer)를 통한 취약점 발견
CodeAnt AI의 AI 코드 리뷰어(AI Code Reviewer)는 CVE 패치 적용 후에도 취약점이 남아있는지 분석하는 과정에서 해당 취약점을 발견했다. 특히, 서명 검증(Signature Verification) 전 null 체크 로직이 존재하여, 공격자가 서명되지 않은 토큰(Unsigned Token)을 삽입할 경우 검증 단계가 생략되는 점을 파악했다. 이는 AI 기반의 자동화된 코드 분석 도구가 보안 취약점(Security Vulnerability) 발견에 효과적임을 보여준다.
RSA 공개키를 이용한 인증 우회 원리
공격자는 서버의 RSA 공개키(Public Key)를 사용하여 암호화된 JWE(JSON Web Encryption) 토큰을 생성한다. pac4j-jwt는 JWE 복호화 후, 서명된 JWT(JWS)를 기대하지만, 공격자는 서명되지 않은 PlainJWT를 삽입하여 서명 검증 단계를 우회한다. 결과적으로, 공격자는 RSA 공개키(Public Key)만으로 임의의 사용자 권한을 획득하여 시스템에 접근할 수 있게 된다. 이는 인증(Authentication) 및 인가(Authorization) 과정의 취약점을 악용한 사례이다.
취약한 코드 구조 분석
취약점은 `JwtAuthenticator.java` 파일 내에서 `signedJWT` 변수에 대한 null 체크 로직에서 발생한다. JWE(Encrypted JWT) 복호화 후, `toSignedJWT()` 메서드를 통해 서명된 JWT를 추출하는데, 서명이 없는 경우 null을 반환한다. 하지만, null 체크 이후 서명 검증(Signature Verification) 단계가 생략되어, 공격자가 조작한 PlainJWT의 claims가 그대로 사용된다. 이는 잘못된 변수 사용(Incorrect Variable Usage)으로 인한 보안 취약점이다.
패치 및 대응 방안
pac4j-jwt maintainer는 취약점 보고 후 2일 만에 패치를 배포하고 보안 권고를 발표했다. 패치는 4.x, 5.x, 6.x 버전 모두에 적용되었으며, 오픈소스(Open Source) 프로젝트의 신속한 대응을 보여주는 사례이다. 사용자들은 pac4j-jwt를 최신 버전으로 업데이트하고, RSA 기반 JWE(RSA-based JWE) 사용 여부 및 `JwtAuthenticator` 설정을 확인해야 한다. 또한, 보안 감사(Security Audit)를 통해 유사한 취약점을 사전에 방지해야 한다.