لایه انتزاعی سختافزار ویور (HAL) ( IWeaver.aidl ) که در اندروید ۸.۱ معرفی شد، یک رابط کاربری امن برای احراز هویت کاربر با استفاده از فاکتور دانش قفل صفحه (LSKF) مانند پین، الگو و رمز عبور فراهم میکند.
ویور جایگزین قابلیت تأیید LSKF در Gatekeeper شده است. با این حال، Gatekeeper هنوز برای تولید توکنهای احراز هویت سختافزاری استفاده میشود.
In Android 9 and higher, CDD 9.11.2 requires devices supporting StrongBox to provide dedicated secure hardware that backs secure user authentication. Implementing the Weaver HAL using this secure hardware satisfies the "secure user authentication" requirement.
در دستگاههایی که فاقد عنصر امنیتی (SE) اختصاصی هستند، ویور همچنان میتواند در یک محیط اجرای قابل اعتماد (TEE) مانند Trusty پیادهسازی شود.
در اندروید ۱۷ و بالاتر، پیادهسازی ویور حتی در دستگاههایی که عنصر امنیتی اختصاصی ندارند، اکیداً توصیه میشود.
قطعات
ویور از سه جزء تشکیل شده است:
- رابط هوش مصنوعی ویور (
IWeaver) : مشخصات رسمی HAL. اندروید ۱۳ و پایینتر به جای AIDL از HIDL استفاده میکرد. - سرویس لایه انتزاعی سختافزار ویور (HAL) : یک فرآیند اندروید مختص فروشنده که رابط
IWeaverرا پیادهسازی میکند. - برنامهی کاربردی قابل اعتماد ویور (TA) : منطق اصلی که در یک محیط امن اجرا میشود. این برنامه تأیید LSKF را انجام میدهد و محدودیت سرعت را اعمال میکند. سرویس HAL با استفاده از یک کانال امن مخصوص پیادهسازی با TA ارتباط برقرار میکند.
رابط
رابط کاربری ویور، آرایهای با اندازه ثابت از اسلاتهای پایدار را ارائه میدهد که هر کدام شامل یک کلید با اندازه ثابت و یک مقدار با اندازه ثابت هستند. هر اسلات با شناسه (ID) خود، یک عدد صحیح در بازه [0, numSlots - 1] شناسایی میشود. مقدار یک اسلات تنها زمانی قابل دسترسی است که کلیدی مطابق با کلید ذخیره شده ارائه شود.
رابط کاربری ویور عمدتاً شامل موارد زیر است:
-
getConfig(): تعداد اسلاتها، اندازه کلید و اندازه مقدار پشتیبانی شده توسط پیادهسازی را بازیابی میکند. -
write(): اسلات مشخص شده را با یک جفت کلید-مقدار جدید بازنویسی میکند. این عملیات اتمیک است و دادههای قبلی را برای همیشه غیرقابل بازیابی میکند (حذف امن). -
read(): تلاش میکند تا مقدار اسلات مشخص شده را بازیابی کند. این کار تنها زمانی موفقیتآمیز است که مهلت زمانی محدودکننده سرعت (که توسط TA اعمال میشود) فعال نباشد و کلید ارائه شده دقیقاً با کلید ذخیره شده مطابقت داشته باشد. -
warmUp(): در اندروید ۱۷ و بالاتر، اشارهای میکند که ممکن است به زودی عملیات خواندن یا نوشتن انجام شود.
برای مشخصات کامل رابط، به IWeaver.aidl مراجعه کنید.
استفاده توسط اندروید
وقتی پیادهسازی Weaver در دسترس باشد، LockSettingsService در سرور سیستم اندروید از آن برای محافظت از دادههای کاربر استفاده میکند. برای هر کاربر روی دستگاه، LockSettingsService یک اسلات Weaver را مدیریت میکند:
- کلید اسلات (
weaverKey): هش LSKF کاربر. اگر کاربر قفل صفحه نداشته باشد، از یک رشته پیشفرض استفاده میشود. - مقدار اسلات (
weaverSecret): یک راز رمزنگاریشده با آنتروپی بالا و تولید شده به صورت تصادفی.
weaverSecret طوری طراحی شده است که فقط توسط یکی از دو روش زیر قابل بازیابی باشد:
- ارائه
weaverKeyصحیح به TA ویور در چارچوب سیاست محدودکننده نرخ آن. - به خطر انداختن محیط امنی که Weaver TA در آن اجرا میشود. این کار قرار است بسیار دشوار باشد.
LockSettingsService از هر دو weaverKey و weaverSecret برای رمزگذاری رمز عبور مصنوعی کاربر استفاده میکند. از آنجا که رمز عبور مصنوعی از فضای ذخیرهسازی رمزگذاریشدهی اعتبارنامه (CE) کاربر برای رمزگذاری مبتنی بر فایل (FBE) و کلیدهای احراز هویت کاربر در Android Keystore محافظت میکند، دادهها تا زمانی که Weaver رمز را منتشر نکند، غیرقابل دسترس باقی میمانند.
در اندروید ۱۷ و بالاتر، LockSettingsService هنگام شروع ورود LSKF، متد warmUp() در Weaver را فراخوانی میکند. پیادهسازیهای Weaver میتوانند از این سیگنال برای انتقال سختافزار امن از حالت کممصرف به منظور کاهش تأخیر برای درخواست read() بعدی استفاده کنند.
ویور در مقابل دروازهبان
از لحاظ تاریخی، HALِ دروازهبان، دو نقش متمایز را در یک فراخوانی verify() انجام میداد:
- تأیید : بررسی LSKF، با محدود کردن سرعت اعمال شده توسط TEE.
- گواهی : صدور یک
HardwareAuthTokenبرای اطلاعرسانی به KeyMint (که قبلاً Keymaster نام داشت) مبنی بر موفقیتآمیز بودن احراز هویت LSKF.
چرا به ویور روی آوردید؟
با معرفی توکنهای بازنشانی رمز عبور امن در اندروید ۸.۱، «رمز عبور مصنوعی» به راز رمزنگاری اصلی تبدیل شد. دو نقشی که در بالا توضیح داده شد، اکنون توسط ثبتهای جداگانهی Gatekeeper انجام میشوند، یکی برای LSKF تحت userId + 100000 و دیگری برای رمز عبور مصنوعی تحت userId .
ویور برای ایفای نقش اول معرفی شد و از یک رابط HAL سادهتر با پشتیبانی از پیادهسازیهای مبتنی بر عنصر امن (SE) استفاده میکرد.
| ویژگی | ویور | دروازهبان |
|---|---|---|
| حذف امن | حذف امن مورد نیاز است و پیادهسازی آن آسان است زیرا رابط از تعداد ثابتی از اسلاتهای با اندازه ثابت استفاده میکند. | حذف امن الزامی نیست و پیادهسازی آن دشوار است زیرا رابط کاربری از تعداد نامحدودی از ثبتنامها پشتیبانی میکند. |
| سختافزار | برای SEها بهینه شده، اما در TEEها نیز کار میکند. | عملاً فقط برای TEE. پیادهسازی آن در SE با طراحی فعلی، مزیت امنیتی ایجاد نمیکند. |
| مدیریت خطا | کدهای خطای واضحتر | کدهای خطای مبهم. در نتیجه، صفحه قفل بین LSKF های نادرست و خرابی های نامرتبط تفاوتی قائل نمی شود. |
| اتمی بودن | کد موجود در LockSettingsService که از Weaver استفاده میکند، تغییرات LSKF را به صورت اتمی انجام میدهد. دادههای جدید در یک اسلات جدید Weaver نوشته میشوند و اسلات قدیمی فقط زمانی پاک میشود که انجام این کار بیخطر باشد. | The code in LockSettingsService that uses Gatekeeper doesn't perform LSKF changes atomically. All user data may be lost if something goes wrong while the LSKF is being changed. |
کد مرجع
AOSP شامل دو پیادهسازی مرجع از Weaver است:
- در اندروید ۱۷ و بالاتر،
system/weaver/شامل پیادهسازی Weaver برای محیطهای امن عمومی است. - در اندروید ۸.۱ و بالاتر،
external/libese/شامل پیادهسازی Weaver برای عناصر امن سازگار با ISO/IEC7816-4 است.
آزمایش
برای اعتبارسنجی پیادهسازی Weaver، از VtsHalWeaverTargetTest استفاده کنید:
atest VtsHalWeaverTargetTest
یا:
vts-tradefed run vts -m VtsHalWeaverTargetTest