Kuoleman ping! FreeBSD korjaa kaatuvan bugin verkkotyökalussa PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Kuoleman ping! FreeBSD korjaa verkkotyökalun kaatuvan bugin

Yksi ensimmäisistä matalan tason verkkotyökaluista, joista kuka tahansa tietokoneen käyttäjä oppii, on kunnioitettava ping apuohjelma.

Komento on nimetty samannimisen ääniefektin mukaan kaikista vanhan koulun sotaelokuvan kohtauksista, joissa on mukana sukellusveneitä. Komento on metaforinen kaiku (katso mitä teimme siellä?) SONAR-nimellä tunnetun RADARin vedenalaisesta versiosta.

Lähetät pingin (enemmn kuin ääniä, sisään todellisuus).

Mielenkiintoista, koska olet luultavasti kuullut lyhenteen TCP/IP käytettävän yleisenä kuvauksena Internetiä käyttävästä protokollasta, ping ei teknisesti käytä TCP/IP:tä ollenkaan.

Itse asiassa TCP/IP on lyhenne sanoista lähetyksen ohjausprotokolla Internet-protokollan kautta, ja viittaa melko korkean tason mekanismiin tietojen lähettämiseksi Internetin kautta siten, että verkko itse laittaa paljon "toimiiko se todella oikein?" vaivaa sinulle.

Esimerkiksi TCP-yhteyksissä kaikki lähettämäsi datapalat joko saapuvat ehjinä toiseen päähän tai aiheuttavat virheen, jotta tiedät, että ne eivät päässeet perille.

Lisäksi vaikka eri datapalat päätyisivät eri reittejä pitkin Internetiä (esimerkiksi kuormituksen tasapainottamisen, tilapäisten käyttökatkojen tai muiden korjattavissa olevien virheiden vuoksi), ja vaikka joidenkin osien saapuminen vie kauemmin kuin toisten, TCP-tiedot puskuroidaan oikein. ylös ja esitetään oikeassa järjestyksessä toisessa päässä.

Ping on eri asia

- ping komentoa käytetään kuitenkin yleensä tarkistamaan, onko sinua kiinnostava tietokone online-tilassa, varsinkin jos se ei hyväksy odottamaasi korkean tason TCP-yhteyksiä, kuten sähköpostin vastaanottamista tai SSH-kirjautumisia.

Tämä auttaa sinua nopeasti määrittämään, johtuuko käyttökatkos todennäköisesti verkon tai palvelimen katkeamisesta tai siitä, että kyseisellä palvelimella käynnissä olevat yksittäiset palvelut eivät käynnisty oikein.

Tämän seurauksena, ping käyttää paljon alemman tason protokollaa kuin TCP.

Todellakin, ping ei edes käytä TCP:n rennompaa serkkua UDP, lyhenne sanoista käyttäjän datagrammiprotokolla, joka on nopea ja helppo tapa siirtää datapaloja, mutta jota kutsutaan yleisesti nimellä lähetä ja toivo (tai jos olet kyyninen tapa, spray-and-pray).

UDP ei itse ilmoita, pääsivätkö tietosi toiseen päähän vai eivät, ja vaikka ne saapuisivat ehjinä, UDP ei seuraa järjestystä, jossa paketit alun perin lähetettiin, joten se ei voi järjestää niitä uudelleen toinen pää, jos he pääsevät sinne väärässä järjestyksessä.

Ping, sen arvoista, käyttää erittäin matalan tason protokollaa, joka on erityisesti suunniteltu vianetsintään ja verkon uudelleenmäärittelyyn, joka tunnetaan nimellä ICMP, tai Internetin ohjausviestiprotokolla.

Tyypillisesti suoraan käyttöjärjestelmän ytimessä käsitelty, joten ICMP/IP-paketit menevät lähes varmasti läpi, vaikka mitään korkeamman tason verkkoohjelmistoa ei olisikaan keksitty oikein, ICMP sisältää erityisesti kaksi erikoisviestityyppiä:

  • Kirjoita 0x08. Virallisesti kutsuttu ICMP EchoTämä eräänlainen paketti kutsutaan yleensä kaikupyynnöksi. Se on mitä ping ohjelma lähettää verkon aktiivisten tietokoneiden etsimiseksi.
  • Kirjoita 0x00. Virallisesti kutsuttu ICMP Echo Reply, tämä pakettityyppi on juuri mitä siinä lukee. Tietokoneen, joka on elossa, online-tilassa ja jota ei ole määritetty estämään ICMP Echo -liikennettä, on tarkoitus lähettää tällainen paketti suoraan takaisin sitä pyytäneelle tietokoneelle.

Tykkää tästä:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com
KUVIO: 0x4e414b45445345435552495459
PING news-sophos.go-vip.net (192.0.66.227) 56(84) tavua dataa.
64 tavua 192.0.66.227:stä (192.0.66.227): icmp_seq = 1 ttl = 53 aika = 84.0 ms
64 tavua tiedostosta 192.0.66.227 (192.0.66.227): icmp_seq = 2 ttl = 53 aika = 85.1 ms
64 tavua tiedostosta 192.0.66.227 (192.0.66.227): icmp_seq = 3 ttl = 53 aika = 84.8 ms

--- news-sophos.go-vip.net ping-tilastot ---
3 pakettia lähetetty, 3 vastaanotettu, 0 % pakettihäviö, aika 2004ms
rtt min/avg/max/mdev = 84.025/84.644/85.062/0.446 ms

Jos haluat nähdä a ping toiminnassa hieman alemmalla tasolla, käytämme artikkelin lopusta löytyvää Lua-koodia oman ICMP Echo -paketin rakentamiseen ja mahdollisen vastauksen lukemiseen:

$ sudo luax ping.lua nakedsecurity.sophos.com
Lähetetään ICMP ECHO -pyyntö numeroon 192.0.66.227 -->
00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 71 75 |.....Zo.PingRequ|
00000010 65 73 74 4p 65 73 73 61 67 65 20 42 42 35 41 36 |estMessage BB5A6|
00000020 46 31 44 |F1D |
Tuli takaisin-->
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 00 00 0b 02 bb 5a 6f 1d 50 69 6e 67 |.........Zo.Ping|
00000020 52 65 71 75 65 73 74 4p 65 73 73 61 67 65 20 42 |Pyyntöviesti B|
00000030 42 35 41 36 46 31 44 |B5A6F1D |

Muuten meidän piti käyttää sudo yllä suorittaaksesi komentosarjamme pääkäyttäjän oikeuksilla, koska loimme niin sanotun a raaka IP-pistoke – sellaisen, joka voidaan muotoilla mihin tahansa haluamaamme taustalla olevaan muotoon, mukaan lukien TCP, UDP ja tarpeen mukaan ICMP.

Monissa Linux/Unix-järjestelmissä ping distrosi antama komento toimii ilman nimenomaista pääkäyttäjän oikeuksia, yleensä koska se on asennettu erityisillä suojausominaisuuksilla tai setuid lippusarja, mikä tarkoittaa, että se alkaa toimimalla eri käyttäjätilillä kuin käyttäjä, joka suoritti sen.

Hyvin suunnitellut ping Ohjelmat tietysti hylkäävät automaattisesti ylimääräiset oikeutensa, kun he ovat avanneet tarvitsemansa raakapistokkeen.

Jätimme tämän oikeuksien poistavan koodin pois malliskriptistämme lyhyyden vuoksi. Voit käyttää posix.unistd.setpid() toiminto vaihtaa etuoikeutetulle tilille socketin luomisen jälkeen, mutta ennen tietojen lähettämistä tai vastaanottamista.

Vastauksen tutkiminen

Kuten saatat tunnistaa yllä olevasta skriptimme datavedosta, verkkoliitäntätoiminto, jota käytämme tietojen lukemiseen vastaavasta palvelimesta, sisältää ICMP Echo Reply -tietojen lisäksi myös matalan tason IP-osoitteen (Internet Protocol Headers). alla olevassa paketissa.

Emme ole yrittäneet jäsentää tai muuten käsitellä näitä tietoja, vaan FreeBSD:tä ping ohjelman on tehtävä niin, jotta se ymmärtää vastauksen, mukaan lukien mahdolliset takaisin tulevat virheilmoitukset.

Jos ping hylätään jollakin tavalla, Echo Reply sisältää tyypillisesti omien IP-otsikoidensa (kuten yllä) lisäksi myös viitekopion IP-otsikoista ja ICMP-tiedoista, jotka esiintyivät alkuperäisessä lähtevässä pyynnössä.

IPv4-pakettien otsikot näyttävät yleensä samanlaisilta kuin yllä, missä IP-otsikot alkavat 45 00 00 37... ja jatka yhteensä 20 tavua, aina näytettyihin tavuihin asti ...XX XX XX XX, joka on kannettavan tietokoneeni IP-osoite.

Tykkää tästä:

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-versio ja otsikon pituus: 0x45 (4 = IPv4, 5 = viisi 32-bittistä sanaa, eli 20 tavua
Palvelutyyppi ja ruuhkatiedot: 0x00
Paketin kokonaispituus: 0x0037 (desimaali 55)
Jaksotiedot: F6 AF 00 00
Elinaika (hyppyjä jäljellä): 0x35 (desimaali 53)
Protokollatyyppi: 0x01 (ICMP)
Tarkistussumma: 0x947F (desimaali 38015)
Lähettävän tietokoneen IP-numero: C0 00 42 E3 (192.0.66.227 = nakedsecurity.sophos.com)
Vastaanottajan IP (kannettavani): XX XX XX XX (MUISTETTU = oma IP-numeroni)

FreeBSD:t ping ohjelmoijat näyttävät olettavan, että tämän tyyppiset otsikot olisivat todellakin aina täsmälleen 20 tavua pitkiä, perustuen otsikon pituusarvoon ensimmäisessä tavussa. 0x45, joka tarkoittaa IPv4:ää (0x4?) ja 5-DWORD (0x?5), tai 20-tavuinen otsikko.

Vain 20 tavua huolehdittavana ohjelmoijat osoittivat pinoon kiinteän kokoisia puskureita, joissa he voivat säilyttää kopion vastauksessa olevista IP-otsikoista sekä mahdolliset alkuperäisen pyynnön upotetut IP-otsikot, jos käsiteltävänä oli virhetilanne. .

Voitte arvata mihin tämä on menossa.

Tällä IPv4-otsikon ensimmäisellä tavulla voi laillisesti olla mikä tahansa arvo 0x45 (otsikon vähimmäiskoko 5 DWORDia tai 20 tavua, kuten kuvassa) enintään 0x4F (tarkoittaa 15 DWORDia, koska 0xF on desimaaliluku 15 tai yhteensä 60 tavua otsikkodataa), mikä mahdollistaa siististi valinnaisen 40 tavua otsikkodataa.

Näitä harvinaisia, mutta laillisia ylimääräisiä otsikkotavuja voidaan käyttää erilaisiin funky- ja epätavallisiin "ominaisuuksiin", joilla on outoja nimiä, kuten esim. Valikoiva ohjattu lähetys, Kokeellinen virtauksen ohjaus ja Ylävirran monilähetyspaketti – asioita, joista olemme kuulleet, mutta joita emme ole tietoisesti käyttäneet tai edes nähneet.

Varo kyberrikollisia, jotka panevat sinut koetukselle

Kuten voit kuvitella, koska näitä ylimääräisiä kenttiä ei käytetä melkein koskaan, et ehkä koskaan näe IPv4-pakettia, jossa on jotain muuta kuin 0x45 alussa ja yhteensä 20 tavua otsikkodataa, ellet ole törmännyt joukkoon kyberrikollisia, jotka ovat valmiita laittamaan sinut koetukselle.

Ikävä kyllä ​​ei ole paljon estettä hyökkääjää luomasta palvelinta, joka arvaa, käytätkö FreeBSD:tä, ja luo tarkoituksella ylisuuria ICMP/IP Echo Reply -paketteja provosoidakseen pinopuskurin ylivuoto sisällä ping ohjelma.

Jos koskaan tarkistat, onko heidän palvelimensa aktiivinen (mitä saatat jopa tehdä, tai ehkä varsinkin, jos pidät sitä epäilyttävänä!), saatat joutua vastauksen kohteeksi.

Parhaimmillaan sinun ping ohjelma kaatuu; pahimmassa tapauksessa, kuten FreeBSD:n tietoturvatiedotus anteliaasti myöntää, "Haitallinen isäntä voi olla mahdollista käynnistää koodin etäsuorittamisen pingissä."

Onneksi myös FreeBSD:n kirjoittajat huomauttaa, "Ping-prosessi toimii ominaisuustilan hiekkalaatikossa kaikissa FreeBSD:n versioissa, joihin se vaikuttaa, ja siksi se on hyvin rajoitettu sen suhteen, miten se voi olla vuorovaikutuksessa muun järjestelmän kanssa siinä kohdassa, jossa virhe voi ilmetä."

Toisin sanoen, sinun on ehdottomasti korjattava, mutta riskejä voidaan pitää vaatimattomina.

Erityisesti ping Ohjelma ei ole vain lukittu hiekkalaatikkoon, mutta se ei ole käynnissä root-käyttäjänä, kun buginen koodi saavutetaan, kuten turvallisuustiedotteessa vahvistetaan: "Kun ping suoritetaan, se luo työnsä suorittamiseen tarvittavan raakapistokkeen ja peruuttaa sitten korotetut oikeudet."

Kuten yllä on kuvattu, pääkäyttäjän valtuudet vaaditaan vain raaka-IP-pistokkeen hankkimiseen käyttöjärjestelmästä, ei sendto() ja recvfrom() toimii kyseisessä liittimessä jälkeenpäin.

Tälle bugille on annettu virallinen tunniste CVE-2022-23093; se on dokumentoitu turvallisuustiedotteessa FreeBSD-SA-22:15.ping.

Mitä tehdä?

  • Jos olet FreeBSD-käyttäjä, vain päivitä ongelmalliset julkaisut (FreeBSD 12 ja FreeBSD 13) uusimpiin versioihin, joissa tämä virhe on korjattu.
  • Jos olet verkko-ohjelmoija, Varmista aina, että olet ottanut huomioon pakettien otsikot, jotka voivat viitata epätavallisiin kokovaihteluihin. Se, että et ole koskaan nähnyt mitään muunnelmia itse, ei estä sinua kohtaamasta huomenna pakettia, joka on epätavallinen mutta täysin laillinen.
  • Jos olet verkkovastaava, harkitse IPv4-pakettien estämistä IP-otsikoilla, jotka eivät ole kooltaan 20 tavua. Jos todella näyttää siltä, ​​että joidenkin ohjelmistotuotteiden on sallittava käyttää epätavallisia IPv4-otsikkovaihtoehtoja, harkitse epätavallisten pakettien kirjaamista lokiin saadaksesi selville syyn.

Varo siellä!


ESIMERKIKOODI PING-LIIKENNEEN ESITTÄMISEKSI


Aikaleima:

Lisää aiheesta Naked Security