关于 scamgate
scamgate 是可自托管的本地 MCP 服务,在 AI Agent 执行操作前检查链接和付款。它通过确定性规则给出允许、询问或拒绝的判定及评分理由,检查过程不发起网络请求。
主要功能
- 01基于确定性规则评估链接和付款风险
- 02提供允许、询问或拒绝判定及理由
- 03检查仿冒链接和已知恶意链接
- 04评估收款方、付款方式和紧迫性
- 05通过 Hook 拦截 Agent 工具调用
- 06提供信息源更新和状态命令
适用场景
- 01Agent 打开链接前进行检查
- 02汇款前审查付款信息
- 03对不确定或无法读取的操作要求批准
- 04通过 Hook 阻止可疑目标的工具调用
MCP 相关
向 MCP 客户端提供 `check_url`、`check_payment` 和 `update_feeds`。风险检查在本地执行且不发起网络请求;更新信息源会从固定来源下载列表。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx scamgateSCAMGATE_AUTO_UPDATESet to 1 to refresh the phishing lists every 6 hours while the server runs (off by default).SCAMGATE_URLHAUS_AUTH_KEY密钥Optional abuse.ch Auth-Key that adds the URLhaus malware-link list.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
3收录的工具列表 · 更新于 3 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | Agent 即将打开的完整 URL。 |
| intent | any | 否 | Agent 正在尝试执行的操作,例如 "book a hotel in Galway"。 |
详细介绍

scamgate
为 AI Agent 提供的可自托管诈骗检测工具:在 Agent 执行操作前验证链接和付款。
网站和文档: https://odaiameera.github.io/scamgate/
AI Agent 现在会替人点击链接和付款,诈骗者也盯上了这些钱财。植入网页、商品信息或消息中的文本可能会诱导 Agent 访问假商店、凭据输入页面,或提出“通过银行转账付款”的请求。Agent 付款渠道会保障付款本身(令牌、限额、身份验证),但不会判断收款方或网站是否涉嫌诈骗。scamgate 会进行这项检查,在本地作为 MCP 服务运行,检查期间不会发出网络请求。
判定方式
- 使用确定性规则,不由大模型进行判断。相同输入始终会得到相同判定。
- 每条触发的规则都会累加分数,并提供通俗易懂的原因。总分(最高为 100)决定结果:
- 允许:低于 25
- 询问(停止操作并向用户确认):25 到 69
- 拒绝:70 或更高
- Agent 会收到判定结果、分数、所有原因和任何警告(例如缓存的源数据已过期)。
链接规则: 已知恶意链接源、你自己的屏蔽列表、仿冒品牌的域名(拼写仿冒、同形异义字符、非官方域名中的品牌名称、作为前缀使用的真实域名,例如 paypal.com.secure-login.xyz)、藏在 @ 前面的地址([email protected])、原始 IP 主机、punycode、易遭滥用的廉价顶级域名,以及要求提供种子短语或与任务无关的登录信息的页面。无法读取的链接(无效的网站名称、javascript: 或 data: 链接、过长的地址)会触发询问:绝不会被允许。
付款规则: 新收款方同时附带紧急要求、银行信息变更、不可逆的付款方式(加密货币、礼品卡、向新收款方转账)、卖家坚持指定付款方式、超出预算、施压或要求保密的措辞,以及收款人验证结果。
快速开始
需要 Python 3.11+。
# with uv
git clone https://github.com/odaiameera/scamgate.git
cd scamgate
uv sync
uv run scamgate update-feeds # download the known-bad-link feeds into ~/.cache/scamgate
# or from PyPI, pinned to a release
uv tool install scamgate==0.3.3 # or: pip install scamgate==0.3.3
scamgate update-feeds
使用 Claude Code?请改为安装 Claude Code 插件:它可以一步完成钩子、MCP 工具和源数据刷新。
检查链接(实际输出):
$ uv run scamgate check-url "https://paypa1.com/login" --intent "buy a ticket"
{
"decision": "deny",
"risk_score": 100,
"reasons": [
{
"rule_id": "url.lookalike_brand",
"explanation": "'paypa1.com' disguises 'paypal' with look-alike characters ('paypa1'). The real site is paypal.com.",
"weight": 60
},
{
"rule_id": "url.intent_mismatch",
"explanation": "The task is 'buy a ticket', but the link goes to a 'login' page. A credential prompt the task doesn't need is a classic phishing step.",
"weight": 45
}
],
"summary": "Do not proceed with this link. Main concern: 'paypa1.com' disguises 'paypal' with look-alike characters ('paypa1'). The real site is paypal.com.",
"checked_host": "paypa1.com",
"warnings": [],
"advisory": "scamgate is advisory. It can miss scams and flag legitimate actions; a human should make the final call on anything flagged."
}
(源数据缓存后,warnings 为空。在运行 update-feeds 之前,它会显示没有缓存的源数据。)
源数据中列出的链接会在原因中注明源数据名称:
{
"rule_id": "url.known_bad_feed",
"explanation": "This exact link is listed as phishing/malware by OpenPhish community feed.",
"weight": 100
}
其他命令:scamgate feeds-status、scamgate bench、scamgate serve(通过标准输入输出运行 MCP),以及 hook、review、promote 和 record-payment(参见使用钩子强制执行)。
添加到你的 Agent
Claude Code 插件
这是在 Claude Code 中使用的最简单方式。安装一次即可添加强制执行钩子、check_url、check_payment 和
update_feeds 工具,并每 6 小时刷新一次钓鱼列表。它通过
uvx scamgate==0.3.3 从 PyPI 运行 scamgate,因此需要安装 uv,并且 Claude Code 版本需为 v2.1.295 或更高版本,确保无法启动的钩子会阻止调用,而不是放行。
/plugin install scamgate --marketplace odaiameera/scamgate
对于低于 2.1.275 的 Claude Code,请运行 /plugin marketplace add odaiameera/scamgate,然后运行
/plugin install scamgate@scamgate。插件运行、下载和存储的内容见:
claude-plugin/README.md。
仅使用 MCP 服务
将 /path/to/scamgate 替换为你的代码库路径,或使用 uvx scamgate==0.3.3 serve 运行 PyPI 版本。
Claude Desktop(claude_desktop_config.json):
{
"mcpServers": {
"scamgate": {
"command": "uv",
"args": ["--directory", "/path/to/scamgate", "run", "scamgate", "serve"]
}
}
}
Claude Code:
claude mcp add scamgate -- uv --directory /path/to/scamgate run scamgate serve
Hermes(~/.hermes/config.yaml):
mcp_servers:
scamgate:
command: "uv"
args: ["--directory", "/path/to/scamgate", "run", "scamgate", "serve"]
然后告诉 Agent:“打开任何链接前都调用 check_url,进行任何支付前都调用 check_payment。如果结果为 ask,请停止并向我说明原因。如果结果为 deny,请勿继续。”
MCP 工具
check_url(url: str, intent: str | None = None) -> Verdict
update_feeds() -> {updated, failed, not_configured, skipped, summary}
check_payment(payee_name: str, payee_account: str, amount: float, currency: str,
method: "card" | "bank_transfer" | "crypto" | "gift_card" | "other",
context_text: str | None = None, is_new_payee: bool | None = None,
bank_details_changed: bool | None = None, budget: float | None = None,
vop_result: "match" | "close_match" | "no_match" | "unavailable" | None = None) -> Verdict
Verdict = decision、risk_score、reasons[](rule_id、explanation、weight)、
summary、checked_host(对于链接:浏览器将打开的主机)、warnings[]、advisory。
这两个检查工具均标记为只读,并将此内容作为输出架构发布,因此 MCP 客户端会将其作为结构化内容接收。update_feeds 不接受任何参数:它每小时最多从固定来源下载一次默认列表,因此 Agent 可以请求刷新,但无法选择哪些内容进入缓存。
使用钩子强制执行
只有当 Agent 选择调用 MCP 工具时,这些工具才会生效,而提示词注入可以让它不调用。钩子将检查移入运行框架:Agent 无法跳过检查。
scamgate-hook(或 scamgate hook)从标准输入读取一个 JSON 格式的钩子事件,并输出一项判定。
它支持 Hermes shell 钩子和 Claude Code PreToolUse 钩子。
- **链接:**会检查 Web、浏览器、媒体、终端、代码或未知 MCP 工具调用中的每个 URL,包括伪装形式(
evilsh%6fp.com、http://3405803781)。deny会阻止调用,ask会将其提交给你审批。批量调用中只要有一个链接有问题,就会阻止整个批次。 - **支付:**涉及资金转移的工具调用(钱包、银行或支付 MCP 工具,或任何参数中包含金额及 IBAN、钱包或账户的工具)都会接受与
check_payment相同的检查,依据是你的收款方历史记录,而不是 Agent 的说法。deny会阻止调用,ask会将其提交给你。无法读取收款方或金额的支付、加密货币 CLI(cast send、bitcoin-cli sendtoaddress、solana transfer等),以及对支付 API(Stripe、PayPal、Wise、Revolut Business 等)的写入调用,都会提交给你审批。每次审批仅适用于一个账户和一个金额。 - **隐藏代码:**先解码或下载、再运行的代码(
… | base64 -d | bash、exec(b64decode(…))、curl … | sh、powershell -enc)都会提交给你审批,无论是否包含网络关键词。 - **隐藏目标地址:**如果 scamgate 无法读取某个网络操作,就会按命令逐条提交给你审批(
curl https://example.org; curl "$URL"仍会触发询问):变量、$(…)、拼接出的链接、经 base64/十六进制解码或反转的链接、requests.get(open(…).read())、安装指定名称的软件包、git clone、新增 git 远程地址。在代码中,只有字面形式的 URL 才算可读取。 - **常规开发工作不会触发提示:**从锁文件、清单或本地路径安装(
pip install -r requirements.txt、uv sync、npm ci),向已有远程地址执行git push/pull/fetch,以及只读取文本的命令(grep requests.get src/)。这些命令中出现的任何 URL 仍会接受检查。 - **无信息可用时运行:**如果没有缓存的信息源,链接会提交给你审批(
SCAMGATE_NO_FEEDS=warn会将其改为警告)。每次审批请求都会提及过期的信息源,并阻止调用。 - **防篡改:**会阻止 Agent 写入 scamgate 自身的代码、状态和信息源缓存,以及钩子配置;涵盖 vim/ed/nano 等编辑器,以及
find -exec、rsync、patch。也会阻止撤销钩子、移除服务、提升规则、记录收款方或直接调用 scamgate 状态 API 的命令或代码。 - **Agent 声明的理由只能增加风险。**系统会分别评估包含和不包含该理由的情况,并采用较高的风险分数。
- **审批范围严格受限。**Hermes 会按
rule_key记住“始终允许”;scamgate 的密钥包含主机和触发的规则(或隐藏命令的哈希值),因此一次“始终允许”无法预先批准其他目标地址。不过,对于预计不会重复的审批请求,请选择“一次”。 - **失败时默认拒绝:**输入无效、输入超过 2 MB、嵌套过深或发生内部错误时,会阻止调用(退出码 2)。
- **长命令仍能快速处理。**钩子只用一次线性扫描读取命令中的词(不使用
shlex),因此填充过长的命令也无法拖慢它:在一台 Windows 机器上,处理一条 2,000,000 个字符的带引号命令约需 5 秒,低于原先的 200 多秒。判定结果不变。 - **永远不会说“允许”。**沉默表示“无异议”,因此它只会收紧 Agent 的权限,不会放宽权限。
流程
hook.handle() 是唯一的强制执行函数。shell 钩子和 Hermes 插件都会调用它。MCP 不会调用。
- wheel 安装的完整性检查。一旦不匹配,所有受保护的调用都会被拦截。可编辑安装和未打包安装会以
dev通过。 - scamgate 自带的
check_url/check_payment工具不会产生输出,因此询问守门工具本身不会被拦截。 - 防篡改:禁止写入软件包、状态、源列表缓存、钩子配置和其他 Hermes 配置文件,以及卸载守门工具或调用
promote/record-payment的命令。 - 额外检查:读取签名密钥;Hermes 安全开关(
approvals.mode off、--yolo、plugins uninstall、--safe-mode、--dangerously-skip-permissions);写入其他工具会运行的文件;$HERMES_HOME/scripts下的 cron 脚本;由bash/python/node/pwsh/uv run指定的脚本文件,并向下检查几层。 - URL 提取。
https:/host和https:///host会被改写为https://host。主机名会进行 NFKC 规范化、百分号解码,并展开数字形式的 IPv4 地址。各段按换行符、;、&&、||和|分割。 - 对每个 URL 分别使用和不使用 Agent 的理由进行评分。取较高分,然后采用最严格的决策。目标地址无法读取时会询问。干净 URL 超过 20 个时会询问。
- 付款结果与通用网络询问结果打平时,付款结果优先。URL 拒绝仍优先于付款询问。
- 静默时输出
{};其他情况下输出 Hermes 的block/approve,或 Claude 的deny/ask。记录询问或拒绝。
rule_key 是主机名加规则 ID,或者不透明命令的哈希值。对一个主机的“始终允许”不适用于其他主机。
插件可以看到每个聊天会话的 /yolo 和 approvals.mode: off,并会将询问转为拦截,除非 when_approvals_off 设为 allow。Shell 钩子无法看到这些会话状态。在一台 Windows 机器上测得:每个 shell 钩子进程约需 0.5–0.7 秒,进程内约需 10 毫秒。这不是基准测试套件。
请求发出后,它无法看到重定向,也无法了解已编译二进制文件的行为,或未在调用中指定的脚本。同一用户身份下,Agent 以外的代码仍可读取签名密钥。详情:文档,运行机制。
Hermes(~/.hermes/config.yaml)。需要使用支持 "action": "approve" 的 Hermes 构建版本(旧版本会丢弃该值,导致所有询问都直接通过;已于 2026 年 9 月在 issue #92553 中修复)。Hermes 会在交互会话中首次运行时询问是否批准新钩子。使用 hermes hooks list 或 hermes hooks doctor 检查:
hooks:
pre_tool_call:
- matcher: ".*" # scamgate passes non-network tools straight through
command: "scamgate-hook"
timeout: 15
fail_closed: true
post_tool_call: # optional: records whether you approved each ask
- matcher: ".*"
command: "scamgate-hook"
timeout: 15
注意:使用 shell 钩子时,/yolo 或 approvals.mode: off 会自动批准所有 scamgate 询问(拦截仍然有效)。下面的 Hermes 插件会改为拦截这些询问,除非设置 plugins.entries.scamgate.settings.when_approvals_off: allow。
Hermes 插件(推荐)。检查内容与 shell 钩子相同,在进程内运行,速度快约 50 倍,并且可以看到每个聊天会话的 /yolo。需要 Hermes 0.19.1 或更高版本。该插件已收录在 Hermes 插件目录中,也可将 src/scamgate 目录安装为插件。它会注册 pre_tool_call、scamgate_check_url、scamgate_check_payment、scamgate_update_feeds、/scamgate status | review | update 和 hermes scamgate update-feeds | feeds-status。它会自动保持钓鱼网站列表为最新:参见 在 Hermes 插件中。插件安装不会在 PATH 上提供 scamgate 命令;请改用 /scamgate 或 hermes scamgate。
Claude Code 插件会为你完成这些设置。若要手动配置:
Claude Code(.claude/settings.json)。onFailure 需要 Claude Code v2.1.295+。没有它,钩子崩溃、超时或无法启动时,工具调用会直接通过:
{"hooks": {
"PreToolUse": [{"matcher": ".*",
"hooks": [{"type": "command", "command": "/absolute/path/to/scamgate-hook",
"timeout": 15, "onFailure": "block"}]}],
"PostToolUse": [{"matcher": ".*",
"hooks": [{"type": "command", "command": "/absolute/path/to/scamgate-hook"}]}]
}}
使用绝对路径(uv tool dir --bin 可显示该路径),以免 PATH 上更早出现的程序冒充钩子。
为这个钩子安装固定版本(uv tool install scamgate==0.3.3,或 git+https://github.com/odaiameera/[email protected]),
而不是从源码检出目录运行:已安装的副本会在每次调用时,将自身文件与安装时记录的
哈希值进行比对;如果文件发生变化,就会阻止所有操作。源码检出目录没有可供比对的记录。
每次受控调用都会启动一个进程(在 Windows 上约需 0.7 秒)。不访问网络或不涉及 scamgate 文件的调用会直接通过。
查看、审核并提升信任级别
每次 ask 和 deny 都会记录到 $SCAMGATE_STATE_DIR(默认为 ~/.local/state/scamgate)
中,其中包含已脱敏的目标、触发的规则、评分、Agent 给出的理由(供你查看,并标记为
不可信;在评分中它只能增加风险),以及你随后是否允许其运行。
scamgate review --days 7 # which hosts keep tripping it, and what you did
scamgate promote --host shop.example --decision deny
scamgate promote --host shop.example --decision allow --rule url.userinfo
只有人才能添加例外规则。promote 会要求确认;如果没有交互式终端,或在已知 Agent(Claude Code、Hermes、Codex)内部运行,则会拒绝执行,即使 Agent 直接导入 scamgate 的代码也是如此。每条例外规则都会使用状态目录中的密钥进行签名,因此,以其他方式写入文件的规则行都会被忽略。deny 会覆盖该主机及其子域名。allow 的适用范围很窄:它只会豁免一条规则对一个精确主机的限制,并且绝不会豁免已知恶意源、你的屏蔽列表、意图检查或你自己的拒绝规则,因此攻击者无法诱使防护机制信任整个域名。
收款方历史记录
check_payment 不会轻信 Agent 对 is_new_payee 的判断。它会在本地历史记录中查询你实际支付过的收款方(以加盐哈希存储,不记录姓名或账号)。它会标记:
- 你以前支付过的收款方,这次使用了不同的账号(银行信息已变更);
- 使用新账号的近似名称(例如 “Acme Trading Ltd”、“Acmee Ltd”,或 “Acme” 中使用了西里尔字母 “е”):这是典型的发票转账诈骗手法;
- 你以前支付过的账号,这次使用了不同的名称;
- Agent 将收款方称为“已知”,但没有支付记录的情况(会增加风险)。
只有你能在实际付款后添加记录,方式与添加例外规则相同:需要交互式终端、不能在 Agent 内运行,并且必须签名。如果历史记录的密钥或盐值丢失,所有收款方都会被视为新收款方且信息已变更,而不是悄无声息地忘记所有人。
scamgate record-payment --payee "Acme Ltd" --account IE29AIBK93115212345678
域名年龄(可选启用)
新域名是网店诈骗的重要信号(url.domain_age,域名注册未满 30 天时计 30 分)。查询域名年龄需要通过 RDAP 联系域名注册管理机构,这会让注册管理机构知道你在检查哪个网站,因此默认关闭,需由你选择启用:
SCAMGATE_RDAP | 行为 |
|---|---|
off(默认) | 不进行查询。该规则不会触发。 |
cache | 使用已缓存的域名年龄;绝不会联网。使用 scamgate domain-age HOST 填充缓存。 |
live | 查询未知域名(超时设为 3 秒),并将结果缓存一年(失败结果缓存 7 天)。 |
官方品牌域名、共享平台、IP 和 localhost 均不会被查询。注册管理机构信息来自 IANA 的 RDAP 引导列表,并缓存在 feed 缓存目录中。
已知恶意链接信息源
只有刷新信息源时才会访问网络:scamgate update-feeds、MCP update_feeds 工具、设置 SCAMGATE_AUTO_UPDATE=1 后启动的 scamgate serve,或 Hermes 插件中的 /scamgate update、hermes scamgate update-feeds、scamgate_update_feeds 工具及后台刷新。它们都使用同一个下载器。检查时读取本地缓存。本仓库不包含任何信息源数据。
scamgate update-feeds # default feeds
scamgate update-feeds --all # also the large opt-in feed
scamgate update-feeds -f openphish
scamgate feeds-status
缓存位于 $SCAMGATE_CACHE_DIR,否则位于 $XDG_CACHE_HOME/scamgate,再否则位于 ~/.cache/scamgate。每个信息源都有各自的文件,meta.json 会记录获取时间、来源和数量。下载失败时会保留该信息源之前的缓存。没有缓存信息源或信息源超过 24 小时时,判定结果会发出警告。正在运行的 MCP 服务无需重启,即可使用刷新的缓存。
| 信息源 | 默认启用 | 来源 | 许可证 / 条款 |
|---|---|---|---|
openphish | 是 | OpenPhish 社区信息源 | OpenPhish 条款:仅限个人非商业用途,不得再分发。商业用途需获得 OpenPhish 的书面同意 |
phishing_database_domains | 是 | Phishing.Database 活跃域名 | MIT |
phishing_database_links | --all | Phishing.Database 活跃链接(下载约 65 MB) | MIT |
urlhaus | 设置密钥后启用 | abuse.ch URLhaus 在线恶意软件 URL | 需要免费的 abuse.ch Auth-Key(SCAMGATE_URLHAUS_AUTH_KEY)。遵循公平使用条款;商业用途可能需要付费套餐 |
你有责任遵守每个信息源的条款。未使用的信息源:PhishTank(已禁用新注册)和 Google Safe Browsing / Web Risk(仅限非商业用途,或需付费)。
匹配规则:完全匹配已列出的 URL 得 100 分,完全匹配已列出的主机得 75 分,子域名匹配已列出的域名(仅限域名信息源)得 50 分。
长时间运行的 scamgate serve 可以自行刷新:设置 SCAMGATE_AUTO_UPDATE=1 启动(除非关闭 auto_update_feeds,否则 Claude Code 插件会启用此功能)。只有列表超过 6 小时未更新时才会下载。否则,可通过 cron 刷新,例如每 6 小时一次:
0 */6 * * * cd /path/to/scamgate && uv run scamgate update-feeds >> ~/.cache/scamgate/update.log 2>&1
在 Hermes 插件中
插件会自行刷新默认信息源:Hermes 启动约两分钟后刷新一次,之后在 Hermes 运行期间每 6 小时刷新一次。无需设置 cron。缓存目录中的锁文件可确保同一时间只有一个 Hermes 进程进行下载。失败会记录日志,并保留旧列表。手动刷新:
/scamgate update # in a chat
hermes scamgate update-feeds # in a terminal
hermes scamgate feeds-status
Agent 可使用 scamgate_update_feeds 工具自行刷新过期列表。该工具不接受参数:它始终会从固定来源下载默认信息源并存入配置的缓存;如果最近一小时内已刷新,则不会执行任何操作。Agent 可以请求刷新,但不能选择下载内容或存放位置。通过命令行调用下载器并传入自定义参数的命令会被拦截,但仍可直接写入缓存目录。
将 plugins.entries.scamgate.settings.auto_update_feeds: false 或 SCAMGATE_AUTO_UPDATE=0 设为关闭后台刷新。刷新不会发送任何你检查过的链接信息:它会下载完整列表。
你自己的阻止列表:src/scamgate/data/blocklist.txt(或 $SCAMGATE_BLOCKLIST)。其中附带了几个虚构的 .example 域名。
误报
信息源可能会列出大型共享平台上的单个恶意页面(Google Docs 和 Sites、Firebase 存储、Microsoft 登录、Discord CDN、短链接服务)。将这些主机整体标记为恶意会阻止正常网站。对于 rules.yaml 中 lists.feed_host_ignore 下的域名(及其子域名)和官方品牌域名,只有完全匹配的 URL 才会计入。x.vercel.app 上的单个钓鱼页面不会导致 vercel.app 被标记。代价是:忽略平台的子域名上若出现诈骗,只有在 URL 完全匹配时才能被发现。
配置
权重、阈值、品牌列表和词表都位于
src/scamgate/config/rules.yaml。将 SCAMGATE_CONFIG 指向
你自己的副本即可覆盖默认配置。要添加规则,请在
src/scamgate/rules/ 中编写一个函数,并用 @register("url.my_rule", kind="url")
装饰;在 rules.yaml 的 rules: 下为其添加条目,并添加测试和场景。
基准测试与测试
scenarios/ 包含 24 个手写的示例案例(17 个诈骗案例、7 个合法案例),每个案例
都有一个预期判定。
$ uv run scamgate bench
...
Scams: 17 caught: 17 missed: 0
Legit: 7 false positives: 0
Exact decision match: 24/24
这是对规则的回归检查,不代表真实世界的检测率。运行 uv run pytest
可执行单元测试(v0.3.3 时为 1013 个;CI 在 Python 3.11–3.13 上运行)。测试使用固定数据,不会访问网络。
限制
- 默认仅提供建议。 通过 MCP,它只会发出警告,而且必须由 Agent 调用。安装 钩子 才能强制执行。即便如此,它也只能看到工具调用:如果 Agent 通过重定向访问链接,或目标网址藏在变量中,就需要你批准,而不是进行检查。
- 启发式规则会漏掉不符合规则的诈骗,有时也会将合法操作标记为风险。
应将
allow理解为“没有已知风险信号”,而非“安全”。 - 域名年龄检查需要主动启用(
SCAMGATE_RDAP=cache或live,见下文),因为实时 查询会让域名注册机构知道你正在检查哪个网站。 - 已知取舍:与长品牌名只差一个字母的词仍会触发询问(
stripes.com与stripe)。向新收款方进行 银行转账时会询问(25),除非你的银行的收款方验证(Verification of Payee)已匹配 名称;向新收款方进行银行卡支付则不会。 - 钩子看到的是工具调用的参数,而不是程序运行后执行的操作:如果本地脚本、
二进制文件或软件包安装脚本访问网络,除非命令行中能看出来,否则它无法检测到。解码或下载后再运行的代码
(
base64 -d | bash、exec(b64decode(…)、powershell -enc)会触发询问。 - 品牌包涵盖约 50 个最常遭钓鱼的品牌,以及爱尔兰/英国的银行、快递公司和服务;你可以在
lists.brands下添加自己的品牌。可注册域名使用精选的后缀列表 (国家二级域名和github.io、vercel.app等共享主机域名),而不是完整的 PSL。 - 收款方历史记录只包含你通过
record-payment记录过的收款方。scamgate 不会 验证 IBAN,也不会联系你的银行。 - 防篡改机制会阻止 Agent 使用常规工具修改 scamgate、其状态和信息源缓存、其虚拟环境(新增
.pth文件会导致完整性检查失败)、~/.claude(设置、钩子和 已安装的插件)、项目中的.claude/settings*.json以及 Hermes 配置,无论路径采用何种写法(~、$HOME、 通配符、cd+ 相对路径、./、//、..)。只有指向文件夹本身的路径才会被视为目标:~/.cache/scamgate-feeds.log不在~/.cache/scamgate内。仅用于读取的命令(ls、cat、head、tail、grep、rg、find、stat、which、wc、du、sha256sum)在受保护路径上可以通过,前提是没有重定向到/dev/null以外的位置、没有$(…)或反引号,也没有-exec、-delete、-fprint或--pre。禁用或移除 Claude Code 插件的 Agent 命令,以及以裸模式启动 Claude(会跳过所有钩子)的命令,也会被阻止。但这不是沙箱:以你的身份运行的代码可以读取签名密钥并改写任何文件,也可以编写代码绕过模式匹配。要获得最强保护,请勿向 Agent 提供直接 Shell 访问权限;将 scamgate 安装到 Agent 用户无法写入的位置(由其他用户运行uv tool install,或设为只读);对于 Claude Code,则将钩子放入托管设置,并启用allowManagedHooksOnly。 - Hermes 根据钩子的命令字符串而非文件哈希来信任钩子,因此无法发现已安装的 scamgate 被替换。完整性检查会检测已安装文件是否被修改。
免责声明: scamgate 不构成财务、法律或安全建议,也不能替代你银行的欺诈防范措施、收款方验证(Verification of Payee)或人工判断。
路线图
- IBAN 校验和验证及收款人验证集成
- 重定向后检查:重新检查浏览器实际跳转到的页面
- 可选的本地模型,仅用于对模糊情况进行仲裁,绝不推翻硬性规则
- 完整的公共后缀列表(可选,已缓存)
- 基于真实欺诈类型的更多场景
贡献
欢迎提交问题和拉取请求,尤其是新规则、新场景(诈骗和合法场景)以及误报报告。请为每项规则更改附上测试或场景,并确保检查过程离线且结果确定。开始之前,请阅读 CONTRIBUTING.md,并通过私下渠道报告安全漏洞(SECURITY.md)。仓库规范请参阅 AGENTS.md。
感谢 @simin-yuan 的首批外部贡献:#20 中的报告,以及 #21 和 #22 中的修复,这些修复让钩子在处理长命令时保持线性复杂度。
许可证
MIT。不包含信息源数据,且这些数据仍受各提供方自身条款约束。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。