ar-io/ar-io-content-scanner

GitHub: ar-io/ar-io-content-scanner

为 ar.io 网关设计的内容审核 Sidecar,通过规则引擎与 ML 评分自动检测并拦截托管在 Arweave 上的钓鱼 HTML 内容,帮助网关规避安全黑名单风险。

Stars: 0 | Forks: 0

# ar.io 内容扫描器 一个为 [ar.io 网关](https://github.com/ar-io/ar-io-node) 准备的内容审核 Sidecar。检测并自动拦截托管在 Arweave 上的钓鱼 HTML 内容,保持网关清洁,并避免被 Netcraft 和 Google Safe Browsing 等黑名单收录。 ## 工作原理 ``` ar-io-node Content Scanner ---------- --------------- User request ──> Cache miss ──> Fetch from Arweave | Cache write | DATA_CACHED ──────────────────> POST /scan | | Serve content Enqueue scan (no delay) | Worker picks up | GET /raw/:id ──> Fetch HTML | Parse HTML Run 4 rules + ML | ┌── malicious? ──┐ | | yes no | | PUT block-data Cache clean | Future requests ──> 404 ``` **权衡:** 第一个访问恶意内容的用户会看到该内容。所有后续请求都会被拦截。这是可以接受的,因为钓鱼页面需要重复受害者,而在首次访问后进行拦截可以消除攻击面。 ## 快速开始 ### 1. 网关配置 添加到您的 ar-io-node `.env` 中: ``` WEBHOOK_TARGET_SERVERS=http://content-scanner:3100/scan WEBHOOK_EMIT_DATA_CACHED_EVENTS=true ``` 如果您的网关启用了 `ENABLE_RATE_LIMITER=true`,请将 Docker 网络加入允许列表: ``` RATE_LIMITER_IPS_AND_CIDRS_ALLOWLIST=172.17.0.0/16 ``` 需要带有 `DATA_CACHED` Webhook 事件支持的 ar-io-node。 ### 2. 运行扫描器 克隆此仓库,将 `.env.example` 复制为 `.env`,并设置您的 `ADMIN_API_KEY`: ``` cp .env.example .env # 编辑 .env — 设置 ADMIN_API_KEY 以匹配您的 gateway key docker compose up -d ``` 包含的 `docker-compose.yml` 会自动加入 ar-io-node 的 `ar-io-network`。 ### 3. 观察,然后执行 以 `SCANNER_MODE=dry-run`(默认值)开始,观察日志中的检测结果而不进行拦截。当对准确性满意时,在 `.env` 中设置 `SCANNER_MODE=enforce` 并重启。 ## 检测引擎 ### 第一层规则 (自动拦截) 每条规则需要 2 个以上独立信号(合取逻辑),以确保近乎零的误报。 | 规则 | 信号 A | 信号 B | |------|----------|----------| | **助记词窃取** | 8+ 个文本输入框 | 可见文本中包含助记词术语 | | **外部凭证表单** | 密码输入框 | 表单 action 为绝对 URL,或带有外部 URL 的 JS 窃取模式 | | **钱包冒充** | 标题/标题/图片 alt 中包含加密品牌 | 密码输入框 | | **混淆加载器** | DOM 注入 + 脚本中的编码函数 | 长 base64、十六进制转义或 charcode 链 | ### ML 模型 (参考性) 一个在钓鱼与合法 HTML 上训练的 XGBoost 分类器提供辅助信号。ML 模型可以将 CLEAN(清洁)判定升级为 SUSPICIOUS(可疑,记录以供审查),但**其本身永远不会触发自动拦截**。 ``` Rule verdict ML score Final verdict ----------- -------- ------------- MALICIOUS any MALICIOUS (auto-block in enforce mode) CLEAN >= 0.95 SUSPICIOUS (log only) CLEAN < 0.95 CLEAN ``` ### 为什么这不会误伤合法 DApps Arweave 内容是静态的——没有服务器端后端。发布到外部 URL 的密码表单没有合法的用例。真正的 Arweave dApps 通过钱包签名(`window.ethereum.request()`)进行身份验证,而不是 HTML 密码表单。合取规则利用了这一 Arweave 特有的上下文。 ## 配置 | 变量 | 必需 | 默认值 | 描述 | |----------|----------|---------|-------------| | `GATEWAY_URL` | 是 | -- | ar-io-node 内部 URL (例如 `http://core:4000`) | | `ADMIN_API_KEY` | 是 | -- | 必须与网关的 `ADMIN_API_KEY` 匹配 | | `SCANNER_MODE` | 否 | `dry-run` | `dry-run` (仅记录) 或 `enforce` (自动拦截) | | `SCANNER_PORT` | 否 | `3100` | HTTP 服务器端口 | | `SCANNER_WORKERS` | 否 | `2` | 并发扫描 Worker 数量 | | `ML_MODEL_ENABLED` | 否 | `true` | 启用 XGBoost ML 评分 | | `LOG_LEVEL` | 否 | `info` | 日志级别 (debug, info, warning, error) | | `MAX_SCAN_BYTES` | 否 | `262144` | 最大扫描 HTML 字节数 (256KB) | | `SCAN_TIMEOUT` | 否 | `10000` | 网关获取超时(毫秒) | | `DB_PATH` | 否 | `/app/data/scanner.db` | SQLite 数据库路径 | | `RULE_SEED_PHRASE` | 否 | `true` | 启用助记词窃取规则 | | `RULE_EXTERNAL_CREDENTIAL_FORM` | 否 | `true` | 启用外部凭证表单规则 | | `RULE_WALLET_IMPERSONATION` | 否 | `true` | 启用钱包冒充规则 | | `RULE_OBFUSCATED_LOADER` | 否 | `true` | 启用混淆加载器规则 | | `BACKFILL_ENABLED` | 否 | `false` | 启用对缓存内容的主动文件系统扫描 | | `BACKFILL_DATA_PATH` | 否 | -- | 网关的连续数据目录(如果启用回填则为必需) | | `BACKFILL_GATEWAY_DB_PATH` | 否 | -- | 网关的 `data.db` 路径(只读,用于哈希→TX ID 查找) | | `BACKFILL_RATE` | 否 | `5` | 回填期间每秒扫描的最大文件数 | | `BACKFILL_INTERVAL_HOURS` | 否 | `24` | 回填扫描间隔小时数(0 = 一次性) | ## HTTP 端点 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/scan` | POST | 接收 `DATA_CACHED` Webhook 事件 (返回 202) | | `/health` | GET | 健康检查 (模式, 版本) | | `/metrics` | GET | 扫描统计 (判定, 缓存命中, 拦截, 队列深度) | ## Docker 镜像 预构建镜像在每次推送到 `main` 和版本标签时发布到 GHCR。 ``` # 拉取最新 image docker pull ghcr.io/ar-io/ar-io-content-scanner:main # 或固定到特定版本 docker pull ghcr.io/ar-io/ar-io-content-scanner:0.1.0 ``` ### CI/CD GitHub Actions 工作流 (`.github/workflows/build-and-push.yml`) 运行测试,然后自动构建并推送: | 触发条件 | 镜像标签 | |---------|------------| | 推送到 `main` | `:main`, `:sha-` | | 标签 `v1.0.0` | `:1.0.0`, `:1.0`, `:sha-` | | Pull request | 仅测试,不推送镜像 | ### 创建发布 ``` git tag v0.1.0 git push origin v0.1.0 ``` 这将发布操作员可以固定使用的版本化镜像。 ## 开发 ``` # 安装 dependencies pip install -r requirements.txt -r requirements-dev.txt # 运行 tests python3 -m pytest tests/ -v # 本地构建 Docker image docker build -t content-scanner . # 本地运行 GATEWAY_URL=http://localhost:3000 ADMIN_API_KEY=secret python3 -m src.server ```
标签:Apex, Arweave, HTML 分析, Naabu, Sidecar 模式, TCP/UDP协议, Web3 安全, 云计算, 内容安全, 内容审核, 内容扫描, 区块链内容监管, 去中心化存储, 反钓鱼, 威胁情报, 开发者工具, 恶意检测, 机器学习, 漏洞缓解, 缓存安全, 网关安全, 网络安全, 自动拦截, 规则引擎, 请求拦截, 逆向工具, 钓鱼防护, 隐私保护