Only humans with a phone can
git push.
基于 Intel SGX TEE 的 SSH Agent。TOTP seed 封存于 Enclave 隔离环境中,任何外部进程(包括 AI agent)均无法访问。每次 git push 必须提供当前有效的 TOTP 验证码——而只有持有手机的人才能生成它。
传统 SSH 密钥的问题:私钥是一个文件,任何能读文件的进程都可以用它签名。AI agent 拿到 root 权限后可以直接用密钥 push,完全绕过人类审批。
这个方案的保证来自 TEE 隔离,而非访问控制:
- TOTP seed 在初始化时由 Enclave 生成,通过 SGX Sealing 加密存储
- sealed 数据只有同一台机器上的同一个 Enclave 才能解开,操作系统、hypervisor、root 进程均不可访问
- 签名必须经过 Enclave 内部的 TOTP 验证,验证失败则拒绝签名
- TOTP 每 30 秒轮换,持有手机的人才能提供当前有效验证码
结果:即使 AI agent 控制了整台机器,它也无法绕过 TEE 提取 TOTP seed,更无法伪造当前验证码。
git push
↓
ssh 客户端 → Unix socket /tmp/sgx-agent.sock
↓
Host 进程(agent)
├─ 收到签名请求
├─ 从 /tmp/push_token 读取 TOTP(或提示终端输入)
└─ ECALL → SGX Enclave
├─ 从 sealed 存储恢复 TOTP seed(仅 Enclave 可解)
├─ 验证 TOTP(RFC 6238,30 秒窗口)
├─ 验证通过 → ECDSA P-256 签名
└─ 验证失败 → 拒绝,私钥永不离开 Enclave
source /opt/intel/sgxsdk/environment
make依赖:
- Intel SGX SDK(Ubuntu 24.04 已有官方包:
libsgx-*) qrencode(初始化时显示二维码):sudo apt install qrencode
cd ~/are-you-human2
source /opt/intel/sgxsdk/environment
./agent会显示:
=== are-you-human SGX SSH Agent 初始化 ===
█████████████████████
█ ▄▄▄▄▄ ██▀▀▀ ▄▄▄▄▄ █ ← 二维码
...
或手动输入: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
获取公钥请在初始化完成后运行:
ssh-add -L
[2/2] 完成后按回车保存...
操作:
- 用 Google Authenticator 扫码(或手动输入种子)
- 按回车确认
- 出现「初始化完成」后,重新运行
cd ~/are-you-human2
source /opt/intel/sgxsdk/environment
./agent &
export SSH_AUTH_SOCK=/tmp/sgx-agent.sock永久配置(加到 ~/.zshrc 或 ~/.bashrc):
echo 'export SSH_AUTH_SOCK=/tmp/sgx-agent.sock' >> ~/.zshrcssh-add -L
# 输出:ecdsa-sha2-nistp256 AAAAE2Vc... sgx-protected-key复制 → GitHub Settings → SSH Keys → New SSH Key → 粘贴 → 保存
方式一:提前写入 TOTP(推荐,非交互)
echo "482913" > /tmp/push_token # 手机上看验证码
git push # agent 自动读取,无需交互方式二:终端交互
git push
# agent 终端提示:🔑 请输入 TOTP:
# 切换到 agent 终端输入 6 位验证码cd ~/are-you-human2
source /opt/intel/sgxsdk/environment
./agent &在 ~/.ssh/config 里添加(解决 OpenSSH 9.x hostbound 扩展问题):
Host github.com
PubkeyAuthentication unbound
are-you-human2/
├── agent.edl # ECALL/OCALL 接口定义
├── enclave/
│ ├── enclave.c # Enclave 内部逻辑(私钥、TOTP、签名)
│ └── enclave.config.xml # SGX 配置
├── host/
│ └── host.c # Host 进程(socket、终端 I/O、ECALL)
├── Makefile
├── sealed/ # Sealed 密钥(自动创建,不进 git)
└── README.md
| 攻击者 | 能做什么 | 结果 |
|---|---|---|
| 拥有 root 的 AI agent | 读 sealed/ 目录 | ❌ SGX Sealing 密文,OS 无法解密 |
| 拥有 root 的 AI agent | 读进程内存 | ❌ SGX EPC 内存加密,不可见 |
| 拥有 root 的 AI agent | 直接调用 Enclave | ❌ TOTP 验证失败,无法签名 |
| 网络攻击者 | 重放旧的 TOTP | ❌ 30 秒有效期,已过期 |
| 持有手机的你 | 提供当前 TOTP + git push | ✅ 成功 |
安全性不依赖"AI 没有手机"这类能力假设,而是依赖 TEE 的硬件隔离:sealed 数据在 Enclave 外物理不可读,TOTP 验证在 Enclave 内完成。
代码完全公开(Kerckhoffs 原则)——安全性依赖密钥保密,不依赖代码保密。
- TEE:Intel SGX(Software Guard Extensions),硬件级内存隔离
- 加密算法:ECDSA P-256(SGX SDK 原生
sgx_ecc256) - TOTP:RFC 6238,HMAC-SHA1,30 秒窗口,±1 容忍
- 密钥保护:SGX Sealing(MRSIGNER 策略,重新编译不影响解密)
- SSH 协议:SSH Agent Protocol v2
- 初始化时 你必须在场(需要扫码导入 Authenticator)
- 如需重新初始化:
rm -f ~/are-you-human2/sealed/*,重新运行./agent - 重新初始化后需要更新 GitHub SSH Keys(公钥会变)
- 重新编译不影响 sealed 密钥(使用 MRSIGNER 策略)