Typemill 持久性跨站脚本漏洞CVE-2026-44401
Typemill 是开源、自托管、无数据库(Flat-file 扁平文件)PHP CMS,基于 Markdown,主打文档、知识库、产品手册、落地页搭建。
一、基本情况
Typemill 基于MIT 开源协议,可以用于软件帮助文档、产品说明书、企业内部知识库、技术 Wiki、产品落地页、小型官网等各类场景。

Typemill 的所有文章、配置直接保存为服务器本地 Markdown/YAML 文件,无需 MySQL,支持自定义主题(Twig 模板)、插件扩展。
栋科技漏洞库关注到 Typemill CMS 2.x 通过 Markdown javascript URI 的持久 XSS,追踪为CVE-2026-44401,CVSS 4.0评分为 4.6。
二、漏洞分析
CVE-2026-44401漏洞是Typemill CMS 2.x版本的Markdown解析器扩展存在持久性跨站脚本漏洞,该漏洞已在 v2.23.0版本中得以修复。
Typemill 是基于平面文件的Markdown CMS,漏洞源于Markdown 解析器在将链接目标写入 href 属性前,未校验链接的 URI 协议类型。
拥有主题配置权限的用户(例如 Landingpage Intro Segment 文本输入框,支持原始 Markdown 内容),可写入 javascript:协议链接。
具体来说,认证用户若拥有主题配置权限,可通过向Markdown链接提供未过滤的href值注入恶意JavaScript URI。
攻击者利用ParsedownExtension.php或TwigMarkdownExtension.php中的javascript:协议构造Markdown链接,存储可持久执行的载荷。
每当有用户点击该链接时,载荷将在其浏览器中执行,从而实现会话cookie窃取、认证请求伪造及凭证收集。
该链接在公开首页以未转义形式渲染,任意访问者点击后即可触发浏览器内恶意代码执行,属于存储型 XSS 漏洞。
1、根本原因
ParsedownExtension::inlineLink()--system/typemill/Extensions/ParsedownExtension.php,第934-996行。
相对链接与 media/ 开头链接会自动拼接基础 URL 前缀,但程序在将链接赋值给 href 属性之前,并未校验 URI 协议类型。
# start typemill: if relative link or media-link
$href = $matches[1];
if($href[0] == '/')
{
$href = $this->baseUrl . $href;
}
elseif(substr( $href, 0, 6 ) === "media/")
{
$href = $this->baseUrl . '/' . $href;
}
# end typemill
$Element['attributes']['href'] = $href; // <-- no scheme validation
[Click me](javascript:alert(document.domain)) → <a href="javascript:alert(document.domain)">Click me</a>
该漏洞对应的渲染调用链路:themes/cyanine/home/landingpageIntro.twig → TwigMarkdownExtension.php →
ParsedownExtension.php。所有使用同一解析器处理用户Markdown内容的其他主题字段,均会受到相同漏洞影响。
2、修复版本(v2.23.0)
# end typemill
-
+
+ # block dangerous URI schemes (e.g. javascript:, vbscript:, data:)
+ $scheme = parse_url($href, PHP_URL_SCHEME);
+ if ($scheme !== null && !in_array(strtolower($scheme), ['http', 'https', 'mailto', 'ftp'], true))
+ {
+ $href = '#';
+ }
+
$Element['attributes']['href'] = $href;
采用原始漏洞报告中提出的同一套白名单(http、https、mailto、ftp)。
对比 v2.22.0 与 v2.23.0 标签下的 ParsedownExtension.php 文件,已证实该修复方案。
3、权限说明
主题设置相关路由(GET /tm/themes、POST /api/v1/theme)受 system/update 访问控制权限管控。
根据 Typemill 自身路由定义(routes/web.php、routes/api.php),
该权限默认授予管理员(manager)角色,并非仅超级管理员(admin)可用。
因此风险影响范围不局限于最高权限账号。
三、POC概念验证
(一)操作步骤
1、使用拥有主题配置权限的账号登录 → 系统 → 主题 → 配置(当前启用主题,例如 Cyanine)。

2、展开落地页简介板块,在 “Text for your landingpage intro (use markdown)” 输入框中填入:
[Click me](javascript:alert(document.domain))

3、保存设置。以任意用户身份访问首页并点击链接 → JavaScript 将在访问者会话中执行。

(二)概念验证
CVE-2026-44401_POC.py 提供两种运行模式:
管理员已设置登录后刷新可查看最简手动复现步骤(用于验证本漏洞报告):
管理员已设置登录后刷新可查看(三)漏洞影响
劫持管理员/管理员(manager)会话(窃取Cookie)
通过注入表单、跳转页面窃取凭证
以受害者身份执行更多需要登录权限的操作(漏洞链利用)
四、影响范围
Typemill CMS 2.x
五、修复建议
Typemill CMS v2.23.0
六、参考链接
管理员已设置登录后刷新可查看