
HashiCorp Vault KMS में confluent-kafka के लिए अक्षम TLS प्रमाणपत्र सत्यापन
गंभीरता: उच्च, CVSS 3.1 7.4
वेक्टर (v3.1): CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
प्रभावित: confluent-kafka >= 2.8.0, <= 2.14.2
में ठीक किया गया: 2.15.0
CWE: CWE-295 (अनुचित प्रमाणपत्र सत्यापन)
घटक: confluent_kafka/schema_registry/rules/encryption/hcvault/hcvault_client.py
रिपोर्ट किया गया: Rahul Karne
CNA: VulnCheck
confluent-kafka में HashiCorp Vault KMS क्लाइंट अपने hvac.Client का निर्माण करते समय verify=False को हार्डकोड करता है, जिससे Schema Registry फ़ील्ड-एन्क्रिप्शन नियमों के माध्यम से की जाने वाली Vault HTTPS कनेक्शनों के लिए TLS प्रमाणपत्र सत्यापन अक्षम हो जाता है।
कमजोर कोड यहाँ स्थित है:
confluent_kafka/schema_registry/rules/encryption/hcvault/hcvault_client.py
प्रभावित क्लाइंट को निम्नानुसार आरंभ किया जाता है:
self._client = hvac.Client(
url=vault_url,
token=token,
namespace=ns,
verify=False
)
चूँकि verify=False बिना शर्त है, क्लाइंट अविश्वसनीय TLS प्रमाणपत्रों को स्वीकार करता है, जिनमें स्व-हस्ताक्षरित या हमलावर-नियंत्रित प्रमाणपत्र भी शामिल हैं।
एक नेटवर्क-स्थित हमलावर जो एप्लिकेशन के Vault ट्रैफ़िक को इंटरसेप्ट या रीडायरेक्ट करने में सक्षम है, Vault सर्वर का रूप धारण कर सकता है, Vault प्रमाणीकरण क्रेडेंशियल्स को कैप्चर कर सकता है, और नकली Vault/KMS प्रतिक्रियाएँ लौटा सकता है।
प्रभावित HCVault एकीकरण Vault टोकन, नेमस्पेस, और AppRole क्रेडेंशियल्स के लिए कॉन्फ़िगरेशन प्रदान करता है, लेकिन प्रभावित संस्करण प्रमाणपत्र सत्यापन को बहाल करने के लिए कोई समर्थित CA-बंडल कॉन्फ़िगरेशन या समकक्ष तंत्र प्रदान नहीं करते हैं।
एप्लिकेशन और HashiCorp Vault के बीच नेटवर्क मैन-इन-द-मिडल स्थिति वाला हमलावर यह कर सकता है:
X-Vault-Tokenrole_idsecret_idयह Vault-समर्थित KMS वर्कफ़्लो द्वारा संरक्षित डेटा की गोपनीयता और अखंडता से समझौता कर सकता है।
confluent-kafka Apache Kafka के लिए आधिकारिक Confluent Python क्लाइंट है।
यह भेद्यता विशेष रूप से उन परिनियोजनों को प्रभावित करती है जो उपयोग करते हैं:
Schema Registry encryption rules
↓
HCVault KMS integration
↓
hcvault:// key URI
इसलिए प्रभावित जनसंख्या सभी confluent-kafka उपयोगकर्ताओं की तुलना में संकीर्ण है।
हालाँकि, प्रभावित कार्यक्षमता सुरक्षा-संवेदनशील है क्योंकि ये परिनियोजन क्रिप्टोग्राफिक कुंजी प्रबंधन और फ़ील्ड-स्तरीय एन्क्रिप्शन के लिए HashiCorp Vault पर निर्भर करते हैं।
HcVaultKmsClient.__init__() एक hcvault:// कुंजी URI को पार्स करता है, Vault बेस URL निर्धारित करता है, और एक hvac.Client बनाता है।
प्रभावित संस्करणों में, जिसमें 2.14.2 भी शामिल है, प्रासंगिक कोड है:
self._client = hvac.Client(
url=vault_url,
token=token,
namespace=ns,
verify=False
)
if role_id and secret_id and self._client is not None:
self._client.auth.approle.login(
role_id=role_id,
secret_id=secret_id
)
hvac लाइब्रेरी अंततः Python requests TLS स्टैक पर निर्भर करती है।
सेटिंग:
verify=False
क्लाइंट को निर्देश देती है कि वह रिमोट सर्वर के TLS प्रमाणपत्र को मान्य न करे।
परिणामस्वरूप, वे प्रमाणपत्र जो सामान्यतः अस्वीकार किए जाते, स्वीकार किए जा सकते हैं, जिनमें ऐसे प्रमाणपत्र शामिल हैं जो:
यह दोनों समर्थित प्रमाणीकरण पथों को प्रभावित करता है।
जब टोकन प्रमाणीकरण का उपयोग किया जाता है, तो Vault टोकन इसके माध्यम से भेजा जाता है:
X-Vault-Token
HTTP हेडर।
यदि कोई हमलावर सफलतापूर्वक Vault एंडपॉइंट का रूप धारण कर लेता है, तो हमलावर-नियंत्रित सर्वर यह टोकन प्राप्त कर सकता है।
जब AppRole प्रमाणीकरण का उपयोग किया जाता है, तो क्लाइंट भेजता है:
role_id
secret_id
इस पर:
/v1/auth/approle/login
इसलिए एक सफल MITM दोनों AppRole क्रेडेंशियल्स को कैप्चर कर सकता है।
प्रभावित HCVault ड्राइवर निम्नलिखित सहित कॉन्फ़िगरेशन पढ़ता है:
token.id
namespace
approle.role.id
approle.secret.id
साथ ही प्रासंगिक VAULT_* पर्यावरण चर।
हालाँकि, प्रभावित संस्करण ऑपरेटरों को निम्नलिखित की अनुमति देने वाला कॉन्फ़िगरेशन उजागर नहीं करते हैं:
परिणामस्वरूप, प्रभावित एकीकरण का उपयोग करने वाले एप्लिकेशन सामान्य पैकेज कॉन्फ़िगरेशन के माध्यम से TLS सत्यापन बहाल नहीं कर सकते हैं।
पैकेज सुरक्षित डिफ़ॉल्ट पर निर्भर रहने के बजाय स्पष्ट रूप से TLS सर्वर-प्रमाणपत्र सत्यापन को अक्षम करता है।
कमजोर निर्माण प्रभावी रूप से है:
hvac.Client(..., verify=False)
न कि:
hvac.Client(..., verify=True)
या बस:
hvac.Client(...)
जहाँ सत्यापन डिफ़ॉल्ट रूप से सक्षम होता है।
प्रमाणपत्र सत्यापन को अक्षम करना TLS कनेक्शन से सर्वर प्रमाणीकरण को हटा देता है।
हालाँकि कनेक्शन एन्क्रिप्टेड रहता है, क्लाइंट के पास यह निर्धारित करने का कोई विश्वसनीय तंत्र नहीं है कि वह वैध Vault सर्वर के साथ संचार कर रहा है या नहीं।
यह नेटवर्क मैन-इन-द-मिडल हमले के लिए आवश्यक स्थिति बनाता है।
सफल शोषण के लिए आवश्यक है:
एप्लिकेशन confluent-kafka का प्रभावित संस्करण उपयोग करता है:
2.8.0 से 2.14.2 तक।एप्लिकेशन HCVault KMS एकीकरण के साथ Schema Registry एन्क्रिप्शन नियमों का उपयोग करता है।
कॉन्फ़िगर की गई KMS कुंजी इस स्कीम का उपयोग करती है:
hcvault://
संभावित उदाहरणों में शामिल हैं:
आवश्यक MITM स्थिति बनने के बाद किसी एप्लिकेशन-स्तरीय विशेषाधिकार या पीड़ित इंटरैक्शन की आवश्यकता नहीं है।
poc_confluent_kafka.py स्थानीय रूप से अनपैक किए गए confluent-kafka 2.14.2 व्हील के विरुद्ध इस समस्या को प्रदर्शित करता है।
PoC उपयोग करता है:
HcVaultKmsClient कार्यान्वयन।प्रूफ़ ऑफ़ कॉन्सेप्ट में पाँच मोड हैं।
| मोड | विवरण |
|---|---|
cert | स्थानीय मॉक Vault के लिए एक स्व-हस्ताक्षरित प्रमाणपत्र और कुंजी उत्पन्न करता है। |
server | https://localhost:8443 पर मॉक HTTPS Vault शुरू करता है और प्राप्त अनुरोधों को प्रदर्शित करता है। |
control | verify=True का उपयोग करके सुरक्षित नियंत्रण; स्व-हस्ताक्षरित प्रमाणपत्र को CERTIFICATE_VERIFY_FAILED के साथ अस्वीकार करना चाहिए। |
token | कमजोर HcVaultKmsClient को लोड करता है और प्रदर्शित करता है कि यह अविश्वसनीय प्रमाणपत्र को स्वीकार करता है। |
approle | कमजोर AppRole प्रमाणीकरण पथ का परीक्षण करता है और role_id और secret_id के एक्सपोज़र को प्रदर्शित करता है। |
PoC निर्भरताएँ स्थापित करें:
pip install hvac cryptography
अनपैक किए गए कमजोर व्हील को PoC के बगल में रखें:
confluent_kafka-2.14.2-cp310-cp310-win_amd64/
└── confluent_kafka/
└── schema_registry/
└── ...