YesWiki公式计算器安全漏洞CVE-2026-52778
YesWiki 是一款开源、轻量、协作式维基系统,产品基于 PHP+MySQL 开发,遵循 AGPL/GPL 许可证,主打 “易用、灵活、强协作”。
一、基本情况
YesWiki 是基于 PHP 开发的维基系统,它源自法语区的 Wikini 项目,由社区主导维护,面向协会、非营利组织、中小企业、教育团队。

YesWiki 用于快速搭建知识库、项目文档、内部协作平台、小型官网,兼顾维基开放性与 CMS 的易用性,所见即所得(WYSIWYG)。
栋科技漏洞库关注到 YesWiki 在 4.6.5 及之前版本中存在的安全漏洞,该漏洞现已被追踪为CVE-2026-52778,漏洞CVSS 3.X评分 9.8。
二、漏洞分析
CVE-2026-52778是YesWiki 4.6.6 版本之前中的公式计算器中存在不安全的 eval() - 远程代码执行(RCE)和拒绝服务(DoS)漏洞。
该漏洞是由于集市表单字段计算器(CalcField.php)中的存在不安全代码导致的,
由于程序先通过复杂的递归正则表达式对用户自定义数学公式进行过滤,再将其传入PHP的eval() 函数执行。
该实现存在固有缺陷,易遭受正则表达式拒绝服务(ReDoS / 栈溢出)攻击,可导致服务器宕机;
同时,该架构风险极高,一旦绕过校验逻辑,攻击者就能执行任意 PHP 代码。
(一)受影响组件
文件:tools/bazar/fields/CalcField.php
方法:formatValuesBeforeSave($entry)
漏洞成因:先使用复杂递归正则表达式校验,再调用`eval()`执行代码
程序尝试通过校验公式结构,为数学运算构建沙箱环境,相关代码如下:
$regexpToCheckIfMathFormula = '/^((' . $number . '|' . $functions . '\s*\((?1)+\)|\((?1)+\))(?:' . $operators . '(?1))?)+$/';
if (preg_match($regexpToCheckIfMathFormula, $formula)) {
$formula = preg_replace('!pi|π!', 'pi()', $formula);
try {
eval("\$value = $formula;"); // VULNERABLE LINE
// ...
(二)架构缺陷
1、PCRE栈溢出与正则表达式拒绝服务(直接利用方式)
该正则表达式大量使用递归模式`(?1)+`。在PHP的PCRE引擎中,深度嵌套的递归模式会占用系统栈资源。
攻击者传入包含数千层嵌套括号或重复分组的公式,会耗尽 pcre.recursion_limit 限制(返回假值或空值),
或是触发段错误,直接造成PHP进程崩溃,引发拒绝服务。
2、先校验后替换的安全隐患
正则表达式在校验 $formula 变量前,程序已对输入字符串进行分词和重组。
若分词过程中调用的函数(如testEntryValue)或后续迭代的getEntryValue函数返回异常格式字符串,会改变原有字符串结构。
3、过度信任eval函数
将 eval() 作为数学解析器,意味着应用的安全边界完全依赖单一正则表达式。
过往案例表明,用于代码执行防护的复杂正则过滤逻辑,总会被特殊语法、字符编码手段或PCRE引擎漏洞绕过。
三、POC概念验证
场景A:远程拒绝服务(服务器宕机)
拥有集市表单创建或编辑权限的攻击者,添加计算字段并植入深度嵌套的递归结构。
攻击载荷:
管理员已设置登录后刷新可查看根据服务器`pcre.recursion_limit`与栈配置,将上述内容重复2000至5000次。
PCRE引擎耗尽栈内存,导致处理请求的PHP-FPM工作进程或Apache进程立即崩溃,服务中断。
场景B:绕过校验实现远程代码执行
由于 eval() 会执行原生PHP代码,若攻击者成功绕过递归正则校验,
或是利用操作系统PCRE库未修复的漏洞,即可绕过校验规则注入PHP攻击载荷。
攻击载荷:
管理员已设置登录后刷新可查看一旦校验被绕过,该字符串将作为原生PHP代码执行,攻击者将获得网页服务运行账户(www-data)权限,进而完全控制服务器。
漏洞影响
保密性:高。攻击者可读取/etc/passwd、.env配置文件等敏感系统文件。
完整性:高。攻击者可篡改应用文件、植入后门、修改数据库数据。
可用性:高。攻击者可利用正则表达式拒绝服务、段错误攻击轻易使网站服务下线。
修复与缓解方案
禁止使用正则表达式防护`eval()`函数。改用专用安全的抽象语法树(AST)数学解析器,或是无法调用系统接口的表达式解析组件。
四、影响范围
YesWiki ≤ 4.6.5
五、修复建议
YesWiki ≥ 4.6.6
六、参考链接
管理员已设置登录后刷新可查看