FlawOpen

flawopen.com/Teardowns/cve-2024-1086-linux-netfilter-nftables-uaf

● CVE-2024-1086 · CVSS 7.8 · उच्च
सुरक्षा अनुसंधान · FlawOpen

CVE-2024-1086: Linux nf_tables में use-after-free

CVE-2024-1086 Linux nf_tables का use-after-free दोष है, जिसमें अमान्य DROP पैरामीटर स्वीकार हुए। अपने डिस्ट्रिब्यूशन का पैच किया हुआ कर्नेल लगाएँ।

💡 आसान भाषा में (ELI5)

ऐसे फ़ॉर्म की कल्पना करें जिसमें कर्मचारी केवल “स्वीकार” या “अस्वीकार” चुन सकता है। अलग खाने में अस्वीकृति का त्रुटि कोड होता है, जहाँ केवल शून्य या मान्य ऋणात्मक त्रुटि स्वीकार्य है। असुरक्षित जाँच ने धनात्मक “स्वीकार” मान को उस खाने में जाने दिया। बाद में नेटवर्क कोड ने उसी निर्णय को अलग-अलग तरह से समझा। पैच केवल ठीक-ठीक समर्थित निर्णय मानों को स्वीकार करके इस रास्ते को बंद करता है।

इस पेज के मुख्य शब्द

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 अपने-आप सिद्ध नहीं होता।

फ्रेमवर्क मैपिंग

मूल कारण विश्लेषण (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 को समान रूप से प्रभावित न मानें।

हमले का चरण-दर-चरण प्रवाह

चरण 1

स्थानीय नियम-प्रबंधन क्षमता

दस्तावेज़ित हमला स्थानीय है। प्रक्रिया को nf_tables verdict validation तक पहुँचने में सक्षम होना चाहिए; आवश्यक capabilities और unprivileged user namespace की उपलब्धता host configuration पर निर्भर करती है।

चरण 2

अमान्य verdict parameter validation तक पहुँचता है

पैच से पहले nft_verdict_init() NF_VERDICT_MASK लगाने के बाद कुछ parameter वाले मान स्वीकार करता था, जिनमें parameter bits में धनात्मक NF_ACCEPT भी शामिल था।

चरण 3

hook पथ पर use-after-free

Netfilter hook NF_DROP parameters को शून्य या मान्य ऋणात्मक errno के रूप में समझता है। upstream विवरण कहता है कि स्वीकार हुआ धनात्मक मान packet processing में use-after-free करा सकता है; पैच किसी सार्वभौमिक exploit primitive या निश्चित container escape का दावा नहीं करता।

चरण 4

डिस्ट्रिब्यूशन का 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;
}

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत