= EternalBlue = EternalBlue yra saugumo spragas Windows [[Server Message Block|SMB]] (Server Message Block) protokole išnaudojantis įrankis leidžiantis įvykdyti nuotolini [[WikiPedia:Arbitrary_code_execution|kenksmingo kodo paleidimą]] kompiuteriuose be savininko žinios. Įrankį sukūrė JAV nacionalinio saugumo agentūra WikiPedia:NSA, tačiau saugumo spragos buvo laikomos paslaptyje mažiausiai 5 metus, kol EternalBlue ir dar kelį WikiPedia:NSA įrankiais nebuvo paviešinti 2017 metais grupuotės [[WikiPedia:The_Shadow_Brokers|The Shadow Brokers]]. Grupuotė dar 2016 metų rugpjūti paskelbė turintis WikiPedia:NSA sukurtų kibernetinio karo įrankių ir norinti juos parduoti, tačiau galiausiai 2017 m. balandi viskas buvo paviešinta nemokamai, tarp paviešintų dokumentų buvo daugiau negu 30 Windows saugumo spragų ir 7 įrankiai skirti spragos išnaudoti. === Naudotos saugumo spragos === EternalBlue nuotoliniai kodo paleidimui naudoja 3 Microsoft [[Server Message Block|SMB]] protokolo spragas: 1. spraga „Wrong type casting Bug“ 1. spraga „Wrong parsing function Bug“ 1. spraga „Non-paged Pool Allocation Bug“ ---- Pirmoji saugumo spraga „Wrong parsing function Bug“ yra Windows [[Server Message Block|SMBv1]] tvarkyklėje (srv.sys), klaida atsiranda kai per [[Server Message Block|SMB]] yra siunčiamas WikiPedia:OS/2 operacinės sistemos formato [[Extended file attributes|EFA]] (extended file attributes) sąrašas. Kadangi WikiPedia:OS/2 ir Windows [[Extended file attributes|EFA]] formatai skiriasi, WikiPedia:OS/2 formatas yra konvertuojamas į Windows suprantamą formatą. Siunčiant [[Extended file attributes|EFA]] sąrašą per [[Server Message Block|SMB]] protokolą, paketas susideda iš [[Server Message Block|SMB]] antraštės nurodančios paketo tipą ir {{{FeaList}}}(full extended attribute list) bloko, kuri sudaro {{{SizeOfListInBytes}}} kintamasis nurodantis argumentų sąrašo ilgį baitais ir atitinkamas skaičius [[Extended file attributes|EFA]] atributų. Atsiradus neatitikimų tarp {{{SizeOfListInBytes}}} kintamojo ir siunčiamų [[Extended file attributes|EFA]] atributų skaičiaus tvarkyklė juos perskaišiuoja ir išsaugo nauąs {{{SizeOfListInBytes}}} vertę. Dėl programos klaidos pakeičiami tik paskutiniai 2 {{{SizeOfListInBytes}}} kintamojo baitai, todėl tam tikromis salygomis vietoj kintamojo sumažinimo jis yra padidinamas, kas gali sukelti [[Buffer overflow|atminties perpildymą]]. ---- Antroji saugumo spraga „Wrong parsing function Bug“ yra Windows [[Server Message Block|SMBv1]] komunikacijos protokole ir leidžia realizuoti pirmąją saugumo spragą. [[Extended file attributes|EFA]] paketai gali būti siunčiami naudojant kelias skirtingas [[Server Message Block|SMB]] komandas. Klaida atsiranda naudojant {{{SMB_COM_TRANSACTION2}}} ir {{{SMB_COM_NT_TRANSACT}}} komandas. * {{{SMB_COM_TRANSACTION2}}} maksimalus perduodamų duomenų ilgis yra apibrėžiamas WORD tipo kintamuoju, kai perduodami duomenis viršija maksimalų vieno paketo ilgį (apibrėžta sesijos pradžios metu), pertekliniai duomenys yra siunčiami {{{SMB_COM_TRANSACTION2_SECONDARY}}} komanda. * {{{SMB_COM_NT_TRANSACT}}} yra skirtas didesniam duomenų perdavimui, duomenų ilgis yra apibrėžtas DWORD kintamuoju, duomenims viršijant maksimalų vieno paketo ilgį, jie taip pat yra dalinami į antrinius paketus {{{SMB_COM_NT_TRANSACT_SECONDARY}}} komanda. Klaida atsiranda dėl netaisyklingos paketų tipo interpretacijos, {{{SMD_COM}}} komandos tipas yra nustatomas pagal paskutinio gauto {{{_SECONDARY}}} paketo tipą. Taigi pradėjus komunikacija {{{SMB_COM_NT_TRANSACT}}} ir vėliau išsiunčiant {{{SMB_COM_TRANSACTION2_SECONDARY}}} galima priversti SMB tvarkyklę interpretuoti DWORD ilgio duomenis kaip WORD. Ši klaida leidžia realizuoti pirmąją saugumo spragą, kadangi 32 bitų DWORD ilgio paketas yra siunčiamas kaip 16 bitų WORD paketas. ---- Trečioji saugumo spraga „Non-paged Pool Allocation Bug“ [[Server Message Block|SMB]] protokolo komandomis leidžia išskirti norimo dydžio bloką non-paged pool atmintyje. Naudojant šią spragą ir kitas atminties manipuliacijos technikas galima apeiti [[ASLR]] atminties apsaugą ir užtikrinti sėkmingą [[Buffer overflow|perpildymo]] ataką. Klaida atsiranda išsiunčiant netaisyklingai suformuluotą [[Server Message Block|SMB]] sesijos praždios komandą {{{SMB_COM_SESSION_SETUP_ANDX}}} === Įsilaužimo primityvai === Toliau aprašyta įsilaužimo technika tinkama tik Windows operacinės sistemos versijoms iki Windows 8, kadangi iki šios versijos Windows HAL heap atmintis turėjo paleidimo teisę (execution permission) ir nenaudojo [[ASLR]] apsaugos. Norint realizuoti anksčiau minėtas [[Server Message Block|SMBv1]] saugumo spragas vėlesnėse Windows versijoje turi būti naudojama kitokia įsilaužimo technika. Įsilaužimui naudojamas [[Server Message Block|SMBv2]] protokolas. Nors jis neturi žinomų saugumo spragų naudojant perpildymo ataką ir [[Server Message Block|SMBv2]] užklausas galima įrašyti norimus duomenis bent kurioje fizinės atminties vietoje ir priversti procesorių vykdyti komandas nuo pasirinktos atminties vietos. Pradėjus [[Server Message Block|SMBv2]] komunikaciją atmintyje yra išsaugomas {{{SRVNET_BUFFER_HDR}}} antraštės blokas, kurioje nurodomi sąsajos nustatymai, tarp jų yra {{{pMdl1 rodyklė}}} rodanti fizinės atminties vietą kurioje bus išsaugomi gauti duomenys ir {{{pSrvNetWskStruct}}}, rodyklė į iš anksto apibrėžtą {{{SRVNET_RECV}}} objektą kuris nurodo kur yra {{{HandlerFunction}}} funkcija, iškviečiama pasibaigus [[Server Message Block|SMBv2]] komunikacijai. Naudojant [[Server Message Block|SMBv1]] saugumo spragas užpuolikas gali perrašyti minėtas rodykles. * {{{pMdl1}}} rodyklės perrašymas leidžia įrašyti kenksmingą ShellCode ir netikrą SRVNET_RECV objektą į HAL heap atmintį. * {{{pSrvNetWskStruct}}} perrašoma taip, kad rodytu į netikrą {{{SRVNET_RECV}}} objektą, kurio dėka pasibaigus komunikacijai yra vykdomas ne {{{HandlerFunction}}} kodas, o į HAL atmintį įrašytas kenksmingas kodas. === Įsilaužimo eiga === EternalBlue įsilaužimo eiga susideda iš 10 punktų. Sėkmingas įsilaužimas po vienos atakos nėra užtikrinamas šimtu procentu atvejų, tačiau ataka yra trumpa todėl ją galima kartoti kol įsilaužimas nebus sėkmingas arba aukos kompiuteris nebus priverstas persikrauti. ||'''Etapas''' ||'''Aprašymas''' || ||Pre-Overflow ||Naudojant {{{SMB_COM_NT_TRANSACT}}}} pradedamas duomenų perdavimas, tačiau perdavimas ne pilnas, laukiama {{{_SECONDARY}}} paketo || ||Pre-Hole ||Naudojant 3 [[Server Message Block|SMB]] spraga užimama atmintis nenumatytiems procesams kurie gali reikalauti atminties įsilaužimo metu, turi būti šiek tiek mažesnė negu likusiam FEA sąrašui reikalinga atmintis || ||Grooming ||Pradedama daug [[Server Message Block|SMB]] sesijų norit užpildyti non-paged atminti ir padidinti tolesnių etapų sėkmės tikimybę || ||Hole ||Naudojant 3 [[Server Message Block|SMBv1]] spraga užimama atmintis kuri bus naudojama FEA sąrašo įrašymui naudojant 1 ir 2 spragas || ||Pre-Hole atlaisvinimas ||Atlaisvinama atminties vieta nenumatytiems procesams || ||SRVNET Grooming ||Pradedamos mažiausi 5 naujos [[Server Message Block|SMBv2]] sesijos, kurios atmintyje išsaugo 5 trumpas {{{SRVNET}}} antraštes iš kurių vienai tūrėtų būti išskirta atmintis po Hole punkte užimtos atminties. || ||Hole ||Atlaisvinama atmintis skirta FEA sąrašui || ||Overflow ||Išsiunčiamas paskutinis {{{SMB_COM_TRANSACTION2_SECONDARY}}}. Kadangi Windows naudoja [[LIFO]] principą atminties skirstymui, paketas įrašomas į atlaisvinta Hole atmintį ir perpildo sekančius atminties segmentus. Sėkmingos atakos atveju yra perrašoma viena iš {{{SRVNET}}} antraščių ir pakeičiamos {{{pMdl1}}} ir {{{pSrvNetWskStruct}}} rodyklės || ||SRVNET Grooming ||Per kiekviena iš anksčiau atidarytų [[Server Message Block|SMBv2]] sąsajų išsiunčiamas netikras {{{SRVNET_RECV}}} objektas kartu su kenksmingu ShellCode, kuris dėka perpildymo yra įrašomas HAL heap atmintyje || ||Execution ||Uždaromos visos [[Server Message Block|SMB]] sąsajos, dėka perpildymo po uždarymo pradedamas vykdyti anksčiau į HAL heap įrašytas kodas || === Literatūros sąrašas === https://www.virusbulletin.com/uploads/pdf/magazine/2018/201806-EternalBlue.pdf https://en.wikipedia.org/wiki/Extended_file_attributes https://research.checkpoint.com/2017/eternalblue-everything-know/ https://docs.microsoft.com/en-us/windows/win32/memory/memory-pools https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb/a00d0361-3544-4845-96ab-309b4bb7705d?redirectedfrom=MSDN https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/81e15dee-8fb6-4102-8644-7eaa7ded63f7?redirectedfrom=MSDN https://en.wikipedia.org/wiki/EternalBlue https://en.wikipedia.org/wiki/WannaCry_ransomware_attack ---- CategoryŽodis