زیرسیستم Gatekeeper احراز هویت الگوی/رمز عبور دستگاه را در یک محیط اجرای مورد اعتماد (TEE) انجام میدهد. Gatekeeper رمزهای عبور را با استفاده از یک کلید مخفی سخت افزاری ثبت و تأیید می کند. علاوه بر این، Gatekeeper تلاشهای تأیید ناموفق متوالی را مهار میکند و باید از درخواستهای سرویس بر اساس یک بازه زمانی معین و تعداد معینی از تلاشهای ناموفق متوالی خودداری کند.
وقتی کاربران رمزهای عبور خود را تأیید میکنند، Gatekeeper یک نشانه احراز هویت منتشر میکند که با یک کلید HMAC در هر راهاندازی امضا میشود که فقط برای مؤلفههای ایمن در دسترس است، و این نشانه به Keystore با پشتیبانی سختافزار ارسال میشود. به این معنی که یک نشانه احراز هویت Gatekeeper به Keystore اطلاع می دهد که کلیدهای مرتبط با احراز هویت (به عنوان مثال، کلیدهایی که برنامه ها ایجاد کرده اند) می توانند توسط برنامه ها استفاده شوند.
معماری
دروازه بان شامل سه جزء اصلی است:
-
gatekeeperd
(شیب دروازهبان) - یک سرویس C++ Binder در Android که حاوی منطق مستقل از پلتفرم است که رابطIGateKeeperService
AIDL را بر اساس پیادهسازیIGatekeeper
خاص فروشنده زیربنایی اجرا میکند. - سرویس لایه انتزاعی سخت افزار Gatekeeper (HAL) - یک پیاده سازی خاص فروشنده از رابط
IGatekeeper
AIDL. این سرویس HAL در اندروید اجرا میشود، اما عملکرد اصلی Gatekeeper باید در یک محیط امن اجرا شود، بنابراین معمولاً با Gatekeeper TA ارتباط برقرار میکند. - Gatekeeper Trusted Application (TA) - یک پیاده سازی خاص فروشنده است که در TEE اجرا می شود و رمز عبور واقعی یا تأیید الگو را انجام می دهد.
LockSettingsService
درخواستی (از طریق Binder) ارائه میکند که به شبح gatekeeperd
در سیستمعامل اندروید میرسد. سپس دیمون gatekeeperd
درخواستی از سرویس IGatekeeper
HAL میکند و به نوبه خود به همتای خود Gatekeeper TA در TEE میرسد:

شکل 1. جریان داده در سطح بالا برای احراز هویت توسط GateKeeper.
شبح gatekeeperd
به APIهای فریمورک اندروید دسترسی به HAL میدهد و در گزارش احراز هویت دستگاه به Keystore شرکت میکند. شبح gatekeeperd
در فرآیند خودش اجرا میشود و جدا از سرور سیستم است.
اجرای HAL
شبح gatekeeperd
از IGatekeeper
HAL برای تعامل با Gatekeeper TA برای احراز هویت رمز عبور استفاده میکند. پیاده سازی Gatekeeper TA باید قادر به امضا (ثبت نام) و تأیید حباب ها باشد. انتظار میرود همه پیادهسازیها به فرمت استاندارد برای رمز احراز هویت ( HardwareAuthToken
) که در هر تأیید موفقیت آمیز رمز عبور تولید میشود، پایبند باشند. برای جزئیات بیشتر در مورد محتوا و معنای HardwareAuthToken
، به تعریف HardwareAuthToken.aidl
مراجعه کنید.
پیاده سازی فروشنده IGatekeeper
HAL باید توابع enroll
و verify
را اجرا کند:
- روش
enroll
یک لکه رمز عبور را می گیرد، آن را امضا می کند و امضا را به عنوان یک دسته برمی گرداند. حباب برگشتی (از یک فراخوان برایenroll
) باید ساختار نشان داده شده درsystem/gatekeeper/include/gatekeeper/password_handle.h
داشته باشد. - تابع
verify
باید امضای تولید شده توسط رمز عبور ارائه شده را مقایسه کند و اطمینان حاصل کند که با دسته رمز عبور ثبت شده مطابقت دارد.
کلید مورد استفاده برای ثبت نام و تأیید هرگز نباید تغییر کند و باید در هر بوت دستگاه قابل استخراج مجدد باشد.
اجراهای قابل اعتماد و دیگر
سیستم عامل Trusty سیستم عامل منبع باز مورد اعتماد Google برای محیط های TEE است و شامل اجرای تایید شده Gatekeeper است. با این حال، هر سیستمعامل TEE میتواند Gatekeeper را پیادهسازی کند تا زمانی که TEE به یک کلید ثابت سختافزاری و یک ساعت ایمن و یکنواخت که در حالت تعلیق تیک تاک میکند، دسترسی داشته باشد.
Trusty از یک سیستم IPC داخلی برای برقراری ارتباط مستقیم یک راز مشترک بین KeyMint و اجرای Trusty Gatekeeper ( Trusty Gatekeeper ) استفاده می کند. این راز مشترک برای امضای توکنهای احراز هویت ارسال شده به Keystore برای ارائه تأییدیه تأیید رمز عبور استفاده میشود. Trusty Gatekeeper برای هر بار استفاده، کلید را از KeyMint درخواست میکند و مقدار را باقی نمیگذارد یا در حافظه پنهان نگه میدارد. پیاده سازی ها می توانند این راز را به هر طریقی که امنیت را به خطر نیندازند به اشتراک بگذارند.
کلید HMAC که برای ثبت نام و تأیید گذرواژه ها استفاده می شود، مشتق شده و صرفاً در Gatekeeper نگهداری می شود.
اندروید یک پیادهسازی عمومی C++ Gatekeeper را ارائه میکند که برای کامل شدن فقط به اضافه کردن روتینهای خاص دستگاه نیاز دارد. اجرای Trusty بر این اساس است. برای پیاده سازی TEE Gatekeeper با کد مخصوص دستگاه برای TEE خود، به عملکردها و نظرات در system/gatekeeper/include/gatekeeper/gatekeeper.h
مراجعه کنید. مسئولیت های اولیه اجرای سازگار عبارتند از:
- پایبندی به
IGatekeeper
HAL. - توکنهای احراز هویت برگشتی باید مطابق با مشخصات
HardwareAuthToken
(شرح شده درHardwareAuthToken.aidl
) قالببندی شوند. - TEE Gatekeeper باید بتواند یک کلید HMAC را با استفاده از یکی از موارد زیر با KeyMint به اشتراک بگذارد:
- توافقنامه مخفی مشترک: Gatekeeper می تواند با اجرای
ISharedSecret
HAL در مذاکره هر بوت کلید HMAC شرکت کند. این مستلزم آن است که Gatekeeper و KeyMint هر دو به یک راز مشترک از قبل به اشتراک گذاشته شده دسترسی داشته باشند. - دسترسی مستقیم: Gatekeeper میتواند کلید HMAC را از KeyMint با استفاده از یک مکانیسم ارتباطی درون فرآیندی TEE، در صورت تقاضا یا در اولین استفاده (پس از آن در حافظه پنهان) بازیابی کند.
- توافقنامه مخفی مشترک: Gatekeeper می تواند با اجرای
شناسه های ایمن کاربر (SID)
یک کاربر SID نمایش TEE یک کاربر است (بدون اتصال قوی به شناسه کاربری Android). هر زمان که کاربر رمز عبور جدیدی را بدون ارائه رمز قبلی ثبت می کند، SID با یک تولید کننده اعداد شبه تصادفی رمزنگاری (PRNG) تولید می شود. این به عنوان ثبت نام مجدد نامعتبر شناخته می شود و معمولاً تنها زمانی اتفاق می افتد که کاربر برای اولین بار رمز عبور یا الگو را تعیین کند.
ثبت نام مجدد مطمئن زمانی اتفاق می افتد که کاربر یک رمز عبور معتبر و قبلی ارائه کند، مانند هنگام تغییر رمز عبور. در این حالت، SID کاربر به دسته رمز عبور جدید منتقل می شود و کلیدهایی که به آن متصل شده اند حفظ می شود.
SID کاربر در احراز هویت HMAC به همراه رمز عبور در دسته گذرواژه هنگام ثبت رمز وارد می شود.
شناسههای کاربر در HardwareAuthToken
که توسط تابع verify()
بازگردانده شده و به همه کلیدهای Keystore محدود به احراز هویت مرتبط میشوند گنجانده شدهاند (برای جزئیات بیشتر در مورد قالب HardwareAuthToken
و Keystore، به تأیید اعتبار مراجعه کنید).
توجه داشته باشید که از آنجایی که یک فراخوانی نامعتبر به تابع enroll()
SID کاربر را تغییر میدهد، این فراخوانی کلیدهای متصل به آن رمز عبور را بیاستفاده میکند. مهاجمان در صورت کنترل سیستم عامل اندروید می توانند رمز عبور دستگاه را تغییر دهند، اما در این فرآیند کلیدهای حساس و محافظت شده از ریشه را از بین می برند.
درخواست throttling
دروازهبان باید بتواند بهطور ایمن تلاشهای brute-force را روی یک اعتبار کاربری کنترل کند. همانطور که در GatekeeperVerifyResponse.aidl
نشان داده شده است، HAL امکان برگرداندن یک بازه زمانی را در میلی ثانیه فراهم می کند. تایم اوت به مشتری اطلاع میدهد که دیگر با Gatekeeper تماس نگیرد تا زمانی که زمان پایان سپری شود. در صورت وجود یک بازه زمانی معلق، دروازهبان نباید درخواستهای سرویس را ارائه دهد.
Gatekeeper باید قبل از تأیید رمز عبور کاربر، یک شمارنده خرابی بنویسد. اگر تأیید رمز عبور با موفقیت انجام شود، شمارنده خرابی باید پاک شود. این امر از حملاتی که با غیرفعال کردن MMC تعبیه شده (eMMC) پس از صدور یک تماس verify
، از throttling جلوگیری می کند، جلوگیری می کند. تابع enroll
همچنین رمز عبور کاربر را تأیید می کند (در صورت ارائه) و باید به همان روش کنترل شود.
اگر توسط دستگاه پشتیبانی می شود، بسیار توصیه می شود که شمارنده خرابی برای ذخیره سازی ایمن نوشته شود. اگر دستگاه از رمزگذاری مبتنی بر فایل پشتیبانی نمیکند، یا اگر ذخیرهسازی ایمن بسیار کند است، ممکن است پیادهسازیها مستقیماً از بلوک حافظه محافظتشده پخش مجدد (RPMB) استفاده کنند.