核心用法
OTP Challenger 是一款面向智能代理(agent)和技能(skill)的身份验证中间件,在执行敏感操作前强制要求用户提供基于时间的一次性密码(TOTP)。核心流程为:代理调用 verify.sh 验证用户提供的6位动态码,验证通过后记录时效状态(默认24小时),后续脚本可通过 check-status.sh 查询验证有效性。
关键脚本:
verify.sh <user_id> <code>— 验证OTP并更新状态check-status.sh <user_id>— 检查验证是否仍有效generate-secret.sh <account>— 生成TOTP密钥(含QR码)
配置方式: 支持 OpenClaw 配置文件、环境变量 OTP_SECRET 或 1Password 密钥引用(推荐),可自定义验证间隔、宽限期、状态文件路径等。
显著优点
1. 标准化TOTP实现:遵循 RFC 6238,兼容 Google Authenticator、Authy、1Password、Bitwarden 等主流应用
2. 零敏感信息持久化:状态文件仅存储时间戳,密钥永不写入状态存储
3. 灵活集成:通过 source 方式嵌入现有技能脚本,无需复杂API调用
4. 失败可观测性:支持 OTP_FAILURE_HOOK 自定义失败回调,可对接 Slack/PagerDuty 或触发防护性停机
5. 内置降级方案:可选 oathtool 验证,但自带 Python TOTP 生成器确保核心功能零外部依赖(除 jq/python3)
潜在缺点与局限性
- 主机安全依赖:若攻击者已获得 OpenClaw 所在主机的 shell 权限,可直接读取配置文件中的密钥
- 无防钓鱼保护:用户仍可能被骗取OTP码(与所有TOTP方案相同局限)
- 单点配置风险:密钥配置于服务端,多用户场景需额外扩展(当前设计偏向个人/单用户代理)
- 时间同步要求:依赖系统NTP同步,极端时钟偏移可能导致验证失败
- 状态文件本地存储:默认
memory/otp-state.json为本地文件,分布式部署需自行外接存储
适合人群
- 使用 OpenClaw 框架的开发者,需要为部署、财务、数据导出等敏感操作添加身份确认层
- 个人开发者或小团队,通过本地代理管理基础设施(kubectl/terraform)
- 已使用1Password/Bitwarden等密码管理器,希望引用托管密钥的安全意识用户
常规风险
| 风险类型 | 等级 | 说明 |
|---------|------|------|
| 配置泄露 | 中 | 密钥以明文或1Password引用形式存储于配置文件,需严格限制文件权限(0600) |
| 会话劫持缓解 | 低 | 有效防护:窃取聊天会话无法绕过OTP验证 |
| 重放攻击 | 低 | 有效防护:TOTP码30秒窗口+单次验证机制 |
| 内部威胁 | 中 | 若攻击者已控制代理进程,可直接读取内存中的密钥 |
| 社会工程 | 高 | 用户可能被诱导在恶意场景下提供OTP码,需配合安全培训 |
建议缓解措施: 使用1Password引用替代明文密钥、设置较短验证间隔(8小时)、启用失败钩子监控异常尝试、确保 memory/ 目录权限严格。