Caddy SSO插件安全漏洞分析
我们在Caddy Web服务器的caddy-security插件中发现了10个安全漏洞,这些漏洞可能导致各种高严重性攻击,包括客户端代码执行、OAuth重放攻击和未授权资源访问。
Caddy背景介绍
Caddy(又称Caddy Server或Caddy 2)是一个用Golang编写的现代开源Web服务器,设计易于使用且高度可配置。caddy-security插件是Caddy的中间件插件,提供各种安全相关功能,包括基于表单、基本、本地、LDAP、OpenID Connect、OAuth 2.0、SAML认证,以及基于JWT/PASETO令牌的HTTP请求授权。
漏洞发现
问题1:反射型跨站脚本(XSS)
严重性:高
反射型XSS发生在应用程序将不受信任的数据包含在发送给用户浏览器的HTML响应中。攻击者可利用此漏洞在目标用户浏览器中执行任意JavaScript代码。
即时修复方案: 将所有字符串值视为潜在不可信来源并进行适当转义(使用safehtml/template包生成输出安全的HTML)。
深度防御建议:
- 使用恶意XSS载荷扩展单元测试
- 在测试环境中使用Burp Suite Professional的主动扫描器
- 扩展文档以推广安全头,特别是内容安全策略(CSP)头
问题2:不安全随机数生成
严重性:高
插件使用基于Unix时间戳种子的math/rand库生成安全关键字符串,可能通过暴力搜索预测。攻击者可利用可预测的nonce值进行OAuth重放攻击。
即时修复方案: 使用加密安全随机数生成器(crypto/rand)。
长期建议:
- 审查其他使用math/rand的安全上下文
- 避免代码重复,创建安全包装函数
- 在CI/CD中实施Semgrep检查
问题3:通过X-Forwarded-For头进行IP欺骗
严重性:中
攻击者可通过操纵X-Forwarded-For头欺骗用户身份模块中使用的IP地址,可能导致未授权访问。
修复方案: 重新实现应用程序,不依赖用户提供的头来获取用户IP地址。
问题4:基于Referer头的XSS
严重性:中
通过重写Referer头可触发XSS漏洞,虽然对某些字符进行了转义,但未考虑JavaScript URL方案攻击。
问题5:开放重定向漏洞
严重性:中
登录用户点击特制链接可能被重定向到外部网站,可能导致钓鱼攻击。
问题6:X-Forwarded-Host头操纵
严重性:中
处理X-Forwarded-Host头可能导致各种安全漏洞,包括Web缓存中毒、业务逻辑缺陷和SSRF。
问题7:X-Forwarded-Proto头操纵
严重性:低
处理X-Forwarded-Proto头可能导致重定向到注入的协议,可能绕过安全机制。
问题8:通过暴力破解验证码绕过2FA
严重性:低
双因素认证缺乏足够的暴力破解保护,攻击者可通过自动化完整的多步2FA过程绕过阻止机制。
问题9:注销时缺乏用户会话失效
严重性:低
点击"登出"按钮后用户会话仍然有效,攻击者可利用活动会话执行未授权操作。
问题10:解析Caddyfile时多次恐慌
严重性:低
多个解析函数在尝试访问元素前未验证输入值是否为nil,可能导致恐慌。
Golang安全社区
我们在Trail of Bits热爱编写和审查Golang代码库,持续开发Golang相关的Semgrep资源、规则和博客文章。
协调披露时间线
- 2023年8月7日:向caddy-security插件维护者报告发现
- 2023年8月23日:维护者确认无近期修复计划
- 2023年9月18日:发布披露博客文章并在原始项目仓库提交问题