ปิงมรณะ! FreeBSD แก้ไขข้อผิดพลาดที่ผิดพลาดในเครื่องมือเครือข่าย PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

ปิงแห่งความตาย! FreeBSD แก้ไขข้อผิดพลาดที่ผิดพลาดในเครื่องมือเครือข่าย

หนึ่งในเครื่องมือเครือข่ายระดับต่ำตัวแรกที่ผู้ใช้คอมพิวเตอร์ทุกคนเรียนรู้คือผู้เคารพนับถือ ping ประโยชน์

ตั้งชื่อตามซาวด์เอฟเฟกต์จากฉากภาพยนตร์สงครามในโรงเรียนเก่าทุกฉากที่เกี่ยวข้องกับเรือดำน้ำ คำสั่งนี้เป็นเสียงสะท้อนเชิงเปรียบเทียบ (ดูว่าเราทำอะไรที่นั่น) ของเรดาร์รุ่นใต้น้ำที่รู้จักกันในชื่อ SONAR

คุณส่ง ping ออกไป (คล้ายกับเสียงที่ดังขึ้นใน ความจริง) ลงไปในน้ำลึกที่มีน้ำเค็ม และการวัดว่าต้องใช้เวลานานแค่ไหนกว่าที่เสียงสะท้อนที่น่าขนลุกจะกลับมาหาคุณ และโดยการประมาณความเร็วของเสียงในมหาสมุทรโดยรอบ คุณจะสามารถคำนวณระยะทางไปยังวัตถุที่สร้างเสียงสะท้อนได้

น่าประหลาดใจที่คุณอาจเคยได้ยินคำย่อ TCP/IP ที่ใช้เป็นคำอธิบายทั่วไปของกาวโปรโตคอลที่ขับเคลื่อนอินเทอร์เน็ต ping ไม่ได้ใช้ TCP/IP ในทางเทคนิคเลย

ที่จริงแล้ว TCP/IP นั้นย่อมาจาก โปรโตคอลควบคุมการส่งผ่านอินเทอร์เน็ตโปรโตคอลและหมายถึงกลไกระดับสูงพอสมควรสำหรับการส่งข้อมูลผ่านอินเทอร์เน็ตในลักษณะที่เครือข่ายเองแสดงความคิดเห็นมากมายว่า "ใช้งานได้จริงหรือไม่" ความพยายามสำหรับคุณ

ตัวอย่างเช่น ในการเชื่อมต่อ TCP ข้อมูลใดๆ ที่คุณส่งจะรับประกันได้ว่าจะไม่เสียหายที่ปลายอีกด้านหรือทำให้เกิดข้อผิดพลาด ดังนั้นคุณจึงรู้ว่าไม่ได้สร้างขึ้น

นอกจากนี้ แม้ว่ากลุ่มข้อมูลที่แตกต่างกันจะลงเอยด้วยเส้นทางที่แตกต่างกันในอินเทอร์เน็ต (เช่น เนื่องจากโหลดบาลานซ์ การหยุดทำงานชั่วคราว หรือข้อผิดพลาดที่สามารถกู้คืนได้อื่นๆ) และแม้ว่าบางกลุ่มใช้เวลานานกว่าจะมาถึง ข้อมูล TCP จะถูกบัฟเฟอร์อย่างถูกต้อง ขึ้นและแสดงตามลำดับที่ถูกต้องที่ปลายอีกด้านหนึ่ง

ปิงแตกต่างกัน

พื้นที่ ping อย่างไรก็ตาม โดยทั่วไปจะใช้คำสั่งเพื่อตรวจสอบว่าคอมพิวเตอร์ที่คุณสนใจนั้นออนไลน์อยู่หรือไม่ โดยเฉพาะอย่างยิ่งหากไม่ยอมรับการเชื่อมต่อ TCP ระดับสูงแบบที่คุณคาดหวัง เช่น การรับอีเมลหรือการอนุญาตการเข้าสู่ระบบ SSH

การดำเนินการนี้ช่วยให้คุณระบุได้อย่างรวดเร็วว่าการหยุดทำงานน่าจะเกิดจากเครือข่ายหรือเซิร์ฟเวอร์เองหยุดทำงาน หรือเนื่องจากบริการแต่ละรายการที่ทำงานบนเซิร์ฟเวอร์นั้นไม่สามารถเริ่มต้นได้อย่างถูกต้อง

เป็นผลให้ ping ใช้โปรโตคอลระดับต่ำกว่า TCP มาก

อันที่จริง ping ไม่ใช้แม้แต่ UDP ลูกพี่ลูกน้องของ TCP ซึ่งย่อมาจาก โปรโตคอลดาต้าแกรมของผู้ใช้ซึ่งเป็นวิธีการส่งข้อมูลที่รวดเร็วและง่ายดาย แต่นิยมเรียกกันว่า send-and-hope

UDP เองไม่ได้แจ้งให้คุณทราบว่าข้อมูลของคุณไปถึงปลายทางอื่นหรือไม่ และแม้ว่าข้อมูลจะมาถึงโดยสมบูรณ์ UDP จะไม่ติดตามลำดับที่แพ็กเก็ตของคุณถูกส่งไปตั้งแต่แรก ดังนั้นจึงไม่สามารถจัดเรียงแพ็กเก็ตใหม่ได้ที่ ปลายอีกด้านหนึ่งถ้าพวกเขาไปที่นั่นโดยลำดับ

Pingเพื่อสิ่งที่คุ้มค่า ใช้โปรโตคอลระดับต่ำมาก ซึ่งออกแบบมาเป็นพิเศษสำหรับวัตถุประสงค์ในการแก้ปัญหาและการกำหนดค่าเครือข่ายใหม่ เรียกว่า ICMP หรือ โปรโตคอลข้อความควบคุมอินเทอร์เน็ต.

โดยปกติจะจัดการโดยตรงในเคอร์เนลของระบบปฏิบัติการ เพื่อให้แพ็กเก็ต ICMP/IP เกือบจะผ่านได้แม้ว่าจะไม่มีซอฟต์แวร์เครือข่ายระดับสูงขึ้นมาอย่างถูกต้องก็ตาม โดยเฉพาะอย่างยิ่ง ICMP รวมข้อความพิเศษสองประเภท:

  • พิมพ์ 0x08. อย่างเป็นทางการที่เรียกว่า ICMP Echoนี้ ประเภทของแพ็คเก็ต โดยปกติจะเรียกว่าคำขอเสียงสะท้อน มันเป็นสิ่งที่ ping โปรแกรมส่งออกเพื่อตรวจสอบสำหรับคอมพิวเตอร์ที่ใช้งานอยู่บนเครือข่าย
  • พิมพ์ 0x00. อย่างเป็นทางการที่เรียกว่า ICMP Echo Reply, ประเภทแพ็คเก็ตนี้คือ ตรงตามที่บอก. คอมพิวเตอร์ที่ยังมีชีวิตอยู่ ออนไลน์ และไม่ได้กำหนดค่าให้บล็อกการรับส่งข้อมูล ICMP Echo ควรจะส่งแพ็กเก็ตประเภทนี้กลับไปยังคอมพิวเตอร์ที่ร้องขอโดยตรง

อย่างนี้:

$ ping -c 3 -p 4E414B45445345435552495459 Nakedsecurity.sophos.com รูปแบบ: 0x4e414b45445345435552495459 PING news-sophos.go-vip.net (192.0.66.227) 56(84) ไบต์ของข้อมูล 64 ไบต์จาก 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 เวลา=84.0 ms 64 ไบต์จาก 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 เวลา=85.1 ms 64 ไบต์จาก 192.0.66.227 .192.0.66.227 (3): icmp_seq=53 ttl=84.8 เวลา=3 ms --- สถิติการ ping ของ news-sophos.go-vip.net --- ส่ง 3 แพ็กเก็ต ได้รับ 0 แพ็กเก็ต การสูญเสียแพ็กเก็ต 2004% เวลา 84.025ms rtt min/ เฉลี่ย/สูงสุด/mdev = 84.644/85.062/0.446/XNUMX มิลลิวินาที

เพื่อดูไฟล์ ping ในระดับที่ต่ำกว่าเล็กน้อย เราจะใช้รหัส Lua ที่คุณพบได้ในตอนท้ายของบทความเพื่อสร้างแพ็กเก็ต ICMP Echo ของเราเอง และอ่านคำตอบที่ตอบกลับมา ถ้ามี:

$ sudo luax ping.lua Nakedsecurity.sophos.com กำลังส่งคำขอ ICMP ECHO ไปที่ 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 | กลับมาแล้ว--> 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.ปิง| 00000020 52 65 71 75 65 73 74 4d 65 73 73 61 67 65 20 42 | ขอข้อความ B | 00000030 42 35 41 36 46 31 44 |B5A6F1D |

โดยวิธีการที่เราจำเป็นต้องใช้ sudo ด้านบนเพื่อเรียกใช้สคริปต์ของเราด้วยสิทธิ์ superuser เพราะเราสร้างสิ่งที่เรียกว่า a ซ็อกเก็ต IP ดิบ – แบบที่สามารถสร้างเป็นรูปแบบพื้นฐานใดก็ได้ที่เราชอบ รวมถึง TCP, UDP และ ICMP ตามต้องการ

บนระบบ Linux/Unix หลายระบบ ping คำสั่งที่จัดทำโดย distro ของคุณทำงานโดยไม่ได้รับสิทธิ์รูทอย่างชัดเจน โดยปกติแล้วเป็นเพราะติดตั้งด้วยความสามารถด้านความปลอดภัยพิเศษหรือด้วย setuid ตั้งธง หมายความว่ามันเริ่มต้นด้วยการทำงานภายใต้บัญชีผู้ใช้ที่แตกต่างจากผู้ใช้ที่เรียกใช้

ออกแบบมาอย่างดี ping แน่นอนว่าโปรแกรมจะละทิ้งสิทธิ์พิเศษโดยอัตโนมัติเมื่อเปิดซ็อกเก็ตดิบที่ต้องการ

เราไม่ใส่โค้ดลดสิทธิ์นี้จากสคริปต์ตัวอย่างของเราเพื่อความกระชับ คุณสามารถใช้ posix.unistd.setpid() ฟังก์ชันเพื่อสลับไปยังบัญชีที่ไม่มีสิทธิพิเศษหลังจากสร้างซ็อกเก็ต แต่ก่อนส่งหรือรับข้อมูลใดๆ

ตรวจสอบคำตอบ

ดังที่คุณอาจทราบในการดัมพ์ข้อมูลจากสคริปต์ของเราด้านบน ฟังก์ชันซ็อกเก็ตเครือข่ายที่เราใช้เพื่ออ่านข้อมูลจากเซิร์ฟเวอร์ตอบสนองไม่เพียงแต่รวมถึงข้อมูล ICMP Echo Reply เท่านั้น แต่ยังรวมถึง IP ระดับต่ำ (ส่วนหัวของโปรโตคอลอินเทอร์เน็ต) ในแพ็คเก็ตพื้นฐาน

เราไม่ได้พยายามแยกวิเคราะห์หรือประมวลผลข้อมูลนี้ แต่ใช้ FreeBSD ping โปรแกรมจำเป็นต้องทำเช่นนั้นเพื่อให้เข้าใจถึงการตอบกลับ รวมถึงทำความเข้าใจกับข้อความแสดงข้อผิดพลาดใดๆ ที่ตอบกลับมา

ถ้า ping ได้รับการปฏิเสธไม่ทางใดก็ทางหนึ่ง โดยทั่วไปแล้ว Echo Reply จะรวมส่วนหัว IP ของตัวเอง (ดังที่เห็นด้านบน) แต่ยังมีสำเนาอ้างอิงของส่วนหัว IP และข้อมูล ICMP ที่ปรากฏในคำขอขาออกดั้งเดิม

ส่วนหัวของแพ็กเก็ต IPv4 มักจะมีลักษณะเหมือนกับที่คุณเห็นด้านบน โดยส่วนหัวของ IP จะขึ้นต้นด้วย 45 00 00 37... และดำเนินการต่อรวมเป็น 20 ไบต์ จนถึงและรวมถึงไบต์ที่แสดงเป็น ...XX XX XX XXซึ่งเป็นที่อยู่ IP ของแล็ปท็อปของฉัน

อย่างนี้:

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 และความยาวส่วนหัว: 0x45 (4 = IPv4, 5 = ห้าคำแบบ 32 บิต เช่น 20 ไบต์ ประเภทบริการและข้อมูลความแออัด: 0x00 ความยาวรวมของแพ็กเก็ต: 0x0037 (ทศนิยม 55) ข้อมูลลำดับ: F6 AF 00 00 Time-to -live (กระโดดไปทางซ้าย): 0x35 (ทศนิยม 53) ประเภทโปรโตคอล: 0x01 (ICMP) ผลรวมตรวจสอบ: 0x947F (ทศนิยม 38015) การส่งหมายเลข IP ของคอมพิวเตอร์: C0 00 42 E3 (192.0.66.227 = Nakedsecurity.sophos.com) IP ของผู้รับ (ของฉัน แล็ปท็อป): XX XX XX XX (ปกปิด = หมายเลข IP ของฉันเอง)

FreeBSD ของ ping ดูเหมือนว่าโปรแกรมเมอร์จะสันนิษฐานว่าส่วนหัวของการจัดเรียงนี้จะมีความยาว 20 ไบต์เสมอ โดยพิจารณาจากค่าความยาวส่วนหัวนั้นในไบต์แรกของ 0x45, หมายถึง IPv4 (0x4?) กับ 5-DWORD (0x?5) หรือ 20 ไบต์ ส่วนหัว

ด้วยขนาดเพียง 20 ไบต์ที่ต้องกังวล โปรแกรมเมอร์จึงจัดสรรบัฟเฟอร์ขนาดคงที่บนสแตก ซึ่งพวกเขาสามารถเก็บสำเนาของส่วนหัว IP ในการตอบกลับ รวมถึงส่วนหัว IP ที่ฝังไว้จากคำขอดั้งเดิม หากมีเงื่อนไขข้อผิดพลาดที่ต้องจัดการ .

คุณสามารถเดาได้ว่าสิ่งนี้จะเกิดขึ้นที่ไหน

ไบต์แรกนั้นในส่วนหัวของ IPv4 สามารถมีค่าใดๆ ได้ตามกฎหมาย 0x45 (ขนาดส่วนหัวขั้นต่ำ 5 DWORDs หรือ 20 ไบต์ตามที่แสดง) สูงสุด 0x4F (แสดงถึง 15 DWORDs เนื่องจาก 0xF เป็นทศนิยม 15 หรือข้อมูลส่วนหัวทั้งหมด 60 ไบต์) ดังนั้นจึงอนุญาตให้มีข้อมูลส่วนหัวเพิ่มเติมอีก 40 ไบต์

ไบต์ส่วนหัวเพิ่มเติมที่หายาก แต่ถูกกฎหมายสามารถใช้สำหรับ "คุณสมบัติ" ขี้ขลาดและผิดปกติต่างๆ ที่มีชื่อแปลก ๆ เช่น การออกอากาศแบบเลือกทิศทาง, การควบคุมการไหลของการทดลอง และ แพ็กเก็ตมัลติคาสต์อัปสตรีม – สิ่งที่เราเคยได้ยินแต่ไม่เคยรู้เท่าทันใช้หรือแม้แต่เห็น

ระวังอาชญากรไซเบอร์ที่ทดสอบคุณ

อย่างที่คุณจินตนาการได้ เนื่องจากฟิลด์พิเศษเหล่านั้นแทบจะไม่เคยถูกใช้เลย คุณจึงอาจไม่เคยเห็นแพ็กเก็ต IPv4 ที่มีสิ่งอื่นใดนอกจาก 0x45 ในตอนเริ่มต้น และด้วยข้อมูลส่วนหัวทั้งหมด 20 ไบต์ เว้นแต่ว่าคุณจะเจออาชญากรไซเบอร์จำนวนมากที่พร้อมจะทดสอบคุณ

น่าเศร้าที่ไม่มีอะไรมากมายที่จะหยุดผู้โจมตีจากการปลอมแปลงเซิร์ฟเวอร์ที่คาดเดาว่าคุณกำลังใช้ FreeBSD หรือไม่ และจงใจสร้างแพ็กเก็ต ICMP/IP Echo Reply ขนาดใหญ่เพื่อกระตุ้น สแต็กบัฟเฟอร์ล้น ภายในของคุณ ping โครงการ

หากคุณเคยตรวจสอบว่าเซิร์ฟเวอร์ของพวกเขาเปิดใช้งานอยู่หรือไม่ (ซึ่งคุณอาจทำด้วยซ้ำ หรือบางทีโดยเฉพาะอย่างยิ่ง หากคุณคิดว่ามันน่าสงสัย!) คุณอาจตกเป็นเป้าหมายด้วยการตอบกลับแบบกวนๆ

อย่างดีที่สุดของคุณ ping โปรแกรมจะพัง อย่างไรก็ตาม ที่แย่ที่สุด ตามที่ที่ปรึกษาด้านความปลอดภัยของ FreeBSD ยอมรับอย่างไม่เห็นแก่ตัว “อาจเป็นไปได้ที่โฮสต์ที่เป็นอันตรายจะเรียกใช้การเรียกใช้โค้ดจากระยะไกลใน ping”

โชคดีที่เป็นผู้เขียน FreeBSD ด้วย ชี้ให้เห็น, “กระบวนการ [t]he ping ทำงานในโหมดแซนด์บ็อกซ์ของโหมดความสามารถบน FreeBSD เวอร์ชันที่ได้รับผลกระทบทั้งหมด ดังนั้นจึงมีข้อจำกัดอย่างมากในการโต้ตอบกับส่วนที่เหลือของระบบ ณ จุดที่จุดบกพร่องสามารถเกิดขึ้นได้”

กล่าวอีกนัยหนึ่ง คุณต้องแก้ไขอย่างแน่นอน แต่ความเสี่ยงนั้นถือว่าพอประมาณ

โดยเฉพาะอย่างยิ่ง ping โปรแกรมไม่ได้ถูกล็อคในแซนด์บ็อกซ์เท่านั้น แต่จะไม่ทำงานในฐานะรูทเมื่อเข้าถึงรหัสบั๊กกี้ ตามที่ได้รับการยืนยันในคำแนะนำด้านความปลอดภัย: "เมื่อ ping รัน จะสร้างซ็อกเก็ตดิบที่จำเป็นในการทำงาน จากนั้นจึงยกเลิกสิทธิ์ขั้นสูง”

ตามที่อธิบายไว้ข้างต้น อำนาจ superuser จำเป็นเท่านั้นที่จะได้รับซ็อกเก็ต IP แบบดิบจากระบบปฏิบัติการ ไม่ใช่เพื่อใช้ sendto() และ recvfrom() ฟังก์ชั่นบนซ็อกเก็ตนั้นในภายหลัง

ข้อผิดพลาดนี้ได้รับการระบุอย่างเป็นทางการ CVE-2022-23093; มีการบันทึกไว้ในคำแนะนำด้านความปลอดภัย ฟรีBSD-SA-22:15.ping.

จะทำอย่างไร?

  • หากคุณเป็นผู้ใช้ FreeBSD เพียงอัปเดตรุ่นที่ได้รับผลกระทบ (FreeBSD 12 และ FreeBSD 13) เป็นเวอร์ชันล่าสุด โดยที่ข้อบกพร่องนี้ได้รับการแก้ไขแล้ว
  • หากคุณเป็นโปรแกรมเมอร์เครือข่าย ตรวจสอบให้แน่ใจเสมอว่าคุณมีส่วนหัวของแพ็กเก็ตที่สามารถระบุการเปลี่ยนแปลงขนาดที่ผิดปกติได้ ความจริงที่ว่าคุณไม่เคยเห็นการเปลี่ยนแปลงใด ๆ ด้วยตัวเองไม่ได้หยุดคุณเผชิญกับแพ็คเก็ตในวันพรุ่งนี้ที่ผิดปกติ แต่ถูกกฎหมายอย่างสมบูรณ์
  • หากคุณเป็นผู้จัดการเครือข่าย พิจารณาบล็อกแพ็กเก็ต IPv4 ที่มีส่วนหัวของ IP ที่ไม่ใช่ขนาด 20 ไบต์ หากดูเหมือนว่าคุณจำเป็นต้องอนุญาตให้ผลิตภัณฑ์ซอฟต์แวร์บางตัวใช้ตัวเลือกส่วนหัวของ IPv4 ที่ผิดปกติอย่างแท้จริง ให้ลองบันทึกแพ็กเก็ตที่ผิดปกติเหล่านั้นเพื่อเรียนรู้สาเหตุ

ดูแลออกไปที่นั่น!


รหัสตัวอย่างเพื่อสาธิตการจราจร Ping


ประทับเวลา:

เพิ่มเติมจาก ความปลอดภัยเปล่า