flawopen.com/Teardowns/cve-2024-1086-linux-netfilter-nftables-uaf
CVE-2024-1086: Linux nf_tables में use-after-free
CVE-2024-1086 Linux nf_tables का use-after-free दोष है, जिसमें अमान्य DROP पैरामीटर स्वीकार हुए। अपने डिस्ट्रिब्यूशन का पैच किया हुआ कर्नेल लगाएँ।
ऐसे फ़ॉर्म की कल्पना करें जिसमें कर्मचारी केवल “स्वीकार” या “अस्वीकार” चुन सकता है। अलग खाने में अस्वीकृति का त्रुटि कोड होता है, जहाँ केवल शून्य या मान्य ऋणात्मक त्रुटि स्वीकार्य है। असुरक्षित जाँच ने धनात्मक “स्वीकार” मान को उस खाने में जाने दिया। बाद में नेटवर्क कोड ने उसी निर्णय को अलग-अलग तरह से समझा। पैच केवल ठीक-ठीक समर्थित निर्णय मानों को स्वीकार करके इस रास्ते को बंद करता है।
इस पेज के मुख्य शब्द
nf_tables- Linux kernel का subsystem, जिसका उपयोग nftables packet filtering और संबंधित network rules को configure करने के लिए करता है।
Netfilter verdict- Kernel द्वारा packet rule जाँचने के बाद दिया गया परिणाम, जैसे
NF_ACCEPTयाNF_DROP। DROP verdict में error value हो सकती है; hook को शून्य या मान्य ऋणात्मक errno अपेक्षित है। Use-after-free (CWE-416)- Memory safety दोष जिसमें object का जीवनकाल समाप्त होने के बाद भी code उसकी memory का उपयोग करता है। NVD इस मामले को स्थानीय kernel privilege escalation के रूप में दर्ज करता है।
User namespace- Linux namespace जो processes की identities और capabilities को map करता है। बिना privilege इसे बनाने की अनुमति kernel और distribution policy पर निर्भर है; इससे host escape अपने-आप सिद्ध नहीं होता।
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-416
- CISA KEV — जोड़ा गया 2024-05-30 — CVE-2024-1086
मूल कारण विश्लेषण (Root Cause)
net/netfilter/nf_tables_api.c में nft_verdict_init() पहले निर्णय मान को mask करके NF_DROP या NF_QUEUE के पैरामीटर स्वीकार करता था। Netfilter hook को NF_DROP के ऊपरी bits में शून्य या मान्य ऋणात्मक errno चाहिए। upstream सुधार बताता है कि NF_ACCEPT जैसा धनात्मक मान use-after-free करा सकता था। पैच ढीले validation रास्ते को हटाकर केवल सटीक समर्थित निर्णय स्वीकार करता है; अन्य मान -EINVAL लौटाते हैं। NVD इसका प्रभाव स्थानीय privilege escalation बताता है। पहुँच कर्नेल, उपलब्ध capabilities और डिस्ट्रिब्यूशन नीति पर निर्भर है; हर container को समान रूप से प्रभावित न मानें।
हमले का चरण-दर-चरण प्रवाह
स्थानीय नियम-प्रबंधन क्षमता
दस्तावेज़ित हमला स्थानीय है। प्रक्रिया को nf_tables verdict validation तक पहुँचने में सक्षम होना चाहिए; आवश्यक capabilities और unprivileged user namespace की उपलब्धता host configuration पर निर्भर करती है।
अमान्य verdict parameter validation तक पहुँचता है
पैच से पहले nft_verdict_init() NF_VERDICT_MASK लगाने के बाद कुछ parameter वाले मान स्वीकार करता था, जिनमें parameter bits में धनात्मक NF_ACCEPT भी शामिल था।
hook पथ पर use-after-free
Netfilter hook NF_DROP parameters को शून्य या मान्य ऋणात्मक errno के रूप में समझता है। upstream विवरण कहता है कि स्वीकार हुआ धनात्मक मान packet processing में use-after-free करा सकता है; पैच किसी सार्वभौमिक exploit primitive या निश्चित container escape का दावा नहीं करता।
डिस्ट्रिब्यूशन का patched kernel लगाएँ
upstream बदलाव असमर्थित verdict parameters को अस्वीकार करता है। अपने डिस्ट्रिब्यूशन का patched kernel install करके boot करें, क्योंकि package versions और backports अलग-अलग हैं।
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
असुरक्षित कोड verdict को mask करके आगे बढ़ता था, इसलिए धनात्मक NF_ACCEPT जैसा parameter NF_DROP के error field में स्वीकार हो सकता था। सुधार केवल exact constants स्वीकार करता है और बाकी मानों पर -EINVAL लौटाता है। ये upstream patch के केंद्रित अंश हैं, अलग से compile होने वाले पूर्ण functions नहीं।
सोर्स अंश: net/netfilter/nf_tables_api.c
/* f342de4e2f33 से पहले net/netfilter/nf_tables_api.c के nft_verdict_init() का अंश।
* masked-value path parameterized verdicts स्वीकार करता था। */
switch (data->verdict.code) {
default:
switch (data->verdict.code & NF_VERDICT_MASK) {
case NF_ACCEPT:
case NF_DROP:
case NF_QUEUE:
break;
default:
return -EINVAL;
}
fallthrough;
case NFT_CONTINUE:
case NFT_BREAK:
case NFT_RETURN:
/* अन्य मौजूदा verdict handling आगे जारी है। */
break;
}
/* f342de4e2f33 द्वारा बदले गए net/netfilter/nf_tables_api.c के
* nft_verdict_init() का अंश। */
switch (data->verdict.code) {
case NF_ACCEPT:
case NF_DROP:
case NF_QUEUE:
break;
case NFT_CONTINUE:
case NFT_BREAK:
case NFT_RETURN:
/* अन्य मौजूदा verdict handling आगे जारी है। */
break;
default:
return -EINVAL;
}
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓डिस्ट्रिब्यूशन द्वारा सुझाया patched kernel package install और boot करें; reboot के बाद चल रहे kernel की पुष्टि करें, क्योंकि backports में version numbers अलग हो सकते हैं।
- ✓केवल upstream version तुलना पर निर्भर न रहें; अपने kernel flavor और package के लिए डिस्ट्रिब्यूशन का security tracker देखें।
- ✓यदि update टालना पड़े, तो unprivileged user namespace creation सीमित करने के vendor-documented विकल्प का मूल्यांकन करें; पहले उपलब्धता जाँचें और containers तथा desktop apps पर प्रभाव परखें।
- ✓Kernel verdict validation की समीक्षा में packet-hook path से पहले unsupported parameter bits अस्वीकार करें और अनुमत exact constants तथा अमान्य धनात्मक मानों के परीक्षण जोड़ें।