GHSA-XFX2-PRG5-JQ3G:Gin-Gonic 中间件绕过:INSATutorat 中的授权失败
发布: (2026年3月1日 GMT+8 15:10)
3 分钟阅读
原文: Dev.to
Source: Dev.to
概览
漏洞编号: GHSA-XFX2-PRG5-JQ3G
CVSS 分数: 8.8
发布时间: 2026-03-01
在 INSATutorat 应用中,由于 Gin‑Gonic Web 框架的中间件实现不当,导致出现严重的授权绕过漏洞。负责保护管理路由的 AdminHandler 中间件在检测到未授权访问时未能终止请求生命周期。因此,已认证的非管理员用户可以绕过安全控制,在 /api/admin/* 下执行特权操作,可能导致数据丢失和未授权的系统管理。
TL;DR
INSATutorat 应用的管理中间件存在关键缺陷。虽然代码能够正确识别未授权用户,但未能停止请求处理链(缺少 c.Abort())。这使得任何已认证用户都能够成功调用管理 API 端点,而不受权限限制。
漏洞利用状态
POC
技术细节
- CWE 编号: CWE-285
- CVSS v3.1: 8.8
- 攻击向量: 网络
- 所需权限: 低
- 影响: 高(机密性 & 完整性)
- 平台: Go (Gin‑Gonic)
受影响系统
- INSATutorat(Go 应用)– 已在提交
15ae47425aed337181f7a6c54a9d199c93b041eb中修复
代码分析
提交: 15ae474
通过添加 c.Abort() 修复管理员中间件的授权绕过问题:
func AdminHandler() gin.HandlerFunc {
return func(c *gin.Context) {
userInterface, exists := c.Get("user")
if !exists {
_ = c.Error(apierrors.Unauthorized)
c.Abort()
return
}
user := userInterface.(*models.User)
if !user.IsAdmin {
_ = c.Error(apierrors.Forbidden)
c.Abort()
return
}
// Continue processing for authorized admin users
c.Next()
}
}
缓解策略
- 立即修补中间件逻辑。
- 审计所有 Gin 中间件,检查是否缺少
Abort()调用。 - 实施集成测试,断言未授权请求返回正确的 HTTP 状态码。
修复步骤
- 在源码中定位
middlewares/admin.go。 - 在错误处理分支的每个
return前插入c.Abort()。 - 重新构建并部署应用。
- 使用非管理员账户尝试访问
/api/admin/端点,以验证修复效果。