Ping của cái chết! FreeBSD sửa lỗi Crashtastic trong công cụ mạng PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Ping của cái chết! FreeBSD sửa lỗi crashtastic trong công cụ mạng

Một trong những công cụ mạng cấp thấp đầu tiên mà bất kỳ người dùng máy tính nào cũng biết đến là công cụ đáng kính ping tiện ích.

Được đặt tên theo hiệu ứng âm thanh cùng tên từ bất kỳ và mọi cảnh phim chiến tranh trường học cũ liên quan đến tàu ngầm, mệnh lệnh là tiếng vang ẩn dụ (xem chúng tôi đã làm gì ở đó?) Của phiên bản RADAR dưới nước được gọi là SONAR.

Bạn gửi một tiếng ping (giống tiếng ồn doinnnng hơn, trong thực tế) vào độ sâu của biển và bằng cách đo khoảng thời gian cần thiết để tiếng vang kỳ lạ của nó quay trở lại với bạn và bằng cách ước tính tốc độ âm thanh trong đại dương xung quanh, bạn có thể tính toán khoảng cách đến vật thể tạo ra tiếng vang.

Thật thú vị, vì có lẽ bạn đã nghe thấy từ viết tắt TCP/IP được sử dụng như một mô tả chung về chất kết dính giao thức cung cấp năng lượng cho internet, ping về mặt kỹ thuật hoàn toàn không sử dụng TCP/IP.

Trên thực tế, TCP/IP là viết tắt của giao thức điều khiển truyền qua giao thức internet, và đề cập đến một cơ chế khá cao cấp để gửi dữ liệu qua internet theo cách mà mạng tự đưa ra rất nhiều câu hỏi "nó có thực sự hoạt động bình thường không?" công sức cho bạn.

Ví dụ: trong các kết nối TCP, bất kỳ khối dữ liệu nào bạn gửi đều được đảm bảo đến đầu kia nguyên vẹn hoặc gây ra lỗi để bạn biết rằng họ đã không mắc phải lỗi đó.

Hơn nữa, ngay cả khi các khối dữ liệu khác nhau kết thúc theo các tuyến đường khác nhau trên internet (ví dụ: do cân bằng tải, mất điện tạm thời hoặc các lỗi có thể khôi phục khác) và ngay cả khi một số khối mất nhiều thời gian hơn các khối khác, thì dữ liệu TCP sẽ được lưu vào bộ đệm một cách chính xác lên và trình bày theo đúng thứ tự ở đầu bên kia.

Bình thì khác

Sản phẩm ping Tuy nhiên, lệnh thường được sử dụng để xác minh xem máy tính mà bạn quan tâm có đang trực tuyến hay không, đặc biệt nếu máy tính đó không chấp nhận loại kết nối TCP cấp cao mà bạn mong đợi, chẳng hạn như nhận email hoặc cho phép đăng nhập SSH.

Điều này nhanh chóng giúp bạn xác định xem sự cố ngừng hoạt động có thể là do mạng hoặc chính máy chủ gặp sự cố hay do các dịch vụ riêng lẻ chạy trên máy chủ đó không khởi động đúng cách.

Kết quả là, ping sử dụng giao thức cấp thấp hơn nhiều so với TCP.

Thật, ping thậm chí không sử dụng người anh em họ thông thường hơn của TCP là UDP, viết tắt của giao thức datagram người dùng, đây là một cách truyền các khối dữ liệu nhanh chóng và dễ dàng, nhưng thường được gọi là gửi và hy vọng (hoặc, nếu bạn là người hoài nghi, là phun và cầu nguyện).

Bản thân UDP không thông báo cho bạn biết liệu dữ liệu của bạn có đến được đầu bên kia hay không và ngay cả khi nó đến nơi nguyên vẹn, UDP không theo dõi thứ tự mà các gói của bạn được gửi ban đầu, vì vậy nó không thể sắp xếp lại chúng tại đầu bên kia nếu họ đến đó không theo trình tự.

Ping, với giá trị của nó, sử dụng giao thức thực sự ở mức rất thấp, được thiết kế đặc biệt cho mục đích khắc phục sự cố và cấu hình lại mạng, được gọi là ICMP hoặc Giao thức Thông báo Kiểm soát Internet.

Thường được xử lý ngay trong nhân hệ điều hành, do đó các gói ICMP/IP gần như chắc chắn sẽ đi qua ngay cả khi không có phần mềm mạng cấp cao hơn nào hoạt động chính xác, đáng chú ý là ICMP bao gồm hai loại thông báo đặc biệt:

  • Nhập 0x08. Chính thức gọi ICMP Echo, điều này loại gói thường được gọi là Yêu cầu tiếng vang. Đó là những gì ping chương trình gửi đi để thăm dò các máy tính đang hoạt động trên mạng.
  • Nhập 0x00. Chính thức gọi ICMP Echo Reply, loại gói này là chính xác những gì nó nói. Một máy tính đang hoạt động, trực tuyến và không được định cấu hình để chặn lưu lượng ICMP Echo có nhiệm vụ gửi loại gói này thẳng trở lại máy tính đã yêu cầu nó.

Thích bài viết này:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com MẪU: 0x4e414b45445345435552495459 PING news-sophos.go-vip.net (192.0.66.227) 56(84) byte dữ liệu. 64 byte từ 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 time=84.0 ms 64 byte từ 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 time=85.1 ms 64 byte từ 192.0.66.227 .192.0.66.227 (3): icmp_seq=53 ttl=84.8 time=3 ms --- news-sophos.go-vip.net thống kê ping --- truyền 3 gói, nhận 0 gói, mất gói 2004%, thời gian 84.025ms rtt min/ trung bình/tối đa/mdev = 84.644/85.062/0.446/XNUMX ms

Để xem một ping trong thực tế ở mức thấp hơn một chút, chúng tôi sẽ sử dụng mã Lua mà bạn có thể tìm thấy ở cuối bài viết để xây dựng một gói ICMP Echo của riêng chúng tôi và để đọc câu trả lời gửi lại, nếu có:

$ sudo luax ping.lua nakedsecurity.sophos.com Đang gửi yêu cầu ICMP ECHO tới 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 | Quay lại--> 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 |

Nhân tiện, chúng tôi cần sử dụng sudo ở trên để chạy tập lệnh của chúng tôi với các đặc quyền siêu người dùng, bởi vì chúng tôi đã tạo cái được gọi là ổ cắm IP thô – một định dạng có thể được tạo thành bất kỳ định dạng cơ bản nào mà chúng tôi muốn, bao gồm TCP, UDP và, nếu cần ở đây, ICMP.

Trên nhiều hệ thống Linux/Unix, ping lệnh do bản phân phối của bạn cung cấp hoạt động mà không được cấp quyền root một cách rõ ràng, thường là do lệnh được cài đặt với các khả năng bảo mật đặc biệt hoặc với setuid được đặt cờ, nghĩa là nó bắt đầu bằng việc chạy dưới một tài khoản người dùng khác với người dùng đã chạy nó.

Được thiết kế tốt ping tất nhiên, các chương trình sẽ tự động loại bỏ các đặc quyền bổ sung của chúng sau khi chúng đã mở ổ cắm thô mà chúng cần.

Chúng tôi đã bỏ qua mã loại bỏ đặc quyền này khỏi tập lệnh mẫu của mình để đảm bảo tính ngắn gọn. Bạn có thể dùng posix.unistd.setpid() chức năng chuyển sang tài khoản không có đặc quyền sau khi tạo ổ cắm, nhưng trước khi gửi hoặc nhận bất kỳ dữ liệu nào.

Kiểm tra câu trả lời

Như bạn có thể nhận ra trong kết xuất dữ liệu từ tập lệnh của chúng tôi ở trên, chức năng ổ cắm mạng mà chúng tôi đang sử dụng để đọc lại dữ liệu từ máy chủ phản hồi không chỉ bao gồm dữ liệu ICMP Echo Reply mà còn cả IP cấp thấp (tiêu đề giao thức internet) trong gói bên dưới.

Chúng tôi chưa cố gắng phân tích hoặc xử lý dữ liệu này, nhưng FreeBSD ping chương trình cần làm như vậy để hiểu câu trả lời, bao gồm cả việc hiểu bất kỳ thông báo lỗi nào quay lại.

Nếu ping bị từ chối theo một cách nào đó, Echo Reply thường sẽ không chỉ bao gồm các tiêu đề IP của chính nó (như đã thấy ở trên) mà còn có một bản sao tham chiếu của các tiêu đề IP và dữ liệu ICMP xuất hiện trong yêu cầu gửi đi ban đầu.

Tiêu đề gói IPv4 thường giống như bạn thấy ở trên, trong đó tiêu đề IP bắt đầu bằng 45 00 00 37... và tiếp tục trong tổng số 20 byte, lên đến và bao gồm cả các byte được hiển thị dưới dạng ...XX XX XX XX, đó là địa chỉ IP của máy tính xách tay của tôi.

Thích bài viết này:

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 |.... | Phiên bản IP và độ dài tiêu đề: 0x45 (4 = IPv4, 5 = năm từ 32 bit, tức là 20 byte Loại dịch vụ và dữ liệu tắc nghẽn: 0x00 Tổng chiều dài của gói: 0x0037 (thập phân 55) Thông tin trình tự: F6 AF 00 00 Thời gian đến -live (hop left): 0x35 (thập phân 53) Loại giao thức: 0x01 (ICMP) Tổng kiểm tra: 0x947F (thập phân 38015) Số IP của máy tính đang gửi: C0 00 42 E3 (192.0.66.227 = nakedsecurity.sophos.com) IP của người nhận (của tôi máy tính xách tay): XX XX XX XX (ĐÃ GIẤU = số IP của chính tôi)

FreeBSD ping có vẻ như các lập trình viên đã giả định rằng các tiêu đề thuộc loại này thực sự sẽ luôn dài chính xác 20 byte, dựa trên giá trị độ dài tiêu đề đó trong byte đầu tiên của 0x45, biểu thị IPv4 (0x4?) với 5-DWORD (0x?5) hoặc 20 byte, tiêu đề.

Chỉ cần lo lắng về 20 byte, các lập trình viên đã phân bổ bộ đệm có kích thước cố định trên ngăn xếp nơi họ có thể giữ một bản sao của các tiêu đề IP trong phản hồi, cộng với bất kỳ tiêu đề IP nhúng nào từ yêu cầu ban đầu, nếu có lỗi cần xử lý .

Bạn có thể đoán nơi này sẽ đi.

Byte đầu tiên đó trong tiêu đề IPv4 hợp pháp có thể có bất kỳ giá trị nào từ 0x45 (kích thước tiêu đề tối thiểu là 5 DWORD hoặc 20 byte, như được hiển thị) lên đến 0x4F (biểu thị 15 DWORD, vì 0xF là số thập phân 15 hoặc tổng cộng 60 byte dữ liệu tiêu đề), do đó cho phép gọn gàng thêm 40 byte dữ liệu tiêu đề tùy chọn.

Các byte tiêu đề bổ sung hiếm nhưng hợp pháp đó có thể được sử dụng cho nhiều “tính năng” thú vị và khác thường với những cái tên gây tò mò như Phát sóng định hướng có chọn lọc, Kiểm soát luồng thử nghiệmGói Multicast ngược dòng – những thứ mà chúng tôi đã nghe nói nhưng chưa bao giờ cố ý sử dụng, hoặc thậm chí nhìn thấy.

Cẩn thận với tội phạm mạng, những kẻ đưa bạn vào thử thách

Như bạn có thể tưởng tượng, do các trường bổ sung đó hầu như không bao giờ được sử dụng, bạn có thể không bao giờ thấy gói IPv4 có bất kỳ thứ gì khác ngoài 0x45 ngay từ đầu và với tổng cộng 20 byte dữ liệu tiêu đề, trừ khi bạn gặp phải một nhóm tội phạm mạng sẵn sàng thử thách bạn.

Đáng buồn thay, không có nhiều thứ để ngăn chặn kẻ tấn công thiết lập một máy chủ đoán xem bạn có đang sử dụng FreeBSD hay không và cố tình tạo ra các gói ICMP/IP Echo Reply quá khổ để kích động tràn bộ đệm ngăn xếp bên trong của bạn ping chương trình.

Nếu bạn kiểm tra xem máy chủ của họ có đang hoạt động hay không (điều mà bạn thậm chí có thể làm, hoặc có lẽ đặc biệt, nếu bạn cho rằng điều đó đáng ngờ!), thì bạn có thể bị nhắm mục tiêu với một câu trả lời có bẫy.

Tốt nhất, của bạn ping chương trình sẽ bị sập; tuy nhiên, tệ nhất là như tư vấn bảo mật FreeBSD đã hào phóng thừa nhận, “Có thể một máy chủ độc hại kích hoạt thực thi mã từ xa trong ping.”

May mắn thay, như các tác giả FreeBSD cũng chỉ ra, “[t]quá trình ping của anh ấy chạy trong hộp cát chế độ khả năng trên tất cả các phiên bản FreeBSD bị ảnh hưởng và do đó rất hạn chế về cách nó có thể tương tác với phần còn lại của hệ thống tại điểm có thể xảy ra lỗi.”

Nói cách khác, bạn chắc chắn cần phải vá lỗi, nhưng rủi ro có thể được coi là khiêm tốn.

Đáng chú ý là ping chương trình không chỉ bị khóa trong hộp cát mà còn không chạy với quyền root khi gặp phải mã lỗi, như đã xác nhận trong tư vấn bảo mật: "Khi nào ping chạy, nó tạo ổ cắm thô cần thiết để thực hiện công việc của nó, sau đó thu hồi các đặc quyền nâng cao của nó.”

Như đã mô tả ở trên, quyền hạn siêu người dùng chỉ được yêu cầu để có được ổ cắm IP thô từ hệ điều hành, không sử dụng sendto()recvfrom() các chức năng trên ổ cắm đó sau đó.

Lỗi này đã được cung cấp định danh chính thức CVE-2022-23093; nó được ghi lại trong tư vấn bảo mật FreeBSD-SA-22:15.ping.

Phải làm gì?

  • Nếu bạn là người dùng FreeBSD, chỉ cần cập nhật các bản phát hành bị ảnh hưởng (FreeBSD 12 và FreeBSD 13) lên phiên bản mới nhất của chúng, lỗi này đã được sửa.
  • Nếu bạn là một lập trình viên mạng, luôn đảm bảo rằng bạn đã tính đến các tiêu đề gói có thể chỉ ra các biến thể kích thước bất thường. Việc bản thân bạn chưa bao giờ nhìn thấy bất kỳ biến thể nào không ngăn bạn đối mặt với một gói tin khác thường nhưng hoàn toàn hợp pháp vào ngày mai.
  • Nếu bạn là người quản lý mạng, xem xét việc chặn các gói IPv4 có tiêu đề IP không có kích thước 20 byte. Nếu bạn thực sự cần cho phép một số sản phẩm phần mềm sử dụng các tùy chọn tiêu đề IPv4 bất thường, hãy cân nhắc ghi nhật ký các gói bất thường đó để tìm hiểu lý do.

Cẩn thận ở ngoài đó!


MÃ VÍ DỤ ĐỂ CHỨNG MINH LƯU LƯỢNG PING


Dấu thời gian:

Thêm từ An ninh trần trụi