11 điểm bởi GN⁺ 2025-03-16 | 1 bình luận | Chia sẻ qua WhatsApp
  • Tác giả đã khôi phục thành công dữ liệu của một công ty bị nhiễm ransomware Akira mà không phải trả tiền chuộc
  • Mã nguồn dùng trong quá trình khôi phục được cung cấp trên GitHub
  • Ransomware Akira có nhiều biến thể khác nhau và biến thể này đã hoạt động từ cuối năm 2023
  • Các phiên bản trước đó (trước giữa năm 2023) có lỗi cho phép Avast phát triển công cụ giải mã, nhưng sau khi thông tin này được công bố, kẻ tấn công đã cập nhật cơ chế mã hóa
  • Có thể xem hash của các mẫu ransomware trên GitHub

Tóm tắt cách khôi phục tệp từ ransomware Akira (biến thể Linux/ESXI 2024)

Hướng tiếp cận giải quyết

Phân tích ban đầu

  • Ransomware dùng thời gian hiện tại ở đơn vị nano giây làm seed
  • Do thời gian sửa đổi tệp trên Linux có độ phân giải nano giây nên đã phát hiện khả năng khôi phục seed
  • Thử cách tiếp cận bruteforce dựa trên dấu thời gian của các tệp đã bị sửa đổi

Quy trình mã hóa phức tạp

  • Ransomware sử dụng 4 giá trị seed (thời gian ở đơn vị nano giây)
  • Việc tạo khóa lặp xử lý băm SHA-256 1500 lần
  • Hệ thống tệp VMware VMFS chỉ lưu thời gian sửa đổi ở độ phân giải giây
  • Do mã hóa dựa trên đa luồng nên khó khôi phục thời điểm chính xác

Reverse engineering

  • Mã được viết bằng C++ nên khó phân tích, nhưng không bị làm rối
  • Qua thông báo lỗi có thể xác nhận ransomware dùng thư viện Nettle
  • Bộ sinh số ngẫu nhiên dựa trên thuật toán Yarrow256 và dùng đoạn mã sau
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);   
}  
  • Khi tạo khóa sẽ có 4 lần gọi generate_random()
    • chacha8_key (32 byte)
    • chacha8_nonce (16 byte)
    • kcipher2_key (16 byte) × 2

Đánh giá khả năng bruteforce

Chiến lược chính

  • Tạo hai dấu thời gian (t3, t4), chuyển thành seed rồi sinh số ngẫu nhiên
  • Dùng số ngẫu nhiên làm khóaIV của KCipher2 để mã hóa, sau đó so sánh kết quả với tệp đã mã hóa

Phân tích hiệu năng

  • Chuyển đổi 100 triệu dấu thời gian mất 3 giờ (trên CPU)
  • Khi dùng GPU, tốc độ chuyển đổi giảm xuống còn dưới 6 phút
  • Trong phạm vi 1 giây có khoảng 500 nghìn tỷ cặp khả dĩ
  • Sau khi tối ưu GPU, RTX 3090 có thể xử lý 1,5 tỷ phép mã hóa mỗi giây

Kiểu tệp VMware và chiến lược khôi phục

FLAT-VMDK

  • 8 byte đầu của VMDK có thể được khôi phục từ bootloader
  • Cần kiểm tra thông tin OS trong tệp VMX và cài đặt cùng hệ điều hành đó

SESPARSE

  • Xác định mẫu header tệp từ mã nguồn của QEMU
  • Header bắt đầu bằng 0x00000000cafebabe

Các tệp khác

  • Có thể xác nhận dấu thời gian ban đầu từ tệp NVRAM, tệp VMX, tệp log, v.v.

Khôi phục dấu thời gian

Log ESXi

  • Log ESXi ghi lại thời gian thực thi ở đơn vị mili giây
  • Nếu không có log ở mili giây, có thể ước lượng từ thời gian ở đơn vị giây

Thời gian sửa đổi của hệ thống tệp

  • Với ESXi, do độ phân giải chỉ ở mức giây nên khó ước lượng thời gian chính xác

Mã hóa đa luồng

  • Việc mã hóa tệp được xử lý song song theo số lõi CPU
  • Thời gian sửa đổi của tệp gần với thời điểm mã hóa hoàn tất

Triển khai công cụ bruteforce

Thuật toán KCipher2

  • Sử dụng phiên bản đã chỉnh sửa thay vì KCipher2 chuẩn (bao gồm xử lý Endian)
  • Tối ưu GPU bằng CUDA

Cải thiện hiệu năng

  • Cải thiện hiệu năng bằng bộ nhớ chia sẻ
  • Tăng tốc bằng cách loại bỏ sao chép bộ nhớ
  • Triển khai xử lý tệp song song → có thể xử lý khoảng 1,5 tỷ lần mỗi giây

RTX 3090 vs RTX 4090

  • RTX 4090 nhanh hơn khoảng 2,3 lần → mất khoảng 7 ngày
  • RTX 3090 → mất khoảng 16 ngày

Các bước khôi phục

1. Trích xuất dấu thời gian

  • Dùng lệnh stat để kiểm tra thời gian sửa đổi
  • Trích xuất thời điểm bắt đầu thực thi từ log ESXi

2. Trích xuất dữ liệu đã mã hóa

  • Trích xuất các block đã mã hóa từ VMDK, SESPARSE, v.v.

3. Đo tốc độ máy chủ

  • Dùng công cụ timing-patch trên GitHub

4. Chia nhỏ tác vụ

  • Tạo và chia tệp cấu hình
  • Thiết lập để có thể chạy song song trên GPU

5. Thuê GPU và chạy

  • Runpod → chi phí khoảng 116 USD cho 7 ngày
  • Vast.ai → rẻ hơn nhưng tốc độ có thể khác nhau tùy tình trạng máy

6. Chạy bruteforce KCipher2

./akira-bruteforce run2 config.json  

7. Chạy bruteforce Chacha8

  • Cần thiết trong trường hợp tệp lớn

8. Thực thi giải mã

./decrypt filename.vmdk <t1> <t2> <t3> <t4>  

Kết quả hiệu năng

  • RTX 3090 → 1,5 tỷ lần xử lý mỗi giây
  • RTX 4090 → 3,5 tỷ lần xử lý mỗi giây
  • Khi dùng 16 chiếc RTX 4090 → có thể khôi phục trong vòng 10 giờ

Khả năng và giới hạn của việc khôi phục

  • Xác suất khôi phục thành công ransomware là dưới 0,1%
  • Nếu đáp ứng một số điều kiện nhất định thì vẫn có khả năng khôi phục
  • Cơ chế mã hóa có thể thay đổi tùy theo biến thể ransomware

Kết luận

  • Khôi phục dữ liệu từ ransomware là việc cực kỳ khó, nhưng trong một số điều kiện nhất định vẫn có thể thành công
  • Bruteforce dựa trên GPU là công cụ cốt lõi
  • Tác giả đã công khai mã khôi phục dưới dạng mã nguồn mở nhưng khó có thể hỗ trợ thêm

Ghi chú tham khảo thêm

  • Tham khảo tệp README.md trên GitHub
  • Mã được viết để phù hợp với tình huống của một khách hàng cụ thể → không phải công cụ dùng chung
  • Việc tạo tệp cấu hình, tinh chỉnh timing, v.v. đòi hỏi kỹ năng ở mức quản trị hệ thống

1 bình luận

 
GN⁺ 2025-03-16
Ý kiến Hacker News
  • Có người đã nhắc đến "vòng đời giới hạn" của ransomware. Vì vậy, một ý kiến cho rằng điều này không ảnh hưởng đến các nạn nhân khác đã bị xóa, nhưng vẫn có bài trả lời về vấn đề này

    • Đây là thông tin sai. Điều bị giới hạn là số lượng cuộc tấn công mà nạn nhân có thể khôi phục tệp
    • Nếu nghĩ rằng tác giả là người duy nhất đã sử dụng cách tấn công này thì đó cũng là một nhận định sai
    • Có đề xuất cuốn sách The Ransomware Hunting Team. Đây là một cuốn sách thú vị nói về những câu chuyện hậu trường trong quá trình các nạn nhân khôi phục tệp
  • Có câu hỏi về lý do sử dụng timestamp

    • Mong là đừng hiểu lầm, tôi mừng vì chúng không dùng nó, nhưng điều này trông giống một sai lầm rất cơ bản
    • Tôi tự hỏi liệu có điều gì tôi đã bỏ sót hay chỉ đơn giản là có nhiều người hơn chọn không phạm tội
  • Bài viết này dễ đọc và chứa lượng chi tiết vừa đủ để thỏa mãn sự tò mò về quy trình

    • Xin dành lời khen lớn cho tác giả vì đã nghĩ ra quy trình này và cung cấp những chi tiết thú vị
  • Nếu ứng dụng được sandbox hóa theo mặc định thì vấn đề ransomware sẽ giảm bớt

  • "Tôi ước tính CPU trên mini PC của mình có thể tính 100.000 timestamp mỗi giây với các byte ngẫu nhiên (tận dụng toàn bộ các lõi)"

    • Muốn biết thêm chi tiết về mini PC. Tò mò về bộ xử lý, RAM, giá và liệu nó có fanless hay không
  • Tò mò vì sao 65k đầu tiên được mã hóa bằng KCipher2 còn phần còn lại lại được mã hóa bằng thứ khác. Trông khá lạ

  • "Tôi dự đoán rằng sau khi đăng bài này, những kẻ tấn công sẽ lại thay đổi cách mã hóa"

    • Nếu chúng nhận ra điều này thì tôi tự hỏi vì sao lại đăng nó. Việc cung cấp một công cụ giải mã chi tiết như vậy chỉ để lấy danh tiếng trên Internet có vẻ khá vô trách nhiệm
    • Đây là nội dung thú vị và kích thích tò mò trí tuệ, nhưng giữ kín các chi tiết có lẽ sẽ tốt hơn cho toàn bộ cộng đồng
  • "Mỗi khi tôi viết về ransomware trên blog tiếng Indonesia của mình, rất nhiều người lại nhờ giúp về ransomware"

    • Chỉ riêng việc kiểm tra xem ransomware có thể khôi phục được hay không cũng có thể tốn hàng giờ công sức và thời gian (ví dụ: khi mã độc bị làm rối/bảo vệ)
    • Vì vậy, ý kiến là đừng yêu cầu người khác làm miễn phí
    • Vậy thì hãy thu phí