Akira 랜섬웨어로 암호화된 파일을 다수의 GPU로 복호화하기
(tinyhack.com)- 작성자는 Akira 랜섬웨어에 감염된 회사의 데이터를 몸값을 지불하지 않고 복구하는 데 성공함
- 복구 과정에서 사용한 소스 코드는 GitHub에서 제공
- Akira 랜섬웨어는 다양한 변종이 존재하며, 2023년 후반부터 활동 중인 변종임
- 이전 버전(2023년 중반 이전)에는 Avast가 복호화기를 개발할 수 있는 버그가 있었지만, 이 내용이 공개된 후 공격자가 암호화를 업데이트함
- 랜섬웨어 샘플 해시는 GitHub에서 확인 가능
Akira 랜섬웨어(Linux/ESXI Variant 2024) 파일 복구 방법 요약
해결 접근 방식
초기 분석
- 랜섬웨어는 나노초 단위의 현재 시간을 시드로 사용
- Linux의 파일 수정 시간이 나노초 해상도를 가지므로 시드 복구 가능성 발견
- 수정된 파일의 타임스탬프를 기반으로 브루트포스 접근 시도
복잡한 암호화 과정
- 랜섬웨어는 4개의 시드 값(나노초 단위 시간) 사용
- 키 생성은 SHA-256 해시를 1500회 반복 처리
- VMware VMFS 파일 시스템은 수정 시간을 초 단위로만 저장함
- 다중 스레드 기반 암호화로 인해 정확한 타이밍 복구 어려움
리버스 엔지니어링
- 코드가 C++로 작성되어 분석이 어려웠으나, 난독화되지 않음
- 오류 메시지를 통해 Nettle 라이브러리 사용 확인
- 랜덤 생성기는 Yarrow256 알고리즘 기반이며 다음과 같은 코드를 사용함
void generate_random(char *buffer, int size)
{
uint64_t t = get_current_time_nanosecond();
char seed[32];
snprintf(seed, sizeof(seed), "%lld", t);
struct yarrow256_ctx ctx;
yarrow256_init(&ctx, 0, NULL);
yarrow256_seed(&ctx, strlen(seed), seed);
yarrow256_random(&ctx, size, buffer);
}
- 키 생성 시 4번의
generate_random()
호출 발생- chacha8_key (32바이트)
- chacha8_nonce (16바이트)
- kcipher2_key (16바이트) × 2
브루트포스 가능성 검토
주요 전략
- 두 개의 타임스탬프(t3, t4)를 생성해 시드로 변환 후 난수 생성
- 난수를 KCipher2 키 및 IV로 사용해 암호화 후 결과와 암호화된 파일 비교
성능 분석
- 1억 개의 타임스탬프를 변환하는 데 3시간 소요 (CPU 기준)
- GPU 사용 시 변환 속도 → 6분 이하로 단축
- 1초 범위에 대해 가능한 쌍은 약 500조 개
- GPU 최적화 후 RTX 3090에서 초당 15억 회 암호화 처리 가능
VMWare 파일 타입 및 복구 전략
FLAT-VMDK
- VMDK의 첫 8바이트는 부트로더에서 복구 가능
- OS 정보를 VMX 파일에서 확인해 동일한 OS 설치 필요
SESPARSE
- QEMU의 소스 코드에서 파일 헤더 패턴 확인
- 헤더가
0x00000000cafebabe
로 시작
기타 파일
- NVRAM 파일, VMX 파일, 로그 파일 등에서 초기 타임스탬프 확인 가능
타임스탬프 복구
ESXi 로그
- ESXi 로그에서 밀리초 단위 실행 시간 기록
- 밀리초 단위 로그가 없으면 초 단위 시간에서 추정 가능
파일 시스템 수정 시간
- ESXi의 경우 초 단위 해상도이기 때문에 정확한 시간 추정 어려움
다중 스레드 암호화
- 파일 암호화는 CPU 코어 수만큼 병렬 처리
- 파일의 수정 시간은 암호화 완료 시간에 가까움
브루트포스 도구 구현
KCipher2 알고리즘
- 표준 KCipher2가 아닌 수정된 버전 사용 (Endian 처리 포함)
- CUDA 사용해 GPU 최적화 진행
성능 개선
- 공유 메모리 사용해 성능 개선
- 메모리 복사 제거로 속도 향상
- 병렬 파일 처리 구현 → 초당 약 15억 회 처리 가능
RTX 3090 vs RTX 4090
- RTX 4090이 약 2.3배 빠름 → 7일 소요
- RTX 3090 → 약 16일 소요
복구 단계
1. 타임스탬프 추출
-
stat
명령으로 수정 시간 확인 - ESXi 로그에서 실행 시작 시간 추출
2. 암호화 데이터 추출
- VMDK, SESPARSE 등에서 암호화된 블록 추출
3. 서버 속도 측정
- GitHub의
timing-patch
도구 사용
4. 작업 분할
- 구성 파일 생성 및 분할
- GPU에서 병렬 실행 가능하도록 설정
5. GPU 대여 및 실행
- Runpod → 7일에 약 116달러 비용
- Vast.ai → 더 저렴하지만 기기 상태에 따라 속도 차이 발생 가능
6. KCipher2 브루트포스 실행
./akira-bruteforce run2 config.json
7. Chacha8 브루트포스 실행
- 대형 파일의 경우 필요
8. 복호화 실행
./decrypt filename.vmdk <t1> <t2> <t3> <t4>
성능 결과
- RTX 3090 → 초당 15억 회 처리
- RTX 4090 → 초당 35억 회 처리
- 16개의 RTX 4090 사용 시 → 10시간 이내 복구 가능
복구 가능성 및 한계
- 랜섬웨어 복구 성공 확률은 0.1% 미만
- 특정 조건이 충족될 경우 복구 가능성 존재
- 랜섬웨어 변종에 따라 암호화 방식이 변경될 수 있음
결론
- 랜섬웨어 복구는 매우 어렵지만, 특정한 조건에서는 성공 가능
- GPU 기반 브루트포스가 핵심 도구
- 작성자는 복구 코드를 오픈 소스로 공개했지만 추가 지원은 어려움
추가 참고 사항
- GitHub의
README.md
파일 참고 - 코드는 특정 클라이언트 상황에 맞춰 작성됨 → 범용 도구 아님
- 구성 파일 생성, 타이밍 조정 등은 시스템 관리자 수준의 기술 필요
Hacker News 의견
-
누군가 랜섬웨어의 "제한된 수명"에 대해 언급했음. 이로 인해 다른 피해자에게는 영향이 없다는 의견을 삭제했지만, 이에 대한 답변을 게시함
- 잘못된 정보임. 제한된 것은 피해자가 파일을 복구할 수 있는 공격의 수임
- 저자가 이 공격을 사용한 유일한 사람이라고 생각한다면 그것도 잘못된 생각임
- The Ransomware Hunting Team이라는 책을 추천함. 피해자들이 파일을 복구하는 과정의 뒷이야기를 다룬 흥미로운 책임
-
왜 타임스탬프를 사용하는지에 대한 질문이 있었음
- 오해하지 말길 바라며, 사용하지 않는 것이 기쁘지만 초보적인 실수처럼 보임
- 내가 놓친 것이 있는지, 아니면 범죄를 선택하지 않는 사람들이 더 많은 것인지 궁금함
-
이 글은 읽기 좋았고, 과정에 대한 호기심을 만족시킬 만큼의 적절한 세부사항을 담고 있었음
- 저자가 이 과정을 고안하고 흥미로운 세부사항을 제공한 것에 큰 찬사를 보냄
-
애플리케이션이 기본적으로 샌드박스화된다면 랜섬웨어 문제는 줄어들 것임
-
"내 미니 PC CPU에서 초당 100,000 타임스탬프를 랜덤 바이트로 계산하는 속도를 추정했음 (모든 코어를 활용하여)"
- 미니 PC에 대한 더 많은 세부사항을 알고 싶음. 프로세서, RAM, 가격, 팬리스인지 궁금함
-
처음 65k를 KCipher2로 암호화하고 나머지를 다른 것으로 암호화하는 이유가 무엇인지 궁금함. 이상해 보임
-
"이것을 게시한 후 공격자들이 암호화를 다시 변경할 것이라고 예상함"
- 그들이 이를 인지한다면, 왜 게시하는 것인지 궁금함. 인터넷 명성을 위해 이렇게 상세한 복호화기를 제공하는 것은 무책임해 보임
- 흥미로운 읽을거리이며 지적 호기심이 자극되지만, 세부사항을 비공개로 유지하는 것이 커뮤니티 전체에 더 나을 것임
-
"내 인도네시아 블로그에 랜섬웨어에 대해 글을 쓸 때마다 많은 사람들이 랜섬웨어 도움을 요청함"
- 랜섬웨어가 복구 가능한지 확인하는 것만으로도 몇 시간의 노력과 시간이 소요될 수 있음 (예: 악성코드가 난독화/보호된 경우)
- 그러니 무료로 해달라고 요청하지 말라는 의견임
- 그럼 비용을 청구하라는 의견임