| 版本 | 是否仍在修 |
|---|---|
| 3.1.x | ✅ 是 |
| 3.0.x | |
| 2.x 及更早 | ❌ 否,请升级 |
版本号在扩展的 manifest.json 里,油猴版在脚本头部的 @version。面板底部也会显示。
先说清楚边界,这样你能判断自己发现的问题算不算安全问题。
- 在页面里包装
window.fetch,只读取 URL 匹配PAY_URL的那些响应体 - 从响应体里取 11 个诊断字段,存进本地存储(扩展是
chrome.storage.local,油猴是GM_setValue) - 把这些字段渲染成一个浮动面板
- 不发任何网络请求 —— 没有更新检查、没有统计、没有错误上报。这是硬承诺,见 PRIVACY.md
- 不存原始响应体 —— 只存那 11 个白名单字段
- 不修改请求或响应 —— 它是只读旁听者,不会替你重试、不会改金额、不会拦截
- 不碰 Cookie、localStorage、DOM 表单值 —— 卡号、CVV、持卡人姓名从来没进过它的作用域
这个工具最要命的一点,值得单独讲:
记录会存下来,并在之后打开的每一个页面上重新渲染。
也就是说,一个恶意站点如果能让工具存下一条含 <img src=x onerror=...> 的记录,这段代码会在你下一次打开 checkout.stripe.com 时,在那个页面的上下文里执行。这是一条跨站点、跨时间的注入路径。
防线是 esc():所有插进 HTML 的字段一律转义,自检第 4 节专门喂恶意 payload 验这件事。任何绕过 esc() 的写法都是高危漏洞,请务必报告。
其他值得关注的方向:
| 方向 | 为什么危险 |
|---|---|
PAY_URL 正则被绕过或范围过宽 |
这行正则就是隐私边界,读得比它宽 = 读了不该读的响应体 |
两个版本的 PAY_URL 不一致 |
意味着某一版的读取范围悄悄大于另一版(自检第 5 节逐字比对) |
| 存储里出现白名单之外的字段 | 说明有隐私字段泄漏进了本地记录 |
| Shadow DOM 逃逸 | 面板样式或脚本影响到宿主页面 |
| 权限扩大 | 清单里出现 tabs / webRequest / 多余 host_permissions |
- 面板显示了拒付信息 —— 这是它的功能。信息本来就在响应里,只是页面不给你看
- 恶意网站能看到浮球 —— 面板在 Shadow DOM 里,宿主页面读不到内容,但知道你装了这个工具。这一点我们接受,见 PRIVACY.md
- 本机上有权限的人能读你的记录 —— 数据在本地存储里,明文。能读浏览器配置目录的人本来就能读你所有 Cookie,这不是本项目能解决的层级
- CSP 挡住了注入 —— 这是站点的安全策略在起作用,属于正常现象,换油猴版即可
发现漏洞请不要开公开 issue。
按优先顺序选一个:
- GitHub 私密报告(推荐) —— 打开仓库的 Security → Report a vulnerability。 全程私密,修好之前外人看不到。
- 邮件 —— luck2026228@users.noreply.github.com,标题带上
[security]。
- 受影响的版本和形态(插件版 / 油猴版 / 两个都是)
- 浏览器和版本
- 复现步骤,越具体越好
- 你认为的影响面(能读到什么?能执行代码吗?在哪个站点的上下文里?)
- 有 PoC 最好,但请用 Stripe 官方测试卡号构造,不要用真卡
| 时间 | 我会做什么 |
|---|---|
| 3 天内 | 确认收到 |
| 7 天内 | 给出初步判断:是漏洞 / 不是 / 需要更多信息 |
| 确认是漏洞后 30 天内 | 发出修复版本 |
| 修复发布时 | 在 CHANGELOG 和 Release 里致谢(你不想具名的话说一声) |
这是个人维护的小项目,没有赏金,但每一条报告我都会认真看。
- 验一下你装的是不是原版。 油猴版的唯一官方地址是
https://github.com/luck2026228/DeclineLens/raw/main/DeclineLens.user.js。 从别处拿到的副本请自己比对内容 —— 这是个纯文本单文件,肉眼可读。 - 扩展版请从 Releases 下载。 每个 zip 里的文件都能在仓库里逐字对上。
- 零依赖是刻意的。
build.py只用 Python 标准库,test.js只用 Node 标准库,运行时不加载任何第三方代码 —— 这个项目没有供应链可以被投毒。