Ping of death! A FreeBSD kijavítja a PlatoBlockchain Data Intelligence hálózati eszköz összeomló hibáját. Függőleges keresés. Ai.

Halál ping! A FreeBSD kijavítja a hálózati eszköz katasztrofális hibáját

Az egyik első alacsony szintű hálózati eszköz, amelyről bármely számítógép-felhasználó megismeri, a tiszteletreméltó ping hasznosság.

A tengeralattjárókat is magában foglaló régi iskolai háborús filmek azonos nevű hangeffektusáról nevezték el, a parancs a RADAR SONAR néven ismert víz alatti változatának metaforikus visszhangja (lásd, mit csináltunk ott?).

Kiküld egy pinget (inkább egy zajt, be valóság) a sós mélységbe, és megmérve, mennyi idő alatt tér vissza a kísérteties visszhangja, és megbecsülve a hangsebességet a környező óceánban, kiszámíthatja a visszhangot kiváltó tárgy távolságát.

Érdekes módon, mivel valószínűleg hallotta már a TCP/IP rövidítést az internetet működtető protokollragasztó általános leírásaként, ping technikailag egyáltalán nem használ TCP/IP-t.

Valójában a TCP/IP a rövidítése átvitelvezérlő protokoll az internet protokollon keresztül, és egy meglehetősen magas szintű adatátviteli mechanizmusra hivatkozik az interneten oly módon, hogy maga a hálózat sok „működött ez megfelelően?” erőfeszítést érted.

Például a TCP-kapcsolatokban minden elküldött adatdarab garantáltan vagy érintetlenül érkezik a másik végére, vagy hibát okoz, így tudhatja, hogy nem jutottak el.

Ezen túlmenően, még akkor is, ha a különböző adattömbök különböző útvonalakat vezetnek be az interneten (például terheléselosztás, átmeneti kimaradások vagy más helyrehozható hibák miatt), és még akkor is, ha egyes adatdarabok megérkezése tovább tart, mint másoké, a TCP-adatok pufferelése megfelelően történik. fel, és a másik végén a megfelelő sorrendben mutatják be.

A ping más

A ping A parancs azonban jellemzően annak ellenőrzésére szolgál, hogy az Önt érdeklő számítógép online állapotban van-e, különösen akkor, ha nem fogadja el az elvárt magas szintű TCP-kapcsolatokat, például e-maileket vagy SSH-bejelentkezést.

Ez gyorsan segít meghatározni, hogy a kimaradás oka valószínűleg a hálózat vagy maga a kiszolgáló leállása, vagy az adott kiszolgálón futó egyes szolgáltatások nem indulnak el megfelelően.

Ennek eredményeként, ping sokkal alacsonyabb szintű protokollt használ, mint a TCP.

Valóban, ping nem is használja a TCP egyszerűbb rokona UDP-t, a rövidítése felhasználói datagram protokoll, amely az adattömbök gyors és egyszerű továbbításának egyik módja, de közismerten küldés-reménykedésként (vagy ha cinikusan gondolkodunk, spray-and-pray) néven emlegetik.

Az UDP maga nem tájékoztat arról, hogy az adatok a másik végére kerültek-e vagy sem, és még ha érintetlenül is megérkeznek, az UDP nem követi nyomon a csomagok eredeti küldési sorrendjét, így nem tudja átrendezni őket a másik végét, ha soron kívül odaérnek.

Ping, amiért megéri, egy nagyon alacsony szintű, kifejezetten hibaelhárítási és hálózat-újrakonfigurálási célokra tervezett protokollt használ, az ICMP néven, ill. internetes vezérlő üzenet protokoll.

Jellemzően közvetlenül az operációs rendszer kernelében kezelik, így az ICMP/IP-csomagok szinte biztos, hogy átjutnak még akkor is, ha nem jött létre megfelelően magasabb szintű hálózati szoftver, az ICMP két speciális üzenettípust tartalmaz:

  • Írja be a 0x08-at. Hivatalosan hívták ICMP Echo, Ez egyfajta csomag általában visszhangkérésnek nevezik. Ez az, amit a ping program küldi el a hálózaton lévő aktív számítógépek keresésére.
  • Írja be a 0x00-at. Hivatalosan hívták ICMP Echo Reply, ez a csomagtípus az pontosan mit mond. Egy olyan számítógépnek, amely él, online, és nincs beállítva az ICMP Echo forgalom blokkolására, ezt a fajta csomagot egyenesen vissza kell küldenie annak a számítógépnek, amelyik kérte.

Mint ez:

$ ping -c 3 -p 4e414b45445345435552495459 NakedSecurity. 0 bájt 4-től (414): icmp_seq=45445345435552495459 ttl=192.0.66.227 time=56 ms 84 bájt 64-től (192.0.66.227): icmp_seq=192.0.66.227 1 53x84.0 64 192.0.66.227 x 192.0.66.227 ttl. .2 (53): icmp_seq=85.1 ttl=64 idő=192.0.66.227 ms --- news-sophos.go-vip.net ping statisztika --- 192.0.66.227 csomag továbbított, 3 fogadott, 53% csomagvesztés, idő 84.8ms rtt min/ avg/max/mdev = 3/3/0/2004 ms

Látni a ping Ha valamivel alacsonyabb szinten működik, a cikk végén található Lua kódot használjuk egy saját ICMP Echo csomag létrehozásához, és a visszaküldött válasz elolvasásához, ha van ilyen:

$ sudo luax ping.lua nakedsecurity.sophos.com ICMP ECHO kérés küldése a 192.0.66.227 --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 . 65 71 75 00000010 65d 73 74 4 65 73 73 61 67 65 20 42 42 |estÜzenet BB35A41| 36 5 6 00000020 |F46D | Visszakaptam--> 31 44 1 00000000 45 f00 af 00 37 6 00 00 35f c01 94 7 e0 |E..00....42.....B.| 3 XX XX XX XX 7 5 00000010b 00 bb 00a 0f 02d 5 6 1e 50 |.........Zo.Ping| 69 6 67 00000020 52 65 71 75 65d 73 74 4 65 73 73 61 67 |Kérés B| 65 20 42 00000030 42 35 41 36 |B46A31F44D |

Mellesleg használnunk kellett sudo fent, hogy szuperfelhasználói jogosultságokkal futtassuk a szkriptünket, mert létrehoztuk az úgynevezett a nyers IP foglalat – olyan, amely bármilyen mögöttes formátumba alakítható, amilyet szeretünk, beleértve a TCP-t, az UDP-t és szükség szerint az ICMP-t.

Számos Linux/Unix rendszeren a ping A disztribúció által biztosított parancs anélkül működik, hogy kifejezetten root jogosultságot kapna, általában azért, mert speciális biztonsági képességekkel vagy setuid zászlókészlet, ami azt jelenti, hogy egy másik felhasználói fiók alatt fut, mint az a felhasználó, aki futtatta.

Jól megtervezett ping A programok természetesen automatikusan elvetik az extra jogosultságokat, amint megnyitották a szükséges nyers socketet.

Ezt a privilégium-eldobó kódot a rövidség kedvéért kihagytuk a mintaszkriptünkből. Használhatja a posix.unistd.setpid() funkcióval a socket létrehozása után, de még az adatok küldése vagy fogadása előtt nem jogosult fiókra válthat.

A válasz vizsgálata

Amint azt a fenti szkriptünk adatkiíratásában is felismerheti, a hálózati socket funkció, amelyet a válaszoló szerver adatainak visszaolvasására használunk, nem csak az ICMP Echo Reply adatokat tartalmazza, hanem az alacsony szintű IP-címet (internetprotokoll fejlécek) is. az alapul szolgáló csomagban.

Nem ezeket az adatokat próbáltuk elemezni vagy más módon feldolgozni, csak a FreeBSD-t ping A programnak ezt meg kell tennie annak érdekében, hogy értelmezze a választ, beleértve a visszatérő hibaüzeneteket is.

Ha a ping Ha valamilyen módon elutasításra kerül, az Echo Reply jellemzően nem csak a saját IP-fejléceit tartalmazza (amint fentebb látható), hanem az IP-fejlécek referenciapéldányát és az eredeti kimenő kérésben megjelent ICMP-adatokat is.

Az IPv4-csomagfejlécek általában úgy néznek ki, mint fentebb, ahol az IP-fejlécek kezdődnek 45 00 00 37... és folytassa összesen 20 bájton keresztül, egészen a mintában látható bájtokig ...XX XX XX XX, ami a laptopom IP-címe.

Mint ez:

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-verzió és fejléc hossza: 0x45 (4 = IPv4, 5 = öt 32 bites szó, azaz 20 bájt Szolgáltatás típusa és torlódási adatok: 0x00 Csomag teljes hossza: 0x0037 (tizedes 55) Sorozat információ: F6 AF 00 00 Időpont -élő (ugrás balra): 0x35 (decimális 53) Protokoll típusa: 0x01 (ICMP) Ellenőrző összeg: 0x947F (decimális 38015) A küldő számítógép IP-száma: C0 00 42 E3 (192.0.66.227)s IPomyphpient.com. laptop): XX XX XX XX (REDACTED = saját IP-számom)

FreeBSD-k ping Úgy tűnik, a programozók azt feltételezték, hogy az ilyen típusú fejlécek valóban mindig pontosan 20 bájt hosszúak, a fejléc hosszának az első bájtjában lévő értéke alapján. 0x45, IPv4 (0x4?) egy 5 duplaszóval (0x?5), vagy 20 bájtos fejléc.

Mivel mindössze 20 bájt miatt kellett aggódni, a programozók rögzített méretű puffereket osztottak ki a veremben, ahol megtarthatták a válaszban szereplő IP-fejlécek másolatát, valamint az eredeti kérésből származó beágyazott IP-fejléceket, ha valamilyen kezelendő hiba volt. .

Lehet találgatni, hová megy ez.

Az IPv4 fejléc első bájtja törvényesen bármilyen értékkel bírhat 0x45 (a minimális fejléc mérete 5 duplaszó vagy 20 bájt, az ábrán látható módon) legfeljebb 0x4F (15 duplaszót jelöl, mert a 0xF decimális 15, vagyis összesen 60 bájt fejlécadat), így szépen lehetővé teszi az opcionális további 40 bájt fejlécadat.

Azok a ritka, de legális, extra fejléc bájtok felhasználhatók különféle funky és szokatlan „funkciókhoz”, különös nevekkel, mint pl. Szelektív irányított adás, Kísérleti áramlásszabályozás és a Upstream Multicast Packet – olyan dolgok, amelyekről hallottunk, de tudatosan soha nem használtunk, sőt nem is láttunk.

Óvakodj a kiberbűnözőktől, akik próbára tesznek téged

Ahogy el tudja képzelni, mivel ezeket az extra mezőket szinte soha nem használják, előfordulhat, hogy soha nem lát IPv4-csomagot mással, mint 0x45 az elején, és összesen 20 bájt fejlécadatokkal, hacsak nem futott össze egy csomó kiberbűnözővel, akik készen állnak arra, hogy próbára tegyenek.

Sajnos nincs sok akadálya annak, hogy egy támadó összecsaljon egy szervert, amely kitalálja, hogy FreeBSD-t használ-e, és szándékosan túlméretezett ICMP/IP Echo Reply csomagokat generál, hogy provokáljon verem puffer túlcsordulás benned ping program.

Ha valaha is ellenőrzi, hogy a szerverük aktív-e (amit akár meg is tesz, vagy talán különösen, ha gyanúsnak gondolja!), egy csapdába esett válasz célpontja lehet.

Legjobb esetben a tiéd ping a program összeomlik; a legrosszabb esetben azonban, ahogy a FreeBSD biztonsági tanácsadója nagylelkűen elismeri, "Lehetséges, hogy egy rosszindulatú gazdagép távoli kódfuttatást indítson el a ping alatt."

Szerencsére, ahogy a FreeBSD szerzői is rámutat, "A ping folyamat képesség módú sandboxban fut a FreeBSD összes érintett verzióján, és ezért nagyon korlátozott abban, hogy miként tud együttműködni a rendszer többi részével azon a ponton, ahol a hiba előfordulhat."

Vagyis mindenképpen foltozni kell, de a kockázatok szerénynek tekinthetők.

Különösen a ping A program nem csak zárolva van egy homokozóban, de nem fut rootként, amikor a hibás kódot elérik, amint azt a biztonsági figyelmeztetés is megerősíti: "Amikor ping lefut, létrehozza a munkájához szükséges nyers socketet, majd visszavonja a megnövekedett jogosultságait."

A fent leírtak szerint a szuperfelhasználói jogosultságok csak egy nyers IP-aljzat beszerzéséhez szükségesek az operációs rendszerből, nem pedig a sendto() és a recvfrom() utána azon az aljzaton működik.

Ez a hiba hivatalos azonosítót kapott CVE-2022 23093-; a biztonsági tájékoztatóban dokumentálva van FreeBSD-SA-22:15.ping.

Mit kell tenni?

  • Ha Ön FreeBSD felhasználó, egyszerűen frissítse az érintett kiadásokat (FreeBSD 12 és FreeBSD 13) a legújabb verziókra, ahol ez a hiba javítva van.
  • Ha Ön hálózati programozó, mindig győződjön meg arról, hogy figyelembe vette azokat a csomagfejléceket, amelyek szokatlan méretváltozásokat jelezhetnek. Az a tény, hogy még soha nem láttál semmilyen variációt, nem akadályoz meg abban, hogy holnap olyan csomaggal nézz szembe, amely a szokásostól eltérő, mégis teljesen legális.
  • Ha Ön hálózatmenedzser, fontolja meg a nem 4 bájt méretű IPv20-csomagok blokkolását. Ha valóban úgy tűnik, hogy bizonyos szoftvertermékeknek engedélyeznie kell a szokatlan IPv4-fejlécbeállítások használatát, fontolja meg a szokatlan csomagok naplózását, hogy megtudja, miért.

Vigyázz odakint!


PÉLDAKÓD A PING FORGALOM BEMUTATÁSÁRA


Időbélyeg:

Még több Meztelen biztonság