Xiuno BBS 审计之问题14:依赖XXTEA 弱加密算法的鉴权令牌可被伪造

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 本文分享了Xiunox版本重构审计中发现的问题,该问题已在新版本中修复,供基于xiunobbs4.0.4版本开发者和站长参考。核心加密函数xn_encrypt/xn_decrypt在未加载xiuno.so时回退到纯PHP实现的XXTEA算法,该算法非现代标准,存在密钥派生弱、密文无完整性校验等问题。密钥派生仅md5,密文可被篡改,影响bbs_token、bbs_admin_token等鉴权令牌,存在身份伪造风险。修复建议改用现代AEAD算法,使用HKDF/PBKDF2进行密钥派生,并增加随机IV与认证标签及MAC校验,同时强制随机生成auth_key。

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

问题:XXTEA 弱加密算法用于 Cookie/Token 加密,密钥派生仅 md5

现象

Xiuno BBS 4.0.4 的核心加密函数 xn_encrypt/xn_decrypt 在未加载 xiuno.so 扩展时,回退到纯 PHP 实现的 XXTEA 算法。XXTEA 是 1998 年设计的分组加密算法,并非密码学标准推荐算法(对比 AES),存在以下问题:

  • 算法本身非现代标准:XXTEA 未经 NIST/ISO 密码学评审,无 AEAD(无完整性/认证标签),密文可被篡改后仍解密为有效结构(无 MAC 校验)。
  • 密钥派生弱xn_key() 直接返回 $conf['auth_key'] 字符串,无 KDF(PBKDF2/HKDF/Argon2);xxtea_encrypt 内部将 key 字符串 str2long 转 4 个 32 位整数,不足补 0,密钥有效熵可能远低于预期。
  • 密文无完整性校验xn_decrypt 解密后直接返回,无 HMAC/签名验证,攻击者可构造/篡改密文(如 bbs_admin_tokenbbs_token)进行比特翻转/选择密文攻击。
  • 影响面广:该函数被用于加密 bbs_token(用户登录态)、bbs_admin_token(后台登录态)、xn_safe_key 等,一旦算法被攻破或密钥泄露,所有依赖它的鉴权令牌可被伪造。

源码证据

证据 1:xn_encrypt/xn_decrypt 回退到 XXTEA,无完整性校验 文件:xiunobbs_4.0.4/xiunophp/xn_encrypt.func.php 行 37-48

function xn_encrypt($txt, $key = '') {
  empty($key) AND $key = xn_key();
  $encrypt = function_exists('xiuno_encrypt') ? xiuno_encrypt($txt, $key) : xxtea_encrypt($txt, $key);
  return xn_urlencode(base64_encode($encrypt));
}
function xn_decrypt($txt, $key = '') {
  empty($key) AND $key = xn_key();
  $encrypt = base64_decode(xn_urldecode($txt));
  $ret = function_exists('xiuno_decrypt') ? xiuno_decrypt($encrypt, $key) : xxtea_decrypt($encrypt, $key);
  return $ret;
}

第 39 行:未加载 xiuno.so 时回退到 xxtea_encrypt;第 46 行解密后直接 return $ret,无 HMAC/签名校验。xn_encrypt 输出 base64_encode(xxtea_encrypt(plain, key)),无 IV、无认证标签。

证据 2:XXTEA 纯 PHP 实现,key 派生仅 str2long 补零 文件:xiunobbs_4.0.4/xiunophp/xn_encrypt.func.php 行 97-126

function xxtea_encrypt($str, $key) {
  if($str == '') return '';
  $v = xxtea_str2long($str, TRUE);
  $k = xxtea_str2long($key, FALSE);
  if (count($k) < 4) {
    for ($i = count($k); $i < 4; i++) {
      $k[$i] = 0;
    }
  }
  $n = count($v) - 1;
  $z = $v[$n];
  $y = $v[0];
  $delta = 0x9E3779B9;
  $q = floor(6 + 52 / ($n + 1));
  $sum = 0;
  while (0 < $q--) {
    $sum = xxtea_int32($sum + $delta);
    $e = $sum >> 2 & 3;
    for ($p = 0; $p < $n; $p++) {
      $y = $v[$p + 1];
      $mx = xxtea_int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ xxtea_int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));
      $z = $v[$p] = xxtea_int32($v[$p] + $mx);
    }
    // ...
  }
  return xxtea_long2str($v, FALSE);
}

第 100-105 行:$k = xxtea_str2long($key, FALSE),key 不足 4 个 32 位整数时补 0($k[$i] = 0),短密钥的有效熵被零填充稀释;无 KDF,密钥直接作为算法输入。

证据 3:xn_key 直接返回 auth_key 字符串,无 KDF 文件:xiunobbs_4.0.4/xiunophp/xn_encrypt.func.php 行 16-19

function xn_key($fromso = TRUE) {
  $conf = _SERVER('conf');
  return ($fromso && function_exists('xiuno_key')) ? xiuno_key() : (isset($conf['auth_key']) ? $conf['auth_key'] : '');
}

第 18 行:未加载扩展时直接返回 $conf['auth_key'] 字符串作为加密密钥,无 PBKDF2/HKDF 拉伸。该 auth_key 在默认配置中为硬编码值(见独立审计文件),密钥强度进一步降低。

证据 4:XXTEA 加密用于鉴权令牌 文件:xiunobbs_4.0.4/model/user.func.php 行 348-358

function user_token_gen($uid) {
  global $ip, $time, $conf;
  
  // hook model_user_token_gen_start.php
  
  $tokenkey = md5(xn_key());
  $token = xn_encrypt("$ip  $time $uid", $tokenkey);
  
  // hook model_user_token_gen_end.php
  
  return $token;
}

第 353-354 行:bbs_token 内容 $ip\t$time\t$uidxn_encrypt(XXTEA)加密。bbs_admin_tokenadmin.func.php 行 58)同样用 xn_encrypt。若 XXTEA 密文可被篡改/伪造,攻击者可构造任意 uid 的有效令牌,实现身份伪造。

风险等级与结论

风险等级:中高危

结论:

  1. 核心加密采用 XXTEA(非现代标准、无 AEAD、无完整性校验),纯 PHP 回退实现,密钥派生仅 str2long 补零,无 KDF。
  2. xn_decrypt 解密后无 HMAC/签名校验,密文可被篡改;结合明文结构已知($ip\t$time\t$uid),存在选择密文/比特翻转攻击空间。
  3. 该加密保护 bbs_token/bbs_admin_token 等鉴权令牌,算法弱点直接危及身份认证体系。
  4. auth_key 默认硬编码(见独立审计文件),密钥强度问题叠加,进一步降低伪造令牌难度。
  5. 修复建议:改用 openssl_encrypt/sodium_crypto_secretbox(AES-256-GCM 或 XSalsa20-Poly1305)等现代 AEAD 算法;密钥派生使用 HKDF/PBKDF2;密文包含随机 IV 与认证标签;解密后校验 MAC;auth_key 强制随机生成且不少于 32 字节。
目录
相关文章
|
5天前
|
缓存 人工智能 安全
GPT-5.6 Terra与GPT-5.5性能实测:成本减半后的跑分对比与快速迁移指南
GPT-5.6 Terra 的定价为每百万 token 输入 2.50/输出 15。GPT-5.5 则是 5/ 30。Terra 的每一项费率,包括 $0.25/M 的缓存读取,都恰好是 GPT-5.5 的一半,因此在任何工作负载组合下,Terra 都固定 便宜 2.0x。以每天 10 万次请求、3K token 提示词计算,大约是 Terra 每天 2,000,GPT−5.5每天 4,000,即每月约 60,000对 120,000。问题在于:OpenAI 没有发布任何针对 Terra 的编码基准。那个著名的 91.9% Terminal-Bench 数字是 Sol 在 Ul
|
4天前
|
SQL 人工智能 自然语言处理
大模型内容安全实时防护:恶意Prompt注入拦截、越权阻断与熔断机制方案.166
本文系统阐述大模型输入安全防护体系,涵盖提示词注入、恶意Prompt拦截、越权阻断与输入熔断四大核心风险及应对方案。提出四层防护架构(预处理、检测、鉴权、熔断),结合规则引擎、语义识别与RBAC权限控制,实现全链路实时防护,保障业务合规、数据安全与服务稳定。
242 1
|
12天前
|
存储 关系型数据库 MySQL
云数据库自研存储引擎:阿里云 PolarDB 相比开源 MySQL 性能提升数倍
云数据库自研存储引擎已成为云原生数据库竞争的核心技术高地。阿里云 PolarDB 通过 X-Engine 高压缩存储、PolarStore 用户态 IO + RDMA、IMCI 列存 HTAP 三大自研引擎组合,配合物理日志、跨节点 Buffer Pool 共享、Parallel Query 五大优化,实现写性能 6 倍、压缩 3-5 倍、AP 加速 100 倍、IO 延迟 -80% 的全面超越,让客户存储成本下降 65%、DBA 人力节省 80%。
453 114
|
5天前
|
人工智能 缓存 JSON
刚刚 GPT-5.6 发布,吊打 Claude 5 和 Grok 4.5?一手实测来啦!
GPT-5.6 刚发布,跑分号称超越 Fable 5,真的假的?附一手实测,让 3 个最强 AI 编程模型 GPT-5.6 Sol、Claude Fable 5、Grok 4.5 在 Cursor 里同时一把梭开发网页游戏,看看最新模型到底谁更能打。
307 0
|
5天前
|
存储 人工智能 JSON
Qwen 本地部署搭配 ComfyUI 生成 AI 漫剧完整实操指南(小白零基础可落地,零成本无限生成+角色一致性天花板)
2026全网最优本地漫剧流水线:零成本、离线运行、角色统一、低配(8G显卡)可跑。融合Qwen本地大模型+ComfyUI双引擎,实现剧本生成→分镜绘图→动态成片全自动,隐私安全、无审核限流,新手30分钟上手,日更无忧。(239字)
|
12天前
|
人工智能 编解码 物联网
2026 最新Stable Diffusion 本地部署教程 下载安装使用详细图解(含官网安装包)
Stable Diffusion(SD)是2022年发布的开源文生图模型,由Stability AI等联合开发。支持文生图、图生图、局部重绘等,依托VAE降低算力需求,可在消费级显卡运行。本文提供秋葉aaaki制作的Windows整合包(含图形界面与插件),开箱即用,零配置启动。
|
28天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)
|
1天前
|
缓存 UED 开发者
Codex109天重置23次,明天还要再送一次
Codex近109天完成23次额度重置,7月14日将迎来第24次。Tibo高频响应用户反馈:优化GPT-5.6高消耗问题、补发失效福利、调整重置时间——形成“反馈→回应→修复→补偿”正向闭环,彰显以用户为中心的产品哲学。(239字)
406 11