Kimdir01/eventum-multi-vuln-cve
GitHub: Kimdir01/eventum-multi-vuln-cve
针对 PHP 问题跟踪系统 Eventum 的多漏洞 PoC 报告,涵盖未授权 SCM Webhook、XSS、CSRF、文件上传等 24 个安全问题。
Stars: 0 | Forks: 0
# GitHub 安全公告:Eventum — 多重漏洞(未授权 SCM Webhook、XSS、CSRF、文件上传)
## 公告信息
| 字段 | 值 |
|-------|-------|
| **严重程度** | 严重 / 高危 |
| **CWE** | CWE-306 (缺少认证) / CWE-79 (XSS) / CWE-434 (无限制文件上传) / CWE-352 (CSRF) |
| **CVSS v3.1** | 8.6 (未授权 SCM) / 8.2 (反射型 XSS) / 8.0 (CSRF) / 7.5 (文件上传) |
| **CVSS 向量** | AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:N |
## 摘要
Eventum(由 MariaDB Corporation 开发的专业 PHP 问题跟踪系统)包含 24 个漏洞,包括:(1) 未授权 SCM webhook endpoint 允许注入伪造 commit,(2) 通过 JSONP callback 导致反射型 XSS,(3) 没有扩展名验证的任意文件上传,(4) 15+ 个 controller 缺乏 CSRF 保护,(5) 使用 MD5 的弱密码重置 token,(6) auth cookie 中的不安全反序列化。
## 漏洞详情
### 受影响的 Package/Repository
- **Repository:** `eventum/eventum`
- **受影响版本:** 当前版本
- **修复版本:** 无 (0-day)
**Commit Hash (已审计):** `f2007a181e422d3f98dd1ceb5f13103d37c343ab`
## CVE-REQUEST-001:未授权 SCM Webhook (CVSS 8.6)
**文件:** `res/packages/security.yml`,第 57 行
```
- { path: ^/scm_ping, roles: IS_AUTHENTICATED_ANONYMOUSLY }
```
**文件:** `src/Controller/ScmPingController.php`,第 24-74 行
`/scm_ping` 处的 SCM webhook 没有任何认证。SCM adapter 仅检查简单的请求属性:
- Gitlab:检查是否存在 `X-Gitlab-Event` header(第 46 行)
- Standard:检查 `scm=svn` 或 `scm=git` GET param(第 38 行)
- CVS:检查 `scm=cvs` GET param(第 36 行)
**PoC:**
```
# 注入 fake commits
curl -X POST "http://target/scm_ping.php?scm=git" \
-H "Content-Type: application/json" \
-d '{"commits":[{"id":"abc123","message":"backdoor","author":"attacker"}]}'
```
没有 HMAC 验证,没有 IP 白名单,没有共享密钥。攻击者可以伪造 commit 记录,将虚假的 check-in 与 issue 关联,并污染 SCM 历史。
## CVE-REQUEST-002:通过 JSONP Callback 导致的反射型 XSS (CVSS 8.2)
**文件:** `src/Controller/RemoteDataController.php`,第 123-124 行
```
$this->callback = (string) $request->query->get('callback');
// ...
echo $this->callback, '(', json_encode($res), ')';
```
典型的 JSONP 注入。`$this->callback` 直接取自 `$_GET['callback']`,没有任何验证。
**PoC:**
```
http://target/get_remote_data.php?callback=alert(document.cookie)
```
## CVE-REQUEST-003:任意文件上传 — 无扩展名验证 (CVSS 7.5)
**文件:** `src/Attachment/AttachmentManager.php`,第 89-99 行
```
$filename = $files['name'][$i];
$blob = file_get_contents($files['tmp_name'][$i]);
$iaf_ids[] = Attachment::create($filename, $files['type'][$i], $blob)->id;
```
没有扩展名白名单,没有针对实际文件内容的 MIME 验证。仅执行了 Unicode 归一化。用户可以上传 `.php`、`.phtml`、`.htaccess` 文件。如果使用本地文件系统 adapter,文件将被写入 `APP_PATH/var/storage/`。
## CVE-REQUEST-004:所有更改状态操作存在 CSRF (CVSS 8.0)
存在 `CsrfHelper`,但仅有 2 个 controller(ProjectsController、UsersController)使用。所有其他 15+ 个 controller 均缺少 CSRF 保护:
```
// In 15+ controllers:
// No CsrfHelper check before processing state changes
```
**缺少 CSRF 的受影响操作:**
- Issue 关闭 (`CloseController`)
- Issue 更新 (`UpdateController`)
- 发布 note (`PostNoteController`)
- 发送电子邮件 (`SendController`)
- 文件上传 (`FileUploadController`)
- 访问级别更改 (`AccessController`)
- 时间跟踪
- 电话呼叫
- 所有管理 CRUD 操作
## CVE-REQUEST-005:弱密码重置 (MD5 + 计时侧信道) (CVSS 6.5)
**文件:** `lib/eventum/class.user.php`,第 337、372 行
```
$hash = md5($full_name . $usr_email . Auth::privateKey());
```
MD5 在密码学上已被攻破。token 使用可预测的输入(full_name、email)+ 私钥生成。验证使用了 `!=` 非常量时间比较。
## 其他发现(共 24 项):
| # | 漏洞 | CVSS | 需要认证 |
|---|--------------|------|---------------|
| H-5 | Smarty 模板含有未转义的 $smarty.get.* | 7.6 | 否 |
| H-6 | Auth cookie — 不安全反序列化 | 5.3 | 否* |
| H-7 | HTTP Basic Auth 发送至任何后端 | 5.0 | 否 |
| H-8 | 通过 filetype 进行的 Content-Type header 注入 | 5.0 | 是 |
| H-9 | SpellCheckController 中的 Shell 执行 | 3.1 | 是 |
| H-10 | Cookie 缺少 HttpOnly/SameSite | 5.4 | N/A |
| H-11 | 匿名用户自动登录绕过 | 6.5 | 否 |
| H-12 | 从 config 进行动态类实例化 | 4.4 | Admin |
| H-13 | 明文密码生成与电子邮件发送 | 5.9 | 否 |
| H-14 | 未授权响应中的异常详情 | 4.3 | 否 |
| M-1 | customer.php 中通过 $_REQUEST['page'] 引发的 LFI | 5.3 | 否 |
| L-1 | 会话固定(登录时未执行 regenerate_id) | 4.2 | 否 |
| L-2 | 通过 MD5 生成的弱 auth 私钥 | 2.6 | N/A |
| L-3 | API token 使用 MediumStrengthGenerator | 2.6 | N/A |
## 影响
- 通过未授权 webhook 进行**虚假 SCM 历史注入**
- 通过 JSONP 反射型 XSS 进行**会话劫持**
- 配置不当的服务器因任意文件上传而具有**RCE 潜在风险**
- 所有 admin 操作存在 CSRF 导致**应用程序完全被接管**
- 弱密码重置 token 导致**账户接管**
- cookie 不安全反序列化导致**认证绕过**
## 补丁 / 修复
1. 为 SCM ping endpoint 添加 HMAC 签名验证 + IP 白名单
2. 使用正则表达式 `[a-zA-Z0-9._]+` 验证 JSONP callback
3. 为文件上传添加扩展名白名单(拦截 `.php`、`.phtml`、`.htaccess`)
4. 为所有更改状态的 controller 添加 CsrfHelper
5. 将密码重置 token 的 MD5 替换为 HMAC-SHA256
6. 登录后添加 `session_regenerate_id(true)`
7. 将 `['allowed_classes' => false]` 传递给 `unserialize()`
8. 添加 HttpOnly、Secure、SameSite=Lax cookie 属性
## 披露时间线
- **2026-06-28:** Fatullayev Asadbek (Kimdir01) 发现了全部 24 个漏洞
- **TBD:** 报告给 Eventum 维护者
- **TBD:** 通过 GitHub 请求 CVE
- **TBD:** 发布安全公告
## 致谢
- 发现者:Fatullayev Asadbek | GitHub:Kimdir01
- 独立安全研究员
## 参考
- CWE-306:关键功能缺少认证
- CWE-79:跨站脚本攻击
- CWE-434:无限制文件上传
- CWE-352:跨站请求伪造
- CWE-327:弱密码学算法
标签:CISA项目, OpenVAS, PHP, PoC, 暴力破解, 漏洞公告, 防御加固