项目 001:Mythic 公开发布。
今天,实验室的第一个项目从仓库变成记录: Mythic —— 自适应反机器人系统,为验证码落败的时代打造的验证码替代品。 AGPL-3.0,自今日起完全公开。
验证码已死,且死法可度量
打码平台以不到一顿午饭的价格卖出一千个答案。视觉模型把图像谜题 读得像文字。隐身浏览器大摇大摆走过本该抓住它们的指纹检查。每个 静态谜题共享同一种失败模式: 一个解题器,被发现一次,就永远杀死它。 经济学的每一步都站在攻击者一边 —— 所以我们不再试图造一个更好的 谜题,而是开始给滥用定价。
论点:永不信任客户端
Mythic 默认把浏览器当作敌方。来自客户端的每一个字节都是对抗性 输入 —— 因此客户端 SDK 只是一个传感器,永远不是裁判。 决策发生在服务端,在一个确定性的风险引擎里,输出具名、可审计的 理由。
对滥用的定价是分层的:自适应工作量证明让人类在 Web Worker 里付出 大约一秒 —— 而机器人农场的每个请求都要付出同样的成本,永远如此。 高风险流量拿到更难的挑战。关键操作可以要求密码学证明。裁决以 短时效的 Ed25519 签名令牌传递,你的源站用 JWKS 端点的公钥在本地 验证 —— 无需逐请求回调 mythicd,无需共享会泄露的密钥。
图 1 —— 对人类来说一秒不值一提,对跑一百万请求的农场来说,一秒就是一切。
裁决是一个令牌,而不是回调
当服务端做出决定,它会对决定签名 —— 风险分值、难度、有效期 —— 用 Ed25519。你的源站用 JWKS 端点的公钥在本地验证它。无需对 mythicd 做逐请求回调,无需共享会泄露的密钥:
claims, err := xtoken.VerifyToken(pub, token)
if err != nil {
// reject: malformed, bad signature, or expired
}
// claims.Decision and claims.Risk are yours to enforce;
// verification only proves mythicd signed these claims.
HTTP 接口只有两个端点。挑战进,证明出:
$ curl -s mythicd:8080/v1/challenge \
-d '{"site_key":"sk_live_..."}'
# → {"id":"ch_01J…","difficulty":18,…}
# solve the SHA-256 PoW, then:
$ curl -s mythicd:8080/v1/verify \
-d '{"challenge_id":"ch_01J…","nonce":"48291033"}'
# → decision token (or a harder challenge)
我们先自己动手攻破它
发布之前,我们自己先发动了攻击。一场对令牌格式的一万次变异风暴 抓到一个真实的接受漏洞:不同的字符串解码出相同的已签名字节。一场 现场混沌测试发现一个伪造头部能二十次全部绕过按 IP 的限流器。 两个都已修复。两个都被回归测试钉住。模糊测试器现在在每次推送时 于 CI 中碾过验证路径。绕过报告才是最有用的部分 —— 这就是我们希望这个项目奖励的文化。
它诚实地还做不到什么
v0 会输给资金充足、拥有隐身浏览器和原生解题器的运营者。我们在威胁 模型里白纸黑字地写明了。答案是路线图,不是氛围:行为生物特征、 密码学升级验证、学习引擎。默认公开意味着缺口也公开。
许可证
一切 —— 引擎与 SDK —— 均为 AGPL-3.0-or-later。读它、克隆它、攻破它。 如果你攻破了,请先 私下 告诉我们。欢迎按照仓库中的 CLA 贡献代码。
项目 001 已上线。项目 002 已在排队。
— XEY LABS,发布日