
Pyscan は Rust で書かれた高並行な脆弱性スキャナです。Python プロジェクトを自動的に走査し、さまざまなパッケージング形式から依存関係を抽出し、単一の非同期バッチリクエストで オープンソース脆弱性(OSV)データベースと相互参照します。
Pyscan は、従来の Python ベースのセキュリティツールが抱えるパフォーマンスとメモリのボトルネックを解決するために設計されました:
pip-audit や safety といった業界標準ツールに対して最大 5.25倍 の高速化を達成。Pyscan のランタイムは $O(\text{vulns})$ の時間計算量モデルで動作し、実行時間は依存関係の数ではなく、見つかった脆弱性の数に比例します。uv.lock、requirements.txt、pyproject.toml(Poetry、Hatch、PDM、Flit)から依存関係を自動的に解決・抽出するか、生の .py ソースコードを解析して動的に抽出します。詳細は ベンチマークレポート をご覧ください。
Pyscan は pipx、pip(コンパイル済み Python ホイール)、または cargo(ネイティブ Rust バイナリ)でインストールできます:
# via pipx (recommended) (Note the "-rs" suffix)
pipx install pyscan-rs
# via pip (Note the "-rs" suffix)
pip install pyscan-rs
# via Cargo
cargo install pyscan
プロジェクトのルートディレクトリで pyscan を実行するか、特定のソースフォルダを指定してください:
# Scan the current directory
pyscan
# Scan a specific directory
pyscan -d path/to/src
複数のソースファイルが存在する場合、Pyscan は次の優先順位チェーンに従って依存関係を抽出します:
bom.json、spdx.json)uv.lockrequirements.txtpyproject.toml.py)依存関係が厳密に固定されたバージョンなしで見つかった場合、Pyscan は PyPI に最新バージョンを問い合わせるフォールバックを行いますが、PEP-508 構文に従うことを強く推奨します。
Pyscan には Rust ツールチェーン >= v1.70 が必要で、reqwest と tokio による非同期ネットワーキングを活用して OSV クエリを並列化し、スループットを最大化します。パーサーとスキャナの構造に興味がある場合は、アーキテクチャ概要 を参照してください。
Pyscan は高度に最適化されたツールですが、まだすべてのエッジケースで実戦テストされていません。すべてのベクターからコードが 100% 安全であることを保証するものではありません。Dependabot、pip-audit、Trivy などのツールと併用した多層的なセキュリティアプローチを強くお勧めします。PR や issue は大歓迎です!
このプロジェクトを始めたとき、私は無一文の高校生で、今は無一文の大学生です。Pyscan があなたの CI/CD パイプラインの貴重な時間と RAM を節約してくれたなら、コーヒーを一杯ごちそうしてくれると嬉しいです: