1. 개요
- 24.05 무료 S/W의 팝업(Toast) 광고 프로그램을 악용한 TA- RedAnt의 대규모 공격이 탐지 [1]
- IE의 자바스크립트 엔진(jscript9.dll)에 존재하는 제로데이 취약점 악용
- 22년 악용한 IE의 Type Confusion 취약점(CVE-2022-41128)에 간단한 코드를 추가하여 보안 패치를 우회
1.1 Chakra
- MS에서 제작한 웹 브라우저의 자바스크립트 엔진
> 웹 브라우저는 HTML, CSS, JavaScript 등의 언어로 작성코드를 사람이 읽을 수 있는 문서로 출력하는 프로그램
> 웹 브라우저에서 자바스크립트 코드를 해석하고 실행하는 역할을 수행
구분 | 이름 |
IE 11.0 이하 버전 | legacy Chakra engine(jscript9.dll) |
Edge Legacy 브라우저 | new Chakra engine or Edge engine(Chakra.dll) |
1.1.1 동작 과정
- 웹 브라우저에서는 JavaScript의 동작을 위해 자체 엔진을 포함하고 있으며, 빠른 실행을 위해 JIT(Just-In-Time) Compilation 방식을 사용
- MS Chakra에서 JavaScript로 작성된 코드가 실행되는 과정
구분 | 설명 |
Parsing | 소스코드를 파싱하여 Abstract Syntax Tree(AST)를 생성 ※ Abstract Syntax Tree(AST) : 소스코드의 구조를 트리 형태로 나타낸 자료구조 |
Interpreting | - AST는 바이트코드(Bytecode)로 변환되어 인터프리터에 의해 실행 - 실행 중인 함수의 데이터 유형 및 호출 횟수와 같은 정보를 분석해 함수의 프로파일을 생성 |
Compilation | - 생성된 프로파일을 바탕으로 최적화된 기계코드인 JIT’ed code 생성 ※ 인터프리터에서 여러 번 호출되는 코드가 탐지되면 바이트코드를 실행하는 대신 JIT’ed code를 실행해 프로그램 동작 속도를 향상 시킴 |
- JavaScript엔진에서는 여러 번 호출되는 코드를 따로 관리
구분 | 설명 |
Hot | - 자주 반복되는 코드 - 코드가 Hot으로 탐지되면 엔진은 해당 코드를 스텁코드(Stub Code)로 변환 - 이후 바이트코드를 실행하지 않고 미리 생성한 스텁코드를 사용하여 실행 속도를 향상 |
Warm | 덜 자주 반복되는 코드 |
1.2 Toast 광고
- 다양한 무료 S/W와 함께 설치되어 동작
> 실행 시 광고서버로부터 광고 컨텐츠를 다운받아 PC 화면 우측 하단에 광고창 표시
> 서버는 광고 컨텐츠가 포함된 HTML과 JavaScript로 응답
> Toast 광고 프로그램은 응답값을 IE 브라우저 또는 IE 관련 모듈로 랜더링하여 팝업 광고창을 띄움
2. 주요내용
2.1 CVE-2024-38178
- Windows Scripting Engine에서 발생하는 Type Confusion 취약점으로 메모리 손상을 유발해 원격 명령 실행을 가능하게 함
> jscript9.dll에서 발생하는 Type Confusion 취약점
※ Type Confusion 취약점 : 프로그램에서 사용하는 변수나 객체를 선언 혹은 초기화되었을 때와 다른 타입으로 사용할 때 발생하는 취약점
스텁코드는 Type Confusion 문제가 발생할 수 있음
- 매개변수로 정수형 변수를 입력받는 함수가 있으며, 메인에서 100번 호출된다고 가정
> 엔진에서는 Hot으로 간주하여 정수형 변수를 전달받는 스텁코드로 변환
> 그 결과, 해당 변수의 데이터 유형을 정수로 예측
> 이 때, 매개변수를 정수가 아닌 다른 데이터 유형으로 전달할 경우 Type Confusion 발생
2.2 상세분석
- 해커는 국내 광고 대행사 중 한 업체의 광고 서버를 해킹
> Toast 광고 프로그램에 전달되는 HTML 코드에 iframe을 삽입하여 경유지를 통해 JavaScript가 로드 되도록 변조
> 해당 JavaScript 파일명은 ad_toast이며 IE(JScript9.dll)의 RCE 취약점이 발현되는 코드가 삽입
> 피해자 PC에 설치된 Toast 광고 프로그램은 취약점 코드를 받아 랜더링하는 과정에서 Exploit 및 해커의 쉘 코드로 실행 흐름이 바뀜
- 해커는 과거 악용했던 CVE-2022-41128(Windows 스크립트 언어 RCE [4]) Exploit 코드에 단 3줄을 추가해 기존 패치 우회
> ex_func(false, false)를 반복 호출하여 JIT 컴파일러의 최적화 오류를 유도한 뒤 인자를 true로 바꿔 호출
- "q=g" 연산으로 Type Confusion 발생
> 정수 배열로 초기화된 변수 q에 변수 g가 가리키는 데이터를 참조하면 변수 q의 Type이 Object로 변경
> 하지만, JIT 컴파일러의 최적화 오류로 인해 Type을 계속해서 정수 배열로 판단
- 이후 q[4], q[11], q[12]의 값을 0x1FFFFFFF로 변경
> 변경하는 이유는 해당 값이 배열 av의 Type(Js::JavascriptNativeIntArray)과 관련
> 변경한 값은 순서대로 배열 av의 Array Length, Array Actual Length, Buffer Length 항목
> 배열의 길이를 조작하면 Object Dataview를 사용하여 임의의 메모리 영역에 대한 읽기 및 쓰기가 가능하게 되어 임의 코드를 실행할 수 있음
※ JIT 컴파일러의 배열 최적화 과정에서 초기화된 변수로 착각하게 만드는 방법을 이용해 CVE-2022-41128의 패치를 우회
- 해당 취약점은 MS 8월 보안업데이트에서 패치 [4]
> wil::details::FeatureImpl<_ _WilFeatureTraits_Feature_1489045819>::_ _private_ IsEnabled(&`wil::Feature<_ _WilFeatureTraits_Feature_1489045819>::GetImpl’::`2 ’::impl); 함수가 추가
> 해당 함수의 결과 값에 따라 변수 초기화 여부를 검증하는 분기로 진입
> 진입 후 ValueType 클래스에서 정의된 연산자를 통해 두 개의 정수형 값 비교 과정 추가
> 두 Type을 비교해 값이 다를 경우 SetValueType 함수를 호출하여 Type을 일치시키는 추가적인 과정이 수행
2.3 악성코드 유포
- 과거부터 꾸준히 사용해온 RokRAT 악성코드를 유포하며 공격 흐름은 아래와 같음
> Ruby를 사용하여 악성 행위 지속성 확보 및 상용 클라우드 서버를 통해 명령제어를 수행
실행 단계 | 설명 |
1차 악성코드(43) 다운로드 및 explorer.exe에 인젝션 |
- 실행 PC의 파일·프로세스를 확인하여 분석 환경인지 탐지 > 악성코드 43은 첫 1바이트로 XOR 후 실행되는 쉘코드 > 분석 환경이 아니라고 판단되면 경유지에 접속해 2차 악성코드 다운 및 실행 |
2차 악성코드(23) 다운로드 및 실행 | - 컴퓨터 이름 등 시스템 정보를 수집하고 추가 감염 여부 선별 > 악성코드 23은 첫 1바이트로 XOR 후 In-Memory로 실행되는 PE 형태 > 시스템 정보를 경유지로 전송하고, 응답에 따라 3차 악성코드 다운 및 실행 |
3차 악성코드(move) 다운로드 및 실행 후 추가 파일 다운로드 |
- 악성 스크립트를 삽입한 ruby standalone 드롭 및 악성 행위 지속성 확보 > 악성코드 move는 첫 1바이트로 XOR 후 In-Memory로 실행되는 PE 형태 > 2차 경유지는 원드라이브 1개와 국내 정상 사이트 2개가 악성코드 내부에 하드코딩 > 지속성 확보를 위해 자동실행 되도록 설정 (주기적 실행 또는 PC 부팅 시 실행) |
system32 폴더 내 exe 무작위 선택 후 실행 및 인젝션 |
- PC에 설치된 백신(AVAST·SYMANTEC)을 확인하여 다르게 동작 > 현재 실행중인 프로세스 명에 "UBY"가 있는지 확인 후 설치된 백신에 따라 동작 결정 > AVAST·SYMANTEC : 현재 프로세스에서 In-Memory 방식으로 실행 > 그 외 백신 : system32 폴더에 있는 랜덤 EXE에 인젝션하여 실행 |
system32 폴더 내 exe 무작위 선택 후 실행 및 인젝션 |
- PC에 설치된 백신(AVAST·SYMANTEC)을 확인하여 다르게 동작 > 프로세스의 자체 종료를 막기 위해 ExitProcess 함수를 후킹 및 함수 인자 및 설치된 백신에 따라 동작 결정 > 인자가 0xAC가 아닐 경우 대기 상태, 0xAC일 경우 후킹을 복원 > AVAST·SYMANTEC : rubyw. exe를 재실행 > 그 외 백신 : system32 폴더에 있는 랜덤 EXE에 인젝션하여 실행 |
In-Memory로 RokRAT 실행 | - 상용 클라우드(얀덱스 등)를 경유지로 명령제어를 수행하여 PC 정보 절취 > 윈도우 프로시저에서 수신되는 메시지를 기반으로 해당 핸들러에서 악성 행위를 수행 |
구분 | MD5 |
ad_toast | e11bb2478930d0b5f6c473464f2a2B6e |
43 | b9d4702c1b72659f486259520f48b483 |
23 | b18a8ea838b6760f4857843cafe5717d |
MOVE | da2a5353400bd5f47178cd7dae7879c5 |
ban04.bak(top_08.bak,content) | bd2d599ab51f9068d8c8eccadaca103d |
operating_system.rb | 감염 PC마다 다름 |
1차 로더 | |
2차 로더 | |
RokRAT |
2.4 결론
- MS는 22.06 IE 지원 종료 발표 및 최신 Window OS는 IE가 웹 브라우저로 사용되는 것을 제한하는 등의 조치
> 과거에 비해 워터링홀 공격의 가능성은 희박해짐
> 그러나, 일부 Window 어플리케이션들은 IE를 내장하거나 관련 모듈을 사용해 공격 벡터로 악용될 수 있음
> OS 및 SW 등의 보안 업데이트를 준수하고, 제조사들은 제품 개발 시 보안에 취약한 개발 라이브러리 및 모듈 등이 사용되지 않도록 주의 필요
3. 참고
[1] https://www.ncsc.go.kr:4018/main/cop/bbs/selectBoardArticle.do?bbsId=SecurityAdvice_main&nttId=164037&menuNo=020000&subMenuNo=020200&thirdMenuNo=
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-38178
[3] https://www.boho.or.kr/kr/bbs/view.do?searchCnd=1&bbsId=B0000133&searchWrd=ms&menuNo=205020&pageIndex=1&categoryCode=&nttId=71524
[4] https://nvd.nist.gov/vuln/detail/CVE-2022-41128
[5] https://www.scworld.com/brief/windows-zero-day-leveraged-for-rokrat-malware-delivery
[6] https://thehackernews.com/2024/10/north-korean-scarcruft-exploits-windows.html
[7] https://thehackernews.com/2024/08/microsoft-issues-patches-for-90-flaws.html
[8] https://www.scworld.com/news/microsoft-patches-9-zero-days-6-exploited-in-the-wild
[9] https://www.boannews.com/media/view.asp?idx=132049
[10] https://www.dailysecu.com/news/articleView.html?idxno=160314
[11] https://www.boannews.com/media/view.asp?idx=133660
'취약점 > RCE' 카테고리의 다른 글
CUPS 원격 코드 실행 취약점 (CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, CVE-2024-47177) (0) | 2024.10.08 |
---|---|
GeoServer 원격 코드 실행 취약점 (CVE-2024-36401) (2) | 2024.09.16 |
SolarWinds Web Help Desk 원격 코드 실행 취약점 (CVE-2024-28986, CVE-2024-28987) (0) | 2024.08.19 |
MHTML 원격 코드 실행 취약점 (CVE-2024-38112) (0) | 2024.07.20 |
regreSSHion (CVE-2024-6387) (0) | 2024.07.12 |