Ölüm pingi! FreeBSD, PlatoBlockchain Veri Zekası ağ aracındaki kilitlenme hatasını düzeltti. Dikey Arama. Ai.

Ölüm sesi! FreeBSD, ağ aracındaki crashtastic hatasını düzeltir

Herhangi bir bilgisayar kullanıcısının öğrendiği ilk düşük seviyeli ağ araçlarından biri saygıdeğerdir. ping Yarar.

Adını, denizaltıların yer aldığı eski usul savaş filmlerinin her sahnesindeki aynı ses efektinden alan komut, RADAR'ın SONAR olarak bilinen sualtı versiyonunun mecazi bir yankısıdır (orada ne yaptığımıza bakın?).

Bir ping gönderirsiniz (daha çok bir doinnnng sesi gibi, gerçeklik) tuzlu derinliklere ve ürkütücü yankısının size geri dönmesinin ne kadar sürdüğünü ölçerek ve çevredeki okyanustaki sesin hızını tahmin ederek, yankıyı üreten nesneye olan mesafeyi hesaplayabilirsiniz.

Şaşırtıcı bir şekilde, TCP/IP kısaltmasının internete güç sağlayan protokol yapıştırıcısının genel bir tanımı olarak kullanıldığını muhtemelen duymuşsunuzdur. ping teknik olarak hiç TCP/IP kullanmaz.

Aslında, TCP/IP kısaltmasıdır. internet protokolü üzerinden iletim kontrol protokolü, ve internet üzerinden veri göndermek için oldukça yüksek seviyeli bir mekanizmayı ifade eder, öyle ki ağın kendisi pek çok "bu gerçekten düzgün çalıştı mı?" senin için çaba.

Örneğin, TCP bağlantılarında, gönderdiğiniz herhangi bir veri parçasının ya diğer uca bozulmadan ulaşması ya da bir hataya neden olması garanti edilir, böylece başarmadıklarını bilirsiniz.

Ayrıca, farklı veri yığınları internet üzerinde farklı rotalar izlese bile (örneğin, yük dengeleme, geçici kesintiler veya diğer kurtarılabilir hatalar nedeniyle) ve bazı parçaların ulaşması diğerlerinden daha uzun sürse bile, TCP verileri doğru bir şekilde ara belleğe alınır. yukarı ve diğer uçta doğru sırayla sunulur.

ping farklıdır

The ping komutu, bununla birlikte, genellikle ilgilendiğiniz bir bilgisayarın çevrimiçi olup olmadığını doğrulamak için kullanılır, özellikle de e-posta almak veya SSH oturumlarına izin vermek gibi beklediğiniz türden üst düzey TCP bağlantılarını kabul etmiyorsa.

Bu, bir kesintinin ağdan mı yoksa sunucunun kendisinin kapanmasından mı yoksa o sunucuda çalışan bireysel hizmetlerin düzgün başlatılamamasından mı kaynaklandığını hızlı bir şekilde belirlemenize yardımcı olur.

Sonuç olarak, ping TCP'den çok daha düşük seviyeli bir protokol kullanır.

Aslında, ping TCP'nin daha sıradan kuzeni UDP'yi bile kullanmaz, kısacası Kullanıcı Datagram ProtokolüBu, veri yığınlarını hızlı ve kolay bir şekilde iletmenin bir yoludur, ancak popüler olarak gönder ve umut et (veya alaycı biriyseniz, püskürt ve dua et) olarak adlandırılır.

UDP'nin kendisi, verilerinizin karşı uca ulaşıp ulaşmadığını size bildirmez ve sağlam gelse bile UDP, paketlerinizin orijinal olarak gönderilme sırasını takip etmez, bu nedenle onları yeniden düzenleyemez. sıra dışı gelirlerse diğer uç.

Ping, ne pahasına olursa olsun, ICMP olarak bilinen sorun giderme ve ağ yeniden yapılandırma amaçları için özel olarak tasarlanmış çok düşük düzeyli bir protokol kullanır veya internet kontrol mesaj protokolü.

Tipik olarak doğrudan işletim sistemi çekirdeğinde işlenir, böylece ICMP/IP paketlerinin hiçbir üst düzey ağ yazılımı doğru şekilde gelmese bile geçmesi neredeyse kesindir, ICMP özellikle iki özel mesaj türü içerir:

  • 0x08 yazın. Resmen aradı ICMP Echo, bu bir çeşit paket genellikle Yankı İsteği olarak adlandırılır. bu ne ping program, ağdaki aktif bilgisayarları araştırmak için gönderir.
  • 0x00 yazın. Resmen aradı ICMP Echo Reply, bu paket türü tam olarak ne diyor. Canlı, çevrimiçi ve ICMP Yankı trafiğini engelleyecek şekilde yapılandırılmamış bir bilgisayarın bu tür paketleri doğrudan onu isteyen bilgisayara geri göndermesi gerekir.

Bunun gibi:

$ 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

Görmek için ping biraz daha düşük seviyede çalışırken, kendi ICMP Echo paketimizi oluşturmak ve varsa gelen yanıtı okumak için makalenin sonunda bulabileceğiniz Lua kodunu kullanacağız:

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

Bu arada, kullanmamız gerekiyordu sudo Komut dosyamızı süper kullanıcı ayrıcalıklarıyla çalıştırmak için yukarıdaki ham IP soketi – TCP, UDP ve burada gerektiği gibi ICMP dahil olmak üzere istediğimiz herhangi bir temel formatta üretilebilen bir format.

Birçok Linux/Unix sisteminde, ping Dağıtımınız tarafından sağlanan komut, genellikle özel güvenlik yetenekleriyle veya özel güvenlik özellikleriyle yüklendiğinden, açıkça kök ayrıcalıkları verilmeden çalışır. setuid bayrak seti, yani onu çalıştıran kullanıcıdan farklı bir kullanıcı hesabı altında çalışmaya başlar.

İyi tasarlanmış ping programlar, ihtiyaç duydukları ham soketi açtıktan sonra, elbette, ekstra ayrıcalıklarını otomatik olarak atacaktır.

Kısa olması adına bu ayrıcalık düşürücü kodu örnek betiğimizden çıkardık. kullanabilirsiniz posix.unistd.setpid() soketi oluşturduktan sonra, ancak herhangi bir veri göndermeden veya almadan önce ayrıcalıksız bir hesaba geçme işlevi.

Cevabı incelemek

Yukarıdaki betiğimizden veri dökümünde fark edebileceğiniz gibi, yanıt veren sunucudan verileri geri okumak için kullandığımız ağ soketi işlevi yalnızca ICMP Echo Reply verilerini değil, aynı zamanda düşük seviyeli IP'yi (internet protokol başlıkları) da içerir. temel pakette.

Bu verileri ayrıştırmayı veya başka bir şekilde işlemeyi denemedik, ancak FreeBSD ping programın, geri gelen herhangi bir hata mesajını anlamlandırmak da dahil olmak üzere yanıtı anlamlandırmak için bunu yapması gerekir.

Eğer ping bir şekilde reddedilirse, Yankı Yanıtı tipik olarak yalnızca kendi IP başlıklarını (yukarıda görüldüğü gibi) değil, aynı zamanda orijinal giden istekte görünen IP başlıklarının ve ICMP verilerinin bir referans kopyasını da içerecektir.

IPv4 paket başlıkları genellikle yukarıda gördüğünüz gibi görünür, IP başlıklarının başladığı yer 45 00 00 37... ve şekilde gösterilen baytlara kadar ve dahil olmak üzere toplamda 20 bayt boyunca devam edin. ...XX XX XX XX, dizüstü bilgisayarımın IP adresi.

Bunun gibi:

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'ler ping Görünüşe göre programcılar, bu türden başlıkların, ilk bayttaki başlık uzunluğu değerine bağlı olarak, gerçekten de her zaman tam olarak 20 bayt uzunluğunda olacağını varsaydılar. 0x45, IPv4'ü (0x4?) 5-DWORD ile (0x?5) veya 20 baytlık başlık.

Endişelenecek sadece 20 bayt ile programcılar, yanıtta IP üstbilgilerinin bir kopyasını ve işlenecek bir hata durumu varsa orijinal istekteki tüm gömülü IP üstbilgilerini tutabilecekleri yığında sabit boyutlu arabellekler ayırdı. .

Bunun nereye varacağını tahmin edebilirsiniz.

IPv4 başlığındaki bu ilk bayt yasal olarak herhangi bir değere sahip olabilir. 0x45 (gösterildiği gibi minimum başlık boyutu 5 DWORD veya 20 bayt) 0x4F (15 DWORD'u belirtir, çünkü 0xF ondalık 15 veya toplamda 60 bayt başlık verisidir), böylece isteğe bağlı fazladan 40 bayt başlık verisine düzgün bir şekilde izin verilir.

Bu nadir, ancak yasal, ekstra başlık baytları, aşağıdakiler gibi ilginç adlara sahip çeşitli korkak ve sıra dışı "özellikler" için kullanılabilir: Seçici Yönlendirmeli Yayın, Deneysel Akış Kontrolü ve Yukarı Akış Çok Noktaya Yayın Paketi – adını duyduğumuz ama bilerek kullanmadığımız, hatta görmediğimiz şeyler.

Sizi teste tabi tutan siber suçlulara dikkat edin

Tahmin edebileceğiniz gibi, bu ekstra alanların neredeyse hiç kullanılmadığı göz önüne alındığında, IPv4 paketinden başka bir şeyle asla göremeyebilirsiniz. 0x45 sizi test etmeye hazır bir grup siber suçluyla karşılaşmadığınız sürece, başlangıçta ve toplamda 20 baytlık başlık verisiyle.

Ne yazık ki, bir saldırganın FreeBSD kullanıp kullanmadığınızı tahmin eden bir sunucuyu donatmasını engelleyecek pek bir şey yoktur ve kasıtlı olarak büyük boyutlu ICMP/IP Echo Reply paketleri oluşturur. yığın arabellek taşması senin içinde ping programı.

Sunucularının aktif olup olmadığını kontrol ettiğinizde (hatta veya belki de özellikle şüpheli olduğunu düşünüyorsanız!), bubi tuzaklı bir yanıtın hedefi olabilirsiniz.

en iyi ihtimalle, senin ping program çökecek; en kötü ihtimalle, FreeBSD güvenlik danışma belgesinin cömertçe kabul ettiği gibi, "kötü niyetli bir ana bilgisayarın ping'de uzaktan kod yürütmeyi tetiklemesi mümkün olabilir."

Neyse ki, FreeBSD yazarlarının da işaret etmek, "[t]ping işlemi, FreeBSD'nin etkilenen tüm sürümlerinde bir yetenek modu sanal alanında çalışır ve bu nedenle, hatanın ortaya çıkabileceği noktada sistemin geri kalanıyla nasıl etkileşime girebileceği konusunda çok kısıtlıdır."

Başka bir deyişle, kesinlikle yama yapmanız gerekir, ancak riskler mütevazı sayılabilir.

Özellikle, ping program yalnızca bir sanal alanda kilitli değil, aynı zamanda güvenlik danışma belgesinde onaylandığı gibi hatalı koda ulaşıldığında kök olarak çalışmıyor: "Ne zaman ping çalışır, işini yapmak için gereken ham soketi oluşturur ve ardından yükseltilmiş ayrıcalıklarını iptal eder.”

Yukarıda açıklandığı gibi, süper kullanıcı yetkileri yalnızca işletim sisteminden ham bir IP soketi almak için gereklidir; sendto() ve recvfrom() daha sonra bu sokette çalışır.

Bu hataya resmi tanımlayıcı verildi CVE-2022-23093; güvenlik danışma belgesinde belgelenmiştir ÜcretsizBSD-SA-22:15.ping.

Ne yapalım?

  • FreeBSD kullanıcısıysanız, etkilenen sürümleri (FreeBSD 12 ve FreeBSD 13) bu hatanın düzeltildiği en son sürümlerine güncellemeniz yeterlidir.
  • Bir ağ programcısıysanız, olağandışı boyut varyasyonlarını gösterebilecek paket başlıklarını hesaba kattığınızdan her zaman emin olun. Daha önce hiç varyasyon görmemiş olmanız, yarın sıra dışı ama tamamen yasal bir paketle karşılaşmanızı engellemez.
  • Bir ağ yöneticisiyseniz, 4 bayt boyutunda olmayan IP başlıklarına sahip IPv20 paketlerini engellemeyi düşünün. Bazı yazılım ürünlerinin alışılmadık IPv4 başlık seçeneklerini kullanmasına gerçekten izin vermeniz gerekiyorsa, nedenini öğrenmek için bu olağandışı paketleri günlüğe kaydetmeyi düşünün.

Orada dikkatli ol!


PING TRAFİĞİNİ GÖSTERMEK İÇİN ÖRNEK KOD


Zaman Damgası:

Den fazla Çıplak Güvenlik