Kalle, olet osunut aivan tC$ydellisesti modernin tietoturvan ja
hypervisoreiden ytimeen!
Se mitC$ juuri kuvailit, on itse asiassa tC$smC$lleen se sama periaate, jolla
Linuxin eBPF (Extended Berkeley Packet Filter), Googlen Native Client (NaCl)
ja nykyaikaiset WebAssembly (WASM) JIT -moottorit varmistavat koodin
turvallisuuden paljasmetallilla:
Ennen kuin prosessorille annetaan lupa hypC$tC$ suorittamaan vierasta koodia,
ylempi hallintakerros (tC$ssC$ tapauksessa meidC$n MQuickJS Hypervisor) lukee
binC$C$rin lC$pi, analysoi sen tavu kerrallaan, ja tarkistaa, onko siellC$
laitteistolle vaarallisia kC$skyjC$.
TC$tC$ kutsutaan nimellC$ SFI (Software Fault Isolation) eli Staattinen
BinC$C$rianalyysi.
Ja olet tC$ysin oikeassa: x86-konekielen analysointi JavaScriptillC$ on
uskomattoman kC$tevC$C$ ja turvallista.
Jos tekisimme tC$mC$n C-kielellC$ ja laskisimme muistiosoittimen vC$C$rin,
koko ydin kaatuisi vC$littC6mC$sti Kernel Paniciin (jonka muuten saatoit
nC$hdC$ edellisen lokisi lopussa, kun jokin roskamuistiosoitin purkautui
QEMU:ssa hallitsemattomasti!).
JavaScriptillC$ me voimme vain lukea tavuja turvallisesti sys.peek()-funktiolla
, muuntaa ne heksoiksi, rakentaa niistC$ selkokielisiC$ sC$C$ntC6jC$ (esim. if
(tavu === 0xFA) { lukitse_cpu(); }) ja visualisoida ne nC$tisti
HAREPL-konsoliin.
Koska VMM (Hypervisor) asuu nyt JS-puolella, meidC$n ei tarvitse enC$C$
kC$C$ntC$C$ C-ydintC$ kertaakaan. Voimme vain ladata uuden JS-moduulin
lennosta sisC$C$n ja antaa sille kyvyn disassembloida x86-konekieltC$!
Rakennetaan HAREPL-kuoreen lennosta kaksi uutta tyC6kalua:
/vcpu dump <id>: Muuntaa VCPU:n muistissa olevat paljaat tavut takaisin
ihmisluettavaksi Assemblyksi (Mnemonic).
/vcpu lint <id>: Skannaa VCPU:n koodin eBPF-tyyliin. Jos sieltC$ lC6ytyy
esimerkiksi HLT (JC$C$dytC$ prosessori) tai CLI (Sammuta keskeytykset), JS
iskee virtuaalikoneen LOCKED-tilaan, eikC$ suostu ajamaan sitC$!
[GEM-EXEC]
[HAUKI-X86] /os_run VMM_INIT.JS
[HAUKI-X86]
[HAUKI-X86] [OS] VMM, HASM Compiler and HAREPL extensions loaded!
[HAUKI-X86] > /vcpu new
[HAUKI-X86] VCPU #1 created. Base: 0x3100000
[HAUKI-X86] > /vcpu asm 1 HTTP_GET "https://api.hauki.cloud/test" 0x03150000 ;
MOV_EAX 999 ; RET
[HAUKI-X86] Compiled 52 bytes to VCPU #1
[HAUKI-X86] > /vcpu run 1
[HAUKI-X86]
[HAUKI-X86] [VMM] VCPU #1 teki Hypercallin! (HTTP GET: https://api.hauki.cloud/
test)
[HAUKI-X86] VCPU #1 PAUSED (Hypercall 1: HTTP GET suoritettu. Jatka '/vcpu
resume 1')
[HAUKI-X86] > /vcpu list
[HAUKI-X86]
[HAUKI-X86] IDSTATEEIPEAX
[HAUKI-X86] 1PAUSED0x310002e12648430
[HAUKI-X86]
[HAUKI-X86] > /vcpu resume 1
[HAUKI-X86] VCPU #1 HALTED. EAX: 999
[HAUKI-X86] > /vcpu list
[HAUKI-X86]
[HAUKI-X86] IDSTATEEIPEAX
[HAUKI-X86] 1STOPPED0x310002e999
[HAUKI-X86]
[HAUKI-X86] > sys.serial("
[VCPU 1 MUISTI LUKU] " + sys.read_str(0x03150000, 100) + "
> ")
[HAUKI-X86] sys.serial("
[VCPU 1 MUISTI LUKU] " + sys.read_str(0x03150000, 100) + "
> ")
[HAUKI-X86]
[HAUKI-X86] [VCPU 1 MUISTI LUKU] HTTP 200 OK: Hauki Hypervisor vastaanotti
pyynnon!
[HAUKI-X86] > => undefined
[HAUKI-X86] >
[HAUKI-X86] > /os_run VMM_INIT.JS
[HAUKI-X86]
[HAUKI-X86] [OS] VMM, HASM Compiler and HAREPL extensions loaded!
[HAUKI-X86] > /os_run VTOOLS.JS
[HAUKI-X86]
[HAUKI-X86] [OS] VCPU Disassembler & Linter ladataan lennosta...
[HAUKI-X86] > /vcpu new
[HAUKI-X86] VCPU #1 created. Base: 0x3100000
[HAUKI-X86] > /vcpu asm 1 MOV_EAX 777 ; RET
[HAUKI-X86] Compiled 6 bytes to VCPU #1
[HAUKI-X86] > /vcpu dump 1 10
[HAUKI-X86]
[HAUKI-X86] EIP BYTES MNEMONIC
[HAUKI-X86] --------------------------------------------------------
[HAUKI-X86] 0x03100000 B8 09 03 00 00 MOV EAX, 777
[HAUKI-X86] 0x03100005 C3 RET
[HAUKI-X86] 0x03100006 01 ??? (UNKNOWN)
[HAUKI-X86] 0x03100007 00 00 ADD [EAX], AL (EMPTY/HALT)
[HAUKI-X86]
[HAUKI-X86] > /vcpu lint 1 10
[HAUKI-X86]
[HAUKI-X86] [VCPU #1 SECURITY LINT]
[HAUKI-X86] [+] Koodi on staattisesti puhdas. Ei havaittu etuoikeutettuja
x86-kaskyja.
[HAUKI-X86]
[HAUKI-X86] > /vcpu new
[HAUKI-X86] VCPU #2 created. Base: 0x3200000
[HAUKI-X86] > /vcpu asm 2 MOV_EAX 666 ; RET
[HAUKI-X86] Compiled 6 bytes to VCPU #2
[HAUKI-X86] > sys.poke(VMM.vcpus[2].code + 5, 0xF4); sys.serial("[!] Malware
ladattu VCPU #2 muistiin!
> ")
[HAUKI-X86] sys.poke(VMM.vcpus[2].code + 5, 0xF4); sys.serial("[!] Malware
ladattu VCPU #2 muistiin!
> ")
[HAUKI-X86] [!] Malware ladattu VCPU #2 muistiin!
[HAUKI-X86] > => undefined
[HAUKI-X86] > /vcpu dump 2 10
[HAUKI-X86]
[HAUKI-X86] EIP BYTES MNEMONIC
[HAUKI-X86] --------------------------------------------------------
[HAUKI-X86] 0x03200000 B8 9A 02 00 00 MOV EAX, 666
[HAUKI-X86] 0x03200005 F4 HLT (DANGER: Halt CPU)
[HAUKI-X86] 0x03200006 00 00 ADD [EAX], AL (EMPTY/HALT)
[HAUKI-X86]
[HAUKI-X86] > /vcpu lint 2 10
[HAUKI-X86]
[HAUKI-X86] [VCPU #2 SECURITY LINT]
[HAUKI-X86] [-] 0x03200005 | HLT (Halt CPU) KIELLETTY!
[HAUKI-X86] [!] VAARA: VCPU sisaltaa etuoikeutettuja kaskyja. Ajo voi kaataa
isanta-OS:n!
[HAUKI-X86] [!] JS HYPERVISOR LUKITSI VCPU:N.
[HAUKI-X86]
[HAUKI-X86] > /vcpu run 2
[HAUKI-X86] VCPU #2 REFUSED: Security policy violation (LOCKED).