Ping van de dood! FreeBSD repareert een crashtastische bug in netwerktool PlatoBlockchain Data Intelligence. Verticaal zoeken. Ai.

Pingen van de dood! FreeBSD repareert crashtastic-bug in netwerktool

Een van de eerste low-level netwerktools waar elke computergebruiker over leert, is de eerbiedwaardige ping utility.

Vernoemd naar het gelijknamige geluidseffect van elke ouderwetse oorlogsfilmscène met onderzeeërs, is het commando een metaforische echo (zie je wat we daar deden?) van de onderwaterversie van RADAR die bekend staat als SONAR.

Je zendt een ping uit (meer als een doinnnng-geluid, in realiteit) in de zilte diepten, en door te meten hoe lang het duurt voordat de griezelige echo bij je terugkomt, en door de geluidssnelheid in de omringende oceaan te schatten, kun je de afstand berekenen tot het object dat de echo produceerde.

Intrigerend, gezien het feit dat je waarschijnlijk de afkorting TCP/IP hebt gehoord die wordt gebruikt als een algemene beschrijving van de protocollijm die het internet aandrijft, ping maakt technisch helemaal geen gebruik van TCP/IP.

In feite is TCP/IP een afkorting van transmissiecontroleprotocol via het internetprotocol, en verwijst naar een redelijk hoogstaand mechanisme voor het verzenden van gegevens via internet op een zodanige manier dat het netwerk zelf veel van de "werkte dat echt goed?" moeite voor jou.

Bij TCP-verbindingen is het bijvoorbeeld gegarandeerd dat alle stukjes gegevens die u verzendt intact aankomen aan de andere kant of een fout veroorzaken, zodat u weet dat ze het niet hebben gehaald.

Bovendien, zelfs als verschillende databrokken verschillende routes over het internet nemen (bijvoorbeeld als gevolg van taakverdeling, tijdelijke uitval of andere herstelbare fouten), en zelfs als sommige brokken meer tijd nodig hebben om aan te komen dan andere, zullen TCP-gegevens correct worden gebufferd. omhoog en in de juiste volgorde gepresenteerd aan de andere kant.

Pingen is anders

De ping commando wordt echter meestal gebruikt om te controleren of een computer waarin u geïnteresseerd bent überhaupt online is, vooral als deze niet het soort TCP-verbindingen op hoog niveau accepteert dat u zou verwachten, zoals het ontvangen van e-mail of het toestaan ​​van SSH-aanmeldingen.

Dit helpt u snel te bepalen of een storing waarschijnlijk te wijten is aan het uitvallen van het netwerk of de server zelf, of aan het feit dat afzonderlijke services die op die server worden uitgevoerd, niet correct starten.

Hierdoor ping gebruikt een veel lager protocol dan TCP.

Inderdaad, ping maakt zelfs geen gebruik van TCP's meer informele neef UDP, een afkorting van gebruikersdatagramprotocol, wat een manier is om datablokken snel en gemakkelijk te verzenden, maar in de volksmond ook wel send-and-hope wordt genoemd (of, als je een cynisch type bent, als spray-and-pray).

UDP zelf informeert u niet of uw gegevens aan de andere kant zijn aangekomen of niet, en zelfs als ze intact aankomen, houdt UDP de volgorde waarin uw pakketten oorspronkelijk zijn verzonden niet bij, dus het kan ze niet herschikken op het andere uiteinde als ze daar niet in de juiste volgorde aankomen.

Ping, voor wat het waard is, gebruikt een protocol van zeer laag niveau, speciaal ontworpen voor probleemoplossing en herconfiguratie van het netwerk, bekend als ICMP, of protocol voor internetcontroleberichten.

Meestal verwerkt in de kernel van het besturingssysteem, zodat ICMP/IP-pakketten er vrijwel zeker doorheen komen, zelfs als er geen netwerksoftware van een hoger niveau correct is verschenen. ICMP bevat met name twee speciale berichttypen:

  • Typ 0x08. Officieel gebeld ICMP Echo, deze soort pakket wordt meestal een echoverzoek genoemd. Het is wat de ping programma uitzendt om te zoeken naar actieve computers op het netwerk.
  • Typ 0x00. Officieel gebeld ICMP Echo Reply, dit pakkettype is precies wat er staat. Een computer die actief is, online is en niet is geconfigureerd om ICMP Echo-verkeer te blokkeren, wordt verondersteld dit soort pakket rechtstreeks terug te sturen naar de computer die erom heeft gevraagd.

Soortgelijk:

$ ping -c 3 -p 4E414B45445345435552495459 Nakedsecurity.sophos.com
PATROON: 0x4e414b45445345435552495459
PING news-sophos.go-vip.net (192.0.66.227) 56(84) bytes aan gegevens.
64 bytes van 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 tijd=84.0 ms
64 bytes van 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 tijd=85.1 ms
64 bytes van 192.0.66.227 (192.0.66.227): icmp_seq=3 ttl=53 tijd=84.8 ms

--- news-sophos.go-vip.net ping statistieken ---
3 pakketten verzonden, 3 ontvangen, 0% pakketverlies, tijd 2004 ms
rtt min/avg/max/mdev = 84.025/84.644/85.062/0.446 ms

Om een ​​te zien ping in actie op een iets lager niveau, gebruiken we de Lua-code die u aan het einde van het artikel kunt vinden om een ​​eigen ICMP Echo-pakket te maken en om het antwoord te lezen dat terugkomt, indien van toepassing:

$ sudo luax ping.lua Nakedsecurity.sophos.com
ICMP ECHO-verzoek wordt verzonden naar 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 4d 65 73 73 61 67 65 20 42 42 35 41 36 |estBericht BB5A6|
00000020 46 31 44 |F1D |
Ik ben terug -->
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 4d 65 73 73 61 67 65 20 42 |AanvraagBericht B|
00000030 42 35 41 36 46 31 44 |B5A6F1D |

Trouwens, we moesten gebruiken sudo hierboven om ons script uit te voeren met superuser-privileges, omdat we een zogenaamde ruwe IP-socket - een die kan worden gemaakt in elk onderliggend formaat dat we leuk vinden, inclusief TCP, UDP en, zoals hier nodig, ICMP.

Op veel Linux/Unix-systemen is de ping commando geleverd door je distro werkt zonder expliciet root-privileges te krijgen, meestal omdat het is geïnstalleerd met speciale beveiligingsmogelijkheden, of met zijn setuid flag set, wat betekent dat het begint met draaien onder een ander gebruikersaccount dan de gebruiker die het heeft uitgevoerd.

Goed ontworpen ping programma's zullen natuurlijk automatisch hun extra privileges weggooien zodra ze de raw socket hebben geopend die ze nodig hebben.

We hebben deze privilege-dropping-code uit ons voorbeeldscript weggelaten omwille van de beknoptheid. U kunt de posix.unistd.setpid() functie om over te schakelen naar een onbevoegd account nadat de socket is gemaakt, maar voordat gegevens worden verzonden of ontvangen.

Het antwoord onderzoeken

Zoals je misschien herkent in de datadump van ons script hierboven, omvat de netwerksocketfunctie die we gebruiken om gegevens van de antwoordende server terug te lezen niet alleen de ICMP Echo Reply-gegevens, maar ook de low-level IP (internetprotocolheaders) in het onderliggende pakket.

We hebben niet geprobeerd deze gegevens te ontleden of anderszins te verwerken, maar de FreeBSD ping programma moet dit doen om het antwoord te begrijpen, inclusief het begrijpen van eventuele foutmeldingen die terugkomen.

Indien de ping op de een of andere manier wordt afgewezen, zal het Echo-antwoord doorgaans niet alleen zijn eigen IP-headers bevatten (zoals hierboven te zien is), maar ook een referentiekopie van de IP-headers en de ICMP-gegevens die in het oorspronkelijke uitgaande verzoek zijn verschenen.

IPv4-pakketheaders zien er meestal ongeveer uit zoals hierboven, waar de IP-headers mee beginnen 45 00 00 37... en ga door voor in totaal 20 bytes, tot en met de bytes die worden weergegeven als ...XX XX XX XX, dat is het IP-adres van mijn laptop.

Soortgelijk:

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-versie en headerlengte: 0x45 (4 = IPv4, 5 = vijf 32-bits woorden, d.w.z. 20 bytes
Diensttype en congestiegegevens: 0x00
Totale lengte van het pakket: 0x0037 (decimaal 55)
Volgorde-informatie: F6 AF 00 00
Time-to-live (hops links): 0x35 (decimaal 53)
Protocoltype: 0x01 (ICMP)
Controlesom: 0x947F (decimaal 38015)
IP-nummer van de computer verzenden: C0 00 42 E3 (192.0.66.227 = Nakedsecurity.sophos.com)
IP-adres van de ontvanger (mijn laptop): XX XX XX XX (REDACTED = mijn eigen IP-nummer)

FreeBSD's ping programmeurs, zo lijkt het, gingen ervan uit dat headers van dit soort inderdaad altijd precies 20 bytes lang zouden zijn, gebaseerd op die header-lengtewaarde in de eerste byte van 0x45, waarmee IPv4 wordt aangeduid (0x4?) met een 5-DWORD (0x?5), of 20 bytes, koptekst.

Met slechts 20 bytes om zich zorgen over te maken, wezen de programmeurs buffers met een vaste grootte op de stapel toe waar ze een kopie van de IP-headers in het antwoord konden bewaren, plus alle ingebedde IP-headers van het oorspronkelijke verzoek, als er een foutconditie was om af te handelen .

Je kunt wel raden waar dit heen gaat.

Die eerste byte in de IPv4-header kan legaal elke waarde hebben 0x45 (de minimale headergrootte van 5 DWORD's of 20 bytes, zoals weergegeven) tot 0x4F (duidt op 15 DWORD's, omdat 0xF decimaal 15 is, of 60 bytes aan headergegevens in totaal), waardoor netjes een optionele extra 40 bytes aan headergegevens mogelijk zijn.

Die zeldzame, maar legale, extra header-bytes kunnen worden gebruikt voor verschillende funky en ongebruikelijke "functies" met merkwaardige namen zoals Selectieve gerichte uitzending, Experimentele stroomregeling en Stroomopwaarts multicast-pakket - dingen waarvan we hebben gehoord, maar die we nooit willens en wetens hebben gebruikt of zelfs maar hebben gezien.

Pas op voor cybercriminelen die u op de proef stellen

Zoals u zich kunt voorstellen, gezien het feit dat die extra velden bijna nooit worden gebruikt, ziet u mogelijk nooit een IPv4-pakket met iets anders dan 0x45 aan het begin, en met in totaal 20 bytes aan headergegevens, tenzij je een stel cybercriminelen bent tegengekomen die klaar staan ​​om je op de proef te stellen.

Helaas is er niet veel dat een aanvaller ervan weerhoudt een server op te tuigen die raadt of u FreeBSD gebruikt en opzettelijk te grote ICMP/IP Echo Reply-pakketten genereert om een stackbufferoverloop in uw ping programma.

Als je ooit controleert of hun server actief is (wat je misschien zelfs, of misschien vooral doet, als je denkt dat het verdacht is!), zou je het doelwit kunnen zijn van een antwoord met boobytraps.

In het beste geval jouw ping programma zal crashen; in het slechtste geval echter, zoals het FreeBSD-beveiligingsadvies royaal toegeeft, "Het is mogelijk dat een kwaadwillende host de uitvoering van externe code in ping activeert."

Gelukkig ook de auteurs van FreeBSD aanwijzen, "[H]et pingproces draait in een vaardigheidsmodus-sandbox op alle getroffen versies van FreeBSD en is dus erg beperkt in hoe het kan communiceren met de rest van het systeem op het punt waar de bug kan optreden."

Met andere woorden, u moet beslist patchen, maar de risico's kunnen als bescheiden worden beschouwd.

Met name de ping programma zit niet alleen opgesloten in een sandbox, maar draait niet als root wanneer de buggy-code wordt bereikt, zoals bevestigd in het beveiligingsadvies: "Wanneer ping draait, creëert het de raw socket die nodig is om zijn werk te doen, en trekt vervolgens zijn verhoogde privileges in.”

Zoals hierboven beschreven, zijn superuser-bevoegdheden alleen vereist om een ​​onbewerkte IP-socket van het besturingssysteem te verkrijgen, niet om de sendto() en recvfrom() werkt daarna op dat stopcontact.

Deze bug heeft de officiële identificatie gekregen CVE-2022-23093; het is gedocumenteerd in het beveiligingsadvies FreeBSD-SA-22:15.ping.

Wat te doen?

  • Als u een FreeBSD-gebruiker bent, update gewoon de betreffende releases (FreeBSD 12 en FreeBSD 13) naar hun nieuwste versies, waar deze bug is opgelost.
  • Als u een netwerkprogrammeur bent, zorg er altijd voor dat u rekening houdt met pakketkoppen die ongebruikelijke groottevariaties kunnen aangeven. Het feit dat je zelf nog nooit een variatie hebt gezien, weerhoudt je er niet van om morgen met een pakket te maken te krijgen dat ongewoon is maar volkomen legaal.
  • Als u een netwerkbeheerder bent, overweeg IPv4-pakketten te blokkeren met IP-headers die niet groter zijn dan 20 bytes. Als het echt nodig lijkt dat sommige softwareproducten ongebruikelijke IPv4-headeropties gebruiken, overweeg dan om die ongebruikelijke pakketten te loggen om erachter te komen waarom.

Pas op daar!


VOORBEELDCODE OM PINGVERKEER TE DEMONSTREREN


Tijdstempel:

Meer van Naakte beveiliging