- ผู้เขียนสามารถ กู้คืนข้อมูลของบริษัทที่ติดแรนซัมแวร์ Akira ได้สำเร็จโดยไม่ต้องจ่ายค่าไถ่
- ซอร์สโค้ด ที่ใช้ในกระบวนการกู้คืนเผยแพร่ไว้บน GitHub
- แรนซัมแวร์ Akira มีหลายสายพันธุ์ และสายพันธุ์นี้เริ่มเคลื่อนไหวตั้งแต่ช่วงปลายปี 2023
- เวอร์ชันก่อนหน้า (ก่อนกลางปี 2023) มีบั๊กที่ทำให้ Avast สามารถพัฒนาเครื่องมือถอดรหัสได้ แต่หลังจากข้อมูลนี้ถูกเปิดเผย ผู้โจมตีก็อัปเดตวิธีเข้ารหัส
- ตรวจสอบแฮชของตัวอย่างแรนซัมแวร์ได้ที่ GitHub
สรุปวิธีกู้คืนไฟล์ของ Akira ransomware (Linux/ESXI Variant 2024)
แนวทางการแก้ปัญหา
การวิเคราะห์เบื้องต้น
- แรนซัมแวร์ใช้ เวลาปัจจุบันระดับนาโนวินาที เป็น seed
- เนื่องจากเวลาแก้ไขไฟล์บน Linux มีความละเอียดระดับนาโนวินาที จึงพบความเป็นไปได้ในการกู้คืน seed
- จึงลองใช้แนวทาง bruteforce โดยอิงจาก timestamp ของไฟล์ที่ถูกแก้ไข
กระบวนการเข้ารหัสที่ซับซ้อน
- แรนซัมแวร์ใช้ ค่า seed 4 ค่า (เวลาระดับนาโนวินาที)
- การสร้างกุญแจใช้การวนประมวลผล SHA-256 hash 1500 ครั้ง
- ระบบไฟล์ VMware VMFS เก็บเวลาแก้ไขได้เพียงระดับวินาที
- การเข้ารหัสแบบมัลติเธรดทำให้กู้คืนจังหวะเวลาที่แม่นยำได้ยาก
รีเวิร์สเอนจิเนียริง
- โค้ดเขียนด้วย C++ ทำให้วิเคราะห์ยาก แต่ไม่ได้ถูก obfuscate
- จากข้อความผิดพลาดยืนยันได้ว่ามีการใช้ ไลบรารี 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);
}
- ระหว่างการสร้างกุญแจมีการเรียก
generate_random() 4 ครั้ง
- chacha8_key (32 ไบต์)
- chacha8_nonce (16 ไบต์)
- kcipher2_key (16 ไบต์) × 2
การประเมินความเป็นไปได้ของการ bruteforce
กลยุทธ์หลัก
- สร้าง timestamp สองค่า (t3, t4) แล้วแปลงเป็น seed เพื่อสร้างเลขสุ่ม
- ใช้เลขสุ่มเป็น กุญแจ KCipher2 และ IV เพื่อเข้ารหัส แล้วเปรียบเทียบผลลัพธ์กับไฟล์ที่ถูกเข้ารหัส
การวิเคราะห์ประสิทธิภาพ
- การแปลง timestamp 100 ล้านค่ากินเวลา 3 ชั่วโมง (บน CPU)
- เมื่อใช้ GPU ความเร็วในการแปลงลดเหลือ ไม่ถึง 6 นาที
- ภายในช่วงเวลา 1 วินาที มีคู่ที่เป็นไปได้ราว 500 ล้านล้านคู่
- หลังปรับแต่ง GPU แล้ว RTX 3090 สามารถประมวลผลการเข้ารหัสได้ 1.5 พันล้านครั้งต่อวินาที
ประเภทไฟล์ VMWare และกลยุทธ์การกู้คืน
FLAT-VMDK
- 8 ไบต์แรกของ VMDK สามารถกู้คืนได้จากบูตโหลดเดอร์
- ต้องดูข้อมูล OS จากไฟล์ VMX แล้วติดตั้ง OS เดียวกัน
SESPARSE
- ตรวจสอบแพตเทิร์นของส่วนหัวไฟล์ได้จากซอร์สโค้ดของ QEMU
- ส่วนหัวขึ้นต้นด้วย
0x00000000cafebabe
ไฟล์อื่น ๆ
- ไฟล์ NVRAM, ไฟล์ VMX, ไฟล์ล็อก ฯลฯ สามารถใช้ตรวจสอบ timestamp เริ่มต้นได้
การกู้คืน timestamp
ล็อก ESXi
- ล็อก ESXi บันทึกเวลาเริ่มทำงานในระดับมิลลิวินาที
- หากไม่มีล็อกระดับมิลลิวินาที ก็ยังสามารถประมาณจากเวลาระดับวินาทีได้
เวลาแก้ไขของระบบไฟล์
- ในกรณีของ ESXi ความละเอียดมีเพียงระดับวินาที จึงคาดเดาเวลาที่แม่นยำได้ยาก
การเข้ารหัสแบบมัลติเธรด
- การเข้ารหัสไฟล์ทำงานขนานตามจำนวนคอร์ของ CPU
- เวลาแก้ไขของไฟล์จะใกล้เคียงกับเวลาที่เข้ารหัสเสร็จ
การพัฒนาเครื่องมือ bruteforce
อัลกอริทึม KCipher2
- ใช้เวอร์ชันดัดแปลง ไม่ใช่ KCipher2 มาตรฐาน (รวมถึงการจัดการ Endian)
- ใช้ CUDA เพื่อปรับแต่งให้เหมาะกับ GPU
การปรับปรุงประสิทธิภาพ
- ปรับปรุงประสิทธิภาพด้วย shared memory
- เพิ่มความเร็วด้วยการ ตัดการคัดลอกหน่วยความจำ
- ทำ การประมวลผลไฟล์แบบขนาน → รองรับได้ราว 1.5 พันล้านครั้งต่อวินาที
RTX 3090 vs RTX 4090
- RTX 4090 เร็วกว่า約 2.3 เท่า → ใช้เวลาราว 7 วัน
- RTX 3090 → ใช้เวลาราว 16 วัน
ขั้นตอนการกู้คืน
1. ดึง timestamp
- ใช้คำสั่ง
stat เพื่อตรวจสอบเวลาแก้ไข
- ดึงเวลาเริ่มทำงานจากล็อก ESXi
2. ดึงข้อมูลที่ถูกเข้ารหัส
- ดึงบล็อกที่เข้ารหัสจาก VMDK, SESPARSE ฯลฯ
3. วัดความเร็วของเซิร์ฟเวอร์
- ใช้เครื่องมือ
timing-patch บน GitHub
4. แบ่งงาน
- สร้างและแยกไฟล์คอนฟิก
- ตั้งค่าให้สามารถรันแบบขนานบน GPU ได้
5. เช่า GPU และรันงาน
- Runpod → ค่าใช้จ่ายราว 116 ดอลลาร์ สำหรับ 7 วัน
- Vast.ai → ถูกกว่า แต่ความเร็วอาจต่างกันตามสภาพเครื่อง
6. รัน KCipher2 bruteforce
./akira-bruteforce run2 config.json
7. รัน Chacha8 bruteforce
- จำเป็นในกรณีของไฟล์ขนาดใหญ่
8. รันการถอดรหัส
./decrypt filename.vmdk <t1> <t2> <t3> <t4>
ผลลัพธ์ด้านประสิทธิภาพ
- RTX 3090 → 1.5 พันล้านครั้งต่อวินาที
- RTX 4090 → 3.5 พันล้านครั้งต่อวินาที
- หากใช้ RTX 4090 จำนวน 16 ใบ → กู้คืนได้ภายใน 10 ชั่วโมง
ความเป็นไปได้และข้อจำกัดของการกู้คืน
- โอกาสกู้คืนแรนซัมแวร์สำเร็จต่ำกว่า 0.1%
- หากตรงตามเงื่อนไขบางอย่างก็ยังมีความเป็นไปได้ในการกู้คืน
- วิธีเข้ารหัสอาจเปลี่ยนไปตามสายพันธุ์ของแรนซัมแวร์
บทสรุป
- การกู้คืนจากแรนซัมแวร์เป็นเรื่องยากมาก แต่ภายใต้เงื่อนไขบางอย่างก็อาจสำเร็จได้
- bruteforce บน GPU คือเครื่องมือสำคัญ
- ผู้เขียนเปิดซอร์สโค้ดสำหรับการกู้คืนเป็นโอเพนซอร์ส แต่ยากที่จะให้การสนับสนุนเพิ่มเติม
หมายเหตุเพิ่มเติม
- ดูไฟล์
README.md บน GitHub
- โค้ดนี้เขียนมาให้เหมาะกับสถานการณ์ของลูกค้ารายหนึ่งโดยเฉพาะ → ไม่ใช่เครื่องมืออเนกประสงค์
- การสร้างไฟล์คอนฟิก การปรับ timing ฯลฯ ต้องอาศัยทักษะระดับผู้ดูแลระบบ
1 ความคิดเห็น
ความเห็นบน Hacker News
มีคนหนึ่งพูดถึง "อายุการใช้งานที่จำกัด" ของแรนซัมแวร์ จึงลบความเห็นที่บอกว่าเรื่องนี้ไม่ส่งผลต่อเหยื่อรายอื่นออกไป แต่ได้โพสต์คำตอบไว้
มีคำถามว่าทำไมถึงใช้ไทม์สแตมป์
บทความนี้อ่านได้ดี และมีรายละเอียดมากพอเหมาะที่จะตอบสนองความอยากรู้อยากเห็นเกี่ยวกับกระบวนการ
ถ้าแอปพลิเคชันถูก sandbox โดยค่าเริ่มต้น ปัญหาแรนซัมแวร์ก็น่าจะลดลง
"ฉันประเมินความเร็วในการคำนวณไทม์สแตมป์ 100,000 ค่า/วินาทีจากไบต์สุ่มบน CPU ของมินิพีซีของฉัน (ใช้ทุกคอร์)"
สงสัยว่าทำไมถึงเข้ารหัส 65k แรกด้วย KCipher2 แล้วส่วนที่เหลือเข้ารหัสด้วยอย่างอื่น มันดูแปลก
"ฉันคาดว่าหลังจากเผยแพร่สิ่งนี้แล้ว ผู้โจมตีจะเปลี่ยนวิธีเข้ารหัสอีกครั้ง"
"ทุกครั้งที่ฉันเขียนเรื่องแรนซัมแวร์ในบล็อกภาษาอินโดนีเซียของฉัน จะมีคนจำนวนมากมาขอความช่วยเหลือเรื่องแรนซัมแวร์"