빗나가지 않는 창, Cephalus 랜섬웨어 분석

빗나가지 않는 창, Cephalus 랜섬웨어 분석

Cephalus는 2025년 6월 중순 처음 등장한 신생 랜섬웨어 그룹이다. 해당 그룹은 자신들을 100% 금전적 동기로 활동한다고 소개하고 있다. 진입 방법은 주로 다중 인증이 설정되지 않은 RDP(Remote Desktop Protocol) 계정을 통한 계정 탈취를 활용하였다. 운영 방식은 일종의 맞춤형 랜섬웨어로 특정 조직 타깃을 정해 침해 후 데이터를 유출하고 암호화한다는 점이 특징적이며, RaaS로 운영 중인지나 다른 랜섬웨어 그룹과 동맹 관계 등은 아직 공개된 정보가 없다. 그룹명은 그리스 신화에서 아르테미스로부터 ‘절대 빗나가지 않는’ 창을 받은 케팔로스(Cephalus)에서 유래하였으며, 이는 공격 성공률에 대한 자신감을 암시하는 것으로 분석된다.

 

리브랜딩 이력, 타 랜섬웨어 그룹과의 명확한 직접적 연관성 등은 현재까지 확인된 바가 없으며, 새로운 변종명이나 하위 그룹 존재 여부도 공개된 자료가 존재하지 않는다. 이 그룹은 진입 이후 노골적으로 자신들의 존재와 이전 피해사례 보도를 랜섬노트에 담아 피해 고객을 압박하며, GoFile 저장소 링크 등으로 데이터 유출 사실을 입증하는 등의 수법을 쓴다는 점이 확인되었다.
 


[그림 1] Cephalus 유출 전문 사이트 (DLS)

 

분석 내용

Cephalus는 Go 언어로 개발된 랜섬웨어로, 가짜 AES 키 생성 루틴으로 동적 분석을 교란한다. 실행 시 Windows Defender의 실시간 보호를 비활성화하고, VSS 백업을 삭제하며, Veeam, MSSQL 등 주요 서비스를 중지시켜 암호화 성공률을 높이고, 복구 확률을 낮춘다. 암호화에는 단일 AES-CTR 키를 사용하며, 이 키는 디스크 및 메모리상 노출을 최소화하도록 관리된다. 마지막으로 해당 AES 키를 내장된 RSA 공개키로 암호화하여 대응되는 RSA 개인키를 가진 공격자만 복호화 할 수 있도록 설계되어 있다.

 

초기 루틴

가짜 AES 키 생성

Cephalus에는 분석을 교란하고 추후 암호화에 사용될 AES 키를 최대한 은닉하기 위한 기능이 존재한다. 먼저, 1,024 바이트만큼의 랜덤한 버퍼를 crypto_rand.Read()로 생성한다. 이후 AES 키 길이와 동일한 32바이트 크기의 “FAKE_AES_KEY_FOR_CONFUSION_ONLY!” 문자열을 해당 버퍼에 덮어쓴다. 이 과정을 다시 랜덤 버퍼를 생성하고 채우는 형태로 100번 반복한다. 이러한 과정을 통해 랜섬웨어를 분석하는 동적 도구나 시스템 입장에서는 32바이트 크기의 메모리 접근이 다수 발생하므로, “FAKE_AES_KEY_FOR_CONFUSION_ONLY!”를 실제 AES 키로 오인하도록 설계된 것으로 판단된다.

 


[그림 2] 가짜 AES 키 생성 과정
 

 

파일 암호화

파일 암호화에는 AES-CTR 대칭키 암호 알고리즘이 사용된다. 해당 키는 crypto/rand.Read()로 생성한 랜덤한 32바이트 값을 SHA-256 함수로 10,000회 반복하여 생성한다. 이때 각 파일별로 다른 키를 생성하지 않고, 하나의 AES-CTR 키로 모든 파일 암호화에 재사용한다. 따라서 AES-CTR 키만 확보한다면 모든 암호화된 파일을 복호화 할 수 있기 때문에, 공격자 입장에서는 해당 키가 노출되지 않는 것이 매우 중요하다. 공격자는 이를 방지하기 위해, 키의 저장과 사용, 파기 과정 등을 관리하는 SecureMemory 구조체 및 관련 메서드를 직접 구현하여 키 노출을 최소화하였다.

 


[그림 3] SecureMemory 구조체 및 관련 메서드

 

키 노출을 최소화하기 위해 구현된 기능은 아래와 같다.

 

페이징 방지 – SecureMemory.LockMemory()/UnlockMemory()

Windows 운영체제는 메모리 효율성을 위해 사용 가능한 공간이 부족하거나 오랫동안 참조되지 않은 메모리 페이지를 디스크의 영역으로 옮기는 페이지 아웃(Page-Out) 작업을 내부적으로 수행한다. 이 과정으로 인해 암호화 키가 디스크 파일(페이지 파일) 상에 평문으로 기록되어 노출될 위험이 발생한다. Cephalus 랜섬웨어는 이를 방지하기 위해 LockMemory() 메서드를 사용한다. 해당 메서드는 내부적으로 Windows API인 VirtualLock을 호출하여, 암호화 키가 페이지 아웃 대상에서 제외되도록 설정한다. 이를 통해 키가 디스크 상에 노출되는 것을 방지하게 된다.
 

 

XOR로 키 저장/복원 – SecureMemory.SetData()/GetData()

 

Cephalus는 페이지 아웃을 통해 디스크에 암호화 키가 남겨지는 것을 방지할 뿐만 아니라, 메모리 상에서도 키 노출을 방지하도록 설계되어 있다. 키에 접근할 때는 SetData()/GetData() 메서드를 활용한다. 키를 저장하는 SetData() 메서드는 암호화 키를 그대로 저장하는 대신, 랜덤하게 생성된 XOR 키와 한 번 XOR 연산을 거친 후 저장한다. 이로 인해 일반적인 메모리 덤프 상황에서는 XOR 연산이 적용된 마스킹 상태의 AES 키만이 존재하게 된다. 아래 [그림 4]을 보면, 0xD4로 시작하는 AES 키와 0xF0로 시작하는 XOR 키가 XOR되는 것을 확인할 수 있다.

  


[그림 4] 원본 키를 XOR하는 과정

 

추후 파일을 암호화하기 위해 원본의 AES 키가 필요할 때, GetData() 메서드는 저장 시 사용했던 동일한 XOR 키를 이용하여 원래의 키를 복원한 후 파일 암호화에 사용한다. 이 과정으로 원본의 키가 메모리 상에 노출되는 시점을 GetData() 호출 상황으로 최소화했기 때문에, 포렌식 및 복구 관점에서 원본 키를 획득하기가 매우 어렵다.

랜섬 노트

아래 [그림 5]은 Cephalus 랜섬웨어 악성코드를 감염시킨 화면이다. 바탕화면은 변경되지 않는다. 랜섬 노트는 ‘recover.txt’라는 이름을 가지며, 암호화 작업이 완료된 모든 경로 생성한다.

 


[그림 5] 암호화 작업 완료 후 모습

 

 

 

안랩 대응 현황

 

안랩 제품군의 진단명과 엔진 날짜 정보는 다음과 같다.

 

V3

Ransom/MDP.Behavior.M2813 (2021.10.08.00)
Ransom/MDP.Decoy.M1171 (2024.09.06.02)
Ransom/MDP.Event.M1785 (2024.08.20.03)
Ransomware/Win.Cephalus.C5792414 (2025.08.27.04)
Ransomware/Win.Cephalus.C5792774 (2025.08.28.02)
 

EDR

SystemManipulation/EDR.Event.M2486 (2024.04.22.03)

 

 

MD5

6221b0bf4d365454d40c546cf7133570
a16a1228d5276eec526c21432a403923