Apache Wicket JavaScriptUtils 이스케이프 우회 기반 원격 스크립트 실행 취약점 (CVE-2026-83559)
실무자 핵심 요약 (Executive Summary)
SECOPS ASSESSMENTApache Wicket 8.0.0~8.19.0, 9.0.0~9.24.0, 10.0.0~10.11.0 버전 및 지원이 종료된 7.x 이하 버전
공격자가 입력값에 백슬래시와 따옴표를 혼용하여 이스케이프 로직을 우회하고, 사용자 브라우저 컨텍스트에서 임의의 자바스크립트를 실행(XSS)할 수 있습니다
사용 중인 Apache Wicket 버전에 따라 최신 패치 버전(8.20.0, 9.25.0, 10.12.0)으로 즉시 업그레이드를 수행하십시오
영향받는 제품 및 버전 범위
권장 패치 및 임시 완화(Workaround) 가이드
패치 및 우회 명령어1. 공식 보안 패치 및 버전 업그레이드 명령어
프로젝트의 빌드 구성 파일(pom.xml 또는 build.gradle)을 수정하여 안전한 최신 버전으로 업그레이드하십시오.
Maven (pom.xml) 수정 예시:
<!-- Apache Wicket 의존성을 안전한 버전으로 업데이트 -->
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-core</artifactId>
<version>10.12.0</version> <!-- 또는 9.25.0, 8.20.0 -->
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-extensions</artifactId>
<version>10.12.0</version>
</dependency>Gradle (build.gradle) 수정 예시:
implementation 'org.apache.wicket:wicket-core:10.12.0'
implementation 'org.apache.wicket:wicket-extensions:10.12.0'2. 패치 전 임시 완화(Workaround) 및 접근 제어 설정
즉각적인 패치가 어려운 경우, JavaScriptUtils#escapeQuotes()를 직접 호출하는 커스텀 코드를 검토하고, 입력값 검증 단계에서 백슬래시(\) 문자를 필터링하거나 차단하는 인터셉터를 구현하십시오.
Spring Security / Servlet Filter 기반 백슬래시 차단 예시:
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class InputSanitizationFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
for (String parameterValues : httpRequest.getParameterMap().values()) {
for (String value : parameterValues) {
if (value != null && value.contains("\\")) {
throw new SecurityException('Potential evasion attempt detected: Backslash is not allowed.');
}
}
}
chain.doFilter(request, response);
}
}3. 침해 흔적(IoC) 및 로그·버전 점검 스크립트
애플리케이션 소스 코드 내에서 취약한 메서드가 사용되고 있는지 정적 분석을 수행하고, 의존성 트리를 확인하여 취약한 버전이 포함되어 있는지 점검하십시오.
의존성 트리 점검 및 취약 메서드 검색 스크립트:
# 1. Maven 프로젝트에서 취약한 Wicket 버전 사용 여부 확인
mvn dependency:tree | grep -E 'wicket-core|wicket-extensions'
# 2. 소스 코드 내 취약한 JavaScriptUtils.escapeQuotes 호출부 검색
grep -rn 'JavaScriptUtils.escapeQuotes' ./src/내 GitHub/GitLab 레포지토리에 이 취약한 패키지가 숨어 있는지 30초 만에 스캔하세요
간접 의존성(Transitive Dependency)에 포함된 취약점은 수동 확인이 불가능합니다. Git 연동 한 번으로 취약 버전 탐지부터 호환성을 유지하는 최소 버전 업그레이드 PR까지 자동 생성하세요.
취약점 발생 원리 및 공격 메커니즘
1. 취약점 개요 및 발생 원인 (Root Cause)
본 취약점은 Apache Wicket 프레임워크의 org.apache.wicket.core.util.string.JavaScriptUtils#escapeQuotes() 메서드 내 부적절한 출력 인코딩 및 이스케이프 처리(CWE-116)로 인해 발생합니다. 해당 메서드는 입력값 내의 싱글 쿼터(')와 더블 쿼터(") 앞에 백슬래시(\)를 추가하여 자바스크립트 문자열 리터럴 내에 안전하게 삽입될 수 있도록 설계되었습니다. 그러나 이스케이프의 핵심인 백슬래시 자체를 먼저 이스케이프 처리하지 않는 치명적인 설계 결함이 존재합니다. 이로 인해 입력값에 이미 백슬래시가 포함되어 있는 경우 이스케이프 메커니즘이 완전히 무력화됩니다.
2. 공격 메커니즘 및 익스플로잇 시나리오
공격자가 따옴표 바로 앞에 백슬래시를 배치한 악의적인 입력값(예: \" 또는 \\')을 전송하면, escapeQuotes() 메서드는 따옴표 앞에 백슬래시를 하나 더 추가하여 결과적으로 \\" 형태를 생성합니다. 이 과정에서 첫 번째 백슬래시가 두 번째 백슬래시를 이스케이프 처리하게 되며, 결과적으로 따옴표 자체는 이스케이프되지 않은 상태로 남게 됩니다. 이로 인해 자바스크립트 문자열 리터럴이 조기에 닫히고, 그 뒤에 이어지는 공격자의 입력값이 단순 텍스트가 아닌 실행 가능한 자바스크립트 코드로 해석되어 피해자의 브라우저 컨텍스트(Origin) 및 세션 내에서 실행됩니다. 특히 AjaxEditableLabel과 같이 에러 피드백 메시지를 자바스크립트 리터럴에 동적으로 삽입하는 컴포넌트를 사용하는 경우, 검증 오류 메시지에 사용자 입력값이 포함되도록 설정되어 있다면 즉각적인 XSS 공격 경로가 형성됩니다.
3. 비즈니스 및 인프라 파급 영향
해당 취약점이 성공적으로 익스플로잇될 경우, 공격자는 애플리케이션 사용자의 세션 토큰(Session Cookie)을 탈취하거나, 사용자의 권한을 도용하여 임의의 트랜잭션을 수행하는 CSRF(Cross-Site Request Forgery) 공격을 연계할 수 있습니다. 또한 웹 페이지의 DOM을 조작하여 피싱 레이어를 삽입하거나 악성 스크립트를 유포하는 등 비즈니스 신뢰도에 치명적인 타격을 입히고, 규제 준수(Compliance) 위반으로 인한 법적 책임을 초래할 수 있습니다.
공식 보안 권고문 및 참조 링크
Improper encoding or escaping of output in Apache Wicket. org.apache.wicket.core.util.string.JavaScriptUtils#escapeQuotes() replaces each single quote in its input with a backslash and a single quote, and each double quote with a backslash and a double quote, so that the value can be placed inside a JavaScript string literal. It does not escape the backslash, which is the character that has to be escaped, and escaped first, for the rest of that escaping to hold. A value that already holds a backslash immediately before a quote therefore ends up with two backslashes in front of that quote: the first escapes the second, the quote itself is left unescaped, and it closes the literal. Whatever the value carries after that point is no longer text but JavaScript, and it runs in the application's origin and in the session of the user looking at the page. The method is public, is not deprecated, and its documentation states that its result can be part of a JavaScript call such as an alert; the only limitation it notes concerns JSON values, which need different escaping. An application is affected wherever it calls the method itself and places the result inside a JavaScript string literal, from its own code or from a component of its own or of a third party, and the value it escapes holds data an attacker can influence. There is no further condition, and no component of Wicket has to be involved: the application is using the method for what its documentation offers, and the method does not deliver it. Two components shipped with Wicket Extensions pass a value through the method. org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel writes the editor's first error feedback message into a single-quoted JavaScript string literal in the Ajax response, so an application is affected through that component where the message shown for a failed edit holds data an attacker can influence, whether that is the submitted value itself or another variable the application sets on the validation error. A validation message can carry the submitted value, because input is a message variable that every form component supplies for its own validation errors, and the documentation shows overriding a validator's message to include it; none of the message bundles shipped with Wicket interpolates it, so an application that has not written such a message is not affected through this component. org.apache.wicket.extensions.ajax.markup.html.repeater.AjaxListPanel passes the serialized markup tag of an appended component through the method and is not affected: the tag comes from the panel's own markup file, and a quote in any of its attribute values, the component's markup id included, is written as a character reference by the tag serialization and cannot close the literal. This issue affects Apache Wicket: from 8.0.0 through 8.19.0, from 9.0.0 through 9.24.0, from 10.0.0 through 10.11.0. Users of Apache Wicket 7.x or older, which are no longer supported, should upgrade to a supported version. Users are recommended to upgrade to version 8.20.0, 9.25.0 or 10.12.0, which fix the issue.
자주 묻는 실무 질문 (FAQ — CVE-2026-83559)
FAQQ1. CVE-2026-83559 취약점의 위험도와 실제 악용 가능성은 어느 정도입니까?
CVE-2026-83559의 기본 점수는 CVSS 7.4 (HIGH)이며, 향후 30일 내 실제 악용 확률을 나타내는 EPSS 점수는 0.3%입니다. 외부 네트워크 노출 여부에 따라 선제적인 패치 및 접근 제어가 권장됩니다.
Q2. CVE-2026-83559에 영향을 받는 벤더와 제품은 무엇입니까?
주요 영향 벤더는 apache이며, 대상 컴포넌트는 wicket입니다. 상세 영향 범위: Apache Wicket 8.0.0 ~ 8.19.0, 9.0.0 ~ 9.24.0, 10.0.0 ~ 10.11.0 및 지원이 종료된 7.x 이하 모든 버전
Q3. 서버 재기동이나 정규 패치 전 즉시 적용할 수 있는 완화 조치(Workaround)는 무엇입니까?
[권장 조치] 사용 중인 Apache Wicket 버전에 따라 최신 패치 버전(8.20.0, 9.25.0, 10.12.0)으로 즉시 업그레이드를 수행하십시오 본문의 패치 및 우회 명령어 섹션과 자가 점검 체크리스트를 참고하여 외부 노출 포트를 차단하거나 WAF 탐지 규칙을 선적용하십시오.
CVE-2026-83559 사내 보안 패치 공지문 · CISO 경영진 보고서 초안 자동 생성
클릭 한 번으로 사내 이메일·노션·결재 문서에 바로 붙여넣을 수 있는 공식 보고서 양식을 생성합니다.
🔗 함께 점검해야 할 동일 벤더·스택 연관 취약점 (apache)
동일 카테고리 전체 보기 →Apache Wicket AjaxNewWindowNotifyingBehavior 교차 사이트 스크립팅(XSS) 취약점 (CVE-2026-82956)
[영향 대상] Apache Wicket 8.0.0 ~ 8.19.0, 9.0.0 ~ 9.24.0, 10.0.0 ~ 10.11.0 버전 중 AjaxNewWindowNotifyingBehavior를 명시적으로 사용하는 애플리케이션
Apache Wicket SmartLinkLabel 컴포넌트 교차 사이트 스크립팅(XSS) 취약점 (CVE-2026-83539)
[영향 대상] Apache Wicket 8.0.0~8.19.0, 9.0.0~9.24.0, 10.0.0~10.11.0 버전에서 SmartLinkLabel 및 SmartLinkMultiLineLabel 컴포넌트를 사용하는 애플리케이션
Apache Wicket 리소스 번들 이스케이프 누락 기반 교차 사이트 스크립팅(XSS) 취약점 (CVE-2026-111089)
[영향 대상] Apache Wicket 8.0.0~8.19.0, 9.0.0~9.24.0, 10.0.0~10.11.0 버전
Apache Wicket WebSocket 리소스 권한 검증 누락 취약점 (CVE-2026-82115) 분석 및 대응 가이드
[영향 대상] Apache Wicket 8.0.0~8.19.0, 9.0.0~9.24.0, 10.0.0~10.11.0 및 지원이 종료된 7.x 버전
일간 취약점 브리핑 및 긴급 Zero-Day 경보 구독
보안 실무자와 인프라·백엔드 엔지니어를 위해 매일 아침 주요 취약점과 패치 우선순위를 요약해 발송합니다.