Caddy SSO插件安全漏洞分析
背景介绍
Caddy(又称Caddy Server或Caddy 2)是一款用Golang编写的现代开源Web服务器,以易用性和高可配置性著称。caddy-security插件是Caddy的中间件插件,提供多种安全功能,包括基于表单、基础认证、本地认证、LDAP、OpenID Connect、OAuth 2.0、SAML认证,以及基于JWT/PASETO令牌的HTTP请求授权。
漏洞发现
我们在caddy-security插件中发现了10个安全漏洞,可能导致客户端代码执行、OAuth重放攻击和未授权资源访问等高危攻击。
漏洞 #1:反射型跨站脚本(XSS)
严重性:高
反射型XSS发生在应用程序将不可信数据包含在发送给用户浏览器的HTML响应中。攻击者可通过构造特定API调用(如/admin%22%3E%3Cscript%3Ealert(document.domain)%3C/script%3E/admin/login)执行任意JavaScript代码,可能导致会话劫持。
即时修复方案:
- 将所有字符串值视为潜在不可信数据并进行适当转义(使用
safehtml/template包生成输出安全的HTML)。
长期建议:
- 在单元测试中添加恶意XSS载荷
- 在测试环境中使用Burp Suite Professional的Active Scanner扫描所有API调用
- 扩展文档以推广安全头(尤其是内容安全策略CSP头)
漏洞 #2:不安全随机数生成
严重性:高
插件使用基于Unix时间戳种子的math/rand库生成安全关键字符串,可能通过暴力搜索预测。攻击者可利用可预测的nonce值进行OAuth重放攻击。
即时修复方案:
- 使用密码学安全的随机数生成器(Golang的
crypto/rand)
长期建议:
- 审查其他使用
math/rand的安全上下文 - 创建安全包装函数避免代码重复
- 在CI/CD中实施Semgrep(使用
math-random-used规则)
漏洞 #3:通过X-Forwarded-For头进行IP欺骗
严重性:中
攻击者可通过操纵X-Forwarded-For头欺骗用户身份模块中的IP地址,可能导致未授权访问。
修复方案:
- 重新实现应用,不依赖用户提供的头获取IP地址
- 如需使用用户提供的头,确保进行适当验证(如正则表达式验证IP格式)
漏洞 #4:基于Referer头的XSS
严重性:中
通过重写Referer头可触发XSS漏洞。虽然对某些字符进行了转义,但未处理JavaScript URL方案攻击。
修复方案:与漏洞 #1相同
漏洞 #5:开放重定向漏洞
严重性:中
登录用户点击包含redirect_url参数的特制链接可能被重定向到外部网站,导致钓鱼攻击。
修复方案:
- 对
redirect_url参数进行严格验证,确保仅允许同域或可信源重定向
漏洞 #6:X-Forwarded-Host头操纵
严重性:中
处理X-Forwarded-Host头可能导致Web缓存污染、业务逻辑缺陷、基于路由的SSRF等漏洞。
修复方案:
- 不依赖Host和X-Forwarded-Host头,使用配置文件中手动指定的当前域生成QR码
漏洞 #7:X-Forwarded-Proto头操纵
严重性:低
处理X-Forwarded-Proto头可能导致重定向到注入的协议,可能绕过安全机制。
修复方案:
- 不依赖X-Forwarded-Proto头,或对照允许的协议列表(如HTTP/HTTPS)验证头值
漏洞 #8:通过暴力破解验证码绕过2FA
严重性:低
2FA实现缺乏足够的暴力破解防护,攻击者可通过自动化完整多步2FA流程绕过阻止机制。
修复方案:
- 在MFA配置中强制使用至少6位代码长度
- 实施账户锁定机制
- 对关键操作强制重新认证
漏洞 #9:注销时缺乏用户会话失效
严重性:低
点击"Sign Out"按钮后用户会话仍保持有效,攻击者可利用这些会话执行未授权操作。
修复方案:
- 审查注销流程,确保正确终止用户会话并使相关令牌失效
漏洞 #10:解析Caddyfile时多次恐慌
严重性:低
多个解析函数在访问元素前未验证输入值是否为nil,可能导致恐慌(索引越界)。
修复方案:
- 在所有相关函数中添加nil检查
- 为Caddyfile解析函数添加Golang原生模糊测试
Golang安全社区贡献
我们在Trail of Bits热爱编写和审查Golang代码库,持续开发Golang相关资源、规则和博客文章。发布这些发现旨在帮助保护可能实施类似解决方案的其他人,并帮助他们做出有关安全基础设施的明智决策。
协调披露时间线
- 2023年8月7日:向caddy-security插件维护者报告发现
- 2023年8月23日:维护者确认无近期修复计划
- 2023年9月18日:发布披露博客文章并在原始项目仓库提交问题