Fastjson의 역직렬화 취약점을 이용한 RCE 공격은 @type 지시어가 담긴 조작된 JSON 데이터를 전송해 서버가 악성 바이트코드를 클래스로 착각해 로드하고 실행하는 방식이다. 특히 Spring Boot fat-JAR 구조에서는 외부 gadget 체인이나 AutoType 활성화 없이 중첩 경로 탐색으로 내부 통신만으로 원격 코드 실행이 가능하다.
Fastjson RCE 취약점 개요 및 영향 버전 분석
Fastjson은 고성능 JSON 파싱 라이브러리로 널리 쓰이지만, 역직렬화 과정의 클래스 타입 결정 방식에 설계 결함이 있어 지속적으로 RCE(Remote Code Execution) 취약점이 보고되었다. 가장 최근이자 심각한 사례는 2026년 7월에 공지된 CVE-2026-16723으로, Fastjson 1.2.68에서 1.2.83 버전까지 영향을 미친다. 해당 취약점의 CVSS 점수는 9.0(Critical 등급)으로, 별도 인증 없이 서버 제어권을 탈취할 수 있어 매우 위험하다.
취약점의 핵심은 임의의 JSON을 처리하는 parse 메서드가 진입점이라는 점이다. 과거에는 특정 gadget 클래스가 클래스패스에 있거나 AutoType 설정이 켜져야만 공격이 가능했으나, CVE-2026-16723은 기본 구성에서도 작동한다. 특히 Spring Boot의 fat-JAR 패키징을 사용하면 SafeMode가 기본적으로 비활성화되어 있어 공격에 취약한 구조다.
영향 범위도 넓다. Maven Central에 등록된 아티팩트 7,900개 이상이 Fastjson에 의존하며, Alibaba 생태계 핵심 구성 요소인 Dubbo, Nacos, Sentinel, RocketMQ 등이 기본 JSON 파서로 Fastjson을 내장했다. 이 때문에 하위 의존성 체인에 Fastjson이 포함된 서구권의 금융, 헬스케어, 정부 시스템 등 수많은 레거시 시스템이 공격 대상이 되었다.
Fastjson RCE 취약점 및 공격 사례의 구체적 경로와 악용 조건
Fastjson RCE 공격 과정은 매우 정교하다. 최근에는 기존 gadget 체인 대신 공격자가 직접 바이트코드를 주입하는 방식으로 진화했다. 공격 경로는 다음 단계로 이루어진다.
- 공격자는 JSON을 처리하는 임의의 엔드포인트에
@type지시어가 담긴 조작된 JSON 데이터를 보낸다. - 서버 내 Fastjson 파서는
@type값으로 클래스 리소스를 조회하며, 정상적인 클래스 해석 기능을 이용해 공격자가 의도한 경로를 탐색한다. - Spring Boot fat-JAR 환경은 내부에 중첩된 JAR 구조가 존재한다. 공격자는 이 경로를 조작해 전송한 악성 바이트코드가 클래스로 해석되도록 유도한다.
- JSON 타입 어노테이션이 해당 바이트코드를 시스템에 등록된 정상 클래스로 취급하게 만들어 메모리에 로드하고, 최종적으로 Java 프로세스 권한으로 악성 코드를 실행한다.
이 공격이 위험한 이유는 개발자의 실수나 커스텀 디시리얼라이저 여부와 상관없이, 기본 구성과 기본 패키징, 표준 parse 호출만으로도 성립한다는 점이다. 즉, 내부 통신망에서 신뢰할 수 있는 트래픽으로 간주해 검증 없이 JSON을 처리하는 모든 지점이 공격 경로가 된다.
실제로 이 취약점이 공지된 후 24시간 이내에 공격 시도가 감지되었다. 주요 타겟은 미국의 금융, 헬스케어, 리테일 기업이었다. 공격자들은 일반 사용자의 브라우저 요청으로 위장하거나 Ruby, Go 언어로 작성한 자동화 스크립트를 사용해 대규모 스캐닝과 공격을 가했다.
기술적 분석을 통한 취약점 비교 및 영향도
Fastjson 1.x 버전 취약점들은 시간이 지날수록 방어 기법을 우회하는 방향으로 발전했다. 아래 표는 주요 특성을 비교한 데이터다.
| 구분 | 과거 취약점 (CVE-2017-7929 등) | 최신 취약점 (CVE-2026-16723) |
|---|---|---|
| 필수 조건 | AutoType 활성화 또는 특정 Gadget 필요 | 기본 구성 (SafeMode 비활성 시) |
| 진입점 | 특정 클래스 역직렬화 지점 | 임의의 JSON parse 메서드 |
| 공격 벡터 | 알려진 클래스 체인 이용 | 악성 바이트코드 직접 주입 및 로드 |
| 영향 범위 | 설정 오류가 있는 서버 | Spring Boot fat-JAR 기본 배포 환경 |
| 위험도 (CVSS) | High ~ Critical | 9.0 (Critical) |
탐지, 완화 및 근본적인 마이그레이션 방법
현재 Fastjson 1.x 라인은 EOL(End of Life) 상태라 공식 패치가 제공되지 않는다. 운영 중인 시스템에 즉각적인 조치가 필요하다면 다음 단계별 대응 전략을 세워야 한다.
- SafeMode 즉시 활성화:
Fastjson.parser.safeMode=true설정으로@type을 이용한 임의 클래스 로딩을 완전히 막아야 한다. 단, 이 설정은 기존 정상적인 역직렬화 로직을 깰 수 있으므로 반드시 스테이징 환경에서1.2.83_nontype아티팩트와 함께 충분히 테스트한 뒤 배포해야 한다. - 의존성 인벤토리 전수 조사:
Maven dependency:tree명령어나 최신 SBOM(Software Bill of Materials) 도구로 직접 의존성뿐만 아니라 최소 4계층 하위까지 간접 의존성을 스캔해야 한다. 특히 서비스 메시, 벤더 제공 SDK의 와이어 핸들러 내부에 Fastjson이 숨어 있을 가능성이 크다. - 실시간 검출 신호 모니터링: WAF(웹 방화벽) 시그니처만으로는 부족하다.
@type자체는 정상 트래픽에도 포함될 수 있기 때문이다. 요청 본문에 코드베이스와 일치하지 않는 클래스 이름이나 중첩 JAR 경로 패턴이 있는지, 혹은 Java 프로세스에서 승인되지 않은 외부 연결이나 자식 프로세스가 생성되는지를 확인해야 한다. - Fastjson 2로의 마이그레이션: 가장 근본적인 해결책은 Fastjson 2 버전으로 전환하는 것이다. 하지만 Fastjson 2는 1.x 버전과 드롭인 대체(Drop-in Replacement)가 불가능한 구조적 차이가 있어 코드 수정과 전수 테스트를 포함한 상세한 이행 계획이 필요하다.
특히 주의해야 할 점은 많은 SCA(Software Composition Analysis) 도구가 데이터베이스 업데이트 지연으로 1.2.83 버전을 안전하다고 표시할 수 있다는 점이다. 도구 결과에만 의존하지 말고 실제 런타임 설정과 패키징 구조를 확인하는 실무적 검증이 병행되어야 한다.
결론 및 실무자 대응 제언
Fastjson RCE 취약점은 단순한 설정 오류를 넘어 라이브러리 기본 동작 방식과 프레임워크 패키징 구조가 결합해 발생하는 고도화된 공격이다. CVE-2026-16723 사례처럼 외부 입력 없이 내부 통신과 기본 구성만으로도 Critical 수준의 권한 탈취가 가능하다는 점은 인프라 보안 담당자에게 심각한 위협이다.
지금 즉시 운영 환경의 Fastjson 버전을 확인하고 SafeMode 활성화를 통해 긴급 통제 조치를 시행해야 한다. 이후 SBOM 기반 의존성 분석으로 숨겨진 취약 지점을 모두 찾아내고, 단계적인 Fastjson 2 마이그레이션 로드맵을 세워 레거시 시스템의 보안 부채를 해결해야 한다.