Skip to content

SECURITY

29anan29 edited this page Aug 18, 2026 · 1 revision

安全策略(Security Policy)

PyFly 的目标是编译期阻止不安全代码(注入、篡改、泄露、资源滥用),因此安全问题优先处理。

支持的版本

版本 安全修复支持
最新 release 是
旧版本 否,请升级到最新版(fly update)

上报漏洞

请勿公开披露安全问题(不要开公开 Issue)。请通过以下方式上报:

请在邮件中说明:

  1. 受影响版本(fly version 输出)
  2. 操作系统与 Go/Python 版本
  3. 复现步骤与最小代码样例
  4. 影响评估(能绕过哪些安全关键字、泄露什么数据)

处理流程

  1. 收到上报后 72 小时内确认并回复
  2. 评估影响,修复后发布新版本(补丁版本)
  3. 修复发布后默认披露(提前披露例外情况可协商)

安全模型(8 个安全关键字的语义保障)

编译期检查

关键字 保障 机制
safe 外部输入不流入危险汇点 污点数据流:源点(input/request/os.environ)经赋值/容器/属性/参数传播,到达 pickle.loads/load/Unpickler、eval/exec/compile、os.system/subprocess、SQL execute 等汇点即编译报错;int()/float()/bool() 清洗后放行;import 别名(from pickle import loads as l、import pickle as p)溯源到源模块,不可绕过
only 模块白名单 块内仅可访问白名单模块与安全内置;访问白名单外名称编译报错
lock 常量冻结 定义后不可再赋值/删除,反射(globals/locals/setattr)不可改
mask 敏感数据防泄漏 mask 标记数据不可流入输出上下文(print/logging/f-string 参数)
cage 资源约束 函数级 max_time/max_memory,超限抛 ResourceExhaustedError
guard 输入校验 函数入口注入运行时断言,失败抛 GuardError(带行列号)
seal 类固化 seal 类的实例属性不可增删改(编译期 + 运行时令牌)
trace 强制审计 函数级 logging 注入,调用链可审计

运行时兜底

通过 fly check 的代码,所有动态错误(除零/下标越界/KeyError/属性缺失/ 类型转换失败/不可迭代/运算失败)不再裸抛 Python 异常,统一转为 FlyRuntimeError: src:行:列: 描述——错误消息携带源码位置,AI 可定位、可修复。

威胁模型与边界

完整威胁模型(含污点规则 R1-R5 形式化、对抗实测表、与 Bandit/Semgrep/Ruff 定位差异)见 docs/THREAT-MODEL.md。

  • 防御目标:外部输入引发的注入/RCE/泄漏(pickle、eval、shell、SQL); 敏感数据外泄(mask);资源滥用(cage)。
  • 诚实边界(完整清单见 THREAT-MODEL §6,B1-B8):
    • B1 跨文件污点流不跟踪(单文件编译模型);B2 from x import * 不检查
    • B3 第三方模块内部代码是正常 Python(供应链信任,超出转译器范围)
    • B4 动态反射(getattr(obj, 动态名))、B7 一等函数间接引用(obj = pickle.loads; obj(x)) 不溯源——用 only 白名单 + fly-sandbox 兜底
    • B5 业务逻辑漏洞(如鉴权遗漏)不是安全关键字的责任范围
    • B6 运行时兜底保证"统一报错"而非"不报错";cage 超限仍会抛异常
    • 转译后的 .py 是最终执行产物,代码在用户本机运行,编译期检查无法防御 所有运行时攻击。涉及安全边界绕过的问题请按上文上报。
  • 性能成本:转译注入的 _fly_* 护栏在热循环有约 1-3 倍开销(vs CPython, 见 docs/bench/bench.md),安全与性能的取舍明确公开。

验证

  • 反例测试:testdata/errors/*.fly(编译期必须报错的全部场景)
  • 快照锁定:错误消息与转译产物 golden 对比(go test ./...)
  • CVE 对照演示:bash examples/cve-pickle/run-demo.sh(5 幕:编译期 + 沙箱双层)

Clone this wiki locally