English Advisory →
CVE-2017-97919.8/CRITICALCISA KEV 등재CWE-20CWE-20

Apache Struts 2 Struts 1 플러그인 원격 코드 실행(RCE) 취약점 (CVE-2017-9791, S2-048) 분석 및 대응 가이드

⚡ 패치 명령어 바로가기
영향받는 벤더 / 생태계
apache
대상 컴포넌트 / 패키지
struts
권고문 발행일
2017-07-10
CVSS v3.1
9.8
CRITICAL
30일 악용확률
98.9%
FIRST.org
CISA KEV
악용 확인됨

실무자 핵심 요약 (Executive Summary)

SECOPS ASSESSMENT
영향 대상

Apache Struts 2.1.x 및 2.3.x 버전에서 Struts 1 플러그인(struts2-struts1-plugin)을 사용하는 웹 애플리케이션

파급 효과

공격자가 조작된 필드 값을 전송하여 서버 권한으로 임의의 시스템 명령을 실행하고 시스템을 완전히 장악할 수 있는 원격 코드 실행(RCE) 위험이 존재합니다

권장 조치

Apache Struts 2.5.x 이상 최신 버전으로 업그레이드하거나, Struts 1 플러그인 사용을 중단하고 관련 의존성을 제거해야 합니다

영향받는 제품 및 버전 범위

Apache Struts 2.1.x 및 2.3.x 버전 중 Struts 1 플러그인(struts2-struts1-plugin)을 활성화하여 사용하는 환경

권장 패치 및 임시 완화(Workaround) 가이드

패치 및 우회 명령어

1. 공식 보안 패치 및 버전 업그레이드 명령어

가장 안전한 해결책은 Struts 1 플러그인 의존성을 제거하거나, 취약점이 해결된 최신 Apache Struts 버전으로 마이그레이션하는 것입니다. Maven 빌드 환경의 경우 pom.xml에서 취약한 플러그인 의존성을 제거하거나 버전을 업데이트합니다.

xml
<!-- Maven pom.xml에서 취약한 Struts 1 플러그인 의존성 제거 예시 -->
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-struts1-plugin</artifactId>
    <!-- 이 플러그인의 사용을 완전히 중단하고 의존성 설정을 삭제할 것을 권장합니다 -->
</dependency>

2. 패치 전 임시 완화(Workaround) 및 접근 제어 설정

즉각적인 패치가 어려운 경우, 웹 애플리케이션 방화벽(WAF)에서 OGNL 특수 문자 및 패턴을 차단하는 룰을 적용해야 합니다. 또한, Struts 설정 파일에서 사용자 입력을 직접 ActionMessage에 전달하는 로직을 수정해야 합니다.

xml
<!-- struts.xml 설정 검토 및 개발 코드 수정 예시 -->
<!-- 사용자 입력값을 ActionMessage의 키값으로 직접 전달하지 말고, 리소스 번들의 정의된 키만 사용하도록 수정 -->
<!-- 잘못된 예: messages.add('key', new ActionMessage(userInput)); -->
<!-- 올바른 예: messages.add('key', new ActionMessage('errors.required', userInput)); -->

3. 침해 흔적(IoC) 및 로그·버전 점검 스크립트

서버의 액세스 로그 및 애플리케이션 로그에서 OGNL 페이로드 주입 흔적(ognl, Runtime, ProcessBuilder, #context 등)을 탐지하는 Bash 스크립트 예시입니다.

bash
#!/bin/bash
# Apache Struts S2-048 공격 시도 로그 탐지 스크립트
LOG_DIR='/var/log/nginx'

echo '[*] Scanning logs for potential S2-048 (CVE-2017-9791) exploitation attempts...'
grep -Ei '(#context|ognl|java\.lang\.Runtime|ProcessBuilder)' ${LOG_DIR}/*.log
if [ $? -eq 0 ]; then
    echo '[WARNING] Potential OGNL injection payloads detected in logs!'
else
    echo '[INFO] No obvious OGNL injection patterns found.'
fi
실무자 패치 대응 자가 점검 체크리스트
0/4 (0%)
권장 아키텍처 방어 통제 (Recommended Security Control)
Cloudflare Enterprise & Pro WAF
실제 공격에 악용된 이력이 있는 고위험 취약점이므로, Struts 1 플러그인 사용을 즉시 중단하거나 최신 안전 버전으로 업그레이드하십시오.

코드 수정 전에도 가상 패치(Virtual Patching)로 웹 공격을 즉시 차단하세요

서버 재시작이나 긴급 패치가 어려운 운영 환경이라면 클라우드 WAF 관리형 룰셋을 활성화하여 SQLi, RCE, XSS 익스플로잇 페이로드를 엣지에서 1분 만에 차단할 수 있습니다.

평균 설정 시간 3분 · Zero-Day 자동 룰 업데이트
이 웹 취약점(WAF 우회 & RCE)을 안전한 실습 랩에서 직접 재현해 보세요
실습 랩 & 보안 강의 보러가기

취약점 발생 원리 및 공격 메커니즘

1. 취약점 개요 및 발생 원인 (Root Cause)

본 취약점(CVE-2017-9791, S2-048)은 Apache Struts 2의 Struts 1 통합 플러그인(struts2-struts1-plugin)에서 발생하는 입력값 검증 미흡(CWE-20) 취약점입니다. Struts 1 Action을 Struts 2에서 래핑하여 사용할 때, 사용자 입력값이 포함된 원시 메시지가 ActionMessage 객체로 전달되는 과정에서 발생합니다. 이 과정에서 입력값에 대한 적절한 필터링 없이 OGNL(Object-Graph Navigation Language) 표현식으로 해석 및 평가되어 원격 코드 실행으로 이어집니다.

2. 공격 메커니즘 및 익스플로잇 시나리오

공격자는 HTTP 요청의 폼 필드나 파라미터에 OGNL 구문(예: ${#context...} 또는 %{...})을 삽입하여 서버로 전송합니다. 취약한 플러그인은 이 값을 검증 없이 ActionMessage에 바인딩하고, 내부적으로 getText() 메서드 등을 호출하여 메시지를 처리합니다. 이 과정에서 Struts 2의 OGNL 엔진이 공격자가 주입한 페이로드를 파싱하고 실행하게 됩니다. 공격자는 Java의 java.lang.Runtime 또는 java.lang.ProcessBuilder 클래스를 호출하는 OGNL 페이로드를 구성하여, 대상 서버에서 임의의 OS 명령어를 백그라운드로 실행할 수 있습니다.

3. 비즈니스 및 인프라 파급 영향

이 취약점은 CVSS 9.8(Critical)의 매우 높은 위험도를 가지며, CISA KEV(Known Exploited Vulnerabilities) 목록에 등재되어 실제 공격에 활발히 악용된 이력이 있습니다. 공격 성공 시 인증되지 않은 외부 공격자가 웹 서버 프로세스 권한을 획득하여 내부망 침투, 데이터베이스 탈취, 랜섬웨어 유포, 웹페이지 변조 등 기업 비즈니스 인프라 전반에 치명적인 피해를 입힐 수 있습니다.

공식 보안 권고문 및 참조 링크

자주 묻는 실무 질문 (FAQ — CVE-2017-9791)

FAQ

Q1. CVE-2017-9791 취약점의 위험도와 실제 악용 가능성은 어느 정도입니까?

CVE-2017-9791의 기본 점수는 CVSS 9.8 (CRITICAL)이며, 향후 30일 내 실제 악용 확률을 나타내는 EPSS 점수는 98.9%입니다. 현재 미국 CISA KEV(실제 악용이 확인된 취약점 카탈로그)에 등재되어 있으므로 최우선 긴급 패치가 필요합니다.

Q2. CVE-2017-9791에 영향을 받는 벤더와 제품은 무엇입니까?

주요 영향 벤더는 apache이며, 대상 컴포넌트는 struts입니다. 상세 영향 범위: Apache Struts 2.1.x 및 2.3.x 버전 중 Struts 1 플러그인(struts2-struts1-plugin)을 활성화하여 사용하는 환경

Q3. 서버 재기동이나 정규 패치 전 즉시 적용할 수 있는 완화 조치(Workaround)는 무엇입니까?

[권장 조치] Apache Struts 2.5.x 이상 최신 버전으로 업그레이드하거나, Struts 1 플러그인 사용을 중단하고 관련 의존성을 제거해야 합니다 본문의 패치 및 우회 명령어 섹션과 자가 점검 체크리스트를 참고하여 외부 노출 포트를 차단하거나 WAF 탐지 규칙을 선적용하십시오.

실무자 보고서 워크벤치 연동

CVE-2017-9791 사내 보안 패치 공지문 · CISO 경영진 보고서 초안 자동 생성

클릭 한 번으로 사내 이메일·노션·결재 문서에 바로 붙여넣을 수 있는 공식 보고서 양식을 생성합니다.

보고서 초안 생성하기 →

🔗 함께 점검해야 할 동일 벤더·스택 연관 취약점 (apache)

동일 카테고리 전체 보기 →
SecOps Advisory Dispatch & RSS Feed

일간 취약점 브리핑 및 긴급 Zero-Day 경보 구독

보안 실무자와 인프라·백엔드 엔지니어를 위해 매일 아침 주요 취약점과 패치 우선순위를 요약해 발송합니다.

Slack / Teams / RSS 리더 연동:
패치 명령EN
CVE-2017-9791 Apache Struts 2 Struts 1 플러그인 원격 코드 실행(RCE) 취약점 (CVE-2017-9791, S2-048) 분석 및 대응 가이드 (CVSS 9.8) - 패치 및 보안 권고 | CVE Pulse