
Zero-dependency CLI scanner npm/PyPI आपूर्ति श्रृंखला समझौतों के लिए। लॉकफाइलों और Mini Shai-Hulud (CVE-2026-45321) जैसे हमलों से सिस्टम-स्तरीय IOCs में समझौता किए गए पैकेजों का पता लगाता है।
npm और PyPI आपूर्ति श्रृंखला समझौतों के लिए शून्य-निर्भरता CLI स्कैनर।
11 मई, 2026 को, एक स्व-प्रसार आपूर्ति श्रृंखला वर्म जिसका नाम Mini Shai-Hulud (CVE-2026-45321, GHSA-g7cv-rxg3-hmpx) है, ने npm पारिस्थितिकी तंत्र से समझौता किया। TeamPCP (उर्फ DeadCatx3, PCPcat, ShellForce, CipherForce) को जिम्मेदार ठहराया गया, मैलवेयर ने GitHub Actions OIDC टोकन को हाईजैक करके मान्य SLSA Build Level 3 प्रोवेनेंस के साथ दुर्भावनापूर्ण पैकेज प्रकाशित किए। इसने CI/CD पाइपलाइनों, क्लाउड प्रदाताओं और क्रिप्टोकरेंसी वॉलेट से क्रेडेंशियल चुराए, और Claude Code और VS Code में स्थायित्व हुक स्थापित किए। एक अंतर्निहित डेड-मैन स्विच ने npm टोकन रद्द होने पर उपयोगकर्ता की होम निर्देशिका को मिटाने की धमकी दी।
प्रभावित पैकेजों में TanStack राउटर और स्टार्ट पैकेज, Mistral AI SDKs, OpenSearch क्लाइंट, UiPath टूलिंग और दर्जनों अन्य शामिल थे। चूंकि आपूर्ति श्रृंखला हमले तेज़ी से फैलते हैं, संगठनों को एक हल्के, विश्वसनीय स्कैनर की आवश्यकता होती है जिसे वे अपने स्वयं के हमले की सतह पर नई निर्भरताएँ जोड़े बिना कहीं भी चला सकें।
package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lock, bun.lockb, poetry.lock, Pipfile.lock, और requirements.txt में समझौता किए गए npm और PyPI पैकेजों का पता लगाता है।fs, path, child_process, os) का उपयोग करता है। स्कैनर आपकी आपूर्ति श्रृंखला जोखिम को नहीं बढ़ाता है।0 = साफ, 1 = निष्कर्ष, 2 = त्रुटि)।src/db.ts में अलग-अलग अभियानों के रूप में जोड़ा जाता है; फ़ाइल अपडेट करें और पुनः चलाएँ।कोई स्थापना आवश्यक नहीं। अपने पसंदीदा पैकेज रनर के साथ सीधे चलाएँ:
# npx
npx @digi4care/shai-scan
# bunx
bunx @digi4care/shai-scan
# pnpm dlx
pnpm dlx @digi4care/shai-scan
वैश्विक स्थापना (वैकल्पिक):
npm install -g @digi4care/shai-scan
# or
pnpm add -g @digi4care/shai-scan
स्रोत से:
git clone https://github.com/digi4care/shai-scan.git
cd shai-scan
pnpm install
bun run src/cli.ts --help # Bun (विकास के लिए अनुशंसित)
# या Node.js के साथ बनाएँ और चलाएँ:
pnpm run build && node dist/cli.js --help
npx @digi4care/shai-scan
npx @digi4care/shai-scan ~/projects/my-app
npx @digi4care/shai-scan --json .
npx @digi4care/shai-scan --sarif --sarif-file results.sarif .
#!/bin/bash
npx @digi4care/shai-scan --severity high . || {
code=$?
if [ "$code" -eq 1 ]; then
echo "Supply chain findings detected"
exit 1
elif [ "$code" -eq 2 ]; then
echo "Scanner error"
exit 2
fi
}
name: Supply Chain Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: pnpm install --frozen-lockfile
- run: npx @digi4care/shai-scan --severity high .
name: Supply Chain Scan SARIF
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 6 * * 1'
jobs:
scan:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: pnpm install --frozen-lockfile
- run: npx @digi4care/shai-scan --sarif --sarif-file results.sarif .
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
| प्रारूप | ध्वज | विवरण |
|---|---|---|
| पाठ | (डिफ़ॉल्ट) |
उदाहरण JSON अंश:
[
{
"package": "@tanstack/react-router",
"version": "1.169.5",
"ecosystem": "npm",
"severity": "critical",
"campaign": "mini-shai-hulud-wave4",
"cve": "CVE-2026-45321",
"reference": "https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx"
}
]
| कोड | अर्थ |
|---|---|
| 0 | कोई समझौता किया गया पैकेज या IOC का पता नहीं चला |
| 1 | एक या अधिक निष्कर्षों का पता चला |
| 2 | रनटाइम त्रुटि (अमान्य पथ, अपठनीय लॉकफ़ाइल, आदि) |
जब एक नया आपूर्ति श्रृंखला हमला खोजा जाता है, तो src/db.ts को अपडेट करें:
CompromisedVersion[] सरणी जोड़ें।CAMPAIGNS सरणी में एक नया Campaign ऑब्जेक्ट जोड़ें, जिसमें CVE/GHSA पहचानकर्ता, गंभीरता, विवरण, संदर्भ URL और IOC संकेतक शामिल हों।buildLookup() फ़ंक्शन अगले रन पर स्वचालित रूप से लुकअप मानचित्र को पुनर्निर्मित करता है।Bun का उपयोग करते समय कोई पुनर्निर्माण चरण आवश्यक नहीं है। src/db.ts में परिवर्तन bun run src/cli.ts के साथ तुरंत प्रभावी होते हैं। npm पैकेज के लिए, संपादन के बाद pnpm run build चलाएँ।
शून्य रनटाइम निर्भरताएँ: स्कैनर केवल Node.js/Bun के अंतर्निहित मॉड्यूल का उपयोग करता है। यह रनटाइम पर तृतीय-पक्ष कोड डाउनलोड या निष्पादित नहीं करता है, जिससे स्कैनर के स्वयं एक समझौता वेक्टर बनने का जोखिम समाप्त हो जाता है।
pnpm पैकेज प्रबंधक के रूप में: pnpm सख्त लॉकफ़ाइलों का उपयोग करता है, डिफ़ॉल्ट रूप से लाइफसाइकिल स्क्रिप्ट निष्पादित नहीं करता है, और सामग्री-पता योग्य संग्रहण का समर्थन करता है। ये गुण अन्य पैकेज प्रबंधकों की तुलना में हमले की सतह को कम करते हैं।
अनुशंसित .npmrc सेटिंग्स: पैकेज स्थापित करते समय अधिकतम सुरक्षा के लिए, अपने प्रोजेक्ट या वैश्विक .npmrc में निम्नलिखित जोड़ें:
ignore-scripts=true
engine-strict=true
कोई नेटवर्क कॉल नहीं: shai-scan घर फ़ोन नहीं करता, हस्ताक्षर डाउनलोड नहीं करता, या API कुंजी की आवश्यकता नहीं होती। सभी अभियान डेटा पैकेज के साथ भेजा जाता है।
निम्नलिखित पैकेज और संस्करण CVE-2026-45321 (Mini Shai-Hulud Wave 4) में समझौता होने के लिए जाने जाते हैं। यह एक प्रतिनिधि उपसमूह है; पूरी सूची src/db.ts में बनाए रखी गई है।
MIT. विवरण के लिए LICENSE देखें।
shai-scan एक पहचान सहायता है, न कि व्यापक सुरक्षा ऑडिट, निर्भरता समीक्षा या खतरा खुफिया प्लेटफार्मों का विकल्प। यह भेजे गए डेटाबेस के आधार पर ज्ञात समझौता किए गए संस्करणों की पहचान करता है; नवीन या शून्य-दिवसीय आपूर्ति श्रृंखला हमलों का तब तक पता नहीं लगाया जा सकता जब तक कोई अभियान नहीं जोड़ा जाता। हमेशा गहराई से बचाव का अभ्यास करें: निर्भरताओं का ऑडिट करें, संस्करणों को पिन करें, प्रोवेनेंस सत्यापित करें, और CI/CD पाइपलाइनों की निगरानी करें।
| गंभीरता, पैकेज नाम, संस्करण और अभियान विवरण के साथ निष्कर्षों की मानव-पठनीय तालिका |
| JSON | --json | निष्कर्षों की संरचित JSON सरणी, SIEM या कस्टम डैशबोर्ड में अंतर्ग्रहण के लिए उपयुक्त |
| SARIF | --sarif | GitHub कोड स्कैनिंग, GitLab Secure, या अन्य SARIF उपभोक्ताओं पर अपलोड के लिए OASIS SARIF 2.1.0 प्रारूप |
| पैकेज | पारिस्थितिकी तंत्र | समझौता संस्करण |
|---|
@tanstack/react-router | npm | 1.169.5, 1.169.8 |
@tanstack/vue-router | npm | 1.169.5, 1.169.8 |
@tanstack/solid-router | npm | 1.169.5, 1.169.8 |
@tanstack/router-core | npm | 1.169.5, 1.169.8 |
@tanstack/react-start | npm | 1.167.68, 1.167.71 |
@mistralai/mistralai | npm | 2.2.2, 2.2.3, 2.2.4 |
@mistralai/mistralai-azure | npm | 1.7.2, 1.7.3 |
mistralai | pypi | 2.4.6 |
@opensearch-project/opensearch | npm | 3.5.3, 3.6.2, 3.7.0, 3.8.0 |
@uipath/robot | npm | 1.3.4 |
@squawk/airways | npm | 0.4.2, 0.4.3, 0.4.5 |
@draftauth/core | npm | 0.13.1, 0.13.2 |
@tallyui/core | npm | 0.2.1, 0.2.2, 0.2.3 |
safe-action | npm | 0.8.3, 0.8.4 |
cmux-agent-mcp | npm | 0.1.3 - 0.1.8 |
nextmove-mcp | npm | 0.1.3, 0.1.4, 0.1.5, 0.1.7 |
ts-dna | npm | 3.0.1, 3.0.2, 3.0.4 |
cross-stitch | npm | 1.1.3, 1.1.4, 1.1.6 |
git-git-git | npm | 1.0.8 - 1.0.12 |
git-branch-selector | npm | 1.3.3 - 1.3.7 |
agentwork-cli | npm | 0.1.4, 0.1.5 |
wot-api | npm | 0.8.1, 0.8.2, 0.8.4 |
ml-toolkit-ts | npm | 1.0.4, 1.0.5 |
@beproduct/nestjs-auth | npm | 0.1.2 - 0.1.19 |
@dirigible-ai/sdk | npm | 0.6.2, 0.6.3 |
@taskflow-corp/cli | npm | 0.1.24 - 0.1.29 |
@tolka/cli | npm | 1.0.2, 1.0.3, 1.0.4, 1.0.6 |
@supersurkhet/cli | npm | 0.0.2 - 0.0.7 |
guardrails-ai | pypi | 0.10.1 |