SuperAPI AI 工具集

secret-serialization

编程与开发

查看项目

更新于 10-16 08:47

技能介绍

用途:排查凭据泄露的一种间接路径——某个类型自身会生成序列化输出(repr、str、asdict、model_dump、toJSON、属性枚举等),而其上游代码又会整体序列化对象或全部参数(日志、追踪、错误上下文、缓存、队列、响应)。泄露通常由分别看都安全的两处改动组成:持有方(凭据存为带生成序列化类型的字段)与接收方(整体序列化 sink)。两侧常由不同作者相隔数月编写,因此报告任一侧时,都会在整个代码库搜索另一侧,而不限于 diff。

边界:本技能覆盖经生成式序列化和整体序列化的间接泄露;直接泄露(如把 token 插入日志字符串)属于 security-review,仅在改动后的整体 sink 导致时报出。硬编码凭据字面量和已提交的 .env 文件不在范围内。

凭据字段:名称含 secret、token、password、api_key、client_secret、authorization、cookie、dsn、hmac 等,类型为 SecretStr/SecretBytes 等包装类型,或值来自环境变量、密钥管理器及同名构造参数。

排除机制:dataclasses/attrs 的 repr=False 只挡 repr 与 str;pydantic 的 repr=False 挡 repr/str;exclude=True 挡 model_dump 等;两者并用挡全部生成路径;JS 私有字段、不可枚举属性、手写 repr/toJSON 只挡对应路径;脱敏包装类型挡全部生成路径,但 pickle 和递归 dict 仍可触及内部值。vars、dict、pickle、default=vars 等原始属性访问不受任何字段级机制阻挡,只能靠不在对象上存储凭据来修复。下划线命名、TypeScript private、slots、类型注解、注释不被视为阻挡。

流程:读改动块找新增/修改的凭据字段与整体序列化代码;对每个字段查看完整类、装饰器、基类与配置,逐条核对生成路径;搜索实例构造与传递位置;在整个仓库(不限于 diff)搜索 str(value)、repr(、asdict(、model_dump(、set_data(、set_context(、JSON.stringify(、util.inspect(、以对象调用日志器及原始属性访问等模式;检查 sink 是否已有键白名单、按名脱敏或对象替换;测试只用于确认是否断言凭据缺失;跳过夹具、示例、生成代码和仅测试辅助。

上报类别:未排除的凭据字段、部分排除(仍有 sink 使用未阻挡路径)、原始属性 sink、凭据被迁移到持有对象、新增整体序列化 sink、sink 失去过滤、对象被传入遥测。严重度:high 为凭据到达仓库内任一 sink;medium 为未排除字段实例离开构造模块但未找到 sink,或无白名单且未追踪到凭据调用方的整体 sink;low 为实例从未离开构造作用域。不得因 sink 或持有方不在 diff 内而降级。

不报:完全排除的字段(除非遭遇原始属性 sink)、无 sink 使用的部分排除、方法内读取且不存储的凭据、测试/夹具/示例中的占位值、无生成序列化也无 dict 枚举 sink 的类型、已有白名单或脱敏的 sink、diff 未触及的既有字段与 sink 等。修复建议:持有方阻挡全部生成路径、包装脱敏类型或不再存储;原始属性 sink 改为显式白名单字典;sink 加白名单、按凭据名脱敏、非标量记录类型名;并用与 sink 相同的序列化器写回归测试断言凭据字符串不出现。