注入方式决定了泄漏面
凭据注入讲的是「用什么通道把凭据交给执行进程」。通道选得不同,泄漏面差别很大:环境变量最方便,但同主机的其他进程在一定条件下可以读到,且会被子进程继承;作为命令行参数传递会出现在进程列表中;写成临时文件则可能残留;由运行时按需向凭据服务换取则暴露面最小。隔离讲的是另一件事——不同环境与不同任务之间不能互相看到对方的凭据,否则一次失守就会横向扩散。
基本信息
| 适用对象 | 脚本执行、编排任务、容器化应用 |
|---|---|
| 注入通道 | 运行时取用、环境变量、挂载文件、标准输入 |
| 隔离维度 | 环境之间、任务之间、进程之间 |
| 典型泄漏点 | 进程列表、进程环境、崩溃转储、调试接口 |
| 权限要求 | 读取其他进程环境通常需要高权限,但容器内常较宽松 |
通道与隔离要点
- 运行时取用:进程在执行瞬间向凭据来源换取,凭据不写入镜像与配置文件
- 环境变量注入:实现最简单,但要接受子进程继承与崩溃信息带出明文的代价
- 文件挂载注入:以只读方式挂载,避免进程意外改写或转发该文件
- 标准输入注入:适合一次性口令,用完即弃,进程列表里看不到内容
- 环境隔离:开发、测试、生产使用完全独立的凭据体系,禁止跨环境复用
- 任务隔离:不同任务使用不同凭据,避免一个任务失守牵连其他任务
检查注入面
检查注入面
tr '\0' '\n' < /proc/self/environ | cut -d= -f1 | head -20 # 看当前进程环境里有哪些键
ls -l /run/secrets # 挂载的凭据文件权限与只读属性
mount | grep -i secrets # 确认挂载方式与只读标志
ps -ef | grep -v grep | grep -i 'password\|token' # 命令行里是否带明文
cat /proc/sys/kernel/yama/ptrace_scope # 同机进程读取限制的相关设置
find / -name '*.env' -o -name 'credentials' 2>/dev/null | head -20 # 落盘凭据排查注入通道对照
| 通道 | 优点 | 主要风险 |
|---|---|---|
| 运行时取用 | 不落盘、可短期有效 | 依赖凭据服务可用性 |
| 环境变量 | 实现简单、通用 | 子进程继承与进程环境可被读取 |
| 挂载文件 | 便于多值管理 | 文件残留与权限配置 |
| 标准输入 | 不出现在进程列表 | 仅适合单次使用不易复用 |
注入失败要有明确失败行为:如果取不到凭据时程序回落到内置默认值或匿名访问,故障会以「权限不足」的形式在别处暴露,排查方向会被带偏。取用失败应当直接终止并报出明确原因。
容器中通过本地元数据服务或类似端点获取凭据时,要限制应用可访问的目标地址范围:应用若存在请求伪造类缺陷,攻击者可能借此从凭据端点取到高权限凭据。限制网络访问与端点权限边界比事后检测更有效。