Xiuno BBS 审计之问题:插件 conf.json 版本碎片化
贰先生 6小时前

 

此文章为XIUNOX版本重构审计时发现问题,XIUNOX版本已优化修复此问题。分享出来方便后续想基于xiuno bbs4.0.4版本制作维护版本或插件模板等需求的开发者和站长参考。

现象

Xiuno BBS 4.0.4 的插件元数据完全依赖 plugin/<dir>/conf.json,存在严重的版本管理碎片化问题:

  1. versionbbs_versiondependencies 字段全部为插件作者自填字符串,无 schema 校验、无中央仓库对齐。
  2. bbs_version 默认值 '4.0',插件作者不填则视为兼容 4.0 全系列,但 4.0.0 与 4.0.4 内部 API 已多次变更。
  3. dependencies 字段虽声明依赖插件名及版本,但 plugin_dependencies() 函数只检查"是否安装且启用",完全不校验版本号
  4. 没有中央插件仓库(plugin.xiuno.com 已失效),所有版本信息无法对齐,老插件版本号与新版 BBS 不匹配也无法告警。
  5. plugin_official_list_cache() 调用失效的 plugin.xiuno.com/plugin-all-4.htm,缓存为空时静默返回错误。

源码证据

文件:xiunobbs_4.0.4/model/plugin.func.php 第 111-124 行(依赖检查不校验版本)

function plugin_dependencies($dir) {
    global $plugin_srcfiles, $plugin_paths, $plugins;
    $plugin = $plugins[$dir];
    $dependencies = $plugin['dependencies'];

    // 检查插件依赖关系
    $arr = array();
    foreach($dependencies as $_dir=>$version) {                // $version 被读取
        if(!isset($plugins[$_dir]) || !$plugins[$_dir]['enable']) {
            $arr[$_dir] = $version;                            // 仅检查 enable,不调用 version_compare
        }
    }
    return $arr;
}

文件:xiunobbs_4.0.4/model/plugin.func.php 第 457-458 行(bbs_version 默认值过于宽松)

!isset($local['version']) && $local['version'] = '1.0';
!isset($local['bbs_version']) && $local['bbs_version'] = '4.0';

文件:xiunobbs_4.0.4/model/plugin.func.php 第 418-433 行(中央仓库缓存逻辑,依赖失效的官 方源)

function plugin_official_list_cache() {
    $s = DEBUG == 3 ? NULL : cache_get('plugin_official_list');
    if($s === NULL) {
        $url = PLUGIN_OFFICIAL_URL."plugin-all-4.htm"; // 获取所有的插件,匹配到3.0以上的。
        $s = http_get($url);

        // 检查返回值是否正确
        if(empty($s)) return xn_error(-1, '从官 方获取插件数据失败。');
        $r = xn_json_decode($s);
        if(empty($r)) return xn_error(-1, '从官 方获取插件数据格式不对。');

        $s = $r;
        cache_set('plugin_official_list', $s, 3600); // 缓存时间 1 小时。
    }
    return $s;
}

文件:xiunobbs_4.0.4/admin/route/plugin.php 第 142-145 行(下载时仅检查 BBS 版本,不检查依赖插件版本)

// 检查版本  / check version match
if(version_compare($conf['version'], $official['bbs_version']) == -1) {
    message(-1, lang('plugin_versio_not_match', array('bbs_version'=>$official['bbs_version'], 'version'=>$conf['version'])));
}

文件:xiunobbs_4.0.4/model/plugin.func.php 第 506 行(have_upgrade 仅比较官 方版本号,但官 方源失效后永远为 FALSE)

$plugin['have_upgrade'] = $plugin['installed'] && version_compare($official['version'], $local['version']) > 0 ? TRUE : FALSE;

风险等级与结论

风险等级:高(High)|生态缺陷

危害:

  1. plugin_dependencies() 仅检查依赖插件是否启用,完全忽略版本号,A 插件依赖 B 插件 >=2.0,但用户安装的是 B 1.0 也能通过检查,运行时崩溃。
  2. 无中央仓库意味着插件版本、兼容性、安全更新全部失联,用户无法判断本地插件是否过时。
  3. bbs_version 默认 '4.0',4.0.4 上的 API 变更不会被检测,安装即破坏。
  4. have_upgrade 永远为 FALSE,用户根本看不到升级提示,安全补丁无法触达。
  5. 第三方分发的插件无签名校验,与官 方源失效叠加,形成"野生市场"乱象。

修复建议:

  •  plugin_dependencies() 中加入 version_compare($plugins[$_dir]['version'], $version, '>=') 强制版本校验,不满足则返回错误。
  • conf.json schema 强制声明 php_versionbbs_version_minbbs_version_max,安装时严格校验。
  • 替换失效的 plugin.xiuno.com 为社区维护的镜像源(如 https://plugins.xiuno.org/),并加入 HTTPS 与签名校验。
  • 引入插件签名(Ed25519 公钥),官 方源(或镜像)下发插件包附 .sig 文件,安装前校验。
  • 提供 plugin_outdated 字段,比对中央仓库最新版本,UI 显著提示用户升级。
最新回复 (0)
全部楼主
返回