Ping av død! FreeBSD fikser krasjtastisk feil i nettverksverktøyet PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.

Ping av død! FreeBSD fikser crashtastic bug i nettverksverktøyet

Et av de første nettverksverktøyene på lavt nivå som enhver databruker lærer om, er det ærverdige ping nytte.

Oppkalt etter den samme lydeffekten fra enhver gammeldags krigsfilmscene som involverer ubåter, er kommandoen et metaforisk ekko (se hva vi gjorde der?) av undervannsversjonen av RADAR kjent som SONAR.

Du sender ut et ping (mer som en doinnnng-lyd, inn virkelighet) inn i det saltede dypet, og ved å måle hvor lang tid det tar før det skumle ekkoet kommer tilbake til deg, og ved å estimere lydhastigheten i det omkringliggende havet, kan du beregne avstanden til objektet som produserte ekkoet.

Spennende, gitt at du sannsynligvis har hørt forkortelsen TCP/IP brukt som en generisk beskrivelse av protokolllimet som driver Internett, ping bruker teknisk sett ikke TCP/IP i det hele tatt.

Faktisk er TCP/IP en forkortelse for overføringskontrollprotokoll over internettprotokollen, og refererer til en ganske høynivåmekanisme for å sende data over internett på en slik måte at nettverket selv legger inn mye av "fungerte det faktisk ordentlig?" innsats for deg.

For eksempel, i TCP-tilkoblinger, er alle biter av data du sender garantert enten å komme intakt i den andre enden eller forårsake en feil, slik at du vet at de ikke klarte det.

Videre, selv om forskjellige databiter ender opp med å ta forskjellige ruter over internett (for eksempel på grunn av lastbalansering, midlertidige utfall eller andre gjenopprettbare feil), og selv om noen biter tar lengre tid å ankomme enn andre, vil TCP-data bli riktig bufret opp og presentert i riktig rekkefølge i den andre enden.

Ping er annerledes

De ping kommandoen brukes imidlertid vanligvis til å bekrefte om en datamaskin du er interessert i er online i det hele tatt, spesielt hvis den ikke godtar den typen TCP-tilkoblinger på høyt nivå du forventer, for eksempel å motta e-post eller tillate SSH-pålogginger.

Dette hjelper deg raskt med å finne ut om et strømbrudd sannsynligvis skyldes at nettverket eller selve serveren går ned, eller at individuelle tjenester som kjører på den serveren ikke starter riktig.

Som et resultat ping bruker en mye lavere protokoll enn TCP.

Faktisk, ping bruker ikke engang TCPs mer uformelle fetter UDP, forkortelse for brukerdatagramprotokoll, som er en måte å overføre databiter på som er rask og enkel, men som populært blir referert til som send-og-håp (eller, hvis du er en kynisk sort, som spray-and-pray).

UDP selv informerer deg ikke om dataene dine kom til den andre enden eller ikke, og selv om de kommer intakt, holder ikke UDP styr på rekkefølgen pakkene dine opprinnelig ble sendt i, så den kan ikke omorganisere dem kl. den andre enden hvis de kommer ut av rekkefølge.

Ping, for hva det er verdt, bruker en protokoll på svært lavt nivå, spesielt utviklet for feilsøking og nettverksrekonfigureringsformål, kjent som ICMP, eller meldingsprotokoll for internettkontroll.

Vanligvis håndtert rett i operativsystemkjernen, slik at ICMP/IP-pakker er nesten sikre på å komme gjennom selv om ingen nettverksprogramvare på høyere nivå har kommet opp riktig, inkluderer ICMP spesielt to spesielle meldingstyper:

  • Skriv 0x08. Offisielt kalt ICMP Echo, dette en slags pakke kalles vanligvis en ekkoforespørsel. Det er hva ping programmet sender ut for å søke etter aktive datamaskiner på nettverket.
  • Skriv 0x00. Offisielt kalt ICMP Echo Reply, er denne pakketypen akkurat det som står. En datamaskin som er i live, online og ikke er konfigurert til å blokkere ICMP Echo-trafikk, skal sende denne typen pakke rett tilbake til datamaskinen som ba om det.

Som dette:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com MØNSTER: 0x4e414b45445345435552495459 PING news-sophos.go-vip.192.0.66.227 av. 56 av. 84 av. 64 av. 192.0.66.227 byte fra 192.0.66.227 (1): ICMP_Seq = 53 TTL = 84.0 Tid = 64 MS 192.0.66.227 BYTES Fra 192.0.66.227 2): ​​ICMt_Seq = 53 Ttl = 85.1 Msy 64. (192.0.66.227): icmp_seq=192.0.66.227 ttl=3 tid=53 ms --- news-sophos.go-vip.net pingstatistikk --- 84.8 pakker sendt, 3 mottatt, 3 % pakketap, tid 0ms rtt min/ avg/max/mdev = 2004/84.025/84.644/85.062 ms

Å se en ping i aksjon på et litt lavere nivå, vil vi bruke Lua-koden som du finner på slutten av artikkelen for å konstruere en egen ICMP Echo-pakke, og for å lese svaret som kommer tilbake, hvis noen:

$ sudo luax ping.lua nakedsecurity.sophos.com Sender ICMP ECHO-forespørsel til 192.0.66.227 --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65P. Requ... 71 | 75 00000010 65 73 74d 4 65 73 73 61 67 65 20 42 42 35 41 |estMessage BB36A5| 6 00000020 46 31 |F44D | Fikk tilbake--> 1 00000000 45 00 00 f37 af 6 00 00 35 01 94f c7 0 00 e42 |E..3....7.....B.| 5 XX XX XX XX 00000010 00 00b 0 bb 02a 5f 6d 1 50 69e 6 |.........Zo.Ping| 67 00000020 52 65 71 75 65 73 74d 4 65 73 73 61 67 65 20 |RequestMessage B| 42 00000030 42 35 41 36 46 31 |B44A5F6D |

Forresten, vi trengte å bruke sudo ovenfor for å kjøre skriptet vårt med superbrukerrettigheter, fordi vi opprettet det som er kjent som en rå IP-kontakt – en som kan lages i et hvilket som helst underliggende format vi liker, inkludert TCP, UDP og, etter behov her, ICMP.

På mange Linux/Unix-systemer er ping kommandoen levert av distroen din fungerer uten eksplisitt å ha root-privilegier, vanligvis fordi den er installert med spesielle sikkerhetsfunksjoner, eller med dens setuid flaggsett, noe som betyr at det starter med å kjøre under en annen brukerkonto enn brukeren som kjørte det.

Godt utformet ping programmer, selvfølgelig, vil automatisk forkaste sine ekstra privilegier når de har åpnet opp råkontakten de trenger.

Vi har utelatt denne rettighetsslippkoden fra eksempelskriptet vårt for korthets skyld. Du kan bruke posix.unistd.setpid() funksjon for å bytte til en uprivilegert konto etter å ha opprettet kontakten, men før du sender eller mottar data.

Undersøker svaret

Som du kanskje kjenner igjen i datadumpen fra skriptet vårt ovenfor, inkluderer nettverkssocket-funksjonen vi bruker for å lese tilbake data fra den svarte serveren, ikke bare ICMP Echo Reply-data, men også lavnivå-IP (internettprotokolloverskrifter) i den underliggende pakken.

Vi har ikke prøvd å analysere eller på annen måte behandle disse dataene, men FreeBSD ping programmet må gjøre det for å forstå svaret, inkludert å forstå eventuelle feilmeldinger som kommer tilbake.

Dersom ping blir avvist på en eller annen måte, vil ekkosvaret vanligvis ikke bare inkludere sine egne IP-hoder (som vist ovenfor), men også en referansekopi av IP-hodene og ICMP-dataene som dukket opp i den opprinnelige utgående forespørselen.

IPv4-pakkehoder ser vanligvis omtrent ut som du ser ovenfor, hvor IP-hodene starter med 45 00 00 37... og fortsett i 20 byte totalt, opp til og inkludert bytene vist som ...XX XX XX XX, som er IP-adressen til den bærbare datamaskinen min.

Som dette:

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-versjon og overskriftslengde: 0x45 (4 = IPv4, 5 = fem 32-bits ord, dvs. 20 byte Tjenestetype og overbelastningsdata: 0x00 Total lengde på pakken: 0x0037 (desimal 55) Sekvensinformasjon: F6 AF 00 00 Tid til -live (hopp igjen): 0x35 (desimal 53) Protokolltype: 0x01 (ICMP) Sjekksum: 0x947F (desimal 38015) Sender datamaskinens IP-nummer: C0 00 42 E3 (192.0.66.227 = nakensikkerhet.mottaker) IP-mottaker. bærbar PC): XX XX XX XX (REDAKTERT = mitt eget IP-nummer)

FreeBSD-er ping programmerere, ser det ut til, antok at overskrifter av denne typen faktisk alltid ville være nøyaktig 20 byte lange, basert på den overskriftslengdeverdien i den første byten til 0x45, angir IPv4 (0x4?) med et 5-DWORD (0x?5), eller 20-byte, overskrift.

Med bare 20 byte å bekymre seg for, tildelte programmererne buffere med fast størrelse på stabelen der de kunne beholde en kopi av IP-hodene i svaret, pluss eventuelle innebygde IP-hoder fra den opprinnelige forespørselen, hvis det var en feiltilstand å håndtere .

Du kan gjette hvor dette går.

Den første byten i IPv4-headeren kan lovlig ha en hvilken som helst verdi fra 0x45 (minste overskriftstørrelse på 5 DWORDs, eller 20 byte, som vist) opptil 0x4F (angir 15 DWORDs, fordi 0xF er desimal 15, eller 60 byte med overskriftsdata totalt), og gir dermed mulighet for en valgfri ekstra 40 byte med overskriftsdata.

Disse sjeldne, men lovlige, ekstra header-bytene kan brukes til forskjellige funky og uvanlige "funksjoner" med nysgjerrige navn som f.eks. Selektiv regissert kringkasting, Eksperimentell flytkontroll og Oppstrøms multicast-pakke – ting vi har hørt om, men som vi aldri har brukt bevisst, eller til og med sett.

Pass på nettkriminelle som setter deg på prøve

Som du kan forestille deg, gitt at de ekstra feltene nesten aldri brukes, vil du kanskje aldri se en IPv4-pakke med noe annet enn 0x45 i starten, og med totalt 20 byte med overskriftsdata, med mindre du har støtt på en haug med nettkriminelle som er klare til å sette deg på prøve.

Dessverre er det ikke mye som stopper en angriper fra å rigge opp en server som gjetter om du bruker FreeBSD, og ​​bevisst genererer overdimensjonerte ICMP/IP Echo Reply-pakker for å provosere en stabel bufferoverløp inni din ping program.

Hvis du noen gang sjekker om serveren deres er aktiv (noe du kanskje gjør til og med, eller kanskje spesielt, hvis du synes det er mistenkelig!), kan du bli målrettet med et svar som er fanget i støyen.

I beste fall din ping programmet vil krasje; i verste fall, som FreeBSD-sikkerhetsrådgivningen sjenerøst innrømmer, "det kan være mulig for en ondsinnet vert å utløse ekstern kjøring av kode i ping."

Heldigvis, som FreeBSD-forfatterne også peke ut, "Ping-prosessen kjører i en evnesandboks på alle berørte versjoner av FreeBSD og er derfor svært begrenset i hvordan den kan samhandle med resten av systemet på det punktet der feilen kan oppstå."

Med andre ord, du må definitivt lappe, men risikoen kan anses som beskjeden.

Spesielt, ping programmet er ikke bare låst i en sandkasse, men kjører ikke som root når buggykoden blir nådd, som bekreftet i sikkerhetsrådgivningen: "Når ping kjører, skaper den den rå-sokkelen som trengs for å gjøre arbeidet sitt, og tilbakekaller deretter de forhøyede privilegiene.»

Som beskrevet ovenfor kreves superbrukerkrefter bare for å skaffe en rå IP-socket fra operativsystemet, ikke for å bruke sendto() og recvfrom() fungerer på den kontakten etterpå.

Denne feilen har fått den offisielle identifikatoren CVE-2022-23093; det er dokumentert i sikkerhetsrådgivningen FreeBSD-SA-22:15.ping.

Hva gjør jeg?

  • Hvis du er en FreeBSD-bruker, ganske enkelt oppdater de berørte utgivelsene (FreeBSD 12 og FreeBSD 13) til deres nyeste versjoner, hvor denne feilen er fikset.
  • Hvis du er en nettverksprogrammerer, sørg alltid for at du har tatt hensyn til pakkehoder som kan indikere uvanlige størrelsesvariasjoner. Det faktum at du aldri har sett noen varianter selv hindrer deg ikke i å møte en pakke i morgen som er utenom det vanlige, men likevel helt lovlig.
  • Hvis du er nettverksleder, vurder å blokkere IPv4-pakker med IP-hoder som ikke er 20 byte store. Hvis du virkelig ser ut til å måtte la noen programvareprodukter bruke uvanlige IPv4-overskriftsalternativer, bør du vurdere å logge disse uvanlige pakkene for å finne ut hvorfor.

Ta vare der ute!


EKSEMPEL KODE FOR Å DEMONSTERE PING-TRAFIKK


Tidstempel:

Mer fra Naken sikkerhet