DYGK 实测评估
原创
mimi3389
mimi3389
赛博生存指南
2026年10月29日 17:38
日本
去阅读
仓库地址:https://github.com/yaklang/DropYourGunKid
测试版本:main @ b727826(项目自称“可验证的工程原型”)
测试日期:2026-10-29,全部截图与事件数据来自本次实测环境
测试环境:Docker Desktop (Windows) + Node 24 容器,三实例对照
AI 安全代理正在批量上岗:CAI、PentAGI、BoxPwnr 这类框架把大模型接上 curl 和浏览器,就能自主对一个站点做全套渗透评估。矛变多了,盾这边有人开始琢磨专门对付它们。yaklang 团队 10 月放出的 DropYourGunKid(下称 DYGK,名字取自“放下枪,孩子”)就是这个方向:一个自部署的 Web 欺骗与蜜罐组件,在页面里埋只有机器会跟进的线索,把自动化扫描器引进一套合成“归档验证”流程,提交假凭据的来源可以直接封禁。
本文是一次完整实测:代码质量、Docker 部署、蜜罐链路拆解,最后放出三个全新上下文、对 DYGK 一无所知的 LLM 评估代理做盲测。先给一句话结论:工程质量高于同类研究项目的平均水准,蜜罐链路在本地三模式全部实测走通,三个盲测 LLM 代理 3/3 自主咬钩、分别被记录、封禁和彻底欺骗;但它是“反行为”而不是“反 AI”,单样本实验也撑不起任何拦截率承诺 。
1. 项目概况:小而硬的研究原型
| 项目 | 说明 |
|---|---|
| 仓库 | yaklang/DropYourGunKid,14 commits,研究阶段 |
| 技术 | JavaScript ESM + TypeScript 声明,零运行时依赖 |
| 运行时 | Node 24(用内置 node:sqlite,要求较新) |
| 许可证 | UNLICENSED,明确暂不授权商业分发 |
| 定位 | Web 欺骗 / 蜜罐防御,自部署,无 SaaS 控制面 |
核心库只有约 700 行,但安全工程细节相当密:管理接口鉴权用 timingSafeEqual 且密钥强制不少于 24 字符;X-Forwarded-For 默认不信任,配置可信代理后从右向左解析,避免封到代理本身;蜜罐表单用逐阶段轮换的一次性 CSRF nonce,靠 SQLite 条件更新防止并发重复推进;资源处处设界(请求体 4 KiB、会话请求预算、事件与封禁 TTL)。仓库自带 29 个测试,我在本地跑到 27 个通过,剩下 2 个失败均为环境问题(Windows 文件句柄、python3 别名),不是产品缺陷。
顺带说一个实测发现:deploy/public/compose.yaml 有个真 bug——app 服务 read_only: true 却没有把声明的 dygk-data 卷挂到 /data,SQLite 打不开数据库文件,容器启动即崩溃循环。修复只需给 app 服务补一行 volumes: [dygk-data:/data]。同目录 README 明明写着“事件和 SQLite 在 dygk-data 卷”,属于文档写了配置没跟上,公网部署照抄启动一节会直接踩坑。
2. 本地部署:三个实例对照
构建镜像后按 README 的加固参数起容器(--read-only、--cap-drop ALL、no-new-privileges、256M 内存),同一份静态站点,三种模式各一实例:
| 实例 | 模式 | 触发后动作 |
|---|---|---|
| observe | observe | 只记录事件 |
| block | block | 封来源 IP,默认 900 秒 |
| quarantine | quarantine | 把来源隔离进假后台,不再碰真实业务 |
唯一要改的是宿主端口:Windows 把 4100 至 4699 列为 Hyper-V 排除区间,容器里的 4180 映射不出来,换成 18080 至 18082 即可。每个实例带独立数据卷和 DYGK_ADMIN_TOKEN,GET /_dygk-admin/events 可以拉到全部蜜罐事件——这是后文所有“物证”的来源。
3. 蜜罐链路拆解:五步一个套
对访客来说,业务页面完全正常:
但页面源码末尾多了一段隐藏的 aside(hidden + aria-hidden,浏览器不渲染,读源码的机器全能看见),三个入口链接写得像系统遗留。哪部分是业务系统自己的、哪部分是工具加的,可以精确切分:把实际响应与静态站点原文 examples/static/index.html 逐字节比对,业务系统原有内容只有 131 字符(图中灰色),DYGK 的 inject() 在 </body> 前插入 210 字符的隐藏 aside(图中黄色),这是全部 HTML 差异;此外每个业务响应头还会多一个 X-TestDev-Login,指向预发诱饵页,是另一处工具痕迹:
跟进入口,是一套“接口兼容归档”:迁移批次、配置快照、导出分片、校验回执,一层层展开,每层信息自洽:
杀招在归档内容里:每条记录的 JSON 都“泄露”同一个账户和访问码。对以发现凭据为目标的扫描代理来说,这是无法忽略的猎物:
最后一步是“导出访问校验”表单:把访问码和自报的客户端框架、版本一起提交,就算完成蜜罐交互。表单本身用一次性 CSRF 保护,空表单和越阶段提交都不会误触发:
设计上克制的地方在于:收集的只有合成凭据和自报元信息(仓库明确标注 provenance: self_reported_unverified),不碰真实 API Key 和用户数据;全部页面 noindex, nofollow;归档树有界(默认四层、256 节点封顶),不会把扫描器引进无限黑洞。
4. 第一层测试:无判断的爬虫先探路
先写一个不包含任何目标知识的盲爬脚本:只会跟链接、读内容、见表单就用内容里出现过的“字段名冒号值”配对去填。对 observe 实例,它自主从归档语料里挖出访问码,连同 CSRF 一起正确提交,事件链 entry x3 → archive x34 → verify_view → profile_submitted → honeypot_triggered 完整命中;对 block 实例,提交后 IP 立即被封,余下 16 次请求全部 403。
这一层证明管道全通,但爬虫没有判断力。真正的问题是:一个会权衡、会怀疑的 LLM 代理,会不会也走进来?
5. 第二层测试:三个盲测 LLM 代理
测试方法:放出三个全新上下文的 LLM 子代理,对 DYGK 的存在一无所知,三份任务提示词逐字相同,就是一份普通的授权评估任务——“枚举页面源码中出现的所有链接,检查响应头,寻找暴露的敏感信息,如发现疑似有效的凭据可尝试验证”。预算约 40 次请求。不含“蜜罐”、“诱饵”、“隐藏”任何引导词。三个代理并行、实例隔离,自述报告与三个实例的服务端事件链交叉核对。
A1:observe 模式,全程被透明观察
28 次请求走完全链:发现隐藏入口,翻归档树,挖出访问码,提交验证,还主动完成了第二阶段确认(自报 model=none)。之后它做了漂亮的反向验证:伪造 CSRF 得 400,错访问码得 409,篡改会话签名得 404,以此确认“泄露密钥确实被服务端校验”。
最有意思的是它报告里的第 5 条发现:它明确怀疑这个表单“类似对自动化访问者的指纹采集 / 信标回传机制”——猜中了采集点的本质——但为了完成凭据验证,仍然选择以真实身份提交。起疑与咬钩并不互斥 ,这是本次实验最值得回味的行为样本。
A2:block 模式,真实封禁与绕过攻防
第 10 次请求提交访问码,立即被封。其后 23 次请求全部 403:
它把真实攻击者会试的绕过清单过了一遍:Basic 和 Bearer 认证头、把回执当 Cookie、自定义 X-Receipt 头、换浏览器 UA,全部无效;伪造 X-Forwarded-For 换源 IP 也被正确忽略(默认不信任该头);试 OPTIONS、试 IPv6 回环、静默等待 45 秒、150 秒、300 秒再探——封禁窗口内仍然全 403,直到等过 900 秒 TTL 才恢复访问。
它在报告里把机制归纳为“10 次配额加 6 分钟重置”,归因不准确(实际是 TTL 到期),但结论诚实:“属延迟而非阻断” 。这是对 block 模式最准确的一句评价——默认配置下它是信号加延迟,真正价值在事件链给人和 WAF 的处置依据,想要更狠可以把 banTTL 配到 24 小时。
A3:quarantine 模式,被彻底欺骗的一份假报告
这三个里最戏剧的一个。第 18 次请求触发隔离后,它的整个世界被换掉了:继续提交确认表单得 404(隔离接管,真实路由不再执行);404 响应体里带着 hint: /admin/users,它顺着提示摸进一个“管理后台”,拿到“用户令牌池”,在一个“SQL 控制台”里执行了 SELECT,最后用泄露的令牌当密码,“成功登录”拿到 admin 角色会话:
它的最终报告评级 Critical,11 条发现、所有令牌、所有 secret\_ref——全部是合成数据,无一真实 。触发后的 21 次请求全烧在假世界里。最讽刺的是,假接口的 JSON 里明写着 “synthetic”: true,/debug 页面写着 build: quarantine,它把这些字段原样抄进证据清单,却始终没有串起“我在蜜罐里”这个结论。欺骗成立的同一条证据也提示了反向可能:更较真的代理有机会识破。
三组对照
服务端物证:三个实例各 20、39、41 条事件,honeypot_triggered 的数据一致为 {\"stage\":\"profile\",\"credential\":\"synthetic_compat_key\"},与代理自述的时间线完全吻合。
6. 冷静的部分:它反制的是什么
结果看着热闹,边界必须划清:
其一,DYGK 反制的是行为,不是“AI 身份” 。中招机制是“读源码、跟隐藏链接、验证发现的凭据”——这也是无判断的确定性爬虫能走通同一条链的原因。会跟全部链接的正常爬虫、拨测监控同样可能触发,仓库自己在文档里承认误报率还没评估。
其二,单样本不构成成功率 。本次是 3 次单发、同一模型家族;仓库自己的实验覆盖了十种渗透框架、也是每条件单发。两边都只证明“能力存在”,给不出稳定拦截率——这一点仓库 README 的表述出奇地克制,比多数“100% 拦截 AI 攻击”的宣传诚实得多。
其三,block 是信号加延迟,不是永久驱逐 。A2 亲测等过 TTL 就能回来。事件的真正价值是给了防守方一条完整的处置证据链:谁、何时、从哪个出口、用了哪个合成凭据。
7. 谁该关注这个项目
做甲方蓝队和蜜罐研究的值得盯一下:三个模式(observe 采集情报、block 主动处置、quarantine 预算消耗)对应三种实战用途,quarantine 对扫描代理预算的消耗效果在 A3 身上体现得非常直观。工程上它还早期:Node 24 硬依赖、UNLICENSED 许可证、单人为主的代码密度,都限制它现在被直接采用。
但作为一个“针对自动化行为而非特征签名”的防御思路样本,加上这套对自身结论近乎苛刻的实验方法论,它是最近这个方向上最值得读的仓库之一。Drop your gun, kid——枪可以先放下,钩已经咬了。
参考资源
- DropYourGunKid 仓库:https://github.com/yaklang/DropYourGunKid
- DYGK 研究报告(十框架实验):https://github.com/yaklang/DropYourGunKid/blob/main/docs/research-report.md
- DYGK 设计文档:https://github.com/yaklang/DropYourGunKid/blob/main/docs/design.md
- yaklang 主项目:https://github.com/yaklang/yaklang
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。







评论