Ping smrti! FreeBSD odpravlja crashtastično napako v omrežnem orodju PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Ping smrti! FreeBSD odpravlja crashtastično napako v omrežnem orodju

Eno prvih nizkonivojskih omrežnih orodij, ki jih vsak uporabnik računalnika spozna, je častitljivo ping uporabnost.

Ukaz, imenovan po istoimenskem zvočnem učinku iz katerega koli prizora starega vojnega filma, ki vključuje podmornice, je metaforični odmev (poglejte, kaj smo tam počeli?) podvodne različice RADAR-ja, znane kot SONAR.

Pošljete ping (bolj kot zvok doinnnng, v realnost) v slane globine in z merjenjem, koliko časa traja, da se njegov srhljiv odmev vrne k vam, ter z oceno hitrosti zvoka v okoliškem oceanu lahko izračunate razdaljo do predmeta, ki je povzročil odmev.

Zanimivo je, da ste verjetno že slišali kratico TCP/IP, ki se uporablja kot splošen opis lepila protokola, ki poganja internet, ping tehnično sploh ne uporablja TCP/IP.

Pravzaprav je TCP/IP okrajšava za protokol za nadzor prenosa preko internetnega protokola, in se nanaša na mehanizem dokaj visoke ravni za pošiljanje podatkov prek interneta na tak način, da omrežje samo vnese veliko "ali je to dejansko delovalo pravilno?" trud za vas.

Na primer, pri povezavah TCP je zagotovljeno, da bodo vsi deli podatkov, ki jih pošljete, prispeli nedotaknjeni na drugo stran ali povzročili napako, tako da veste, da je niso uspeli.

Poleg tega, tudi če različni kosi podatkov na koncu peljejo po različnih poteh po internetu (na primer zaradi uravnoteženja obremenitve, začasnih izpadov ali drugih popravljivih napak) in tudi če nekateri kosi potrebujejo dlje, da prispejo kot drugi, bodo podatki TCP pravilno medpomnilniki navzgor in predstavljen v pravem vrstnem redu na drugem koncu.

Ping je drugačen

O ping ukaz pa se običajno uporablja za preverjanje, ali je računalnik, ki vas zanima, sploh na spletu, še posebej, če ne sprejema vrste povezav TCP na visoki ravni, ki bi jih pričakovali, kot je prejemanje e-pošte ali omogočanje prijav SSH.

To vam hitro pomaga ugotoviti, ali je izpad verjetno posledica okvare omrežja ali samega strežnika ali ker se posamezne storitve, ki se izvajajo na tem strežniku, ne zaženejo pravilno.

Zaradi tega ping uporablja protokol veliko nižje ravni kot TCP.

Prav zares, ping ne uporablja niti TCP-jevega bolj običajnega bratranca UDP, okrajšava za protokol uporabniškega datagrama, ki je način prenosa podatkovnih kosov, ki je hiter in enostaven, vendar se popularno imenuje pošlji in upaj (ali, če si ciničen, razprši in moli).

Sam UDP vas ne obvesti, ali so vaši podatki prispeli na drugo stran ali ne, in tudi če prispejo nedotaknjeni, UDP ne sledi vrstnemu redu, v katerem so bili vaši paketi prvotno poslani, zato jih ne more preurediti na drugi konec, če pridejo tja iz zaporedja.

Ping, kar se splača, uporablja protokol zelo nizke ravni, ki je posebej zasnovan za namene odpravljanja težav in rekonfiguracije omrežja, znan kot ICMP, ali internetni protokol nadzornih sporočil.

Običajno se obravnava neposredno v jedru operacijskega sistema, tako da se paketi ICMP/IP skoraj zagotovo prebijejo, tudi če nobena omrežna programska oprema na višji ravni ni bila pravilno nameščena, ICMP zlasti vključuje dve posebni vrsti sporočil:

  • Vnesite 0x08. Uradno poklicana ICMP EchoTo nekakšen paket se običajno imenuje Echo Request. To je tisto, kar ping program pošlje, da poišče aktivne računalnike v omrežju.
  • Vnesite 0x00. Uradno poklicana ICMP Echo Reply, ta vrsta paketa je točno to, kar piše. Računalnik, ki je živ, povezan in ni konfiguriran za blokiranje prometa ICMP Echo, naj bi poslal to vrsto paketa naravnost nazaj v računalnik, ki ga je zahteval.

Všečkaj to:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com
PATTERN: 0x4e414b45445345435552495459
PING news-sophos.go-vip.net (192.0.66.227) 56(84) bytes of data.
64 bytes from 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 time=84.0 ms
64 bytes from 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 time=85.1 ms
64 bytes from 192.0.66.227 (192.0.66.227): icmp_seq=3 ttl=53 time=84.8 ms

--- news-sophos.go-vip.net ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 84.025/84.644/85.062/0.446 ms

Če želite videti a ping v akciji na nekoliko nižji ravni, bomo uporabili kodo Lua, ki jo najdete na koncu članka, da sestavimo lasten paket ICMP Echo in preberemo odgovor, ki se vrne, če obstaja:

$ sudo luax ping.lua nakedsecurity.sophos.com
Sending ICMP ECHO request to 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  |estMessage BB5A6|
00000020  46 31 44                                          |F1D             |
Got back-->
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  |RequestMessage B|
00000030  42 35 41 36 46 31 44                              |B5A6F1D         |

Mimogrede, morali smo uporabiti sudo zgoraj za zagon našega skripta s privilegiji superuporabnika, ker smo ustvarili tisto, kar je znano kot a neobdelana vtičnica IP – takšnega, ki ga je mogoče oblikovati v poljuben osnovni format, vključno s TCP, UDP in, če je tukaj potrebno, ICMP.

V mnogih sistemih Linux/Unix je ping ukaz, ki ga zagotovi vaš distro, deluje, ne da bi mu bile izrecno dodeljene korenske pravice, običajno zato, ker je nameščen s posebnimi varnostnimi zmožnostmi ali setuid nastavljena zastavica, kar pomeni, da se začne z izvajanjem pod drugim uporabniškim računom kot uporabnik, ki ga je zagnal.

Dobro oblikovan ping programi bodo seveda samodejno zavrgli svoje dodatne privilegije, ko bodo odprli neobdelano vtičnico, ki jo potrebujejo.

To kodo za odpuščanje privilegijev smo zaradi jedrnatosti izpustili iz našega vzorčnega skripta. Lahko uporabite posix.unistd.setpid() funkcijo za preklop na neprivilegiran račun po ustvarjanju vtičnice, vendar pred pošiljanjem ali prejemanjem kakršnih koli podatkov.

Preučevanje odgovora

Kot ste morda prepoznali v izpisu podatkov iz našega zgornjega skripta, funkcija omrežne vtičnice, ki jo uporabljamo za branje podatkov iz odzivnega strežnika, ne vključuje samo podatkov ICMP Echo Reply, ampak tudi IP nizke ravni (glave internetnega protokola) v osnovnem paketu.

Teh podatkov nismo poskušali razčleniti ali kako drugače obdelati, ampak FreeBSD ping program mora to storiti, da osmisli odgovor, vključno z osmislitvijo vseh sporočil o napakah, ki se vrnejo.

Če ping na nek način zavrnjen, bo odgovor Echo Reply običajno vključeval ne le lastne glave IP (kot je prikazano zgoraj), temveč tudi referenčno kopijo glav IP in podatkov ICMP, ki so se pojavili v izvirni izhodni zahtevi.

Glave paketov IPv4 običajno izgledajo podobno kot vidite zgoraj, kjer se začnejo glave IP 45 00 00 37... in nadaljujte skupaj 20 bajtov, do in vključno z bajti, prikazanimi kot ...XX XX XX XX, ki je naslov IP mojega prenosnika.

Všečkaj to:

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 version and header length:     0x45 (4 = IPv4, 5 = five 32-bit words, i.e. 20 bytes 
Service type and congestion data: 0x00
Total length of packet:           0x0037 (decimal 55)
Sequence information:             F6 AF 00 00
Time-to-live (hops left):         0x35 (decimal 53)
Protocol type:                    0x01 (ICMP)
Checksum:                         0x947F (decimal 38015)
Sending computer's IP number:     C0 00 42 E3 (192.0.66.227 = nakedsecurity.sophos.com)
Recipient's IP (my laptop):       XX XX XX XX (REDACTED = my own IP number)

FreeBSD ping zdi se, da so programerji domnevali, da bodo glave te vrste dejansko vedno dolge natanko 20 bajtov, na podlagi te vrednosti dolžine glave v prvem bajtu 0x45, ki označuje IPv4 (0x4?) s 5-DWORD (0x?5) ali 20-bajtno glavo.

S samo 20 bajti, ki jih je bilo treba skrbeti, so programerji dodelili vmesne pomnilnike fiksne velikosti v skladu, kjer so lahko hranili kopijo glav IP v odgovoru in morebitne vdelane glave IP iz prvotne zahteve, če je prišlo do napake, ki jo je treba obravnavati. .

Lahko ugibate, kam to pelje.

Ta prvi bajt v glavi IPv4 ima lahko zakonito katero koli vrednost 0x45 (najmanjša velikost glave 5 DWORD ali 20 bajtov, kot je prikazano) do 0x4F (kar označuje 15 DWORD-ov, ker je 0xF decimalno 15 ali skupno 60 bajtov podatkov glave), kar lepo omogoča izbirnih dodatnih 40 bajtov podatkov glave.

Tisti redki, a dovoljeni dodatni bajti glave se lahko uporabljajo za različne smešne in nenavadne »funkcije« z nenavadnimi imeni, kot je npr. Selektivno režirana oddaja, Eksperimentalni nadzor pretoka in Navzgornji paket Multicast – stvari, za katere smo že slišali, a jih nikoli zavestno uporabljali ali celo videli.

Pazite se kibernetskih kriminalcev, ki vas postavljajo na preizkušnjo

Kot si lahko predstavljate, glede na to, da se ta dodatna polja skoraj nikoli ne uporabljajo, morda nikoli ne boste videli paketa IPv4 s čim drugim kot 0x45 na začetku in s skupno 20 bajti podatkov glave, razen če ste naleteli na kup kibernetskih kriminalcev, ki so vas pripravljeni preizkusiti.

Na žalost ni veliko, kar bi napadalcu preprečilo, da bi namestil strežnik, ki ugiba, ali uporabljate FreeBSD, in namerno ustvari prevelike pakete ICMP/IP Echo Reply, da bi izzval prelivanje medpomnilnika sklada Znotraj tvoje ping Program.

Če kdaj preverite, ali je njihov strežnik aktiven (kar bi lahko storili celo ali morda še posebej, če se vam zdi sumljivo!), bi lahko prejeli odgovor z minirano pastjo.

V najboljšem primeru vaš ping program se bo zrušil; v najslabšem primeru pa, kot velikodušno priznava varnostno svetovanje FreeBSD, "morda je možno, da zlonamerni gostitelj sproži oddaljeno izvajanje kode v pingu."

Na srečo, kot tudi avtorji FreeBSD izpostaviti, »Proces pinga teče v peskovniku načina zmogljivosti na vseh prizadetih različicah FreeBSD in je zato zelo omejen v tem, kako lahko komunicira s preostalim sistemom na točki, kjer lahko pride do napake.«

Z drugimi besedami, zagotovo morate popraviti, vendar je tveganje skromno.

Zlasti ping program ni le zaklenjen v peskovniku, ampak se ne izvaja kot root, ko pride do napake kode, kot je potrjeno v varnostnem nasvetu: "Kdaj ping zažene, ustvari neobdelano vtičnico, potrebno za opravljanje svojega dela, in nato prekliče svoje povišane privilegije.«

Kot je opisano zgoraj, so pooblastila superuporabnika potrebna samo za pridobitev neobdelane vtičnice IP iz operacijskega sistema, ne pa za uporabo sendto() in recvfrom() pozneje deluje na tej vtičnici.

Ta hrošč je dobil uradni identifikator CVE-2022-23093; je dokumentirano v varnostnem svetovanju FreeBSD-SA-22:15.ping.

Kaj storiti?

  • Če ste uporabnik FreeBSD, preprosto posodobite prizadete izdaje (FreeBSD 12 in FreeBSD 13) na najnovejše različice, kjer je ta napaka odpravljena.
  • Če ste omrežni programer, vedno se prepričajte, da ste upoštevali glave paketov, ki bi lahko kazale na neobičajne variacije velikosti. Dejstvo, da sami še nikoli niste videli nobene različice, vas ne prepreči, da bi se jutri soočili s paketom, ki je neobičajen, a popolnoma zakonit.
  • Če ste skrbnik omrežja, razmislite o blokiranju paketov IPv4 z glavami IP, ki niso velike 20 bajtov. Če se vam resnično zdi, da morate nekaterim programskim izdelkom dovoliti uporabo nenavadnih možnosti glave IPv4, razmislite o beleženju teh nenavadnih paketov, da boste izvedeli, zakaj.

Bodite previdni tam zunaj!


PRIMER KODE ZA PRIKAZ PING PROMETA


Časovni žig:

Več od Gola varnost