通过触摸 Android 手机的指纹传感器,在你的 Linux 机器上批准 sudo。
输入 sudo,手机震动,你触摸传感器,命令随即执行。无需输入密码,数据不会上传到云端:手机通过你的局域网应答,指纹由手机的安全硬件(TEE / StrongBox)强制执行,而非由应用代码验证。如果出现任何问题(手机关机、超出范围、你点击拒绝、超过 60 秒),sudo 会直接回退到普通密码提示。它能让 sudo 更方便,但不会把你锁在门外。
![]() 1. 主机上的 sudo 手机会弹出是谁在请求。可直接在此处拒绝。 |
![]() 2. 点击它 倒计时、主机和时间,对从未见过的主机给出警告。随后是系统指纹提示。 |
![]() 3. 触摸传感器 TEE 完成签名,sudo 继续执行,应用自行关闭。 |
![]() 首次运行 三个步骤和一个按钮。如果手机尚未录入指纹,会提示录入。 |
![]() 设置 实时检查清单:监听器、通知、电池、勿扰模式。全部通过时才显示“Ready”。 |
![]() 拒绝或超时 手机不会发出任何签名;主机会要求输入密码。 |
截图来自 Pixel 7 模拟器(因此显示 10.0.2.2,即模拟器的主机地址)。步骤 2 上方出现的系统指纹面板是安全窗口,不会出现在截图中。
sudo on the host
-> PAM: pam_rssh (third-party) dials the phone over the LAN, as an ssh-agent
-> phone: "Approve sudo? From 192.168.1.10" (notification)
-> tap -> BiometricPrompt -> fingerprint
-> the phone's TEE signs pam_rssh's fresh 32-byte challenge
-> pam_rssh verifies against the pinned public key -> sudo proceeds
pam_rssh,这是一个现有的、持续维护的模块。这里编写的任何代码在
认证时都不会以 root 身份在主机上运行。setUserAuthenticationParameters(0, AUTH_BIOMETRIC_STRONG) 创建:每一次签名都需要一次全新的强生物识别,
并在 TEE(或 StrongBox)内部强制执行。手机上的恶意软件同样无法在没有你指纹的情况下完成签名,而且密钥
无法被导出。SECURITY.md 包含完整的威胁模型,包括它不防护的内容。docs/DESIGN.md 包含设计及其背后的理由。
手机: Android 11+(API 30,从该版本起可以表达按次使用的生物识别密钥),并配备 Class 3(“强”)指纹传感器。
主机: 以下任意平台。安装程序会一并带来
pam_rssh:有现成软件包时使用软件包,否则从固定的、经过验证的
提交构建。
| 平台 | 状态 |
|---|---|
| Arch、Manjaro、EndeavourOS | ✅ 已在 CI 中端到端测试 |
| Debian 12 / 13、Ubuntu 24.04、Mint、Pop!_OS | ✅ 已在 CI 中端到端测试 |
| Fedora、RHEL / Rocky / Alma 9 | ✅ 已在 CI 中端到端测试 |
| openSUSE Tumbleweed | ✅ 已在 CI 中端到端测试 |
| Windows,通过 WSL(上述任意发行版) | 🧪 应该可用,未测试;设备发现可能无法跨越 WSL2 的 NAT 看到手机,因此请传入 --phone |
macOS 14+(通过 /etc/pam.d/sudo_local) | 🧪 实验性,未测试 |
FreeBSD(security/pam_rssh port) | 🧪 实验性,未测试 |
“端到端测试”意味着每次推送都会在该发行版的全新容器中运行 tools/test/e2e.sh:
安装程序、pam_rssh 和一个真实的 sudo,针对模拟手机进行测试。sudo 必须在手机批准时无需密码即可通过,
在手机拒绝时回退到密码,并且能够通过回滚逐字节恢复原状。
手机和主机位于同一局域网,且手机使用稳定地址(DHCP 保留)。
1. 手机。 从 Releases
页面安装应用,或让 Obtainium 安装并保持其更新:将
https://gitlab.com/ritwick7/sudostamp 添加为应用。打开它并点击 Get started:密钥会在手机的安全硬件
内部创建,随后手机等待你的计算机。
每个发布版 APK 都由同一密钥签名。要在安装前校验下载内容:
sha256sum -c --ignore-missing SHA256SUMS # from the same release page
apksigner verify --print-certs sudostamp-v*.apk | grep SHA-256
# must be 7bcb0b51246197b9bb99779e09a3adcbbaeb2d59a0edecf8d2e8be67844d0657
2. 计算机。 两行命令,无需克隆:
curl -fsSLO https://gitlab.com/ritwick7/sudostamp/-/releases/permalink/latest/downloads/sudostamp-setup.sh
sudo bash sudostamp-setup.sh
在 Arch 上:yay -S sudostamp,然后 sudo sudostamp setup(更新随系统一起进行)。
sudostamp-setup.sh 是一个自包含文件:安装器及其辅助脚本,没有任何隐藏内容。
在以 root 身份运行之前请先阅读它,并将其 SHA-256 与发布页面上的值进行比对。它
由带标签的源代码(scripts/bundle-host.sh)确定性构建,因此你也可以
自行重新构建并逐字节比对。
这就是全部设置过程。它会找到你网络上的手机,手机将显示一个 6 位验证码:
![]() |
![]() |
![]() |
在终端中输入该验证码,用手指批准一个测试请求,就完成了: