Hooks

cors hook:审计 CORS 源

在命令行中扫描源代码里可被绕过的 CORS 源白名单,或评估单个源值是否放行过宽。

cors hook 是 http-request 专项 背后的确定性引擎,你也可以自己运行它。同一条命令有两种模式:scan 模式会扫描源代码,查找可被绕过的源白名单(攻击者的主机能够蒙混过关的主机校验正则),score 模式则把单个 CORS 源值判定为 wildcard、null 或 safe。

扫描代码库​

不带任何选项时,它会扫描整个项目。

npx lagune read cors

它会把每个可被绕过的白名单列在同一个标题下,按文件分组。如果主机校验器的 .+/.* 位于 URL 的 authority 部分、可信主机后缀之前(^https?://.+\.trusted\.com),像 your-site.com.attacker.com 这样的攻击者主机就能蒙混过关。

Origin-allowlist patterns with a greedy wildcard (bypassable, review):

internal/auth/origin.go
^https?://.+\.trusted\.com

这是需要审查的警示,而不是已确认的发现项:仅凭文本无法判定这个正则是否真的把守着某个信任决策,因此扫描从不改变退出码。请逐条阅读,确认白名单使用完全相等的比较。没有发现任何问题时,它只输出一行。

npx lagune read cors --dir src/clean
# => no bypassable origin allowlist found

评估源​

用 --origin 传入每个源。hook 会为每个源输出一个词,只要出现 wildcard 或 null 就以非零退出码退出。

npx lagune read cors --origin '*' # => wildcard
npx lagune read cors --origin 'null' # => null
npx lagune read cors --origin 'https://app.example.com' # => safe
判定结果含义
safe不是 *、null,也不是含 * 的通配模式。它不保证源的格式正确。
wildcard*,或子域名、主机、端口的通配模式:任何站点(或范围很广的一组站点)都能读取响应。
nullnull 源,沙箱化的 iframe 和重定向都能伪造它。

只有 safe 表示放行。--origin 只是值的判定器:它判断的是值,而不是 handler,因此还需要借助 http-request 专项确认 handler。

CLI 选项​

选项值说明
--origin一个源评估一个源值。可重复使用以评估多个,每行一个。
--dir一个目录将扫描范围限定在某个目录。可重复使用,也可与 --file 组合。
--file一个文件将扫描范围限定在单个文件。可重复使用,也可与 --dir 组合。

不带任何选项时,它会扫描整个项目。--origin 属于 score 模式,不能与 --dir 或 --file 组合使用。

它不覆盖的范围

扫描识别的是可被绕过的正则这种形态,--origin 评估的则是源的值。有两种源代码层面的模式超出了它的范围:反射请求的 Origin(服务器把收到的 Origin 原样返回,或在返回时同时允许携带凭据),以及基于 endsWith 或子字符串匹配的宽松白名单。请在代码中识别它们,并按照 http-request 专项 的说明处理。

常见问题

沙箱化的 iframe 和某些重定向会发送 Origin: null,所以信任 null 的白名单会让这些上下文获得读取权限。cors hook 会把它和通配符一起标记出来。

对代码库运行 npx lagune read cors。它会标记贪婪通配符位于可信后缀之前的主机校验正则,这类正则会让 your-site.com.attacker.com 这样的攻击者主机蒙混过关。