
TanStack npm सप्लाई चेन हमले के संकेतकों (CVE-2026-45321 / GHSA-g7cv-rxg3-hmpx) का पता लगाने के लिए शेल स्क्रिप्ट
डेवलपर मशीन, रिपॉजिटरी या CI रनर पर TanStack npm सप्लाई-चेन हमले के संकेतकों का पता लगाएँ। Bash स्क्रिप्ट, Docker इमेज और GitHub Action — एक ही इंजन, तीन प्रवेश बिंदु।
CVE-2026-45321 / GHSA-g7cv-rxg3-hmpx
26 मई 2026 को, हमलावरों ने GitHub Actions कैश पॉइज़निंग के माध्यम से 42 @tanstack/* पैकेजों में 84 दुर्भावनापूर्ण संस्करण प्रकाशित किए। पेलोड GitHub टोकन, npm टोकन, AWS/GCP/Azure क्रेडेंशियल्स चुराता है और एक डेड-मैन स्विच डेमॉन स्थापित करता है जो चुराए गए टोकन को रद्द करने पर ~/ को मिटा देता है।
वह प्रवेश बिंदु चुनें जो आपकी स्थिति से मेल खाता हो।
TAG=v1.0.0
curl -fsSLO https://github.com/fabriziosalmi/tanstack-compromise-checker/releases/download/$TAG/check.sh
curl -fsSLO https://github.com/fabriziosalmi/tanstack-compromise-checker/releases/download/$TAG/check.sh.sha256
sha256sum -c check.sh.sha256
bash check.sh --online
docker run --rm -v "$PWD":/scan \
ghcr.io/fabriziosalmi/tanstack-compromise-checker:v1.0.0 \
/scan true fail tanstack-findings.json '' GHSA-g7cv-rxg3-hmpx
इमेज मल्टी-आर्क (linux/amd64, linux/arm64) है और GitHub OIDC के माध्यम से हस्ताक्षरित बिल्ड प्रोवेंस के साथ आती है। चलाने से पहले सत्यापित करें:
gh attestation verify \
oci://ghcr.io/fabriziosalmi/tanstack-compromise-checker:v1.0.0 \
--repo fabriziosalmi/tanstack-compromise-checker
permissions: {}
jobs:
check:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: fabriziosalmi/tanstack-compromise-checker@v1
with:
scan-dir: .
online: 'true'
fail-on: fail
एक पूरा हार्डन्ड वर्कफ़्लो .github/workflows/tanstack-check.yml पर उपलब्ध है और यह वही वर्कफ़्लो है जो यह रिपॉजिटरी स्वयं के विरुद्ध चलाती है।
--online के साथ, स्क्रिप्ट रनटाइम पर GHSA सलाहकार भी लाती है ताकि पहचान कवरेज संस्करणों की हार्ड-कोडित सूची के बजाय सलाहकार की लाइव स्थिति को ट्रैक करे।
प्रभावित परिवार: @tanstack/router, @tanstack/react-router,
@tanstack/history, @tanstack/start, @tanstack/eslint-plugin-router, और संबंधित पैकेज।
स्वच्छ परिवार (प्रभावित नहीं): @tanstack/react-query,
@tanstack/react-table, @tanstack/react-virtual, @tanstack/form,
@tanstack/store।
# त्वरित जाँच (वर्तमान उपयोगकर्ता का होम)
bash check.sh
# ऑनलाइन मोड: GHSA सलाहकार और npm रजिस्ट्री प्रकाशन-समय क्वेरी करें
bash check.sh --online
# एक विशिष्ट निर्देशिका स्कैन करें
bash check.sh --scan-dir /path/to/your/repos
# CI/SIEM एकीकरण के लिए JSON आउटपुट
bash check.sh --json > findings.json
# प्रभावित रिपॉजिटरी के लिए पिन कमांड सुझाएँ (ड्राई-रन)
bash check.sh --scan-dir /path/to/repos --fix
# एक विस्तारित ज्ञात-बुरी सूची प्रदान करें
bash check.sh --bad-versions-file ./extra-bad-versions.txt
| कोड | अर्थ |
|---|---|
| 0 | स्वच्छ — स्कैन किए गए दायरे में कोई संकेतक नहीं |
| 1 | केवल चेतावनियाँ — समीक्षा अनुशंसित |
| 2 | विफलताएँ — समझौता संकेतक मौजूद |
| 3 | उपकरण/उपयोग त्रुटि |
यह रिपॉजिटरी उसी हमला वर्ग के विरुद्ध आत्मरक्षा करती है जिसका वह पता लगाती है। ठोस रूप से:
uses: 40-अक्षर कमिट SHA पर पिन किया गया है, न कि फ्लोटिंग टैग पर।permissions: {} घोषित करता है; जॉब्स केवल वही अनुदान देते हैं जो उन्हें चाहिए।actions/checkout को persist-credentials: false के साथ बुलाया जाता है ताकि $GITHUB_WORKSPACE में कोई प्रमाणित git रिमोट न रहे।step-security/harden-runner प्रत्येक वर्कफ़्लो का पहला चरण है और रनर एग्रेस की निगरानी करता है।main पर प्रत्येक पुश पर चलता है; परिणाम SARIF के रूप में अपलोड किए जाते हैं।gh attestation के साथ ऑफ़लाइन सत्यापित कर सकता है।check.sh.sha256 शिप करती है।पूर्ण नीति SECURITY.md में है।
किसी भी सुरक्षा उपकरण के लिए curl | bash न करें, इस उपकरण सहित। हमेशा डाउनलोड करें, चेकसम सत्यापित करें, निरीक्षण करें, फिर चलाएँ।
━━ 1 / 8 डेड-मैन स्विच आर्टिफैक्ट
✔ कोई डेड-मैन स्विच आर्टिफैक्ट नहीं मिला
━━ 2 / 8 स्थायित्व वैक्टर
✔ कोई स्थायित्व वैक्टर पता नहीं चला
━━ 3 / 8 टोकन / क्रेडेंशियल एक्सपोज़र
✔ कोई क्रेडेंशियल एक्सपोज़र पता नहीं चला
━━ 4 / 8 नेटवर्क संकेतक
✔ वर्तमान में कोई node TCP कनेक्शन स्थापित नहीं है (या कोई अवलोकन योग्य नहीं)
━━ 5 / 8 रिपोज स्कैन — package.json + लॉकफ़ाइलें
ℹ 12 package.json + 8 lockfile(s) मिले
✔ किसी भी package.json में कोई समझौता परिवार घोषित नहीं
✔ किसी भी लॉकफ़ाइल में कोई समझौता पिन नहीं मिला
━━ 6 / 8 स्थापित node_modules — प्रत्यक्ष संस्करण जाँच
✔ स्थापित node_modules में कोई समझौता पैकेज नहीं
━━ 7 / 8 GitHub Actions हार्डनिंग संकेत
✔ (स्कैन किए गए दायरे में) कोई जोखिमपूर्ण GitHub Actions पैटर्न पता नहीं चला
━━ 8 / 8 मिनी शाई-हुलुद पेलोड + सहायक IOC
✔ कोई मिनी शाई-हुलुद पेलोड / सहायक IOC पता नहीं चला
━━ सारांश
पास: 8 चेतावनियाँ: 0 विफल: 0
दायरा : /Users/alice/dev
✔ दायरे के भीतर समझौते का कोई संकेतक नहीं: /Users/alice/dev
नोट: /Users/alice/dev के लिए स्वच्छ परिणाम शेष सिस्टम को प्रमाणित नहीं करता है।
डेमॉन को रोकने से पहले अपने GitHub टोकन को रद्द न करें — टोकन रद्द होने के क्षण डेड-मैन स्विच
rm -rf ~/करेगा।
launchctl bootout gui/$UID ~/Library/LaunchAgents/com.user.gh-token-monitor.plistlaunchctl unload ~/Library/LaunchAgents/com.user.gh-token-monitor.plistsystemctl --user stop gh-token-monitor && systemctl --user disable gh-token-monitorrm -f ~/.local/bin/gh-token-monitor.sh~/.aws/credentials, ~/.kube/config, ~/.config/gh/hosts.yml,
~/.npmrc का निरीक्षण करें।bash स्क्रिप्ट को चाहिए:
bash 4+jq (अनुशंसित) — package-lock.json पार्सिंगpython3 (वैकल्पिक फॉलबैक) — जब jq अनुपस्थित हो तब उपयोग किया जाता हैcurl — --online के लिए आवश्यकlsof या ss (वैकल्पिक) — नेटवर्क IOC अनुमानDocker इमेज उपरोक्त सभी को बंडल करती है। इसका उपयोग उन सिस्टमों पर करें जहाँ आप ये उपकरण स्थापित नहीं कर सकते या नहीं करना चाहते।
मुद्दे और पुल रिक्वेस्ट का स्वागत है। ध्यान दें कि इस रिपॉजिटरी में CODEOWNERS का उपयोग होता है: सभी PR को मेंटेनर समीक्षा की आवश्यकता होती है।
MIT.
| # | जाँच | विवरण |
|---|
| 1 | डेड-मैन स्विच | ~/.local/bin/gh-token-monitor.sh, LaunchAgents + LaunchDaemons (macOS), systemd यूज़र + सिस्टम यूनिट्स (Linux), चल रही प्रक्रियाएँ |
| 2 | स्थायित्व | शेल rc फ़ाइलें, यूज़र/सिस्टम क्रॉनटैब, /etc/cron.*, XDG ऑटोस्टार्ट, ग्लोबल git core.hooksPath |
| 3 | क्रेडेंशियल्स | संवेदनशील env vars, ~/.npmrc, ~/.yarnrc.yml, ~/.aws/credentials, ~/.config/gh/hosts.yml, ~/.netrc, ~/.docker/config.json, ~/.kube/config, .env* फ़ाइल गणना |
| 4 | नेटवर्क IOC | चल रही node प्रक्रियाएँ जिनमें स्थापित आउटबाउंड TCP कनेक्शन हैं (अनुमानात्मक, मैन्युअल समीक्षा) |
| 5 | रिपोज स्कैन | package.json घोषित निर्भरताएँ + लॉकफ़ाइल पिन किए गए संस्करण (package-lock.json, yarn.lock, pnpm-lock.yaml) |
| 6 | स्थापित | node_modules/@tanstack/*/package.json ज्ञात-दुर्भावनापूर्ण संस्करण सूची के विरुद्ध जाँचा गया, फिर npm रजिस्ट्री time[<version>] के विरुद्ध जब --online |
| 7 | एक्शन संकेत | .github/workflows/* pull_request_target, अनुपस्थित --ignore-scripts, actions/cache उपयोग के लिए स्कैन किया गया |
| 8 | मिनी शाई-हुलुद IOC | node_modules में पेलोड फ़ाइलें (router_init.js, tanstack_runner.js), @tanstack/setup optionalDependency, AI-टूल कॉन्फिग छेड़छाड़, स्रोत में C2 डोमेन, हमलावर कमिट लेखक + शाखा पैटर्न, फिरौती-चिह्नित npm टोकन, द्वितीयक वर्म-प्रचारित पैकेज, साथ ही अज्ञात पेलोड आकृतियों के लिए सूचना-स्तरीय अनुमान |
| फ़्लैग | विवरण |
|---|
--scan-dir DIR | स्कैन करने के लिए रूट निर्देशिका (डिफ़ॉल्ट: $HOME)। /, /etc, /usr जैसी सिस्टम निर्देशिकाओं को स्कैन करने से मना करता है। |
--online | GHSA सलाहकार और npm रजिस्ट्री के time[<version>] को क्वेरी करके समझौते की पुष्टि करें। डिफ़ॉल्ट रूप से बंद — ऑप्ट-इन। |
--ghsa GHSA-ID | --online में उपयोग किए जाने वाले सलाहकार आईडी को ओवरराइड करें (डिफ़ॉल्ट GHSA-g7cv-rxg3-hmpx)। |
--attack-window-start ISO, --attack-window-end ISO | --online में उपयोग की जाने वाली प्रकाशन-समय विंडो को ओवरराइड करें। |
--fix | प्रभावित रिपॉजिटरी के लिए अनुशंसित पिन कमांड प्रिंट करें (डिफ़ॉल्ट रूप से ड्राई-रन)। |
--apply | --fix के साथ: निष्पादन के लिए ऑप्ट-इन। वर्तमान में अभी भी अंधा update अस्वीकार करता है; मैन्युअल पिनिंग आवश्यक है। |
--yes, -y | --apply के लिए पुष्टि संकेत छोड़ें। |
--json | निष्कर्षों को stdout पर JSON के रूप में भेजें (--quiet को दर्शाता है)। |
--bad-versions-file F | ज्ञात-बुरी सूची में प्रविष्टियाँ (pkg@version, प्रति पंक्ति एक) जोड़ें। |
--no-color | ANSI रंग अक्षम करें। |
--quiet, -q | प्रति-जाँच आउटपुट दबाएँ, केवल सारांश प्रिंट करें। |
-h, --help | सहायता दिखाएँ। |