실행되고 있는 프로세스에 코드를 주입하면 악성 코드를 숨기고 탐지 기술을 회피할 수 있다. 하지만 프로세스에 뭔가를 주입하는 행위 자체가 족적을 남기고, 따라서 탐지된다. 하지만 기존과 다른 방식의 프로세스 주입 기술이 개발되면서 EDR만으로 막기 힘들어졌다.

[보안뉴스 문가용 기자] 엔드포인트 탐지와 대응(EDR) 시스템들이 눈이 부시게 발전하고 있다. 어느 기업이나 EDR 솔루션만 하나 있으면 기본적인 해킹 시도를 왠만큼 막을 수 있고, 특히나 악성 프로세스를 메모리 영역에 주입하려는 시도들을 효과적으로 탐지하여 막아내는 것도 가능하다.

[보안뉴스 / 6.28.] 기존 EDR 시스템으로는 막지 못하는 프로세스 주입 공격법 나왔다

[이미지 = gettyimagesbank]

최근 이스라엘의 보안 업체 시큐리티조스(Security Joes)의 연구원들은 이런 대단한 EDR들을 속이고 우회할 수 있는 프로세스 주입 기법이 없을까 연구하기 시작했고, 기존에 알려지지 않았던 방법 하나를 발견해 냈다. 그리고 여기에 마킹제이(MockingJay)라는 이름을 붙였다. DLL과 디폴트 권한만을 사용하여 악성 코드를 프로세스의 주소 영역에 주입하는 기법이라고 시큐리티조스는 마킹제이를 요약한다.

마킹제이
마킹제이의 강점은 악성 프로세스를 주입할 때 EDR에 탐지될 가능성이 낮다는 것이다. 또한 공격 절차가 간소화 되어 있어 실행이 간단하다. “API 대신 취약한 DLL을 활용하고, 코드를 적절한 위치에 복사하는 것만으로 메모리나 권한 설정을 만지지 않고, 또 주입 대상이 되는 프로세스에 새로운 스레드를 생성하지 않고도 코드를 주입할 수 있었습니다. 기존 프로세스 주입 공격보다 상당히 간단한 공격이 가능했다는 뜻입니다.”

여기서 잠깐, 프로세스 주입 공격 기법이란 무엇일까? 컴퓨터에서 실행되고 있는 프로세스의 메모리를 조작함으로써 해당 프로세스가 비정상적으로 작동하게 만드는 것이다. 공격자들은 주로 악성 코드를 숨기거나 탐지 기술을 피해가기 위해 이 기법을 사용한다.

프로세스 주입 공격을 실행할 때 사용하는 기법은 여러 가지인데 그 중 가장 흔한 것은 다음과 같다.
1) 자가 주입 : 공격자의 페이로드를 주입 받는 프로세스를 통해 페이로드를 실행하는 기법
2) DLL 주입 : 악성 DLL을 프로세스의 메모리 영역에 주입하는 기법
3) PE 주입 : PE 파일을 프로세스의 메모리에 매핑하는 기법

“이 모든 주입 공격 기법은 특정 윈도 API들을 필요로 합니다. 하지만 이런 API들을 사용하다 보면 패턴들이 생성될 수밖에 없습니다. 방어자들은 이런 패턴들을 활용하여 프로세스 주입 시도를 탐지할 수 있게 됩니다. 혹은 공격 이후에 피해를 완화시키는 데에도 이런 패턴들이 도움이 되죠.” 시큐리티조스의 전문가들의 설명이다.

위의 공격 기법들이 필요로 하는 API들은 다음과 같다.
1) 자가 주입 : VirtualAlloc, LocalAlloc, GlobalAlloc, VirtualProtect
2) PE 주입 : VirtualAllocEx, WriteProcessMemory, CreateRemoteThread
“현대 EDR 시스템들은 최소 위에 열거된 API들을 탐지하도록 설계되어 있습니다. 그렇기 때문에 악성 행위자들이 프로세스 주입을 하기가 까다롭습니다.”

취약한 DLL 남용하기
그렇다면 마킹제이는 기존 프로세스 주입 기법과 어떤 점에서 차별성을 갖게 될까? “디폴트 읽기, 쓰기, 실행 권한을 가진 DLL을 윈도 OS 환경에서 찾아내는 것부터 공격을 시작합니다. 이번 연구를 위해 저희가 자체적으로 검색 도구를 개발했습니다. 단순히 DLL을 찾는 것이므로 EDR의 경보를 울리는 일은 거의 없습니다. 검색을 했을 때 msys-2.0.dll이라는 16KB짜리 DLL 파일을 하나 찾을 수 있었습니다. 저희가 만든 코드를 주입하고 실행시키기에 딱 알맞은 파일이었습니다.”

시큐리티조스에 의하면 “공격에 어울릴 정도로 취약한 DLL을 찾아낸 후에는, 취약점을 익스플로잇 함으로써 메모리 내에서 코드를 실행시킬 만한 방법을 여러 가지 실험을 통해 고안했다”고 한다. 그렇게 해서 찾아낸 방법들은 다음과 같다.

1) 취약한 DLL를 시큐리티조스가 직접 개발한 애플리케이션의 프로세스에 할당된 메모리에 직접 로딩한다. 그렇게 함으로써 윈도 API를 전혀 사용하지 않고 셸코드를 메모리 영역에 삽입할 수 있게 됐다. EDR 경보가 울리지도 않았다. API를 사용할 필요가 없으므로 공격이 간단해졌다.

2) 원격 프로세스에 프로세스를 주입한다. 이를 위해 mysys-2.0.dll을 활용하는 바이너리들을 먼저 찾아냈는데, 대부분 GNU 유틸리티들과 관련이 있는 것으로 밝혀졌다. 개념 증명을 위해서 시큐리티조스 측은 비주얼스튜디오 2022 커뮤니티(Visual Studio 2022 Community)의 ssh.exe 프로세스를 활용했다. 이 방법을 사용할 경우 코드가 자동으로 주입되므로 ssh.exe 프로세스에 별도의 스레드를 생성할 필요가 없었다고 한다.

시큐리티조스는 “이번에는 연구를 위해 하나의 DLL만을 활용했지만, 찾아보면 비슷한 기능을 수행할 수 있는 DLL들이 훨씬 더 많을 것”이라고 경고하며, “DLL이나 API만을 모니터링 해서는 공격을 효과적으로 막을 수 없다”고 설명했다. “각종 모니터링 기술은 기본으로 장착하되, 행동 패턴 분석 솔루션이나 머신러닝 기반 솔루션까지 함께 사용해 수상한 프로세스들을 전부 찾아내야 합니다.”

3줄 요약
1. 공격자들이 악성 코드 등을 숨기기 위해 ‘프로세스 주입’이라는 기법을 즐겨 사용함.
2. 하지만 최근에는 EDR이 좋아져 자주 막힘.
3. 이에 새로운 프로세스 주입 기법을 미리 보안 업체에서 개발.

[국제부 문가용 기자(globoan@boannews.com)]

<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>