
Seal Security उदाहरण — कमजोर pip ऐप (PyYAML CVE-2020-14343) को सील किए गए संस्करणों में ठीक किया गया; GitHub Actions + Jenkins एकीकरण
एक न्यूनतम, जानबूझकर कमजोर Flask एप्लिकेशन जिसका उपयोग यह प्रदर्शित करने के लिए किया जाता है कि कैसे Seal Security एक ज्ञात CVE को ठीक करता है, एक कमजोर निर्भरता को सील (बैकपोर्टेड, ड्रॉप‑इन) संस्करण से बदलकर — आपकी घोषित आवश्यकताओं या आपके कोड में कोई बदलाव किए बिना।
इसे CI/CD में Seal CLI के लिए एक फ्रंट‑टू‑बैक स्मोक टेस्ट के रूप में डिज़ाइन किया गया है: ऐप चलाएं, एक वास्तविक एक्सप्लॉइट ट्रिगर करें, Seal चलाएं, और उसी एक्सप्लॉइट को अवरुद्ध होते देखें।
| इकोसिस्टम | Python / pip |
| कमजोर पैकेज | PyYAML==5.1 |
| CVE | CVE‑2020‑14343 — yaml.load / FullLoader डिसीरियलाइज़ेशन → आर्बिट्रेरी कोड एक्ज़ीक्यूशन |
| सील (फिक्स्ड) संस्करण | Seal के PyPI रजिस्ट्री से pyyaml 5.1+sp1 |
| एकीकरण | एक बिल्ड स्टेप के रूप में Seal CLI — GitHub Actions और Jenkins दोनों के लिए दिखाया गया |
वेलकम पेज एक name लेता है और इसे PyYAML के डिफ़ॉल्ट लोडर के माध्यम से पार्स करता है:
parsed = yaml.load(name) # PyYAML 5.1 → असुरक्षित FullLoader (CVE-2020-14343)
PyYAML 5.1 पर, yaml.load() बिना स्पष्ट SafeLoader के FullLoader का उपयोग करता है, जो अविश्वसनीय इनपुट से मनमाना Python ऑब्जेक्ट बना सकता है। एक हमलावर एक YAML पेलोड सबमिट करता है जो सर्वर पर मनमाना Python का मूल्यांकन करता है।
सामान्य अनुरोध
/?name=alice → Welcome, alice!
एक्सप्लॉइट अनुरोध — इस YAML को name के रूप में पास करें (वर्कफ़्लो लॉग में पहले से URL‑एन्कोडेड):
!!python/object/apply:tuple [!!python/object/apply:map [!!python/name:eval , ["__import__('subprocess').check_output(['id']).decode()"]]]
कमजोर PyYAML पेलोड को डिसीरियलाइज़ और चलाता है, ऐप “You've been pwned” पेज दिखाता है, और सर्वर को फिर मार दिया जाता है (कुछ सेकंड बाद, ताकि पेज पहले डिलीवर हो)। पुनः लोड करें और ऐप गायब है — ngrok पर आप “endpoint offline” पेज देखेंगे।
.
├── app.py # कमजोर Flask ऐप
├── requirements.txt # PyYAML==5.1 घोषित करता है
├── Jenkinsfile # Seal स्टेज के साथ उदाहरण Jenkins (Groovy) पाइपलाइन
└── .github/workflows/
├── build-and-run.yml # ब्राउज़र परीक्षण के लिए ऐप चलाएं + एक्सपोज़ करें
└── seal-security.yml # Seal सुधार चलाएं, फिर ऐप शुरू करें
Seal SaaS, Seal‑होस्टेड है — आपके वातावरण में कुछ भी स्थापित नहीं किया गया है, और सभी ट्रैफ़िक केवल TCP 443 पर आउटबाउंड HTTPS है। सुधार चलाने के लिए आपको आवश्यकता है:
| सीक्रेट / क्रेडेंशियल |
|---|
इन्हें Settings → Secrets and variables → Actions (GitHub) या Manage Jenkins → Credentials (Jenkins) में कॉन्फ़िगर करें। टोकन को कभी भी रिपॉज़िटरी में कमिट न करें।
आउटबाउंड 443 के लिए इन Seal होस्ट्स को व्हाइटलिस्ट करें:
app.sealsecurity.io, authorization.sealsecurity.io, cli.sealsecurity.io, और — सील pip पैकेजों के लिए — pypi.sealsecurity.io। CLI बाइनरी github.com / objects.githubusercontent.com से डाउनलोड की जाती है।
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python app.py # → http://localhost:5000
http://localhost:5000/?name=alice खोलें (काम करता है), फिर ऊपर दिए गए एक्सप्लॉइट पेलोड को name के रूप में सबमिट करें — ऐप "You've been pwned" दिखाता है और सर्वर कुछ सेकंड बाद मारा जाता है।
Seal CLI एक अतिरिक्त चरण के रूप में चलता है, pip install के बाद और पैकेजिंग से पहले। यह हल की गई निर्भरताओं को स्कैन करता है और कमजोर निर्भरताओं को उनके सील संस्करणों में फिर से लिखता है, रिमोट फिक्स मोड का उपयोग करते हुए (नीति Seal UI में केंद्रीय रूप से प्रबंधित की जाती है)।
seal-community/cli-action का उपयोग करता है:
- uses: seal-community/cli-action@latest
with:
mode: fix
fix_mode: remote
token: ${{ secrets.SEAL_TOKEN }}
target: requirements.txt # इस इकोसिस्टम के लिए मेनिफ़ेस्ट
इसे Actions → “Seal Security Remediation” → Run workflow के माध्यम से चलाएं। देखें
.github/workflows/seal-security.yml।
एक एकल जोड़ा गया चरण, इंस्टॉल के बाद और पैकेजिंग से पहले। देखें Jenkinsfile:
stage('Seal') {
steps {
sh '''
curl -fsSL https://github.com/seal-community/cli/releases/download/latest/seal-linux-amd64-latest -o seal
chmod +x seal
./seal fix --mode remote "$SEAL_MANIFEST" # SEAL_MANIFEST=requirements.txt
'''
}
}
SEAL_TOKEN seal-token Jenkins क्रेडेंशियल से आता है; SEAL_PROJECT को अपने Seal प्रोजेक्ट ID पर सेट करें।
seal fix के बाद, कमजोर निर्भरता Seal के PyPI रजिस्ट्री से एक सील बिल्ड पर हल होती है — वही पैकेज, सुरक्षा फिक्स बैकपोर्टेड:
| निर्भरता | पहले | बाद (सील) |
|---|---|---|
| PyYAML | 5.1 | 5.1+sp1 |
एक सील संस्करण सुरक्षा फिक्स के साथ बैकपोर्टेड वही पैकेज है — एक ड्रॉप‑इन प्रतिस्थापन, कोई कोड बदलाव नहीं और कोई मेजर‑वर्जन अपग्रेड नहीं।
सुधारित ऐप के विरुद्ध एक्सप्लॉइट को पुनः चलाएं। सील PyYAML दुर्भावनापूर्ण ऑब्जेक्ट बनाने से इनकार करता है, इसलिए yaml.load पेलोड को निष्पादित करने के बजाय उठाता है, और ऐप “Invalid input — payload rejected.” के साथ प्रतिक्रिया करता है। सामान्य नाम अभी भी काम करते हैं।
seal fix को विशिष्ट मेनिफ़ेस्ट पर इंगित करें — pip के लिए requirements.txt। एकाधिक मेनिफ़ेस्ट/लॉक फ़ाइलों वाले रिपॉज़िटरी के लिए, प्रति मेनिफ़ेस्ट एक seal fix चलाएं।यह पूरा एकीकरण है — एक चरण, केवल आउटबाउंड, एप्लिकेशन कोड में कोई बदलाव नहीं।
| किसके लिए उपयोग किया जाता है |
|---|
| कहाँ जाता है |
|---|
| Seal टोकन | Seal CLI को प्रमाणित करना | GitHub Actions सीक्रेट SEAL_TOKEN / Jenkins "Secret text" क्रेडेंशियल seal-token |
| ngrok टोकन (वैकल्पिक) | चल रहे ऐप को ब्राउज़र परीक्षण के लिए एक्सपोज़ करना | GitHub Actions सीक्रेट NGROK_TOKEN |