昨天凌晨两点十七分,我还在改这周的赛题审核表。
屏幕右下角弹出一封提交邮件,标题就一行字:「回调白名单绕过,可重定向到任意域,附 PoC」。发件人叫林知远,ID 是 lzy_0x07,提交编号 #1108。我点开,正文八百三十七个字,三张截图,一段 curl 命令,末尾一行:「影响面:登录态可被钓走,建议优先修。」
我看了两遍。
事情本身不复杂。某站的 OAuth 回调白名单只校验了域名后缀,没校验路径。攻击者可以把 redirect_uri 写成 https://trusted.example.com.evil.test/cb,白名单用 endsWith 判断,直接放过。这是个老掉牙的漏洞类型,2019 年我在三个不同项目里见过一模一样的写法。但林知远做了一件大部分人不会做的事:他先写了三行说明为什么这不算误报,再写复现步骤,最后才贴 PoC。
顺序很重要。
百分之九十的提交,是把 PoC 甩在最前面,然后让我自己去猜他想说什么。
我不是在抱怨新人。我自己第一次提交漏洞报告的时候,正文只有一句话:「这里有个 XSS,你看一下」。被当时的负责人退回来三次,第三次他才回我一句:「你先告诉我,谁会被打,怎么被打,打完之后能干什么。」那句话我记了七年。所以现在看到林知远这种写法,我有点想笑,又有点想骂人——骂那些把「写清楚」当成可选项的人。
这周的主题赛一共收到 47 份提交。有效 31 份。剩下的 16 份里,有 9 份是扫描器跑出来的原始报告,连个标题都没改;有 4 份是同一个漏洞换了四个路径提交;还有 3 份,PDF 里只有一张截图和一个「please fix」。
我不生气这些提交不专业。我生气的是,他们连自己写的东西都不愿意读第二遍。
说到判断。上个月有个提交,直接抄了 2024 年某公开漏洞库里的分析,连原文里的一个错别字都原样保留。作者叫周牧野,我在审核群里把两份文本并排贴出来,他回了一句:「我是参考了一下,不算抄吧。」我没回复。直接把这条标记为无效,理由写了六个字:没有自己的判断。
这句话我后来在群里又说了一遍。有人退群了。
回到这周的赛题。主题是「认证与授权边界」,我出题的时候故意留了一个坑:默认的 session 过期时间是 7200 秒,但刷新 token 的接口没做频率限制。这不是什么高明设计,就是想看有没有人愿意在「功能正常」的地方多停一秒。47 份提交里,只有 6 个人提到了刷新接口。林知远是其中之一,他在报告末尾加了一句话:「这个不算漏洞,算是设计债,但你出的题,我就顺手记一下。」
我给他回了邮件。两个字:收到。
接下来这周的主题赛,我打算把赛题往「供应链」方向挪一点。最近在折腾的一个小工具,用到了 高通骁龙6 gen5 平台上的一个调试接口,顺手翻了一遍相关依赖,发现自己两年前写的一段代码还在被某个内部服务引用。那种感觉很怪——你以为是别人在维护,其实一直是你自己在原地打转。
顺便说一句,这周的赛题页面挂了三天,访问量只有 213 次。其中 78 次来自我自己。我认了。
写到这里,窗外天已经亮了。我把林知远那份提交归档,标记为「本期最佳」,然后在审核表里给另外 15 份写了同样的备注:请补一句话,说明这个漏洞被利用之后,谁会损失什么。
我不知道有几个人会真的去补。但我会等。