Locked History Actions

Skirtumas „EternalBlue“

Pakeitimai tarp versijų 1 ir 21 (patvirtinamos 20 versijos)
Versija 1 nuo 2019-11-21 19:26:03
Dydis: 1074
Redaktorius: edgar
Komentaras:
Versija 21 nuo 2019-11-24 17:18:35
Dydis: 9170
Redaktorius: edgar
Komentaras:
Pašalinimai yra pažymėti taip. Pridėjimai yra pažymėti taip.
Eilutė 2: Eilutė 2:
EternalBlue yra saugumo spragas Windows SMB (Server Message Block) protokole išnaudojantis įrankis leidžiantis įvykdyti nuotolini kodo paleidimą (RCE) kompiuteriuose be savininko žinios. Įrankį sukūrė JAV nacionalinio saugumo agentūra (NSA), tačiau saugumo spragos buvo laikomos paslaptyje mažiausiai 5 metus, kol EternalBlue ir dar kelį NSA įrankiais nebuvo paviešinti 2017 metais grupuotės The Shadow Brokers. Grupuotė dar 2016 metų rugpjūti paskelbė turintis 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. 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.
Eilutė 5: Eilutė 5:
EternalBlue nuotoliniai kodo paleidimui naudoja 3 Microsoft SMB protokolo spragas: EternalBlue nuotoliniai kodo paleidimui naudoja 3 Microsoft [[Server Message Block|SMB]] protokolo spragas:
Eilutė 12: Eilutė 12:
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ą]].
Eilutė 14: Eilutė 17:
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.
Eilutė 16: Eilutė 26:
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.
||<tablewidth="750px">'''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 ||



Eilutė 17: Eilutė 54:
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

EternalBlue

EternalBlue yra saugumo spragas Windows SMB (Server Message Block) protokole išnaudojantis įrankis leidžiantis įvykdyti nuotolini kenksmingo kodo paleidimą kompiuteriuose be savininko žinios. Įrankį sukūrė JAV nacionalinio saugumo agentūra NSA, tačiau saugumo spragos buvo laikomos paslaptyje mažiausiai 5 metus, kol EternalBlue ir dar kelį NSA įrankiais nebuvo paviešinti 2017 metais grupuotės The Shadow Brokers. Grupuotė dar 2016 metų rugpjūti paskelbė turintis 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 SMB protokolo spragas:

  1. spraga „Wrong type casting Bug“
  2. spraga „Wrong parsing function Bug“
  3. spraga „Non-paged Pool Allocation Bug“


Pirmoji saugumo spraga „Wrong parsing function Bug“ yra Windows SMBv1 tvarkyklėje (srv.sys), klaida atsiranda kai per SMB yra siunčiamas OS/2 operacinės sistemos formato EFA (extended file attributes) sąrašas. Kadangi OS/2 ir Windows EFA formatai skiriasi, OS/2 formatas yra konvertuojamas į Windows suprantamą formatą.

Siunčiant EFA sąrašą per SMB protokolą, paketas susideda iš 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 EFA atributų. Atsiradus neatitikimų tarp SizeOfListInBytes kintamojo ir siunčiamų 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 atminties perpildymą.


Antroji saugumo spraga „Wrong parsing function Bug“ yra Windows SMBv1 komunikacijos protokole ir leidžia realizuoti pirmąją saugumo spragą. EFA paketai gali būti siunčiami naudojant kelias skirtingas 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“ 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ą perpildymo ataką. Klaida atsiranda išsiunčiant netaisyklingai suformuluotą 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 SMBv1 saugumo spragas vėlesnėse Windows versijoje turi būti naudojama kitokia įsilaužimo technika.

Įsilaužimui naudojamas SMBv2 protokolas. Nors jis neturi žinomų saugumo spragų naudojant perpildymo ataką ir 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 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 SMBv2 komunikacijai. Naudojant 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 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 SMB sesijų norit užpildyti non-paged atminti ir padidinti tolesnių etapų sėkmės tikimybę

Hole

Naudojant 3 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 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ų 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 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