Ping de moarte! FreeBSD remediază erori crashtastic în instrumentul de rețea PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Ping de moarte! FreeBSD remediază erori crashtastic în instrumentul de rețea

Unul dintre primele instrumente de rețea de nivel scăzut despre care învață orice utilizator de computer este venerabilul ping utilitate.

Numit după efectul de sunet omonim de la orice scenă de film de război vechi de școală care implică submarine, comanda este un ecou metaforic (vedeți ce am făcut acolo?) al versiunii subacvatice a RADAR cunoscută sub numele de SONAR.

Trimiți un ping (mai mult ca un zgomot de făcut, în realitate) în adâncurile sărace și măsurând cât timp durează ecoul său ciudat să revină la dvs. și estimând viteza sunetului în oceanul din jur, puteți calcula distanța până la obiectul care a produs ecoul.

În mod intrigant, având în vedere că probabil ați auzit abrevierea TCP/IP folosită ca descriere generică a lipiciului de protocol care alimentează internetul, ping tehnic nu folosește deloc TCP/IP.

De fapt, TCP/IP este prescurtarea pentru protocol de control al transmisiei prin protocolul internet, și se referă la un mecanism de nivel destul de înalt pentru trimiterea de date prin internet în așa fel încât rețeaua însăși pune o mulțime de „a funcționat într-adevăr corect?” efort pentru tine.

De exemplu, în conexiunile TCP, orice bucăți de date pe care le trimiteți sunt garantate fie că vor ajunge intacte la celălalt capăt, fie vor provoca o eroare, astfel încât să știți că nu au reușit.

În plus, chiar dacă diferite bucăți de date ajung să ia rute diferite pe internet (de exemplu din cauza echilibrării încărcării, întreruperi temporare sau alte erori recuperabile) și chiar dacă unele bucăți durează mai mult să ajungă decât altele, datele TCP vor fi tamponate corect sus și prezentate în ordinea corectă la celălalt capăt.

Ping este diferit

ping Comanda, totuși, este folosită de obicei pentru a verifica dacă un computer de care sunteți interesat este online deloc, mai ales dacă nu acceptă tipul de conexiuni TCP de nivel înalt la care v-ați aștepta, cum ar fi primirea de e-mailuri sau autentificarea SSH.

Acest lucru vă ajută să determinați rapid dacă o întrerupere este probabil să fie din cauza căderii rețelei sau a serverului însuși sau din cauza unor servicii individuale care rulează pe acel server nu pornesc corect.

Ca rezultat, ping folosește un protocol de nivel mult mai scăzut decât TCP.

Într-adevăr, ping nici măcar nu folosește UDP, vărul mai casual al TCP, prescurtare pentru protocol de datagramă utilizator, care este o modalitate de transmitere a fragmentelor de date care este rapidă și ușoară, dar este denumită în mod popular send-and-hope (sau, dacă sunteți un tip cinic, spray-and-pray).

UDP în sine nu vă informează dacă datele dvs. au ajuns la celălalt capăt sau nu și, chiar dacă ajung intacte, UDP nu ține evidența ordinei în care pachetele dvs. au fost trimise inițial, așa că nu le poate rearanja la celălalt capăt dacă ajung acolo din secvență.

Ping, pentru cât merită, folosește un protocol de nivel foarte scăzut, special conceput pentru depanare și reconfigurare a rețelei, cunoscut sub numele de ICMP, sau protocolul de mesaje de control pe internet.

De obicei, gestionat chiar în nucleul sistemului de operare, astfel încât pachetele ICMP/IP sunt aproape sigure că vor ajunge chiar dacă niciun software de rețea de nivel superior nu a apărut corect, ICMP include în special două tipuri speciale de mesaje:

  • Tastați 0x08. Numit oficial ICMP Echo, Acest un fel de pachet este de obicei numită o cerere de eco. Este ceea ce ping programul trimite pentru a căuta computere active în rețea.
  • Tastați 0x00. Numit oficial ICMP Echo Reply, acest tip de pachet este exact ce scrie. Un computer care este în viață, online și care nu este configurat pentru a bloca traficul ICMP Echo ar trebui să trimită acest tip de pachet direct înapoi către computerul care l-a solicitat.

Asa:

$ 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

Pentru a vedea o ping în acțiune la un nivel puțin mai scăzut, vom folosi codul Lua pe care îl puteți găsi la sfârșitul articolului pentru a construi un pachet ICMP Echo al nostru și pentru a citi răspunsul care revine, dacă există:

$ 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         |

Apropo, trebuia să folosim sudo de mai sus pentru a rula scriptul nostru cu privilegii de superutilizator, pentru că am creat ceea ce se numește a priză IP brută – unul care poate fi creat în orice format care ne place, inclusiv TCP, UDP și, după cum este necesar aici, ICMP.

Pe multe sisteme Linux/Unix, ping comanda furnizată de distribuția dvs. funcționează fără a primi în mod explicit privilegii de rădăcină, de obicei pentru că este instalată cu capabilități speciale de securitate sau cu setuid flag set, ceea ce înseamnă că începe cu rularea sub un alt cont de utilizator decât utilizatorul care l-a rulat.

Ei bine concepute ping programele, desigur, vor renunța automat la privilegiile lor suplimentare odată ce au deschis soclul brut de care au nevoie.

Am omis acest cod de pierdere a privilegiilor din exemplul nostru de script din motive de concizie. Puteți folosi posix.unistd.setpid() funcția de a comuta la un cont neprivilegiat după crearea socket-ului, dar înainte de a trimite sau de a primi date.

Examinând răspunsul

După cum s-ar putea să recunoașteți în dump-ul de date din scriptul nostru de mai sus, funcția de socket de rețea pe care o folosim pentru a citi înapoi datele de la serverul care răspunde include nu numai datele ICMP Echo Reply, ci și IP-ul de nivel scăzut (antetele protocolului de internet) în pachetul de bază.

Nu am încercat să analizăm sau să procesăm în alt mod aceste date, ci FreeBSD ping programul trebuie să facă acest lucru pentru a înțelege răspunsul, inclusiv pentru a înțelege orice mesaje de eroare care revin.

În cazul în care ping este respins într-un fel, Echo Reply va include de obicei nu numai propriile antete IP (după cum s-a văzut mai sus), ci și o copie de referință a antetelor IP și datele ICMP care au apărut în cererea originală de ieșire.

Anteturile de pachete IPv4 arată de obicei mult ca cele pe care le vedeți mai sus, de unde încep anteturile IP 45 00 00 37... și continuați pentru 20 de octeți în total, până la și inclusiv octeții afișați ca ...XX XX XX XX, care este adresa IP a laptopului meu.

Asa:

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-uri ping programatorii, se pare, au presupus că anteturile de acest fel ar avea, într-adevăr, întotdeauna exact 20 de octeți, pe baza acelei valori a lungimii antetului din primul octet al 0x45, indicând IPv4 (0x4?) cu 5-DWORD (0x?5), sau antet de 20 de octeți.

Cu doar 20 de octeți de care să vă faceți griji, programatorii au alocat buffer-uri de dimensiune fixă ​​pe stivă unde puteau păstra o copie a antetelor IP în răspuns, plus orice antete IP încorporate din cererea originală, dacă exista o condiție de eroare de tratat .

Puteți ghici unde se duce asta.

Primul octet din antetul IPv4 poate avea legal orice valoare de la 0x45 (dimensiunea minimă a antetului de 5 DWORD sau 20 de octeți, după cum se arată) până la 0x4F (indicând 15 DWORD, deoarece 0xF este zecimală 15, sau 60 de octeți de date antet în total), permițând astfel în mod clar opțional 40 de octeți de date de antet.

Acei octeți de antet suplimentari rari, dar legali, pot fi utilizați pentru diverse „funcții” neobișnuite și neobișnuite, cu nume curioase, cum ar fi Difuzare selectivă regizată, Controlul experimental al fluxului și Pachet multicast în amonte – lucruri despre care am auzit, dar nu le-am folosit cu bună știință sau chiar am văzut.

Atenție la infractorii cibernetici care vă pun la încercare

După cum vă puteți imagina, având în vedere că acele câmpuri suplimentare nu sunt aproape niciodată folosite, este posibil să nu vedeți niciodată un pachet IPv4 cu altceva decât 0x45 la început și cu 20 de octeți de date de antet în total, cu excepția cazului în care ați întâlnit o grămadă de criminali cibernetici care sunt gata să vă pună la încercare.

Din păcate, nu există prea multe care să împiedice un atacator să creeze un server care ghicește dacă utilizați FreeBSD și generează în mod deliberat pachete de răspuns ICMP/IP Echo supradimensionate pentru a provoca un depășirea tamponului stivei în interiorul tău ping programul.

Dacă verificați vreodată dacă serverul lor este activ (ceea ce ați putea face chiar și, sau poate mai ales, dacă credeți că este suspect!), ați putea fi vizat cu un răspuns prin capcană.

În cel mai bun caz, dvs ping programul se va bloca; în cel mai rău caz, însă, după cum recunoaște cu generozitate avizul de securitate FreeBSD, „Este posibil ca o gazdă rău intenționată să declanșeze execuția de cod de la distanță în ping.”

Din fericire, ca și autorii FreeBSD A arăta, „Procesul de ping rulează într-un mod sandbox de capacitate pe toate versiunile de FreeBSD afectate și, prin urmare, este foarte limitat în ceea ce privește modul în care poate interacționa cu restul sistemului în punctul în care poate apărea eroarea.”

Cu alte cuvinte, trebuie neapărat să peticeți, dar riscurile pot fi considerate modeste.

În special, ping programul nu este doar blocat într-un sandbox, dar nu rulează ca root atunci când este atins codul bug, după cum se confirmă în avizul de securitate: "Cand ping rulează, creează socket-ul brut necesar pentru a-și face treaba, apoi își revocă privilegiile ridicate.”

După cum este descris mai sus, puterile superutilizatorului sunt necesare numai pentru a achiziționa o soclu IP brut de la sistemul de operare, nu pentru a utiliza sendto() și recvfrom() funcţionează pe priza respectivă după aceea.

Acest bug a primit identificatorul oficial CVE-2022-23093; este documentat în avizul de securitate FreeBSD-SA-22:15.ping.

Ce să fac?

  • Dacă sunteți utilizator FreeBSD, pur și simplu actualizați versiunile afectate (FreeBSD 12 și FreeBSD 13) la cele mai recente versiuni, unde această eroare este remediată.
  • Dacă ești programator de rețea, asigurați-vă întotdeauna că ați luat în considerare antetele pachetelor care ar putea indica variații neobișnuite de dimensiune. Faptul că nu ai văzut niciodată nicio variantă nu te împiedică să te confrunți mâine cu un pachet care este ieșit din comun, dar perfect legal.
  • Dacă sunteți administrator de rețea, luați în considerare blocarea pachetelor IPv4 cu anteturi IP care nu au o dimensiune de 20 de octeți. Dacă se pare că trebuie să permiteți unor produse software să utilizeze opțiuni neobișnuite de antet IPv4, luați în considerare înregistrarea acestor pachete neobișnuite pentru a afla de ce.

Ai grijă acolo!


EXEMPLU DE COD PENTRU A DEMONSTRA TRAFICUL PING


Timestamp-ul:

Mai mult de la Securitate goală