
الموافقة على sudo على محطة عمل Linux باستخدام بصمة الإصبع على هاتفك الذي يعمل بنظام Android. عبر الشبكة المحلية فقط؛ لا يغادر مفتاح ECDSA وحدة TEE في الهاتف أبدًا ويتحدث بروتوكول ssh-agent إلى pam_rssh.
وافق على sudo على جهاز Linux الخاص بك بلمس مستشعر البصمة في هاتفك Android.
اكتب sudo، فيهتز هاتفك، تلمس المستشعر، فتُنفَّذ الأمر. دون كتابة كلمة مرور، ولا شيء
في السحابة: يجيب الهاتف عبر شبكتك المحلية، ويُفرَض التحقق من البصمة بواسطة العتاد الآمن
في الهاتف (TEE / StrongBox)، لا بواسطة كود التطبيق. وإذا حدث أي خطأ (الهاتف مغلق، أو خارج
النطاق، أو ضغطت رفض، أو مرّت 60 ثانية) فإن sudo يعود ببساطة إلى مطالبة كلمة المرور العادية.
يمكنه أن يجعل sudo أكثر ملاءمة؛ لكنه لا يستطيع أن يقفلك خارج جهازك.
![]() 1. sudo على المضيف يظهر على الهاتف من الذي يطلب. الرفض يعمل من هنا مباشرة. |
![]() 2. اضغط عليه عدّاد تنازلي، والمضيف والوقت، وتحذير للمضيفين الذين لم تُرَ من قبل. ثم مطالبة البصمة في النظام. |
![]() 3. المس المستشعر يوقّع TEE، ويتابع sudo، ويغلق التطبيق نفسه. |
![]() أول تشغيل ثلاث خطوات وزر واحد. يعرض تسجيل البصمة إذا لم يكن للهاتف بصمة. |
![]() الإعداد قائمة تحقق حيّة: المستمع، والإشعارات، والبطارية، وعدم الإزعاج. لا يظهر "جاهز" إلا عند نجاح كل شيء. |
![]() مرفوض أو انتهت المهلة لا تخرج أي توقيعة من الهاتف؛ ويطلب المضيف كلمة المرور. |
لقطات شاشة من محاكي 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،
وهي وحدة موجودة ومُصانة. لا شيء مكتوب هنا يعمل بصلاحيات الجذر على المضيف في
وقت المصادقة.setUserAuthenticationParameters(0, AUTH_BIOMETRIC_STRONG): قياس حيوي قوي جديد لكل
توقيع، مفروض داخل TEE (أو StrongBox). لا يمكن للبرمجيات الخبيثة على الهاتف أن توقّع
دون إصبعك أيضاً، ولا يمكن تصدير المفتاح.يحتوي SECURITY.md على نموذج التهديد الكامل، بما في ذلك ما لا يحمي منه. ويحتوي docs/DESIGN.md على التصميم والأسباب الكامنة وراءه.
الهاتف: Android 11+ (API 30، حيث أصبحت مفاتيح القياس الحيوي لكل استخدام قابلة للتعبير) مع مستشعر بصمات من الفئة 3 ("قوي").
المضيف: أي من المنصات أدناه. يجلب المثبّت
pam_rssh معه: حزمة حيث توجد واحدة، وإلا
يُبنى من commit مثبّت ومُتحقق منه.
| المنصة | الحالة |
|---|---|
| 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 (أي توزيعة أعلاه) | 🧪 يُفترض أن يعمل، غير مُختبر؛ قد لا يرى الاكتشاف الهاتف عبر NAT الخاص بـ WSL2، لذا مرّر --phone |
macOS 14+ (عبر /etc/pam.d/sudo_local) | 🧪 تجريبي، غير مُختبر |
FreeBSD (منفذ security/pam_rssh) | 🧪 تجريبي، غير مُختبر |
"مُختبرة من البداية إلى النهاية" تعني أن كل push يشغّل tools/test/e2e.sh في حاوية
جديدة لتلك التوزيعة: المثبّت وpam_rssh و**sudo حقيقي**، مقابل هاتف وهمي. يجب أن ينجح sudo
دون كلمة مرور بينما يوافق الهاتف، وأن يتراجع إلى كلمة المرور عندما يرفض، وأن يُستعاد
بايتاً ببايت عبر التراجع.
الهاتف والمضيف على نفس الشبكة المحلية، مع وجود الهاتف على عنوان ثابت (حجز DHCP).
1. الهاتف. ثبّت التطبيق من صفحة Releases،
أو دع Obtainium يثبّته ويبقيه محدّثاً: أضف
https://gitlab.com/ritwick7/sudostamp كتطبيق. افتحه واضغط على Get started: يُنشأ المفتاح
داخل العتاد الآمن للهاتف وينتظر الهاتف حاسوبك.