# 安全模型与使用边界 · dsh-daiyi-aimy-skill > 本插件是一个**授权安全检测**工具:它帮助有书面授权的测试者在明确范围内做侦察与漏洞检测。 > 它不是「自动渗透机」,不提供任何武器化能力。请先读完本文再用。 ## 1. 一句话定位 - **做什么**:指纹识别、端口探测、目录枚举、爬虫、参数挖掘,以及对 SQL 注入 / XSS / 命令注入 / SSTI / SSRF / NoSQL 注入 / LFI / CORS / GraphQL / 原型链污染 / JWT 配置的**检测**。 - **不做什么**:反弹 Shell、反序列化利用链、SSRF 横向、OOB 带外回连、WAF 绕过、数据提取(拖库)、凭据攻击、MITM 凭据捕获。 - **不承诺**:不承诺检出率,不替代人工验证,不保证零误报。 ## 2. 授权模型:默认拒绝(deny-by-default) 上游 CLI 是「给个目标就打」;作为常驻在 Agent 里的插件,那意味着模型可能在任意对话里对任意主机发起请求。本插件把这件事改成**显式授权**: 1. **没有任何范围登记时,所有网络工具直接拒绝**,并提示先调用 `aimy_scope`。 2. 登记范围必须提供 `authorization` 字段,写清授权依据(授权函编号、靶场名称、本人资产说明等),**至少 8 个字符**,阻止「随手一填」。 3. 每条范围带 `id`、`createdAt`,可选 `expiresInHours`;过期后匹配失败,提示重新登记。 4. 范围登记、移除、清空都会写审计日志(默认最多保留 200 条)。 5. 授权范围可持久化到 `scope.json`;`persistScope: false` 时只存在进程内存,重启失效。 登记示例(具体参数见 [TOOLS.md](TOOLS.md)): ```text aimy_scope(action="add", target="example.com", authorization="客户授权函 #A-1024,范围 example.com 全站,有效期至 2026-12-31") ``` ### 审计 `scope.json` 中同时保存 `entries` 与 `auditLog`。每条审计记录包含时间、执行者(固定 `aimy-plugin`)、动作(`scope.add` / `scope.remove` / `scope.clear`)与目标。审计只覆盖**范围变更**;具体的检测请求记录在会话内存的 `runs` 里,随 `aimy_report` 输出,不持久化。 ## 3. 范围匹配规则 ### 3.1 可登记的写法 | 写法 | 含义 | |---|---| | `example.com` | 精确主机,任意端口、任意 scheme | | `*.example.com` | 所有**子域**(不含 apex `example.com` 本身) | | `example.com:8443` | 该主机的 8443 端口 | | `https://example.com/app` | 只允许 https + 该主机 + 路径前缀 `/app` | | `127.0.0.1` | 回环地址(需 `allowPrivateNetworks: true`) | | `[::1]:8080` | IPv6 回环 + 端口(需 `allowPrivateNetworks: true`) | 登记时**拒绝**:空目标、含空白字符、含 `user:pass@` 凭据、裸通配 `*`、非最左一级的通配(如 `a.*.com`)、含 `/` 的主机名、非法端口。 ### 3.2 一个请求怎么判定「在范围内」 按顺序: 1. **地址类别检查**(先于匹配): - 永久拒绝:link-local(`169.254.0.0/16`、`fe80::/10`)、multicast(`224.0.0.0/4`、`ff00::/8`)、reserved(`0.0.0.0/8`、`240.0.0.0/4` 等)。这类地址即使登记也会被拒绝。 - 需要开关:loopback(`127.0.0.0/8`、`localhost`、`::1`)与 private(`10/8`、`172.16/12`、`192.168/16`、`100.64/10`、`fc00::/7`)。默认 `allowPrivateNetworks: false`,登记与访问都会被拒绝。 2. **主机匹配**:非通配条目要求 `host` 完全相等;`*.example.com` 只匹配 `x.example.com`,**不匹配** `example.com` 本身。 3. **端口匹配**:条目指定端口时必须等于 URL 的有效端口(`https` 默认 443,`http` 默认 80)。 4. **scheme 匹配**:条目指定了 `http` / `https` 时必须一致。 5. **路径前缀**:条目带 `pathPrefix` 时,请求 URL 的 `pathname` 必须以它开头。 6. **过期检查**:`expiresAt ≤ 当前时间` 的条目不参与匹配;如果有同名但已过期的条目,返回 `EXPIRED` 而不是笼统的 `NO_MATCH`。 拒绝结果会带稳定错误码:`NO_SCOPE`、`NO_MATCH`、`EXPIRED`、`PRIVATE_BLOCKED`、`FORBIDDEN_ADDRESS`、`INVALID_TARGET`,便于模型理解下一步该做什么。 ### 3.3 重定向不能逃逸 默认 `followRedirects: false`,3xx 原样返回。显式开启后: - 每一跳都重新做 scope 检查; - 跨主机跳转必须在新目标也在范围内时才继续; - 超过 `maxRedirects`(默认 3)停止并返回错误标记。 ## 4. 运行时护栏 | 护栏 | 默认值 | 作用 | |---|---|---| | 请求预算 `maxRequests` | rookie 24 / veteran 60 | 单次工具调用上限,超出中止 | | 并发 `concurrency` | rookie 4 / veteran 8 | 受控并发,不建无界线程池 | | 单请求超时 `timeoutMs` | rookie 8000 / veteran 12000 | 慢目标不会拖死调用 | | 响应体上限 `maxBodyBytes` | 256 KiB(最大 4 MiB) | 流式读取并截断,防内存放大 | | 重定向 `followRedirects` | `false` | 安全默认 | | 回环/内网 `allowPrivateNetworks` | `false` | 防止误打生产内网 | | 凭据脱敏 `redactSecrets` | `true` | 报告中对疑似凭据打码 | 另外: - **不持久化任何凭据**。目标登记不允许 `user:pass@`;插件不保存 token、cookie、登录态。需要登录态的检测由调用方在单次调用里显式提供请求头。 - **User-Agent 可识别**:默认 `dsh-daiyi-aimy-skill/3.0.0 (authorized-security-testing; +仓库地址)`,目标方可以从日志里识别测试来源。 - **可取消**:宿主取消调用时,探针通过 `AbortSignal` 中止在途请求。 `rookie` / `veteran` 只调整预算与 payload 激进度(例如是否启用时间盲注),**不会放宽任何授权边界**。 ## 5. 数据边界 | 数据 | 存放位置 | 生命周期 | |---|---|---| | 授权范围 + 审计 | `scope.json`(默认 `$DSH_HOME/daiyi-aimy-skill/scope.json`,可用 `scopeFile` 覆盖) | 持久化,直到手动删除 | | Finding / 运行记录 | 进程内存 `FindingsStore` | 插件重启即清空,默认最多 800 条 finding / 60 条运行记录 | | 报告 | `aimy_report` 返回值;是否写文件由调用方决定 | 由调用方管理 | | 凭据 | 不收集、不存储 | — | **没有遥测、没有远程上报、没有第三方服务调用。** 插件唯一的网络出口是发往授权目标的 HTTP 请求。 报告默认对疑似凭据脱敏(例如 `Authorization` 头、token 形态的字符串),但**不要**把真实生产凭据、客户数据贴进对话或报告;检测证据只保留复现所需的最小信息。 ## 6. 明确禁止的用途 以下用途**不允许**,插件也没有提供对应能力: 1. 对**未获书面授权**的目标做任何探测。范围登记只是插件内的技术约束,不能替代法律授权。 2. 数据提取、拖库、批量下载、绕过访问控制获取数据。 3. 建立持久化访问:反弹 Shell、WebShell、计划任务、后门账号。 4. 横向移动、内网扫描、云元数据读取、凭据窃取。 5. 拒绝服务 / 压力测试。请求预算限制的是「不失控」,**不代表**可以拿它做压测。 6. 绕过安全设备(WAF/IDS)的规避性 payload。 7. 把本插件包装成「一键渗透」或对公众目标批量扫描的服务。 ## 7. 检测能力与已知边界 - 检测基于**响应差异启发式**(错误关键字、状态码、时延、反射 marker、响应头),存在误报与漏报。 - 时间型盲注(仅 veteran 模式)受网络抖动影响,单次结果需人工复验。 - 不检测需要多步交互、需要登录态、需要带外信道才能确认的漏洞。 - 默认不跟随重定向、不读大响应体,可能因此漏掉某些目标上的问题。 - 报告里的 `confirmed: true` 只表示「插件内重复观测一致」,不等于人工确认可利用。 **结论:本插件的输出是「线索 + 证据」,最终判定必须由有授权的人类测试者复核。** ## 8. 漏洞报告渠道 如果你发现本插件自身的安全问题(例如范围护栏可被绕过、命令注入、路径穿越、依赖问题): 1. **优先私下联系**:GitHub 仓库 的 Security Advisory,或邮件 `1703205607@qq.com`(作者:戴亿)。 2. 请在报告中包含:插件版本、复现步骤、影响范围、PoC(如适用)。 3. 在修复发布前,请勿公开披露细节。 4. 非安全类问题(文档、兼容性、误报)走 GitHub Issues 即可。 ## 9. 合规提醒 - 在中国境内开展网络安全测试,请遵守《网络安全法》《数据安全法》《个人信息保护法》及目标所在地法律法规。 - 测试前取得**书面授权**,明确范围、时间窗口、允许的测试强度与禁止项。 - 本插件按 MIT 许可证「按原样」提供,作者不对使用者的行为或后果承担责任;使用者对自身行为负全部责任。