# mdserver-web 安全与供应链审计（2026-06-27）

## 结论

不建议把原项目未经修改地直接用于公网生产服务器。没有在仓库静态扫描中发现明确写死的反弹 shell、SSH 公钥或主动上传服务器配置的代码，但这不能证明所有预编译包都无后门。主要风险来自远程脚本执行、下载时关闭 TLS 校验、缺少上游签名/固定哈希、过期软件，以及面板本身具有 root 级动态执行能力。

## 关键发现

1. **严重：会话签名密钥可预测**：Flask `SECRET_KEY` 直接取 `uuid.getnode()`（通常是网卡 MAC）的末 12 个十六进制字符（`web/admin/__init__.py:67-75`），不是随机机密。若攻击者得到/猜到 MAC 和用户名，存在伪造 `login=True` 会话的风险；而插件接口随后能执行系统命令。应立即改为首次启动生成至少 32 字节随机密钥、权限设为 `0600`，并使所有旧会话失效。
2. **高风险供应链**：共识别 770 个活动 URL 引用、104 个主机；其中 515 个安装制品引用、27 个远程脚本引用、72 个运行时 API 引用。多个脚本使用 `--no-check-certificate`、`--insecure` 或 `curl | bash`，下载后通常不校验固定 SHA-256 或发布者签名。
3. **默认统计数据外发**：登录后的默认布局延迟加载 Google Tag Manager，Measurement ID 为 `G-FC74BB2RGD`（`web/templates/default/layout.html:177-188`）。这会向 Google 暴露访问者 IP、浏览器及页面访问元数据，应在私有部署中删除。
4. **服务器 IP 查询**：安装、升级及大量插件脚本调用明文 `http://ipinfo.io/json`，会暴露服务器公网 IP/位置，并允许链路篡改其返回值。
5. **作者接口/第三方 API**：可选 Telegram Bot 插件访问 `bbs.midoks.icu`、Telegram 和网易云音乐；更新检查访问 GitHub API。未发现默认自动上传数据库密码、SSH 密钥或站点配置到作者服务器的明确证据。
6. **更新检查关闭证书验证**：`web/utils/system/update.py:41-45` 请求 GitHub releases 时使用 `ssl._create_unverified_context()`。
7. **已登录即接近 root 执行面**：插件 `/plugins/run` 将 `name`、`script`、`func`、`version`、`args` 拼接为 shell 命令；`/plugins/callback` 使用动态 `eval`（`web/utils/plugin.py:820-872`）。路由有登录校验，但会话或插件一旦被攻破，影响非常大。
8. **插件列表是本地的**：面板遍历本地 `plugins/<name>/info.json` 并执行本地 `install.sh`，不是从作者服务器实时拉取软件商店列表（`web/utils/plugin.py:120-180`）。但安装包和部分脚本仍从远端获取。
9. **大量 EOL 版本**：例如 PHP 5.3–7.x、MySQL 5.5/5.6、MongoDB 3.0/4.4 等仍在列表中；即使制品未被植入后门，也可能包含已公开漏洞。

## 私有镜像策略

- 公开区仅放置经 HTTPS 获取、重新计算 SHA-256、并通过 ZIP/TAR 路径与链接逃逸检查的制品。
- 作者控制的域名、`midoks`/`mw-plugin` 路径、远程安装脚本一律隔离，不从公开 URL 暴露。
- 同名上游与作者镜像包进行 SHA-256 对比；本地 SHA-256 只证明镜像后内容未变化，不等于发布者签名验证。
- 所有动态 `latest` 地址冻结为明确版本；公开清单包含来源 URL、哈希、大小、验证结果和本地路径。

## 镜像完成状态

- 公开校验制品：381；隔离制品/脚本：51；路径冲突：0。
- 原始报告中的 197 个失败项中，169 个是静态枚举 OS/架构分支产生的不可用候选，不代表运行时都缺失；需人工解释的源引用为 28 个。
- 28 个源引用均已分类：官方同名/归档/旧命名替代、隔离的作者替代、Git 镜像、运行时端点或明确的错误版本引用；最终替代报告无未分类项。
- 作者镜像与独立上游有 7 组制品字节完全一致；GeoLite 数据库哈希不同是无版本作者地址与 2026-06-25 快照的时效差异，本身不能证明篡改。

## 上线建议

1. 删除 Google 统计，禁用 `ipinfo.io` 和作者论坛的非必要出站请求。
2. 只保留仍受支持的软件版本；禁用远程脚本管道执行。
3. 将管理面板限制到 VPN/固定 IP，不直接暴露公网；补 CSRF、防命令注入与严格会话 Cookie。
4. 安装器改用私有镜像，并在客户端使用随版本固定的 SHA-256/发布者签名校验。
5. 镜像主机使用非 root SSH、密钥登录、防火墙、fail2ban，并轮换本次会话中出现过的口令。

## 审计边界

这是源代码静态审计、网络依赖盘点和制品结构/哈希检查，不是对所有第三方二进制的反编译或形式化证明。未发现后门证据不等于证明不存在后门。
