PackJ (paket diucapkan) adalah alat untuk membantu mengurangi serangan rantai pasokan perangkat lunak. Ini dapat mendeteksi paket jahat, rentan, ditinggalkan, kesalahan ketik, dan "berisiko" lainnya dari pendaftar paket open-source populer, seperti NPM, Rubygems, dan PYPI. Ini dapat dengan mudah disesuaikan untuk meminimalkan kebisingan. PackJ dimulai sebagai proyek penelitian PhD dan saat ini sedang dikembangkan di bawah berbagai hibah pemerintah.
Catatan Webserver Packj yang diselenggarakan sendiri dan beberapa integrasi yang akan datang akhir bulan ini? Tonton repo ini agar tetap up to date.
Kami mendukung beberapa model penyebaran:
Gunakan PackJ untuk mengaudit dependensi dalam permintaan tarik.
- 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 }}Lihat di GitHub Marketplace. Contoh PR berjalan.
Cara tercepat untuk mencoba/menguji paket adalah menggunakan Docker. Podman juga didukung untuk menjalankan kontainer (terisolasi).
docker run -v /tmp:/tmp/packj -it ossillate/packj:latest --help
Klon repo ini,
git clone https://github.com/ossillate-inc/packj.git && cd packj
Instal dependensi
bundle install && pip3 install -r requirements.txt
Mulailah dengan bantuan:
python3 main.py --help
Packj dapat dokter hewan yang diterbitkan dari NPM, PYPI, Rust, PHP, dan Rubygems Package Registries. Dukungan Rust dan PHP adalah WIP. Kami secara aktif menambahkan dukungan untuk pendaftar. Ini juga mendukung pemeriksaan npm dan pypi lokal (tidak dipublikasikan).
| Registri | Ekosistem | Didukung |
|---|---|---|
| NPM | Javascript | ✅ |
| Pypi | Python | ✅ |
| Muatan | Karat | ✅ |
| Rubygems | Rubi | ✅ |
| Packagist | Php | ✅ |
| Buruh pelabuhan | Buruh pelabuhan | |
| Nuget | .BERSIH | ✅ |
| Maven | Jawa | ✅ |
| Cocoapods | Cepat |
Packj menawarkan alat berikut:
PackJ mengaudit paket perangkat lunak sumber terbuka untuk atribut "berisiko" yang membuat mereka rentan terhadap serangan rantai pasokan. Misalnya, paket dengan domain email yang sudah kadaluwarsa (kurang 2FA), celah waktu rilis yang besar, API sensitif atau izin akses, dll. Ditandai sebagai berisiko.
Audit Berikut ini didukung:
python3 main.py audit -p pypi:requests rubygems:overcommitpython3 main.py audit -f npm:package.json pypi:requirements.txt Secara default, audit hanya melakukan analisis kode statis untuk mendeteksi kode berisiko. Anda dapat paas -t atau --trace flag untuk melakukan analisis kode dinamis juga, yang akan menginstal semua paket yang diminta di bawah strace dan memantau perilaku paket instalasi -waktu. Silakan lihat contoh output di bawah ini.
$ 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",
]
}
PERINGATAN: Karena paket dapat menjalankan kode berbahaya selama instalasi, disarankan untuk hanya menggunakan
-tatau--tracesaat berjalan di dalam wadah Docker atau mesin virtual.
Audit juga dapat dilakukan dalam wadah Docker/Podman. Silakan temukan detail tentang atribut berisiko dan cara menggunakan di Audit ReadMe.
PackJ menawarkan kotak pasir ringan untuk safe installation . Secara khusus, ini mencegah paket berbahaya dari exfiltrating data sensitif, mengakses file sensitif (misalnya, tombol SSH), dan malware yang bertahan.
Ini skrip instalasi kotak pasir, termasuk kompleks asli. Menggunakan strace (yaitu, tidak diperlukan VM/wadah).
Silakan temukan detail tentang mekanisme sandboxing dan cara menggunakan di 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 dimulai sebagai proyek penelitian PhD. Ini didukung oleh berbagai hibah pemerintah.
Packj dimulai sebagai proyek penelitian akademik. Secara khusus, teknik analisis kode statis yang digunakan oleh PackJ didasarkan pada penelitian cybersecurity mutakhir: Proyek Maloss oleh kelompok penelitian kami di Georgia Tech.
Packj didukung oleh hibah murah hati dari NSF, GRA, dan Alinnovate.
TL; DR Pemindai kerentanan canggih berasumsi bahwa kode open-source pihak ketiga jinak. Oleh karena itu, semua alat tersebut hanya membahas ancaman dari bug pemrograman yang tidak disengaja dalam kode jinak (alias CVE seperti log4j). Mereka tidak melindungi terhadap serangan rantai pasokan perangkat lunak modern seperti solarwinds dari kode yang sengaja buruk (alias jahat) yang disebarkan oleh aktor buruk menggunakan kerentanan baru di saluran pasokan, termasuk kebingungan ketergantungan, penipuan kesalahan ketik, protes (menyabot), pembajakan akun, dan teknik sosial. Contoh terbaru (dec'22) adalah paket pytorch yang dikompromikan menggunakan kerentanan kebingungan ketergantungan (tidak ada CVE yang ditetapkan).
Packj tidak hanya audit untuk CVE, tetapi juga melakukan analisis kode statis+dinamis dalam serta pemeriksaan metadata untuk mendeteksi perilaku dan atribut "berisiko", seperti pemijahan shell, penggunaan tombol SSH, ketidakcocokan kode Github vs kode kemasan (sumber), kurangnya 2FA, dan beberapa lainnya. Atribut yang tidak aman seperti itu tidak memenuhi syarat sebagai CVE, itulah sebabnya tidak ada alat yang ada yang dapat menandai mereka. PackJ dapat menandai dependensi berbahaya, kesalahan ketik, ditinggalkan, rentan, dan tidak aman lainnya (tautan lemah) dalam rantai pasokan perangkat lunak Anda.
Model ancaman rantai pasokan perangkat lunak saat ini mengasumsikan bahwa kode open-source pihak ketiga adalah jinak, dan oleh karena itu, kerentanan keamanan hanya dilacak untuk bug pemrograman yang tidak disengaja (alias CVE). Dengan demikian, semua pemindai kerentanan open-source yang ada hanya melaporkan CVE yang diketahui publik dan mengatasi ancaman dari bug yang tidak disengaja dalam kode jinak.
Contoh khas dari bug pemrograman yang tidak disengaja adalah pemeriksaan batas yang hilang pada input pengguna, yang membuat kode rentan terhadap serangan meluap. Contoh populer dunia nyata termasuk Log4j dan Heartbleed. Penyerang perlu mengembangkan eksploitasi untuk memicu CVE (misalnya, paket TCP/IP yang dibuat jika heartbleed atau input tinggi numerik untuk menyebabkan buffer overflow). CVE dapat diperbaiki dengan menambal atau meningkatkan ke versi perpustakaan yang lebih baru (misalnya, versi yang lebih baru dari Log4J memperbaiki CVE).
Lansekap ancaman rantai pasokan perangkat lunak modern bergeser setelah serangan SolarWinds. Aktor buruk telah menemukan kerentanan baru, tetapi kali ini di saluran penawaran, bukan kode. Kerentanan baru ini seperti kebingungan ketergantungan, kesalahan ketik, protes (menyabot), pembajakan akun, dan rekayasa sosial dieksploitasi untuk menyebarkan malware. Ribuan paket NPM/PYPI/Ruby yang dikompromikan telah dilaporkan.
Berbeda dengan CVE, malware sengaja kode buruk (alias jahat). Selain itu, malware itu sendiri adalah eksploitasi dan tidak dapat ditambal atau diperbaiki dengan meningkatkan ke versi yang lebih baru. Misalnya, serangan kebingungan ketergantungan sengaja berbahaya; Itu tidak mengeksploitasi bug pemrograman yang tidak disengaja dalam kode. Demikian pula, seorang penulis paket populer yang menyabot kode mereka sendiri untuk memprotes perang sangat disengaja dan tidak mengeksploitasi CVE apa pun. Typo-Squatting adalah vektor serangan lain yang digunakan aktor buruk untuk menyebarkan malware dalam pendaftaran paket open-source populer: Ini mengeksploitasi kesalahan ketik dan kurang pengalaman devs, bukan bug pemrograman atau CVE yang tidak disengaja dalam kode.
Pemindai yang ada gagal mendeteksi serangan rantai pasokan perangkat lunak modern seperti SolarWinds ini dari kode yang sengaja rentan (jahat). Alat-alat ini hanya memindai kode sumber untuk dependensi sumber terbuka, menyusun daftar semua dependensi yang digunakan, dan lihat masing-masing <nama ketergantungan, ketergantungan-versi> dalam database (misalnya, NVD) untuk melaporkan versi paket yang terpengaruh (misalnya, versi rentan log4j, libssl yang dipengaruhi oleh hati).
Packj tidak hanya audit untuk CVE, tetapi juga melakukan analisis kode statis+dinamis dalam serta pemeriksaan metadata untuk mendeteksi perilaku dan atribut "berisiko", seperti pemijahan shell, penggunaan tombol SSH, ketidakcocokan kode Github vs kode kemasan (sumber), kurangnya 2FA, dan beberapa lainnya. Atribut yang tidak aman seperti itu tidak memenuhi syarat sebagai CVE, itulah sebabnya tidak ada alat yang ada yang dapat menandai mereka. PackJ dapat menandai dependensi berbahaya, kesalahan ketik, ditinggalkan, rentan, dan tidak aman lainnya (tautan lemah) dalam rantai pasokan perangkat lunak Anda. Harap baca lebih lanjut di Audit ReadMe
PackJ dapat dengan mudah disesuaikan (nol noise) untuk model ancaman Anda. Cukup tambahkan file .packj.yaml di dir dir repo/proyek Anda dan kurangi kelelahan peringatan dengan mengomentari atribut yang tidak diinginkan.
Kami menemukan lebih dari 40 dan 20 paket berbahaya di PYPI dan Rubygems, masing -masing menggunakan alat ini. Beberapa dari mereka telah diturunkan. Lihat contoh di bawah ini:
$ 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 bertanda Krisqian (v0.0.7) sebagai mencurigakan karena tidak adanya sumber repo dan penggunaan API sensitif (jaringan, pembuatan kode) selama waktu instalasi paket (dalam setup.py). Kami memutuskan untuk melihat lebih dalam, dan menemukan paket itu berbahaya. Silakan temukan analisis terperinci kami di https://packj.dev/malware/krisqian.
Lebih banyak contoh malware yang kami temukan terdaftar di https://packj.dev/malware silakan hubungi kami di [email protected] untuk daftar lengkap.
Untuk mempelajari lebih lanjut tentang alat PackJ atau serangan rantai pasokan perangkat lunak open-source, lihat kami
Jam tangan ? Repo ini untuk tetap up to date.
Punya permintaan fitur atau dukungan? Silakan kunjungi halaman diskusi GitHub kami atau bergabunglah dengan komunitas Discord kami untuk diskusi dan permintaan.
PackJ telah dikembangkan oleh para peneliti keamanan siber di Ossillate Inc. dan kolaborator eksternal untuk membantu pengembang mengurangi risiko serangan rantai pasokan ketika mencari ketergantungan perangkat lunak open-source pihak ketiga yang tidak dipercaya. Kami berterima kasih kepada pengembang dan kolaborator kami. Tunjukkan penghargaan Anda dengan memberi kami A jika Anda menyukai pekerjaan kami.
Kami menyambut kontribusi kode dengan senjata terbuka. Lihat Pedoman Kontribusi.MD. Menemukan bug? Harap buka masalah. Lihat Pedoman Keamanan.MD kami untuk melaporkan masalah keamanan.
PackJ saat ini dapat memeriksa paket NPM, PYPI, dan Rubygems untuk atribut "berisiko". Kami menambahkan dukungan untuk karat.
PackJ menggunakan analisis kode statis, penelusuran dinamis, dan analisis metadata untuk audit komprehensif. Analisis statis saja tidak cukup untuk menandai malware canggih yang dapat menyembunyikan dirinya lebih baik menggunakan kebingungan kode. Analisis dinamis dilakukan dengan memasang paket di bawah strace dan memantau perilaku runtime. Harap baca lebih lanjut di Audit ReadMe.
Ini adalah perilaku jahat yang sangat umum. PackJ mendeteksi kebingungan kode serta memunculkan perintah shell (panggilan sistem eksekutif). Misalnya, Packj dapat menandai penggunaan getattr() dan eval() API karena mereka menunjukkan "pembuatan kode runtime"; Seorang pengembang dapat pergi dan melihat lebih dalam. Lihat Main.py untuk detailnya.