
IngressNightmare भेद्यता (CVE-2025-1974) पर मेरा दृष्टिकोण
यह रिपॉजिटरी IngressNightmare कमजोरी पर मेरा शोध है। इसमें एक कमजोर Ingress डिप्लॉय फाइलें, स्वयं शोषण और साझा ऑब्जेक्ट पेलोड शामिल हैं।
CVE सूचकांकों की सूची:
auth-url एनोटेशन इंजेक्शनauth-tls-match-cn एनोटेशन इंजेक्शनबस कुछ संदर्भ:
इस कमजोरी का मूल उचित इनपुट स्वच्छता की कमी में निहित है। जब आप एक AdmissionReview अनुरोध भेजते हैं, तो यह एक अस्थायी NGINX कॉन्फ़िगरेशन बनाता है जिसे बाद में nginx -t कमांड का उपयोग करके वैधता के लिए परीक्षण किया जाता है। बग को कम करके देखें स्रोत कोड में।
परीक्षण किए जा रहे कॉन्फ़िगरेशन की सामग्री को नियंत्रित करने की क्षमता हमें खराब कॉन्फ़िग को इंजेक्ट करने के लिए कई कॉन्फ़िग फ़ील्ड्स का उपयोग करने की अनुमति देती है:
auth-url - उचित स्वच्छता के बिना जाता है, जिससे हम # और \n जोड़ सकते हैं। हम इस इंजेक्शन बिंदु का उपयोग करेंगे।auth-tls-match-cn - केवल फ़ील्ड को CN= से शुरू होना और एक वैध regexp होना आवश्यक है।ing.UID - UID कॉन्फ़िग में जैसा है वैसा ही जाता है।यह तथ्य कि NGINX कॉन्फ़िग केवल परीक्षण किया जाता है, निर्देशों की संख्या को थोड़ा कम कर देता है जिनका हम उपयोग कर सकते हैं। बचे हुए निर्देशों में से एक है ssl_engine, जो हमें साझा लाइब्रेरी लोड करने की अनुमति देता है। यह एक अच्छा प्रवेश बिंदु है। लेकिन हम अपनी .so फ़ाइल को पॉड फाइलसिस्टम में कैसे रख सकते हैं?
WIZ के चतुर लोगों ने हमारे .so ऑब्जेक्ट को बॉडी के रूप में एक अनुरोध भेजने का विचार दिया, और यदि यह पर्याप्त बड़ा है, तो NGINX इसे procfs में एक फाइल के रूप में सहेजता है! हम Content-Length को भी समायोजित कर सकते हैं, जिससे NGINX अधिक डेटा की प्रतीक्षा करे, और कुछ समय के लिए फाइल को procfs में रखे। वास्तविक PID और FD संख्या का अनुमान लगाया जाएगा।
अधिक जानकारी के लिए, WIZ रिसर्च टीम द्वारा मूल विश्लेषण लेख पढ़ें।
शोषण कोड काफी स्व-व्याख्यात्मक है। तो स्रोत देखें।
रिपॉजिटरी क्लोन करें:
git clone https://github.com/I3r1h0n/IngressNightterror
cd IngressNightterror
एक डॉकर k3s इमेज शुरू करें:
cd stand
docker compose up -d
NGINX Ingress को तैनात करें:
यदि आप Linux/Mac का उपयोग कर रहे हैं, तो आप इसे स्क्रिप्ट का उपयोग करके तैनात कर सकते हैं:
./k8s/setup.sh
यदि आप Windows पर हैं, या तैनाती प्रक्रिया पर अधिक नियंत्रण चाहते हैं, तो इसे हाथ से करें:
NGINX Ingress तैनात करें:
kubectl --kubeconfig=./output/kubeconfig.yaml apply -f ./k8s/ingress.yaml
अब आप ./output में प्रदान किए गए कॉन्फ़िग के साथ kubectl का उपयोग कर सकते हैं। नेमस्पेस ingress-nginx का उपयोग करना न भूलें।
महत्वपूर्ण नोट: ingress.yaml कमजोर NGINX Ingress से बनाया गया है।
पेलोड एक सरल रिवर्स प्रॉक्सी है। इसे बनाने से पहले पोर्ट और आईपी पता संपादित करना न भूलें:
make all
यह डॉकर कंटेनर gcc:latest का उपयोग करके साझा ऑब्जेक्ट बनाएगा।
WIZ रिसर्च टीम को, जिन्होंने मूल रूप से कमजोरी की खोज की, और NGINX Ingress के रखरखावकर्ताओं को बहुत सम्मान।
निर्मित I3r1h0n द्वारा।