Packj (الحزمة الواضحة) هي أداة للمساعدة في تخفيف هجمات سلسلة التوريد للبرامج. يمكن أن تكتشف الضارة ، الضعيفة ، المهجورة ، والتربية المطبعية ، وغيرها من الحزم "المحفوفة بالمخاطر" من سجلات حزم مفتوحة المصدر الشهيرة ، مثل NPM و Rubygems و PYPI. يمكن تخصيصه بسهولة لتقليل الضوضاء. بدأ Packj كمشروع أبحاث الدكتوراه ويجري حاليًا تطويره بموجب العديد من منح الحكومة.
لاحظ خادم الويب الذي يستضيفه Packj والعديد من عمليات التكامل في وقت لاحق من هذا الشهر؟ شاهد هذا الريبو للبقاء على اطلاع دائم.
نحن ندعم نماذج النشر المتعددة:
استخدم PackJ لتدقيق التبعيات في طلبات السحب.
- name : Packj Security Audit
uses : ossillate-inc/[email protected]
with :
# TODO: replace with your dependency files in the repo
DEPENDENCY_FILES : pypi:requirements.txt,npm:package.json,rubygems:Gemfile
REPO_TOKEN : ${{ secrets.GITHUB_TOKEN }}عرض على سوق جيثب. مثال تشغيل العلاقات العامة.
أسرع طريقة لمحاولة/اختبار Packj هي استخدام Docker. يتم دعم Podman أيضًا لتشغيل الحاويات (المعزولة).
docker run -v /tmp:/tmp/packj -it ossillate/packj:latest --help
استنساخ هذا الريبو ،
git clone https://github.com/ossillate-inc/packj.git && cd packj
تثبيت التبعيات
bundle install && pip3 install -r requirements.txt
ابدأ بالمساعدة:
python3 main.py --help
Can Packj يمكن أن يفحص الحزم من NPM و PYPI و RUST و PHP و Rubygems. دعم الصدأ و PHP هو WIP. نحن نضيف بنشاط الدعم للسجلات. كما يدعم فحص حزم NPM و PYPI المحلية (غير المنشورة).
| السجل | النظام البيئي | مدعوم |
|---|---|---|
| NPM | جافا سكريبت | ✅ |
| pypi | بيثون | ✅ |
| البضائع | الصدأ | ✅ |
| Rubygems | روبي | ✅ |
| حزمة | PHP | ✅ |
| عامل ميناء | عامل ميناء | |
| nuget | .شبكة | ✅ |
| مافن | جافا | ✅ |
| كوكوبودس | سريع |
يقدم Packj الأدوات التالية:
يقوم Packj بمراجعة حزم برامج المفتوحة مفتوحة المصدر لسمات "محفوفة بالمخاطر" التي تجعلها عرضة لهجمات سلسلة التوريد. على سبيل المثال ، يتم وضع علامة على الحزم ذات نطاقات البريد الإلكتروني المنتهية الصلاحية (التي تفتقر إلى 2FA) ، وفجوة وقت الإصدار الكبيرة ، أو واجهات برمجة التطبيقات الحساسة أو أذونات الوصول ، وما إلى ذلك على أنها محفوفة بالمخاطر.
يتم دعم تدقيق ما يلي:
python3 main.py audit -p pypi:requests rubygems:overcommitpython3 main.py audit -f npm:package.json pypi:requirements.txt بشكل افتراضي ، تقوم audit فقط بإجراء تحليل رمز ثابت للكشف عن الكود المحفوف بالمخاطر. يمكنك أيضًا PaaS -t أو --trace Flag لإجراء تحليل رمز ديناميكي أيضًا ، والذي سيقوم بتثبيت جميع الحزم المطلوبة تحت Strace ومراقبة سلوك التثبيت من الحزم. يرجى الاطلاع على مثال الإخراج أدناه.
$ docker run -v /tmp:/tmp/packj -it ossillate/packj:latest audit --trace -p npm:browserify
[+] Fetching 'browserify' from npm..........PASS [ver 17.0.0]
[+] Checking package description.........PASS [browser-side require() the node way]
[+] Checking release history.............PASS [484 version(s)]
[+] Checking version........................RISK [702 days old]
[+] Checking release time gap............PASS [68 days since last release]
[+] Checking author.........................PASS [[email protected]]
[+] Checking email/domain validity.......RISK [expired author email domain]
[+] Checking readme.........................PASS [26838 bytes]
[+] Checking homepage.......................PASS [https://github.com/browserify/browserify#readme]
[+] Checking downloads......................PASS [2M weekly]
[+] Checking repo URL.......................PASS [https://github.com/browserify/browserify]
[+] Checking repo data...................PASS [stars: 14189, forks: 1244]
[+] Checking if repo is a forked copy....PASS [original, not forked]
[+] Checking repo description............PASS [browser-side require() the node.js way]
[+] Checking repo activity...............PASS [commits: 2290, contributors: 207, tags: 413]
[+] Checking for CVEs.......................PASS [none found]
[+] Checking dependencies...................RISK [48 found]
[+] Downloading package from npm............PASS [163.83 KB]
[+] Analyzing code..........................RISK [needs 3 perm(s): decode,codegen,file]
[+] Checking files/funcs....................PASS [429 files (383 .js), 744 funcs, LoC: 9.7K]
[+] Installing package and tracing code.....PASS [found 5 process,1130 files,22 network syscalls]
=============================================
[+] 5 risk(s) found, package is undesirable!
=> Complete report: /tmp/packj_54rbjhgm/report_npm-browserify-17.0.0_hlr1rhcz.json
{
"undesirable": [
"old package: 702 days old",
"invalid or no author email: expired author email domain",
"generates new code at runtime",
"reads files and dirs",
"forks or exits OS processes",
]
}
تحذير: نظرًا لأن الحزم يمكن أن تنفذ التعليمات البرمجية الضارة أثناء التثبيت ، يوصى باستخدام
-tأو--traceفقط عند التشغيل داخل حاوية Docker أو جهاز افتراضي.
يمكن أيضًا إجراء التدقيق في حاويات Docker/Podman. يرجى العثور على تفاصيل عن السمات المحفوفة بالمخاطر وكيفية استخدامها في Audit ReadMe.
يوفر Packj صندوق رمل خفيف الوزن للتثبيت safe installation لحزمة ما. على وجه التحديد ، فإنه يمنع الحزم الخبيثة من البيانات الحساسة للتخلي عن الملفات الحساسة ، والوصول إلى الملفات الحساسة (على سبيل المثال ، مفاتيح SSH) ، والبرامج الضارة المستمرة.
تقوم بصناديق الرمل تثبيت البرامج النصية للوقت ، بما في ذلك أي تكامل أصلي. يستخدم strace (أي ، لا حاجة إلى VM/حاوية).
يرجى العثور على تفاصيل حول آلية الرمل وكيفية استخدامها في Sandbox ReadMe.
$ python3 main.py sandbox gem install overcommit
Fetching: overcommit-0.59.1.gem (100%)
Install hooks by running `overcommit --install` in your Git repository
Successfully installed overcommit-0.59.1
Parsing documentation for overcommit-0.59.1
Installing ri documentation for overcommit-0.59.1
#############################
# Review summarized activity
#############################
[+] Network connections
[+] DNS (1 IPv4 addresses) at port 53 [rule: ALLOW]
[+] rubygems.org (4 IPv6 addresses) at port 443 [rule: IPv6 rules not supported]
[+] rubygems.org (4 IPv4 addresses) at port 443 [rule: ALLOW]
[+] Filesystem changes
/
└── home
└── ubuntu
└── .ruby
├── gems
│ ├── iniparse-1.5.0 [new: DIR, 15 files, 46.6K bytes]
│ ├── rexml-3.2.5 [new: DIR, 77 files, 455.6K bytes]
│ ├── overcommit-0.59.1 [new: DIR, 252 files, 432.7K bytes]
│ └── childprocess-4.1.0 [new: DIR, 57 files, 141.2K bytes]
├── cache
│ ├── iniparse-1.5.0.gem [new: FILE, 16.4K bytes]
│ ├── rexml-3.2.5.gem [new: FILE, 93.2K bytes]
│ ├── childprocess-4.1.0.gem [new: FILE, 34.3K bytes]
│ └── overcommit-0.59.1.gem [new: FILE, 84K bytes]
├── specifications
│ ├── rexml-3.2.5.gemspec [new: FILE, 2.7K bytes]
│ ├── overcommit-0.59.1.gemspec [new: FILE, 1.7K bytes]
│ ├── childprocess-4.1.0.gemspec [new: FILE, 1.8K bytes]
│ └── iniparse-1.5.0.gemspec [new: FILE, 1.3K bytes]
├── bin
│ └── overcommit [new: FILE, 622 bytes]
└── doc
├── iniparse-1.5.0
│ └── ri [new: DIR, 119 files, 131.7K bytes]
├── rexml-3.2.5
│ └── ri [new: DIR, 836 files, 841K bytes]
├── overcommit-0.59.1
│ └── ri [new: DIR, 1046 files, 1.5M bytes]
└── childprocess-4.1.0
└── ri [new: DIR, 272 files, 297.8K bytes]
[C]ommit all changes, [Q|q]uit & discard changes, [L|l]ist details:
TL ؛ بدأ Dr Packj كمشروع بحث الدكتوراه. وهي مدعومة بمنح حكومية مختلفة.
بدأ Packj كمشروع بحثي أكاديمي. على وجه التحديد ، تستند تقنيات تحليل التعليمات البرمجية الثابتة التي تستخدمها PackJ إلى أبحاث الأمن السيبراني المتطورة: مشروع Maloss من قبل مجموعة الأبحاث الخاصة بنا في Georgia Tech.
يتم دعم Packj بمنح سخية من NSF و GRA و Alinnovate.
TL ؛ DR يفترض دكتور ماسحات الضعف الحديثة أن رمز المصدر المفتوح الطرف الثالث حميد. لذلك ، تعالج جميع هذه الأدوات التهديدات فقط من أخطاء البرمجة العرضية في الكود الحميد (المعروف أيضًا باسم CVES مثل Log4J). إنهم لا يحميون من هجمات سلسلة توريد البرمجيات الحديثة التي تشبه الطاقة الشمسية من رمز سيء (ويعرف أيضًا باسم ضار) يتم نشره من قبل الجهات الفاعلة السيئة التي تستخدم نقاط الضعف الجديدة في قناة التوريد ، بما في ذلك ارتباك التبعية ، والاتصال بالأطول ، والاحتجاج (التخزين) ، والاختطاف في الحساب ، والمحركات الاجتماعية. مثال حديث (DEC'22) هو حزمة Pytorch التي تم اختراقها باستخدام ضعف الارتباك التبعية (لم يتم تعيين CVE).
لا يقوم Packj فقط بمراجعة عمليات التدقيق لـ CVES ، ولكن أيضًا يقوم بتحليل رمز ديناميكي ثابت+ثابت بالإضافة إلى فحص البيانات الوصفية للكشف عن أي سلوك وسمات "محفوفة بالمخاطر" ، مثل التفريخ من shell ، واستخدام مفاتيح SSH ، وعدم تطابق رمز Github مقابل الكود المعبأة (المصنع) ، وعدم وجود 2FA ، وغيرها. لا تتأهل مثل هذه السمات غير الآمنة مثل CVES ، وهذا هو السبب في أن أيا من الأدوات الحالية لا يمكن أن تضع علامة عليها. يمكن لـ Packj أن يعلق على تبعيات ضارة ، وتربية مطبعية ، ومهاجمة ، وضعف ، وغيرها من التبعيات غير الآمنة (الروابط الضعيفة) في سلسلة إمداد البرمجيات الخاصة بك.
يفترض نموذج تهديد سلسلة توريد البرمجيات الحالية أن رمز الجهة الخارجية مفتوحة المصدر حميدة ، وبالتالي ، يتم تتبع نقاط الضعف الأمنية فقط لخطاة البرمجة العرضية (المعروفة أيضًا باسم CVES). على هذا النحو ، فإن جميع الماسحات الضوئية الحالية للمصدر مفتوح المصدر تقارير فقط عن CVES المعروفة علنًا وتتناول التهديدات من الأخطاء العرضية في الكود الحميد.
مثال نموذجي لخلل البرمجة العرضية هو فحص حدود مفقودة على إدخال المستخدم ، مما يجعل الكود عرضة لهجمات الفائض المخزن المؤقت. تشمل الأمثلة الشعبية في العالم الحقيقي Log4J و Heartbleed. يحتاج المهاجمون إلى تطوير استغلال لإعداد CVES (على سبيل المثال ، حزمة TCP/IP مصنوعة في حالة وجود مدخلات عالية أو عالية عددًا لتسبب في تدفق مخزن مؤقت). يمكن إصلاح CVES عن طريق تصحيح أو ترقية إلى إصدار أحدث من المكتبة (على سبيل المثال ، إصدار أحدث من Log4J يعمل على إصلاح CVE).
تحول المشهد التهديد لسلسلة توريد البرمجيات الحديثة بعد هجوم Solarwinds. لقد عثرت الجهات الفاعلة السيئة على نقاط ضعف جديدة ، ولكن هذه المرة في قناة التوريد ، وليس رمزًا. يتم استغلال هذه النقاط الضعيفة الجديدة مثل ارتباك التبعية ، والتربية المطبعية ، وأدوات الاحتجاج (التخريب) ، واختطاف الحسابات ، والهندسة الاجتماعية لنشر البرامج الضارة. تم الإبلاغ عن الآلاف من حزم NPM/PYPI/Ruby.
على عكس CVES ، فإن البرامج الضارة هي رمز سيء (ويعرف أيضًا باسم ضار). علاوة على ذلك ، فإن البرامج الضارة نفسها هي استغلال ولا يمكن تصحيحها أو إصلاحها عن طريق الترقية إلى إصدار أحدث. على سبيل المثال ، كان هجوم ارتباك التبعية ضارًا عن قصد ؛ لم يستغل أي خطأ برمجة عرضية في الكود. وبالمثل ، فإن مؤلف الحزمة الشعبية تخريب مدونةهم الخاصة للاحتجاج على الحرب أمر مقصود للغاية ولا يستغل أي CVES. يعتبر الاختلاف المطبعي متجهًا آخر للهجوم يستخدمه الجهات الفاعلة السيئة لنشر البرامج الضارة في سجلات حزم المفتوح الشهيرة: إنها تستغل الأخطاء المطبعية وعدم خبرة DEVs ، وليس أخطاء البرمجة العرضية أو CVES في الرمز.
تفشل الماسحات الضوئية الحالية في اكتشاف هجمات سلسلة توريد البرمجيات الحديثة التي تشبه Solarwinds من الكود الضعيف (الضار) المتعمد. هذه الأدوات ببساطة مسح الكود المصدري للتبعيات مفتوحة المصدر ، وتجميع قائمة بجميع التبعيات المستخدمة ، وتبدو كل <اسم التبعية ، تبعية-تفسر> في قاعدة بيانات (على سبيل المثال ، NVD) للإبلاغ عن إصدارات الحزمة المتأثرة (على سبيل المثال ، الإصدار الضعيف من LOG4J ، إصدار LIBSSL المتأثر بواسطة HANDBLEED).
لا يقوم Packj فقط بمراجعة عمليات التدقيق لـ CVES ، ولكن أيضًا يقوم بتحليل رمز ديناميكي ثابت+ثابت بالإضافة إلى فحص البيانات الوصفية للكشف عن أي سلوك وسمات "محفوفة بالمخاطر" ، مثل التفريخ من shell ، واستخدام مفاتيح SSH ، وعدم تطابق رمز Github مقابل الكود المعبأة (المصنع) ، وعدم وجود 2FA ، وغيرها. لا تتأهل مثل هذه السمات غير الآمنة مثل CVES ، وهذا هو السبب في أن أيا من الأدوات الحالية لا يمكن أن تضع علامة عليها. يمكن لـ Packj أن يعلق على تبعيات ضارة ، وتربية مطبعية ، ومهاجمة ، وضعف ، وغيرها من التبعيات غير الآمنة (الروابط الضعيفة) في سلسلة إمداد البرمجيات الخاصة بك. يرجى قراءة المزيد في Audit ReadMe
يمكن تخصيص Packj بسهولة (ضوضاء صفر) إلى نموذج التهديد الخاص بك. ما عليك سوى إضافة ملف .packj.yaml في الجزء العلوي من ريبو/مشروعك وتقليل التعب من خلال التعليق على السمات غير المرغوب فيها.
لقد وجدنا أكثر من 40 و 20 حزمة ضارة على PYPI و Rubygems ، على التوالي باستخدام هذه الأداة. تم إسقاط عدد منهم. الرجوع إلى مثال أدناه:
$ python3 main.py audit pypi:krisqian
[+] Fetching 'krisqian' from pypi...OK [ver 0.0.7]
[+] Checking version...OK [256 days old]
[+] Checking release history...OK [7 version(s)]
[+] Checking release time gap...OK [1 days since last release]
[+] Checking author...OK [[email protected]]
[+] Checking email/domain validity...OK [[email protected]]
[+] Checking readme...ALERT [no readme]
[+] Checking homepage...OK [https://www.bilibili.com/bangumi/media/md140632]
[+] Checking downloads...OK [13 weekly]
[+] Checking repo_url URL...OK [None]
[+] Checking for CVEs...OK [none found]
[+] Checking dependencies...OK [none found]
[+] Downloading package 'KrisQian' (ver 0.0.7) from pypi...OK [1.94 KB]
[+] Analyzing code...ALERT [needs 3 perms: process,network,file]
[+] Checking files/funcs...OK [9 files (2 .py), 6 funcs, LoC: 184]
=============================================
[+] 6 risk(s) found, package is undesirable!
{
"undesirable": [
"no readme",
"only 45 weekly downloads",
"no source repo found",
"generates new code at runtime",
"fetches data over the network: ['KrisQian-0.0.7/setup.py:40', 'KrisQian-0.0.7/setup.py:50']",
"reads files and dirs: ['KrisQian-0.0.7/setup.py:59', 'KrisQian-0.0.7/setup.py:70']"
]
}
=> Complete report: pypi-KrisQian-0.0.7.json
=> View pre-vetted package report at https://packj.dev/package/PyPi/KrisQian/0.0.7
Packj علامة Krisqian (v0.0.7) على أنها مشبوهة بسبب عدم وجود مصدر ريبو واستخدام واجهات برمجة التطبيقات الحساسة (الشبكة ، توليد الكود) أثناء وقت تثبيت الحزمة (في setup.py). قررنا إلقاء نظرة أعمق ، ووجدنا الحزمة الخبيثة. يرجى العثور على تحليلنا التفصيلي في https://packj.dev/malware/krisqian.
يتم سرد المزيد من الأمثلة على البرامج الضارة التي وجدناها في https://packj.dev/malware يرجى التواصل معنا على [email protected] للحصول على القائمة الكاملة.
لمعرفة المزيد حول أداة PackJ أو هجمات سلسلة التوريد المفتوحة المصدر ، راجع إلى
يشاهد ؟ هذا الريبو للبقاء على اطلاع دائم.
لديك ميزة أو طلب دعم؟ يرجى زيارة صفحة مناقشة GitHub أو الانضمام إلى مجتمع Discord للمناقشة والطلبات.
تم تطوير Packj من قبل باحثو الأمن السيبراني في Ossillate Inc. والمتعاونين الخارجيين لمساعدة المطورين على تخفيف مخاطر هجمات سلسلة التوريد عند الحصول على التبعيات غير الموثوق بها على الطرف الثالث. نشكر مطورينا والمتعاونين. أظهر تقديرك من خلال منحنا إذا كنت تحب عملنا.
نرحب مساهمات الكود بأسلحة مفتوحة. انظر الإرشادات المساهمة. وجدت خطأ؟ الرجاء فتح مشكلة. ارجع إلى إرشادات الأمان الخاصة بنا للإبلاغ عن مشكلة أمنية.
يمكن لـ PackJ حاليًا فحص حزم NPM و PYPI و Rubygems لسمات "محفوفة بالمخاطر". نحن نضيف دعم الصدأ.
يستخدم Packj تحليل التعليمات البرمجية الثابتة ، والتتبع الديناميكي ، وتحليل البيانات الوصفية للتدقيق الشامل. التحليل الثابت وحده لا يكفي لعلامة البرامج الضارة المتطورة التي يمكن أن تخفي نفسها بشكل أفضل باستخدام تعديل الكود. يتم إجراء التحليل الديناميكي عن طريق تثبيت الحزمة تحت strace ومراقبة سلوك وقت التشغيل. يرجى قراءة المزيد في Audit ReadMe.
هذا سلوك ضار شائع جدا. يكتشف Packj تشويه الرمز وكذلك التفريخ لأوامر shell (استدعاء نظام exec). على سبيل المثال ، يمكن لـ Packj علامة استخدام getattr() و eval() API لأنها تشير إلى "توليد رمز وقت التشغيل" ؛ يمكن للمطور الذهاب وإلقاء نظرة أعمق في ذلك الوقت. انظر main.py للحصول على التفاصيل.