Surma ping! FreeBSD parandab krahhilise vea võrgutööriistas PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Surma ping! FreeBSD parandab võrgutööriista krahhilise vea

Üks esimesi madala tasemega võrgutööriistu, mida iga arvutikasutaja õpib, on auväärne ping kasulikkust.

Nimetatud samanimelise heliefekti järgi kõigist vana kooli sõjafilmide stseenidest, milles osalevad allveelaevad, on käsk metafooriline kaja (vaata, mida me seal tegime?) RADARI veealuse versiooni, mida tuntakse SONARina.

Saadate välja pingi (pigem nagu doinnnng noise, sisse reaalsus) soolasesse sügavusse ja mõõtes, kui kaua kulub selle jubeda kaja teieni tagasi jõudmiseks, ning hinnates heli kiirust ümbritsevas ookeanis, saate arvutada kauguse kaja tekitanud objektini.

Arvestades, et olete ilmselt kuulnud lühendit TCP/IP, on intrigeeriv Internetti toitava protokolliliimi üldkirjeldusena, ping ei kasuta tehniliselt üldse TCP/IP-d.

Tegelikult on TCP/IP lühend edastuse juhtimisprotokoll Interneti-protokolli kaudu, ja viitab üsna kõrgetasemelisele mehhanismile andmete Interneti kaudu saatmiseks nii, et võrk ise sisestab palju küsimusi "kas see tegelikult töötas korralikult?" pingutust sinu heaks.

Näiteks TCP-ühenduste puhul on tagatud, et kõik teie saadetud andmetükid jõuavad teise otsa puutumata või põhjustavad tõrke, nii et teate, et nad ei jõudnud kohale.

Lisaks puhverdatakse TCP-andmed õigesti, isegi kui erinevad andmetükid jõuavad Interneti kaudu erinevatele marsruutidele (nt koormuse tasakaalustamise, ajutiste katkestuste või muude taastatavate vigade tõttu) üles ja esitatakse teises otsas õiges järjekorras.

Ping on erinev

. ping Kuid käsku kasutatakse tavaliselt selleks, et kontrollida, kas teid huvitav arvuti on üldse võrgus, eriti kui see ei aktsepteeri selliseid kõrgetasemelisi TCP-ühendusi, mida ootate, näiteks meilisõnumite vastuvõtmine või SSH-i sisselogimiste lubamine.

See aitab teil kiiresti kindlaks teha, kas katkestus on tõenäoliselt tingitud võrgu või serveri enda katkemisest või sellest, et selles serveris töötavad üksikud teenused ei käivitu õigesti.

Selle tulemusena ping kasutab palju madalama taseme protokolli kui TCP.

Tõepoolest, ping ei kasuta isegi TCP juhuslikumat nõbu UDP-d, mille lühend on kasutaja datagrammi protokoll, mis on kiire ja lihtne viis andmetükkide edastamiseks, kuid mida rahvasuus kutsutakse saatma ja lootma (või kui olete küüniline, siis pihustada ja palvetada).

UDP ise ei teavita teid sellest, kas teie andmed jõudsid teise otsa või mitte, ja isegi kui need saabuvad tervena, ei jälgi UDP teie pakettide algse saatmise järjekorda, seega ei saa ta neid aadressil ümber korraldada. teine ​​ots, kui nad jõuavad sinna järjestikku.

Ping, mille väärtust väärt, kasutab väga madala tasemega protokolli, mis on spetsiaalselt loodud tõrkeotsinguks ja võrgu ümberseadistamiseks, tuntud kui ICMP, või Interneti-juhtimissõnumiprotokoll.

Tavaliselt käsitletakse seda otse operatsioonisüsteemi tuumas, nii et ICMP/IP-paketid pääsevad peaaegu kindlasti läbi isegi siis, kui ükski kõrgema taseme võrgutarkvara pole õigesti välja tulnud, sisaldab ICMP eelkõige kahte erisõnumitüüpi:

  • Tüüp 0x08. Ametlikult helistatud ICMP EchoSee omamoodi pakett nimetatakse tavaliselt kajapäringuks. See on see, mis ping programm saadab välja võrgu aktiivsete arvutite otsimiseks.
  • Tüüp 0x00. Ametlikult helistatud ICMP Echo Reply, see paketitüüp on täpselt seda, mida see ütleb. Arvuti, mis on elus, võrgus ja ei ole konfigureeritud ICMP Echo liiklust blokeerima, peaks saatma seda tüüpi paketi otse tagasi seda taotlenud arvutisse.

Nagu nii:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com MUSTER: 0x4e414b45445345435552495459 PING news-sophos.go-vip.192.0.66.227 of.56 of.84net. andmeid. 64 baiti alates 192.0.66.227 (192.0.66.227): icmp_seq = 1 ttl = 53 aeg = 84.0 ms 64 baiti alates 192.0.66.227 (192.0.66.227): icmp_seq = 2 ttl = 53 85.1 ttl = 64 ttl = 192.0.66.227 ms. .192.0.66.227 (3): icmp_seq=53 ttl=84.8 aeg=3 ms --- news-sophos.go-vip.net pingi statistika --- 3 paketti saadetud, 0 vastu võetud, 2004% paketikadu, aeg 84.025ms rtt min/ avg/max/mdev = 84.644/85.062/0.446/XNUMX ms

Et näha a ping veidi madalamal tasemel kasutame Lua koodi, mille leiate artikli lõpust, et luua meie enda ICMP Echo pakett ja lugeda vastust, mis tuleb, kui see on olemas:

$ sudo luax ping.lua nakedsecurity.sophos.com ICMP ECHO päringu saatmine numbrile 192.0.66.227 --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67f 52 65 71e 75 00000010 65 73e 74 4 . 65 73 73 61 67p 65 20 42 42 35 41 36 5 6 00000020 46 31 |estSõnum BB44A1| 00000000 45 00 00 |F37D | Sai tagasi--> 6 00 00 35 01 f94 af 7 0 00 42 3 7f c5 00000010 00 e00 |E..0....02.....B.| 5 XX XX XX XX 6 1 50b 69 bb 6a 67f 00000020d 52 65 71e 75 |.........Zo.Ping| 65 73 74 4 65 73 73 61 67p 65 20 42 00000030 42 35 41 36 |Taotlussõnum B| 46 31 44 5 6 1 XNUMX XNUMX |BXNUMXAXNUMXFXNUMXD |

Muide, meil oli vaja kasutada sudo ülal, et käitada meie skripti superkasutaja õigustega, sest lõime nn a töötlemata IP-pesa – selline, mida saab kujundada mis tahes meile meeldivaks aluseks olevaks vorminguks, sealhulgas TCP, UDP ja vastavalt vajadusele ICMP.

Paljudes Linuxi/Unixi süsteemides on ping teie distro antud käsk töötab ilma selgesõnaliselt administraatoriõigusi andmata, tavaliselt seetõttu, et see on installitud spetsiaalsete turvavõimalustega või setuid lipukomplekt, mis tähendab, et see algab töötamisega erineva kasutajakonto all kui kasutaja, kes seda käivitas.

Hästi kujundatud ping loomulikult loobuvad programmid oma lisaõigusest automaatselt, kui nad on avanud vajaliku töötlemata pesa.

Jätsime selle privileegide kaotamise koodi oma näidisskriptist lühiduse huvides välja. Võite kasutada posix.unistd.setpid() funktsioon, et lülituda privilegeerimata kontole pärast pesa loomist, kuid enne andmete saatmist või vastuvõtmist.

Vastust uurides

Nagu võite meie ülaltoodud skripti andmeväljavõttest ära tunda, sisaldab võrgupesa funktsioon, mida kasutame vastavast serverist andmete tagasilugemiseks, mitte ainult ICMP Echo Reply andmeid, vaid ka madala taseme IP-d (Interneti-protokolli päised). aluspaketis.

Me ei ole proovinud neid andmeid sõeluda ega muul viisil töödelda, vaid FreeBSD ping programm peab seda tegema, et vastusest aru saada, sealhulgas mõistmaks kõiki tagasitulevaid veateateid.

Kui ping lükatakse mingil viisil tagasi, sisaldab Echo Reply tavaliselt mitte ainult oma IP-päiseid (nagu ülalpool näha), vaid ka IP-päiste ja ICMP-andmete viitekoopiat, mis ilmusid algses väljaminevas päringus.

IPv4 pakettide päised näevad tavaliselt välja sarnased, nagu näete ülal, kus IP-päised algavad 45 00 00 37... ja jätkake kokku 20 baiti, kuni baitideni, mis on näidatud kui ...XX XX XX XX, mis on minu sülearvuti IP-aadress.

Nagu nii:

00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7...5.....B.| 00000010 XX XX XX XX |.... | IP-versioon ja päise pikkus: 0x45 (4 = IPv4, 5 = viis 32-bitist sõna, st 20 baiti Teenuse tüüp ja ülekoormuse andmed: 0x00 Paketi kogupikkus: 0x0037 (kümnend 55) Järjestusteave: F6 AF 00 00 Aeg kuni -reaalajas (hüppamine vasakule): 0x35 (kümnendkoht 53) Protokolli tüüp: 0x01 (ICMP) Kontrollsumma: 0x947F (kümnend 38015) Saatva arvuti IP-number: C0 00 42 E3 (192.0.66.227)s IPomyphpient.com. sülearvuti): XX XX XX XX (REDACTED = minu enda IP-number)

FreeBSD-d ping Tundub, et programmeerijad eeldasid, et seda tüüpi päised on tõepoolest alati täpselt 20 baiti pikad, võttes aluseks selle päise pikkuse väärtuse esimeses baidis. 0x45, mis tähistab IPv4 (0x4?) 5-DWORD-iga (0x?5) või 20-baidine päis.

Kuna muretsemiseks oli vaja vaid 20 baiti, eraldasid programmeerijad virnale fikseeritud suurusega puhvrid, kus nad said hoida vastuses IP-päiste koopiat ja kõiki algse päringu manustatud IP-päiseid, kui käsitseda oli veaolukorda. .

Võite arvata, kuhu see läheb.

Sellel IPv4 päise esimesel baidil võib seaduslikult olla mis tahes väärtus 0x45 (päise minimaalne suurus 5 DWORD-i või 20 baiti, nagu näidatud) kuni 0x4F (tähistab 15 DWORD-i, kuna 0xF on kümnendkoha suurus 15 ehk kokku 60 baiti päiseandmeid), võimaldades seega kenasti valikuliselt 40 baiti päiseandmeid.

Neid haruldasi, kuid seaduslikke lisapäisebaite saab kasutada erinevate funky ja ebatavaliste "funktsioonide" jaoks, millel on kummalised nimed, näiteks Valikuline suunatud saade, Eksperimentaalne voolu juhtimine ja Ülesvoolu multisaadete pakett – asjad, millest oleme kuulnud, kuid mida pole kunagi teadlikult kasutanud ega isegi näinud.

Ettevaatust küberkurjategijatega, kes panevad teid proovile

Nagu võite ette kujutada, arvestades, et neid lisavälju peaaegu kunagi ei kasutata, ei pruugi te kunagi näha IPv4 paketti millegi muuga kui 0x45 alguses ja kokku 20 baiti päiseandmetega, välja arvatud juhul, kui olete kokku puutunud hulga küberkurjategijatega, kes on valmis teid proovile panema.

Kahjuks ei saa palju takistada ründajat rikkumast serverit, mis arvab, kas te kasutate FreeBSD-d, ja genereerib tahtlikult liiga suuri ICMP/IP kajavastuspakette, et provotseerida virna puhvri ületäitumine sinu sees ping programmi.

Kui kontrollite kunagi, kas nende server on aktiivne (mida võite isegi teha, või võib-olla eriti, kui arvate, et see on kahtlane!), võite saada sihikule lõksus oleva vastuse.

Parimal juhul sinu ping programm jookseb kokku; aga halvimal juhul, nagu FreeBSD turvanõuanne heldelt tunnistab, "Võimalik, et pahatahtlik host käivitab pingis koodi kaugkäivitamise."

Õnneks nagu ka FreeBSD autorid välja tooma, "Pingiprotsess töötab kõigis mõjutatud FreeBSD versioonides võimerežiimi liivakastis ja on seega väga piiratud selles, kuidas see suudab ülejäänud süsteemiga suhelda kohas, kus viga võib ilmneda."

Ehk siis kindlasti tuleb lappida, aga riske võib pidada tagasihoidlikeks.

Nimelt: ping programm ei ole mitte ainult lukustatud liivakasti, vaid ei tööta ka root kasutajana, kui vigase koodini jõutakse, nagu kinnitab turvanõuanne: "Millal ping töötab, loob see oma töö tegemiseks vajaliku töötlemata sokli ja tühistab seejärel oma kõrgendatud õigused.

Nagu ülalpool kirjeldatud, on superkasutaja volitused vajalikud ainult toores IP-pesa hankimiseks operatsioonisüsteemist, mitte sendto() ja recvfrom() pärast selle pesa funktsioonid.

Sellele veale on antud ametlik tunnus CVE-2022-23093; see on dokumenteeritud turvateatises FreeBSD-SA-22:15.ping.

Mida teha?

  • Kui olete FreeBSD kasutaja, lihtsalt värskendage mõjutatud väljaandeid (FreeBSD 12 ja FreeBSD 13) nende uusimatele versioonidele, kus see viga on parandatud.
  • Kui olete võrgu programmeerija, veenduge alati, et olete arvestanud pakettide päistega, mis võivad viidata ebatavalistele suurusemuutustele. Asjaolu, et te pole kunagi ise ühtegi variatsiooni näinud, ei takista teid homme silmitsi seismast paketiga, mis on ebatavaline, kuid samas täiesti seaduslik.
  • Kui olete võrguhaldur, kaaluge IPv4 pakettide blokeerimist IP-päistega, mille suurus ei ole 20 baiti. Kui tundub, et teil on tõesti vaja lubada mõnel tarkvaratootel kasutada ebatavalisi IPv4 päisevalikuid, kaaluge nende ebatavaliste pakettide logimist, et teada saada, miks.

Hoolitse seal väljas!


NÄIDISKOOD PING-LIIKLUSE DEMONSTREERIMISEKS


Ajatempel:

Veel alates Alasti turvalisus