作者: Elvin Latifli
CVE ID: CVE-2026-26717
严重性: 中危(CVSS 3.1:4.8 — AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N)
受影响产品: OpenFUN Richie(提交 a1b5bbd 之前的所有版本)
受影响组件: src/richie/apps/courses/api.py — sync_course_runs_from_request
修复提交: a1b5bbda
Richie 是由法国数字大学(OpenFUN)开发的开源 CMS,基于 DjangoCMS 构建。它旨在帮助组织构建功能完备的在线教育门户,并从 OpenEdX 等学习管理系统(LMS)同步课程目录。Richie 通过经过身份验证的 Webhook 处理课程数据同步——其中一个 Webhook 包含本报告中描述的漏洞。
sync_course_runs_from_request Webhook 端点使用标准的 == 运算符将传入的 头与预期的 HMAC 签名进行比较:
Authorization# 存在漏洞
signature_is_valid = any(
authorization_header == get_signature(message, secret)
for secret in getattr(settings, "RICHIE_COURSE_RUN_SYNC_SECRETS", [])
)
== 运算符执行的是非常量时间比较——一旦发现第一个不匹配的字符就会立即短路返回。通过发送大量精心构造的请求并测量响应时间差异,远程攻击者可以逐字符推断出正确的签名,最终伪造出有效的身份验证令牌,从而完全绕过 Webhook 的身份验证。
攻击成功后,未认证的远程攻击者可以:
修复方案将 == 替换为 Python 的 hmac.compare_digest(),该函数专为常量时间字符串比较而设计,消除了时序侧信道:
# 已修复
signature_is_valid = any(
hmac.compare_digest(authorization_header, get_signature(message, secret))
for secret in getattr(settings, "RICHIE_COURSE_RUN_SYNC_SECRETS", [])
)