
静的および動的分析ツール。オープンソースパッケージの悪意のある、脆弱性のある、リスクのある属性を監査し、サプライチェーン攻撃を防ぐためにサンドボックス化されたインストールを備えています。
Packj(パッケージと発音)は、ソフトウェアサプライチェーン攻撃を軽減するためのツールです。NPM、RubyGems、PyPIなどの人気のあるオープンソースパッケージレジストリから、悪意のあるもの、脆弱なもの、放棄されたもの、タイポスクワッティング、その他の「リスクのある」パッケージを検出できます。簡単にカスタマイズしてノイズを最小限に抑えることができます。Packjは博士研究プロジェクトとして始まり、現在はさまざまな政府助成金のもとで開発されています。
注記 セルフホスト型のPackjウェブサーバーと複数の統合機能が今月中にリリース予定です 👊 このリポジトリをウォッチして最新情報を入手してください。

複数のデプロイモデルをサポートしています:
Packjを使用してプルリクエスト内の依存関係を監査します。```yaml
GitHub [marketplace](https://github.com/marketplace/actions/packj-security-audit) で見る。例: [PR run](https://github.com/ossillate-inc/packj-github-action-demo/pull/3#issuecomment-1274797138).
### 2. Dockerイメージ(推奨)
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
# サポートされているエコシステム #
Packj は、NPM、PyPI、Rust、PHP、および Rubygems パッケージレジストリから公開されたパッケージを精査できます。Rust と PHP のサポートは作業中です。現在、レジストリのサポートを積極的に追加しています。
また、ローカル(未公開)の NPM および PyPI パッケージの精査もサポートしています。
| レジストリ | エコシステム | サポート状況 |
| ---------- | ------------ | ------------------ |
| NPM | JavaScript | :white_check_mark: |
| PyPI | Python | :white_check_mark: |
| Cargo | Rust | :white_check_mark: |
| Rubygems | Ruby | :white_check_mark: |
| Packagist | PHP | :white_check_mark: |
| Docker | Docker | :x: |
| Nuget | .NET | :white_check_mark: |
| Maven | Java | :white_check_mark: |
| Cocoapods | Swift | :x: |
# 機能 #
Packj は以下のツールを提供します:
* [監査](#auditing-a-package) - パッケージの「リスクのある」属性を精査します。
* [サンドボックス](#sandboxed-package-installation) - パッケージの安全なインストールを行います。
## パッケージの監査 ##
Packj は、オープンソースソフトウェアパッケージを、サプライチェーン攻撃に対して脆弱にする「リスクのある」属性について監査します。例えば、有効期限切れのメールドメイン(2FA がない)、長いリリース時間のギャップ、機密性の高い API やアクセス権限などを持つパッケージはリスクありとフラグが立てられます。
以下の監査がサポートされています:
- 複数パッケージ:`python3 main.py audit -p pypi:requests rubygems:overcommit`
- 依存関係ファイル:`python3 main.py audit -f npm:package.json pypi:requirements.txt`
デフォルトでは、`audit` はリスクのあるコードを検出するために静的コード解析のみを実行します。動的コード解析も実行するには `-t` または `--trace` フラグを渡すことができます。これにより、要求されたすべてのパッケージを strace 下でインストールし、パッケージのインストール時動作を監視します。以下の出力例を参照してください。
<details>
<summary><h4>実行例/出力を表示</h4></summary>
$ 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",
]
}
</details>
> 警告:パッケージはインストール中に悪意のあるコードを実行する可能性があるため、`-t` または `--trace` は Docker コンテナまたは仮想マシン内でのみ使用することを推奨します。
監査は Docker/Podman コンテナ内でも実行できます。リスクのある属性と使用方法の詳細は [Audit README](https://github.com/ossillate-inc/packj/blob/main/packj/audit/README.md) をご覧ください。
## サンドボックス化されたパッケージインストール ##
Packj は、パッケージの「安全なインストール」のための軽量サンドボックス化を提供します。具体的には、悪意のあるパッケージが機密データを外部に送信したり、機密ファイル(例:SSH キー)にアクセスしたり、マルウェアを永続化したりするのを防止します。
インストール時スクリプト(ネイティブコンパイルを含む)をサンドボックス化します。**strace** を使用します(つまり、**VM/コンテナは不要** です)。
サンドボックス化の仕組みと使用方法の詳細は [Sandbox README](https://github.com/ossillate-inc/packj/blob/main/packj/sandbox/README.md) をご覧ください。
<details>
<summary><h4>実行例/出力を表示</h4></summary>