-
Notifications
You must be signed in to change notification settings - Fork 0
SECURITY
29anan29 edited this page Aug 18, 2026
·
1 revision
PyFly 的目标是编译期阻止不安全代码(注入、篡改、泄露、资源滥用),因此安全问题优先处理。
| 版本 | 安全修复支持 |
|---|---|
| 最新 release | 是 |
| 旧版本 | 否,请升级到最新版(fly update) |
请勿公开披露安全问题(不要开公开 Issue)。请通过以下方式上报:
请在邮件中说明:
- 受影响版本(
fly version输出) - 操作系统与 Go/Python 版本
- 复现步骤与最小代码样例
- 影响评估(能绕过哪些安全关键字、泄露什么数据)
- 收到上报后 72 小时内确认并回复
- 评估影响,修复后发布新版本(补丁版本)
- 修复发布后默认披露(提前披露例外情况可协商)
| 关键字 | 保障 | 机制 |
|---|---|---|
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是最终执行产物,代码在用户本机运行,编译期检查无法防御 所有运行时攻击。涉及安全边界绕过的问题请按上文上报。
- B1 跨文件污点流不跟踪(单文件编译模型);B2
-
性能成本:转译注入的
_fly_*护栏在热循环有约 1-3 倍开销(vs CPython, 见 docs/bench/bench.md),安全与性能的取舍明确公开。
- 反例测试:
testdata/errors/*.fly(编译期必须报错的全部场景) - 快照锁定:错误消息与转译产物 golden 对比(
go test ./...) - CVE 对照演示:
bash examples/cve-pickle/run-demo.sh(5 幕:编译期 + 沙箱双层)