Hardware Fingerprinting dan Pendeteksian Sistem Operasi dalam Virtual Machine

Hardware Fingerprinting dan Pendeteksian Sistem Operasi dalam Virtual Machine

By Dendi Suhubdy

xPhreak Security Labs

“Cloaking the Invisble”

“Apaan neh? Bahasanya rumit amat….ckckck..”

Bahasanya emang rumit kok, tapi sebelum kita membahas topik utama kita (red. Hardware fingerprinting), pembaca pernah denger ga tentang virtual machine? Virtual machine adalah software yang dapat menghost sebuah system operasi di atasnya. Pembaca tentu setidaknya pernah mendengar konsepnya ataupun pernah menggunakannya secara langsung.

Hhehee…

Lebih baek pake definition dalam bahasa inggris aja deh…soalnya ada kata yang sulit diterjemahkan langsung ke dalam bahasa Indonesia. Quotation from

“Virtual machine software are software that emulate a given machine's architecture using software (code) instead of relying on hardware, thus allowing a code to be executed in that virtual machine as if it is being run from a real machine.”

“Oooooooh…kya VMWare gitu y? Bilang kek dari tadi…….”

Yupz…kya VMWare. Banyak contohnya lagi, antara lain Microsoft Virtual Machine, dan VPC. Ketika kita menjalankan OS di atas sebuah virtual machine apa yang terjadi? OS melakukan proses booting layaknya berada di dalam sebuah CPU biasa. Sekarang, seandainya Anda bisa berubah menjadi kecil, seukuran memory yang berada di dalam EEPROM processor, dan menjadi sebuah program yang berjalan di atas OS. Apakah Anda bisa mengetahui bahwa diri Anda berada di dalam OS yang berjalan di atas virtual machine ataukah di dalam OS yang berjalan di atas hardware yang sungguhan? Tentunya susah bukan membedakannya? Dalam bahasa yang agak rumit, saya memperkenalkan permasalahan ini dengan istilah Operating System’s Hardware Environment Recognition.

“Op dulu…op dulu Den…trus apa gunanya apa gunanya tuh?”

Pernah denger tentang virtual labnya BitDefender ga? Dulu ketika saya masi aktif menjadi Beta Tester di BitDefender, saya memperbaiki rancangan teknologi BitDefender yang dinamakan B-HAVE (BitDefender Heuristic ). Teknologi ini memungkin kan virus-virus yang baru, yang bahkan signaturenya belum dimiliki oleh antivirus, dapat dimusnahkan oleh antivirus ini. Saya tidak sedang bercanda atau mempromosikan produk, tapi teknologi ini edge-cutting untuk zamannya, sebelum antivirus-antivirus lain menggunakan teknologi yang sama untuk engine produknya.

Inti dari teknologi ini adalah penggunaan virtual machine untuk menganalisa program dan menemukan efeknya pada host (red. Computer) sehingga antivirus dapat mengklasifikasikan virus dan non-virus. Bayangkan sekarang Anda menjadi virus dan melakukan pengecekan apa lingkungan sekitar Anda adalah virtual atau bukan. Ini benar-benar bisa membantu Anda terhindar dari deteksi antivirus kalau Anda memakai algoritma conditional jika berada dalam virtual machine, sehingga program menjadi un-debug-able atau untraceable.

“Keereeeeeeeeeeen!!! Gimana tuh caranya? Gampang kan? Ini bukan sekedar konsep aja kan Den? Ada POC (Proof of Conceptnya) ga?”

Kalau gampang atau sulit itu sih relatif, tapi yang jelas caranya beragam. Inilah saatnya saya perkenalkan hardware fingerprinting, yaitu suatu proses untuk mengidentifikasi jenis hardware yang dipakai untuk menjalankan OS. Teknik hardware fingerprinting terbagi menjadi dua yaitu direct hardware fingerprinting dan indirect hardware fingerprinting.

“Apa bedanya tuh?”

Virtual machine memiliki hardware profile yang unik, sehingga dengan melakukan string compare, kita bisa menentukan apakah program kita berjalan di atas virtual machine atau tidak. Inilah yang dinamakan dengan direct hardware fingerprinting.

Bagi yang suka bahasa BASIC, ini ada code snippet yang bersumber dari http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx>Virtual PC guy.Dim ManufacturerstrComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_BaseBoard")For Each objItem in colItems
Manufacturer = objItem.Manufacturer
Next
if Manufacturer = "Microsoft Corporation" then
wscript.echo "In Microsoft virtual machine"
else
wscript.echo "Not in Microsoft virtual machine"
end if

Bagi yang tidak mengerti bahasa BASIC dan mempunyai dasar algoritma, script mengidentifikasi Motherboard Manufacture Information dan meneruskannya untuk dicheck apakah motherboardnya dibuat oleh Microsoft Corporation. Apabila iya, tentu program kita berjalan di atas virtual machine.

“Eh Den, yang indirect hardware fingerprintingnya belum tuh tadi?”

Oh ya sob…hampir lupa…

Bagi yang suka sedikit tantangan, indirect hardware fingerprinting tepat sekali untuk melakukan exercise. Saya kasi clue nih…

Inget kalau Intel x86 mengizinkan kita melakukan operasi input/output (IO), yang dinamakan dengan IN dan OUT? Pertama, pada operasi I/O, kedua intruksi ini tidak bisa bisa berjalan di dalam user-mode tetapi apabila dilaksanakan di dalam privilege-mode maka akan memunculkan eksepsi “EXCEPTION_PRIV_INSTRUCTION” .

Kedua, pada VMWare, ada suatu I/O port spesifik yang dipergunakan untuk melakukan komunikasi dengan OS yang sebenarnya. Dalam assembly, port ini didesign special dengan nama VX (0x5658).

Berikut adalah code snippet untuk mengidentifikasi OS Windows dalam VMWare (bahasa C):

bool IsInsideVMWare()
{
bool rc = true;

__try
{
__asm
{
push edx
push ecx
push ebx

mov eax, 'VMXh'
mov ebx, 0 // any value but not the MAGIC VALUE

mov ecx, 10 // get VMWare version

mov edx, 'VX' // port number


in eax, dx // read port

// on return EAX returns the VERSION

cmp ebx, 'VMXh' // is it a reply from VMWare?

setz [rc] // set return value


pop ebx
pop ecx
pop edx
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
rc = false;
}

return rc;
}

Source code lengkapnya dapat diperoleh di codeproject.
Untuk OS Linux dalam VMWare (ref. source code by Andrew Hintz)
/* * 4tphi-vmchk.c * Detects if you are in a VMWare virtual machine. * * Written by Andrew Hintz * and AAron Walters * Fortify Research Laboratories * * "Oft at the hives of his tame bees * They would their sugary thirst appease." * * This program is based on info and code from: * http://chitchat.tripod.co.jp/vmware/ * by chitchat@lycos.jp * * Notes: * The program can be run as a normal user. * We tested the program only in x86 Linux. * The m4dn3ss lives on! */

#include
#include
#if __INTSIZE == 2 /* 16 bit environment */
typedef unsigned int uint16;
typedef unsigned long uint32;

#else /* 32 bit environment */ typedef unsigned short uint16;
typedef unsigned int uint32;

#endif /* __INTSIZE */
void segfault()
{ printf("Not running inside VMware.\n"); exit(1); }
int main(){ uint32 verMajor, verMinor, magic, dout; signal(SIGSEGV, segfault);
__asm__ __volatile__ (" mov $0x564D5868, %%eax; /* magic number */ mov $0x3c6cf712, %%ebx; /* random number */ mov $0x0000000A, %%ecx; /* specifies command */ mov $0x5658, %%edx; /* VMware I/O port */ in %%dx, %%eax; mov %%eax, %0; mov %%ebx, %1; mov %%ecx, %2; mov %%edx, %3; " : "=r"(verMajor), "=r"(magic), "=r"(verMinor), "=r"(dout) );
if (magic == 0x564D5868)
{ printf("Running inside VMware. ");
printf("(Version %lu,%lu)\n", verMajor, verMinor); /* I'm not really sure what the versions mean. */ }
return 0; }
/* end main */
/* end of file */

“Syukurlah, akhirnya gw ngerti sekarang. Nah tapi, janji lo tadi? Gimana cara program kita melawan teknologi B-HAVE? Kan ini hanya untuk VMWare?”
Hahaha…benar juga. Ini PR untuk teman2 semua. Intinya, kalau semua Virtual Machine selalu berkomunikasi dengan host induknya, sehingga kita bisa melakukan identifikasi terhadap port special pada VMware.
Nah, teman-teman thanks a lot buat perhatiannya.
P.S:
Buat Tom Gregory, Aziz Mio sama Pirus Indonesia-> I’m alive bro and this is a welcome call. ^_^

No comments:

Post a Comment