Ping kematian! FreeBSD memperbaiki bug crashtastic di alat jaringan PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Ping kematian! FreeBSD memperbaiki bug crashtastic di alat jaringan

Salah satu alat jaringan tingkat rendah pertama yang dipelajari oleh setiap pengguna komputer adalah yang terhormat ping utilitas

Dinamakan setelah efek suara eponymous dari setiap dan setiap adegan film perang jadul yang melibatkan kapal selam, perintah tersebut adalah gema metaforis (lihat apa yang kami lakukan di sana?) dari RADAR versi bawah air yang dikenal sebagai SONAR.

Anda mengirimkan ping (lebih seperti suara doinnnng, masuk kenyataan) ke kedalaman air asin, dan dengan mengukur berapa lama gema menakutkannya kembali kepada Anda, dan dengan memperkirakan kecepatan suara di lautan sekitarnya, Anda dapat menghitung jarak ke objek yang menghasilkan gema tersebut.

Menariknya, mengingat Anda mungkin pernah mendengar singkatan TCP/IP digunakan sebagai deskripsi umum dari lem protokol yang menggerakkan internet, ping secara teknis tidak menggunakan TCP/IP sama sekali.

Sebenarnya, TCP/IP adalah kependekan dari protokol kontrol transmisi melalui protokol internet, dan mengacu pada mekanisme tingkat tinggi untuk mengirim data melalui internet sedemikian rupa sehingga jaringan itu sendiri memasukkan banyak pertanyaan "apakah itu benar-benar berfungsi dengan baik?" usaha untukmu.

Misalnya, dalam koneksi TCP, potongan data apa pun yang Anda kirim dijamin tiba utuh di ujung yang lain atau menyebabkan kesalahan sehingga Anda tahu mereka tidak berhasil.

Selain itu, bahkan jika potongan data yang berbeda akhirnya mengambil rute yang berbeda di internet (misalnya karena penyeimbangan muatan, pemadaman sementara, atau kesalahan lain yang dapat dipulihkan), dan bahkan jika beberapa potongan membutuhkan waktu lebih lama untuk sampai daripada yang lain, data TCP akan disangga dengan benar dan disajikan dalam urutan yang benar di ujung lainnya.

Ping berbeda

Grafik ping perintah, bagaimanapun, biasanya digunakan untuk memverifikasi apakah komputer yang Anda minati sedang online, terutama jika itu tidak menerima jenis koneksi TCP tingkat tinggi yang Anda harapkan, seperti menerima email atau mengizinkan login SSH.

Ini dengan cepat membantu Anda menentukan apakah pemadaman mungkin disebabkan oleh jaringan atau server itu sendiri yang mati, atau karena layanan individual yang berjalan di server tersebut gagal memulai dengan benar.

Akibatnya, ping menggunakan protokol tingkat yang jauh lebih rendah daripada TCP.

Memang, ping bahkan tidak menggunakan UDP sepupu TCP yang lebih kasual, kependekan dari protokol datagram pengguna, yang merupakan cara mentransmisikan potongan data yang cepat dan mudah, tetapi secara populer disebut sebagai kirim-dan-harapan (atau, jika Anda orang yang sinis, semprot-dan-doakan).

UDP sendiri tidak memberi tahu Anda apakah data Anda sampai ke ujung yang lain atau tidak, dan bahkan jika tiba utuh, UDP tidak melacak urutan pengiriman paket Anda pada awalnya, sehingga tidak dapat mengatur ulang mereka di ujung yang lain jika mereka sampai di sana tidak berurutan.

Ping, untuk apa nilainya, menggunakan protokol tingkat sangat rendah, yang dirancang khusus untuk tujuan pemecahan masalah dan konfigurasi ulang jaringan, yang dikenal sebagai ICMP, atau protokol pesan kontrol internet.

Biasanya ditangani langsung di kernel sistem operasi, sehingga paket ICMP/IP hampir pasti dapat melewati meskipun tidak ada perangkat lunak jaringan tingkat tinggi yang muncul dengan benar, ICMP secara khusus menyertakan dua jenis pesan khusus:

  • Ketik 0x08. Disebut secara resmi ICMP Echo, Ini semacam paket biasanya disebut Permintaan Gema. Itu apa ping program mengirimkan untuk menyelidiki komputer aktif di jaringan.
  • Ketik 0x00. Disebut secara resmi ICMP Echo Reply, jenis paket ini adalah persis apa yang dikatakannya. Komputer yang hidup, online, dan tidak dikonfigurasi untuk memblokir lalu lintas ICMP Echo seharusnya mengirimkan paket semacam ini langsung kembali ke komputer yang memintanya.

Seperti ini:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com POLA: 0x4e414b45445345435552495459 PING news-sophos.go-vip.net (192.0.66.227) 56(84) byte data. 64 byte dari 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 time=84.0 ms 64 byte dari 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 time=85.1 ms 64 byte dari 192.0.66.227 (192.0.66.227): icmp_seq=3 ttl=53 waktu=84.8 ms --- news-sophos.go-vip.net statistik ping --- 3 paket dikirim, 3 diterima, 0% paket hilang, waktu 2004ms rtt min/ rata-rata/maks/mdev = 84.025/84.644/85.062/0.446 ms

Untuk melihat a ping beraksi pada tingkat yang sedikit lebih rendah, kami akan menggunakan kode Lua yang dapat Anda temukan di akhir artikel untuk membuat paket ICMP Echo kami sendiri, dan untuk membaca balasan yang muncul kembali, jika ada:

$ sudo luax ping.lua nakedsecurity.sophos.com Mengirim permintaan ICMP ECHO ke 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 | Kembali--> 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 |Pesan Permintaan B| 00000030 42 35 41 36 46 31 44 |B5A6F1D |

Omong-omong, kami perlu menggunakan sudo di atas untuk menjalankan skrip kami dengan hak superuser, karena kami membuat apa yang dikenal sebagai a soket IP mentah – yang dapat dibuat menjadi format dasar apa pun yang kita suka, termasuk TCP, UDP dan, sebagaimana diperlukan di sini, ICMP.

Pada banyak sistem Linux/Unix, file ping perintah yang disediakan oleh distro Anda berfungsi tanpa diberikan hak akses root secara eksplisit, biasanya karena diinstal dengan kemampuan keamanan khusus, atau dengan setuid set flag, artinya dimulai dengan berjalan di bawah akun pengguna yang berbeda dari pengguna yang menjalankannya.

Dirancang dengan baik ping program, tentu saja, akan secara otomatis membuang hak ekstra mereka begitu mereka membuka soket mentah yang mereka butuhkan.

Kami menghilangkan kode yang menghilangkan hak istimewa ini dari skrip sampel kami demi singkatnya. Anda dapat menggunakan posix.unistd.setpid() berfungsi untuk beralih ke akun yang tidak memiliki hak istimewa setelah membuat soket, tetapi sebelum mengirim atau menerima data apa pun.

Memeriksa balasan

Seperti yang mungkin Anda kenali dalam dump data dari skrip kami di atas, fungsi soket jaringan yang kami gunakan untuk membaca kembali data dari server yang merespons tidak hanya mencakup data ICMP Echo Reply, tetapi juga IP tingkat rendah (header protokol internet) dalam paket yang mendasarinya.

Kami belum mencoba mengurai atau memproses data ini, tetapi FreeBSD ping program perlu melakukannya untuk memahami balasan, termasuk memahami setiap pesan kesalahan yang muncul kembali.

Jika ping ditolak dalam beberapa cara, Echo Reply biasanya tidak hanya menyertakan header IP-nya sendiri (seperti yang terlihat di atas) tetapi juga salinan referensi dari header IP dan data ICMP yang muncul dalam permintaan keluar asli.

Header paket IPv4 biasanya terlihat seperti yang Anda lihat di atas, di mana header IP dimulai 45 00 00 37... dan lanjutkan untuk total 20 byte, hingga dan termasuk byte yang ditampilkan sebagai ...XX XX XX XX, yang merupakan alamat IP laptop saya.

Seperti ini:

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 |.... | Versi IP dan panjang header: 0x45 (4 = IPv4, 5 = lima kata 32-bit, yaitu 20 byte Jenis layanan dan data kongesti: 0x00 Total panjang paket: 0x0037 (desimal 55) Informasi urutan: F6 AF 00 00 Time-to -live (melompat ke kiri): 0x35 (desimal 53) Jenis protokol: 0x01 (ICMP) Checksum: 0x947F (desimal 38015) Nomor IP komputer pengirim: C0 00 42 E3 (192.0.66.227 = nakedsecurity.sophos.com) IP Penerima (saya laptop): XX XX XX XX (DISUNTING = nomor IP saya sendiri)

FreeBSD ping programmer, tampaknya, berasumsi bahwa header semacam ini, memang, selalu tepat sepanjang 20 byte, berdasarkan nilai panjang header di byte pertama dari 0x45, menunjukkan IPv4 (0x4?) dengan 5 DWORD (0x?5), atau 20-byte, tajuk.

Dengan hanya 20 byte yang perlu dikhawatirkan, pemrogram mengalokasikan buffer ukuran tetap pada tumpukan di mana mereka dapat menyimpan salinan header IP di balasan, ditambah header IP yang disematkan dari permintaan asli, jika ada kondisi kesalahan yang harus ditangani .

Anda bisa menebak ke mana arahnya.

Byte pertama di header IPv4 secara legal dapat memiliki nilai dari 0x45 (ukuran tajuk minimum 5 DWORD, atau 20 byte, seperti yang ditunjukkan) hingga 0x4F (menunjukkan 15 DWORD, karena 0xF adalah 15 desimal, atau total 60 byte data header), sehingga dengan rapi memungkinkan tambahan 40 byte data header opsional.

Byte header tambahan yang langka, tetapi legal, dapat digunakan untuk berbagai "fitur" yang funky dan tidak biasa dengan nama yang aneh seperti Siaran Terarah Selektif, Kontrol Aliran Eksperimental dan Paket Multicast Hulu – hal-hal yang pernah kita dengar tetapi tidak pernah digunakan secara sadar, atau bahkan dilihat.

Waspadalah terhadap penjahat dunia maya yang menguji Anda

Seperti yang dapat Anda bayangkan, mengingat bidang ekstra tersebut hampir tidak pernah digunakan, Anda mungkin tidak akan pernah melihat paket IPv4 selain 0x45 di awal, dan dengan total 20 byte data header, kecuali jika Anda bertemu dengan sekelompok penjahat dunia maya yang siap menguji Anda.

Sayangnya, tidak banyak yang dapat menghentikan penyerang untuk memasang server yang menebak apakah Anda menggunakan FreeBSD, dan dengan sengaja menghasilkan paket ICMP/IP Echo Reply yang terlalu besar untuk memprovokasi tumpukan buffer overflow di dalam ping program.

Jika pernah Anda memeriksa untuk melihat apakah server mereka aktif (yang mungkin Anda lakukan bahkan, atau mungkin terutama, jika menurut Anda itu mencurigakan!), Anda dapat menjadi sasaran dengan balasan jebakan.

Paling-paling, Anda ping program akan macet; paling buruk, bagaimanapun, seperti yang diakui oleh penasehat keamanan FreeBSD, "ada kemungkinan host jahat memicu eksekusi kode jarak jauh dalam ping."

Untungnya, sebagai penulis FreeBSD juga menunjukkan, “Proses ping berjalan dalam sandbox mode kapabilitas pada semua versi FreeBSD yang terpengaruh dan dengan demikian sangat dibatasi dalam cara berinteraksi dengan sistem lainnya pada titik di mana bug dapat terjadi.”

Dengan kata lain, Anda pasti perlu menambal, tetapi risikonya bisa dianggap sederhana.

Khususnya, the ping program tidak hanya dikunci di kotak pasir, tetapi juga tidak berjalan sebagai root saat kode buggy tercapai, seperti yang dikonfirmasi dalam penasihat keamanan: "Kapan ping berjalan, itu membuat soket mentah yang diperlukan untuk melakukan pekerjaannya, dan kemudian mencabut hak istimewanya yang lebih tinggi.

Seperti dijelaskan di atas, kekuatan pengguna super hanya diperlukan untuk memperoleh soket IP mentah dari sistem operasi, bukan untuk menggunakan sendto() dan recvfrom() fungsi pada soket itu sesudahnya.

Bug ini telah diberi pengidentifikasi resmi CVE-2022-23093; itu didokumentasikan dalam penasehat keamanan FreeBSD-SA-22:15.ping.

Apa yang harus dilakukan?

  • Jika Anda adalah pengguna FreeBSD, cukup perbarui rilis yang terpengaruh (FreeBSD 12 dan FreeBSD 13) ke versi terbarunya, tempat bug ini diperbaiki.
  • Jika Anda seorang pemrogram jaringan, selalu pastikan bahwa Anda telah memperhitungkan header paket yang dapat menunjukkan variasi ukuran yang tidak biasa. Fakta bahwa Anda sendiri belum pernah melihat variasi apa pun tidak menghentikan Anda menghadapi paket besok yang tidak biasa namun sepenuhnya legal.
  • Jika Anda seorang manajer jaringan, pertimbangkan untuk memblokir paket IPv4 dengan header IP yang tidak berukuran 20 byte. Jika Anda benar-benar perlu mengizinkan beberapa produk perangkat lunak untuk menggunakan opsi header IPv4 yang tidak biasa, pertimbangkan untuk mencatat paket yang tidak biasa tersebut untuk mempelajari alasannya.

Hati-hati di luar sana!


CONTOH KODE UNTUK MENUNJUKKAN TRAFFIC PING


Stempel Waktu:

Lebih dari Keamanan Telanjang