第 44 章 / 共 51 章
卷五 · 扩展、运维与实战

安全边界与信任模型:能力全开的代价

全书反复出现的"无沙箱"在这里给出完整定义。理解信任边界画在哪,比记住十条安全技巧更重要。

本章导读

站位:不是渗透手册,是威胁建模章。产出一张你自己的部署审计清单。前置:ch03(能力面)、ch40(嵌套编译)。

44.1 引入

多数运行时的安全模型是"默认最小权限";XServer 相反——默认全权限:脚本能调用 3,030 个 API(含进程、文件、网络全套)、能再开编译器、Windows 下系统库直接可用。这个选择换来的是零边界开销与完整能力,代价是信任必须放在正确的位置。本章把"放在哪"讲清楚。

44.2 无沙箱的完整含义

一段脚本代码 = 与宿主同进程的原生代码 ├── 同地址空间:野指针可打穿整个服务 ├── 同权限:能读宿主能读的一切(含私钥文件) ├── 可再编译:xsCreateTCC → 任意新代码 └── 可出网/起进程:xrtProcessRun / 原生 Socket 结论:devfile 的控制权 = 服务器的控制权
误解事实
"脚本崩了宿主能活"不能——同进程,一个段错误全服务终止
"不导出危险 API 就安全"符号表无签名校验,脚本可 extern 任意宿主符号
"嵌套编译可以关掉"它是导出符号——控制了 devfile 就控制了一切,反之亦然

这不是缺陷清单,是设计事实——xsbase.h 第一屏就写着"零限制:不做沙盒、权限、命名空间,一切对应用开放"。诚实的边界声明比虚假的隔离承诺安全。

44.3 信任分层

层主体信任判定防线
0部署者(放 devfile 的人)完全信任——等价于能登录服务器操作系统账号与文件权限
1脚本作者(若与部署者不同人)按"能写服务器代码"对待代码评审 / 提交权限管理
2插件提交者(ch40 场景)不信任——除非你收窄了能力面自封装符号白名单(见下)
3公网客户端永不信任协议层防线(44.4)+ 应用鉴权

第 2 层是唯一需要"做功"的层:插件系统想接受外部代码时,用 tcc_add_symbol 只注入你写的 plugin_api_* 白名单函数集、不给 xsCreateTCC、不引 VFS 头——一个词法受限 + 符号受限的准沙箱。它挡不住恶意机器码,但挡得住"诚实人写出的危险代码"——这是此类边界的真实强度。

44.4 公网防线汇总

第 3 层(客户端)的防线散在各章,汇总成审计清单:

  • 传输:TLS 端点 + 证书按 host 分发(ch08/12);明文端点的存在应当是决策而非默认
  • 请求限额:header/path/body_limit(431/414/413)按业务收紧(ch09)
  • 时间限额:idle_timeout 对抗慢速攻击(drill 的 slowloris 样本验证过)
  • 静态层:八向量穿越防御 + deny_dotfiles(ch10)
  • WS:ws_message_limit(1009)+ 子协议强制(ch22)
  • 二进制协议:xtp2 limits 头期生效 + 坏帧即断(ch33)
  • 管理面:鉴权 + 内网 vhost(ch27);深度体检与 LB 探针分离(ch43)
  • SQL:参数绑定零例外(ch32)
  • 业务鉴权与输入校验:你的代码——XServer 不替你做,也不拦你做

44.5 契约

  • 边界线:devfile 控制 = 服务器控制;客户端信任 = 永不。
  • 分层线:外部代码进插件层必须先收窄能力面。
  • 审计线:上线前过一遍 44.4 清单;每次新增路由/旋钮/插件时重过相关项。

常见错误

把用户输入编译成插件
症状
某"高级功能"允许用户提交 C 代码段在服务端执行。
原因
把第 3 层主体当成了第 0 层——等于把服务器 shell 发给注册用户。表达式求值请走语法解析路线(受限文法),或严格白名单的迷你求值器;即便用 ch40 的编译缓存,也只对可信来源开放。
明文管理端口暴露公网
症状
/admin/* 只加了简单口令且走 80 端口。
原因
管理面的价值足够高,值得 TLS + 独立 vhost + 内网绑定的完整待遇(ch20/27 的组合拳)。

编程练习

基础部署审计

对照 44.4 清单审计你的 demo 部署,输出"已达标/缺失"两栏。

验收:缺失项每条都有修复计划(改配置/改代码/接受风险的理由)。
进阶白名单插件边界

给 ch40 的插件系统套上 plugin_api_* 白名单(不给 xsCreateTCC、不给文件 API),写文档说明边界强度。

验收:插件里调用白名单外符号编译失败;文档不夸大边界能力。
挑战攻击演练

以自己服务为目标跑一轮 drill 式攻击(慢速/超限/穿越/坏帧),记录防线触发点。

验收:每类攻击都能指出"被哪条防线挡住";无一条穿透到脚本层。

小结

要点结论
模型默认全权限;信任放对位置而非缩小能力
事实devfile 控制 = 服务器控制;无进程级隔离
分层部署者全信 / 插件先收窄 / 客户端永不信
防线九条公网防线清单(44.4)作为审计基线
xrt 延伸阅读