第 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)作为审计基线 |
本章涉及的 API 参考
xrt 延伸阅读
- xrt 参考 · tls_verify — 出站连接的证书验证(调用外部 API 时)
- xrt 参考 · hash — 口令哈希与常数时间比较材料