
स्वचालित आपूर्ति श्रृंखला सुरक्षा मॉनिटर जो PyPI और npm रजिस्ट्रियों को पोल करता है, नए रिलीज़ को पिछले संस्करणों से तुलना करता है, और LLM विश्लेषण का उपयोग करके दुर्भावनापूर्ण कोड परिवर्तनों का पता लगाता है, जिसमें Slack अलर्टिंग शामिल है।
शीर्ष PyPI और npm पैकेजों की स्वचालित निगरानी आपूर्ति श्रृंखला से समझौता के लिए। दोनों रजिस्ट्रियों को नए रिलीज़ के लिए पोल करता है, प्रत्येक रिलीज़ की उसके पूर्ववर्ती से तुलना करता है, और डिफ को सौम्य या दुर्भावनापूर्ण के रूप में वर्गीकृत करने के लिए LLM (Cursor Agent CLI के माध्यम से) का उपयोग करता है। दुर्भावनापूर्ण निष्कर्ष स्लैक अलर्ट को ट्रिगर करते हैं।
दोनों इकोसिस्टम डिफ़ॉल्ट रूप से मॉनिटर किए जाते हैं। एक को अक्षम करने के लिए --no-pypi या --no-npm का उपयोग करें।
प्रत्येक इकोसिस्टम अपना स्वयं का पोलिंग थ्रेड चलाता है लेकिन विश्लेषण और अलर्टिंग पाइपलाइन साझा करता है।
┌─── PyPI ──────────────────────┐ ┌─── npm ───────────────────────┐
│ │ │ │
│ changelog_since_serial() │ │ CouchDB _changes feed │
│ │ │ │ │ │
│ ▼ │ │ ▼ │
│ ┌────────────┐ │ │ ┌────────────┐ │
│ │ All PyPI │─┐ │ │ │ All npm │─┐ │
│ │ events │ │ │ │ │ changes │ │ │
│ └────────────┘ ▼ │ │ └────────────┘ ▼ │
│ hugovk ──► Watchlist │ │ download-counts ─► Watchlist │
│ │ │ │ │ │
│ "new release" events only │ │ new versions since last epoch │
└───────────────┬───────────────┘ └───────────────┬───────────────┘
│ │
▼ ▼
┌───────────────────┐ ┌───────────────────┐
│ Download old + new│ │ Download old + new│
│ (sdist + wheel) │ │ (tarball) │
└───────────────────┘ └───────────────────┘
│ │
└─────────────────┬─────────────────┘
▼
┌───────────────┐
│ Unified diff │
│ report (.md) │
└───────┬───────┘
▼
┌───────────────┐ ◄── LLM analysis
│ Cursor Agent │ (read-only)
│ CLI (ask mode)│
└───────┬───────┘
│
verdict?
│
malicious │
▼
┌───────────────┐
│ Slack alert │
└───────────────┘
LLM विश्लेषण को निम्नलिखित देखने के लिए प्रेरित किया जाता है:
pip install -r requirements.txt के साथ रनटाइम निर्भरताएँ स्थापित करें (stdlib अधिकांश टूल को कवर करता है; Slack अपलोड के लिए requests का उपयोग किया जाता है)agent बाइनरी, IDE नहींWindows (PowerShell):
irm 'https://cursor.com/install?win32=true' | iex
macOS / Linux:
curl https://cursor.com/install -fsS | bash
इससे सत्यापित करें:
agent --version
आपको Cursor के साथ प्रमाणित होना चाहिए (agent login या CURSOR_API_KEY सेट करें)।
अपना स्लैक बॉट टोकन etc/slack.json में रखें:
{
"url": "https://hooks.slack.com/services/...",
"bot_token": "xoxb-...",
"channel": "C01XXXXXXXX"
}
बॉट को लक्ष्य चैनल पर chat:write स्कोप की आवश्यकता है। channel फ़ील्ड स्लैक चैनल आईडी है जहाँ अलर्ट पोस्ट किए जाते हैं।
# One-shot: analyze releases from the last ~10 minutes
python monitor.py --once
# Continuous: monitor top 1000 packages (both ecosystems), poll every 5 min
python monitor.py --top 1000 --interval 300
# Production: monitor top 15000, alert to Slack
python monitor.py --top 15000 --interval 300 --slack
# npm only, top 5000
python monitor.py --no-pypi --npm-top 5000
# PyPI only
python monitor.py --no-npm
| फ़ाइल | उद्देश्य |
|---|---|
monitor.py | मुख्य आयोजक — PyPI + npm को पोल करें, डिफ़ करें, विश्लेषण करें, अलर्ट करें (समानांतर थ्रेड्स) |
pypi_monitor.py | स्टैंडअलोन PyPI चेंजलॉग पोलर (अन्वेषण के लिए उपयोगी) |
package_diff.py | किसी भी PyPI या npm पैकेज के दो संस्करण डाउनलोड और डिफ़ करें |
analyze_diff.py | Cursor Agent CLI को एक डिफ़ भेजें, निर्णय पार्स करें |
top_pypi_packages.py | शीर्ष N PyPI पैकेजों को डाउनलोड गणना द्वारा प्राप्त करें और सूचीबद्ध करें |
slack.py | स्लैक API क्लाइंट (SendMessage, PostFile) |
etc/slack.json | स्लैक बॉट क्रेडेंशियल |
last_serial.yaml | स्थिर पोलिंग स्थिति (PyPI सीरियल + npm सीक्वेंस/इपॉक) |
logs/ | दैनिक लॉग फ़ाइलें (monitor_YYYYMMDD.log) |
python monitor.py [OPTIONS]
Options:
--top N प्रति इकोसिस्टम देखने के लिए शीर्ष पैकेजों की संख्या (डिफ़ॉल्ट: 15000)
--interval SECS पोल अंतराल सेकंड में (डिफ़ॉल्ट: 300)
--once हाल की घटनाओं पर एक बार पास करें, फिर बाहर निकलें
--slack दुर्भावनापूर्ण निष्कर्षों के लिए स्लैक अलर्ट सक्षम करें
--model MODEL LLM मॉडल ओवरराइड करें (डिफ़ॉल्ट: composer-2-fast)
--debug DEBUG लॉगिंग सक्षम करें (एजेंट रॉ आउटपुट शामिल है)
PyPI options:
--no-pypi PyPI मॉनिटरिंग अक्षम करें
--serial N PyPI चेंजलॉग सीरियल जिससे शुरू करना है
npm options:
--no-npm npm मॉनिटरिंग अक्षम करें
--npm-top N देखने के लिए शीर्ष N npm पैकेज (डिफ़ॉल्ट: --top के समान)
--npm-seq N npm प्रतिकृति अनुक्रम जिससे शुरू करना है
PyPI और npm प्रत्येक अपने स्वयं के पोलिंग थ्रेड में चलते हैं। पोलिंग स्थिति (PyPI सीरियल, npm अनुक्रम + इपॉक) last_serial.yaml में स्थिर की जाती है ताकि मॉनिटर पुनरारंभ के बाद वहीं से जारी रहे जहाँ छोड़ा था।
PyPI पाइपलाइन:
--interval सेकंड पर, changelog_since_serial() कॉल करता है - एक एकल API कॉल जो अंतिम जांच के बाद से सभी घटनाओं को लौटाता है"new release" घटनाओं को फ़िल्टर करता हैnpm पाइपलाइन:
replicate.npmjs.com से वर्तमान CouchDB प्रतिकृति अनुक्रम पढ़ता है--interval सेकंड पर, अंतिम अनुक्रम के बाद से सभी रजिस्ट्री परिवर्तनों के लिए _changes फ़ीड प्राप्त करता हैसभी आउटपुट कंसोल और logs/monitor_YYYYMMDD.log दोनों में लॉग किया जाता है।
# PyPI से दो संस्करणों की तुलना करें
python package_diff.py requests 2.31.0 2.32.0
# npm से दो संस्करणों की तुलना करें
python package_diff.py --npm express 4.18.2 4.19.0
# फ़ाइल में सहेजें
python package_diff.py telnyx 2.0.0 2.1.0 -o telnyx_diff.md
# स्थानीय संग्रहों की तुलना करें
python package_diff.py --local old.tar.gz new.tar.gz -n mypackage
डाउनलोड सीधे रजिस्ट्री APIs (PyPI JSON API / npm रजिस्ट्री) के माध्यम से किए जाते हैं, pip या npm से नहीं। इसका अर्थ है:
# एक डिफ़ फ़ाइल का विश्लेषण करें
python analyze_diff.py telnyx_diff.md
# JSON आउटपुट
python analyze_diff.py telnyx_diff.md --json
# एक विशिष्ट मॉडल का उपयोग करें
python analyze_diff.py telnyx_diff.md --model claude-4-opus
Cursor Agent CLI को --mode ask (रीड-ओनली) में --trust के साथ चलाता है। एजेंट डिफ़ फ़ाइल पढ़ता है और एक संरचित निर्णय लौटाता है।
निकास कोड: 0 = सौम्य, 1 = दुर्भावनापूर्ण, 2 = अज्ञात/त्रुटि।
# देखें कि अभी क्या रिलीज़ हो रहा है (पिछले ~10 मिनट)
python pypi_monitor.py --once --top 15000
# सतत निगरानी (केवल कंसोल आउटपुट, कोई विश्लेषण नहीं)
python pypi_monitor.py --top 1000 --interval 120
पूर्ण विश्लेषण पाइपलाइन चलाए बिना PyPI रिलीज़ वेग की खोज या चेंजलॉग API को डीबग करने के लिए उपयोगी।
# शीर्ष 1000 पैकेज प्रिंट करें
python top_pypi_packages.py
# लाइब्रेरी के रूप में उपयोग करें
from top_pypi_packages import fetch_top_packages
packages = fetch_top_packages(top_n=500)
# [{"project": "boto3", "download_count": 1577565199}, ...]
| स्रोत | क्या | दर सीमाएँ |
|---|---|---|
| hugovk/top-pypi-packages | 30-दिवसीय डाउनलोड द्वारा शीर्ष 15,000 PyPI पैकेज (मासिक JSON) | कोई नहीं (स्थिर फ़ाइल) |
PyPI XML-RPC changelog_since_serial() | रीयल-टाइम PyPI इवेंट फायरहोज | अप्रचलित लेकिन कार्यात्मक; प्रति पोल 1 कॉल ठीक है |
| PyPI JSON API | पैकेज मेटाडेटा, संस्करण इतिहास, डाउनलोड URL | उदार; कम उपयोग (प्रति रिलीज़ 1 कॉल) |
| download-counts (nice-registry) | प्रत्येक npm पैकेज के लिए मासिक डाउनलोड गणना (counts.json) | कोई नहीं (npm टारबॉल) |
npm CouchDB प्रतिकृति _changes फ़ीड | रीयल-टाइम npm रजिस्ट्री परिवर्तन स्ट्रीम | सार्वजनिक; पृष्ठांकित पठन |
| npm रजिस्ट्री API | पैकेज पैकुमेंट्स, टारबॉल डाउनलोड | उदार; कम उपयोग |
मॉनिटर प्रति पोल अंतराल प्रति इकोसिस्टम 1 API कॉल (PyPI चेंजलॉग / npm _changes), साथ ही प्रति नई रिलीज़ 2-3 कॉल (संस्करण इतिहास + डाउनलोड) करता है। यह बहुत हल्का है।
जब मॉनिटर एक दुर्भावनापूर्ण रिलीज़ का पता लगाता है, तो यह स्लैक पर पोस्ट करता है:
PyPI:
🚨 सप्लाई चेन अलर्ट: telnyx 4.87.2
रैंक: #5,481 शीर्ष PyPI पैकेजों में से
निर्णय: दुर्भावनापूर्ण
PyPI: https://pypi.org/project/telnyx/4.87.2/
विश्लेषण सारांश (संक्षिप्त):
src/telnyx/_client.py में परिवर्तन अस्पष्ट डाउनलोड-डिक्रिप्ट-एक्ज़ीक्यूट व्यवहार और
मॉड्यूल-आयात साइड इफेक्ट्स को लागू करते हैं। एक _d() फ़ंक्शन base64 स्ट्रिंग्स को
डीकोड करता है, एक विशाल _p ब्लॉब में एक एक्सफ़िल्ट्रेशन स्क्रिप्ट है जो
http://83.142.209.203:8080/ringtone.wav से एक .wav फ़ाइल डाउनलोड करती है और
स्टेग्नोग्राफ़ी के माध्यम से एक छिपा हुआ पेलोड निकालती है...
npm:
🚨 सप्लाई चेन अलर्ट: axios 0.30.4
रैंक: #42 शीर्ष npm पैकेजों में से
निर्णय: दुर्भावनापूर्ण
npm: https://www.npmjs.com/package/axios/v/0.30.4
विश्लेषण सारांश (संक्षिप्त):
1. **गैर-मानक निर्भरता** — `dependencies` ब्लॉक में `plain-crypto-js` शामिल है। प्रकाशित
axios केवल `follow-redirects`, `form-data`, और `proxy-from-env` पर निर्भर करता है।
एक चौथा पैकेज जिसका नाम **`crypto-js`–शैली टाइपोस्क्वाट** जैसा दिखता है,
छेड़छाड़ या नकली पैकेज का एक क्लासिक संकेत है, न कि सामान्य axios रिलीज़।
agent CLI के प्रमाणित होने पर निर्भर करता है।ask मोड में चलता है लेकिन OS-स्तरीय सैंडबॉक्सिंग के बिना।लॉग stdout और logs/monitor_YYYYMMDD.log दोनों पर लिखे जाते हैं। प्रत्येक दिन एक नई फ़ाइल बनाई जाती है। दोनों इकोसिस्टम एक ही फ़ाइल में लॉग करते हैं, npm लाइनें [npm] उपसर्ग के साथ। उदाहरण:
2026-03-27 12:01:15 [INFO] Fetching top 15,000 packages from hugovk dataset...
2026-03-27 12:01:16 [INFO] Watchlist loaded: 15,000 packages (dataset updated 2026-03-01 07:34:08)
2026-03-27 12:01:16 [INFO] Fetching top 15,000 npm packages from download-counts dataset...
2026-03-27 12:01:18 [INFO] npm watchlist loaded: 15,000 packages (download-counts 1.0.52)
2026-03-27 12:01:19 [INFO] [pypi] Starting serial: 35,542,068 (from last_serial.yaml) — polling every 300s
2026-03-27 12:01:19 [INFO] [npm] Starting seq: 42,817,503 (from last_serial.yaml) — polling every 300s
2026-03-27 12:06:18 [INFO] [pypi] 2 new watchlist releases detected (serial 35,542,068 -> 35,542,190)
2026-03-27 12:06:18 [INFO] [pypi] Processing fast-array-utils 1.4 (rank #8,231)...
2026-03-27 12:06:18 [INFO] [pypi] Diffing fast-array-utils 1.3 -> 1.4
2026-03-27 12:06:50 [INFO] [pypi] Analyzing diff for fast-array-utils...
2026-03-27 12:07:35 [INFO] [pypi] Verdict for fast-array-utils 1.4: BENIGN
2026-03-27 12:06:20 [INFO] [npm] 1 new watchlist releases detected (seq -> 42,817,612)
2026-03-27 12:06:20 [INFO] [npm] Processing axios 0.30.4 (rank #42)...
2026-03-27 12:06:21 [INFO] [npm] Diffing axios 0.30.3 -> 0.30.4
2026-03-27 12:07:01 [INFO] [npm] Analyzing diff for axios...
2026-03-27 12:07:45 [INFO] [npm] Verdict for axios 0.30.4: MALICIOUS
यह प्रोजेक्ट MIT लाइसेंस के अंतर्गत लाइसेंस प्राप्त है। तृतीय-पक्ष डेटा स्रोत और सूचनाएँ NOTICE.txt में संक्षेपित हैं।
योगदान आमंत्रित हैं — CONTRIBUTING.md देखें। यह रिपॉजिटरी Contributor Covenant का पालन करती है। सुरक्षा मुद्दों की रिपोर्ट सार्वजनिक मुद्दों के माध्यम से नहीं, बल्कि SECURITY.md के माध्यम से करें।
प्रश्न और चर्चा: Elastic समुदाय स्लैक।