Silabs 21Q2 safe device BLE آزمایشگاه امنیت
راهنمای آزمایشگاه امنیت BLE
در این آزمایشگاه نحوه طراحی یک دستگاه BLE ایمن تر را خواهید دید. ما با یک over شروع خواهیم کردview نحوه استفاده از برخی از ویژگیهای پشته و رفتن به برخی توصیههای کلی در مورد تکنیکهای اتصالات امنتر و در نهایت نحوه استفاده از گواهیهای دستگاه بر روی BLE برای شناسایی یک دستگاه جانبی به عنوان معتبر را خواهیم دید.
شروع به کار
بلوتوث اسampبرنامهای که روی آن میسازید برای استفاده با بوت لودر در نظر گرفته شده است. اگر با یک EFR32MG21B کاملاً جدید کار می کنید، بوت لودر نخواهد داشت. می توانید یک بوت لودر از پیش ساخته شده را در platform\bootloader\s پیدا کنیدampپوشه le-apps\bootloader-storage-internalsingle\efr32mg21a010f1024im32-brd4181a SDK شما.
- با یک سوک خالی شروع کنیدampبرنامه le این اسampبرنامه le به عنوان یک الگو استفاده می شود و نقطه شروع خوبی برای هر برنامه BLE است.
- Silicon Labs Project Wizard را از استودیو Simplicity باز کنید File منو -> جدید.
- BRD4181C را انتخاب کرده و روی دکمه «بعدی» کلیک کنید.
- بر روی کادر انتخاب «بلوتوث (9)» در قسمت نوع فناوری کلیک کنید.
- «Bluetooth – SoC Empty» را هایلایت کرده و روی next کلیک کنید.
- روی دکمه "پایان" کلیک کنید.
- اکنون می توانید برخی از ویژگی ها را اضافه کنید تا ببینید چگونه با ویژگی های محافظت شده و محافظت نشده متفاوت رفتار می شود.
- slcp پروژه را باز کنید file با دوبار کلیک کردن روی آن در پنجره Project Explorer
- تب 'SOFTWARE COMPONENTS' را برجسته کرده و ابزار پیکربندی GATT را مانند تصویر زیر باز کنید:
و از ابزار import نشان داده شده در زیر برای وارد کردن gatt_configuration.btconf استفاده کنید file از پوشه سرور در مواد ارائه شده.
پایگاه داده گات دارای یک سرویس سفارشی به نام "آموزش" است که برخی از داده ها محافظت شده و برخی دیگر محافظت می شوند. این به شما این امکان را می دهد که هنگام تلاش برای دسترسی به یک ویژگی محافظت شده در مقابل یک ویژگی محافظت نشده، آنچه را که اتفاق می افتد، مقایسه کنید. این یک راه سریع برای ساخت دستگاهی با امنیت بسیار ابتدایی است.
- ما از پورت سریال برای چاپ روی کنسول در Simplicity Studio استفاده خواهیم کرد تا آنچه را که در برنامه میگذرد ردیابی کنیم. ساده ترین راه برای یافتن این مؤلفه ها جستجوی آنها در گفتگوی SOFTWARE COMPONENTS است که نشان داده شده است:
-
- مؤلفه IO Stream USART را نصب کنید
- مولفه IO Stream Retarget STDIO را نصب کنید
- مؤلفه استاندارد I/O را نصب کنید
- کامپوننت Log را نصب کنید
- کامپوننت Board Control را باز کنید و "Enable Virtual COM UART" را روشن کنید.
- روی آداپتور در پانل «Debug adapters» کلیک راست کرده و «Launch Console» را انتخاب کنید. تب 'Serial 1' را انتخاب کنید و مکان نما را در قسمت ورودی متن پنجره کنسول قرار دهید و enter را فشار دهید تا کنسول بیدار شود.
-
- یک متغیر محلی در sl_bt_on_event()، موجود در app.c، برای ذخیره دستگیره اتصال ایجاد کنید. متغیر باید ثابت باشد زیرا این تابع هر بار که رویدادی توسط پشته مطرح می شود فراخوانی می شود و ما می خواهیم مقدار ثابت باشد. دستگیره اتصال در آینده مورد استفاده قرار خواهد گرفت
بخش آزمایشگاه
- برخی از دستورات app_log() را برای رویدادها درج کنید تا ببینید چه زمانی متصل هستیم، حالتهای امنیتی و غیره
-
- هدر app_log.h را اضافه کنید file
- sl_bt_evt_connection_opened - دستگیره باند را چاپ کنید و دستگیره اتصال را ذخیره کنید. اگر دسته باند 0xFF باشد، هیچ پیوندی بین دستگاههای متصل وجود ندارد. کنترل کننده رویداد موجود را طوری تغییر دهید که چیزی شبیه به این باشد:
- sl_bt_evt_connection_parameters - حالت امنیتی. این کار به این منظور انجام می شود که بتوانید ببینید چه زمانی حالت امنیتی تغییر می کند. در شماره گذاری حالت های امنیتی که حالت امنیتی 1 با مقدار 0 و غیره شماره گذاری می شود تفاوت وجود دارد. کنترل کننده رویداد زیر را به برنامه خود اضافه کنید:
- sl_bt_evt_connection_closed_id. این کنترل کننده رویداد برای به روز رسانی دسته اتصال اصلاح شده است. مقدار 0xFF برای نشان دادن عدم وجود اتصال فعال استفاده می شود. دستور app_log() برای چاپ دلیل بسته شدن اتصال استفاده می شود، لیست کدهای وضعیت اینجا است. کنترل کننده رویداد موجود را طوری تغییر دهید که چیزی شبیه به این باشد:
- هدر app_log.h را اضافه کنید file
-
- پروژه را بسازید و فلش کنید. در این مرحله، ما s را اجرا می کنیمampبرای مشاهده نحوه عملکرد آن بدون هیچ تغییری، علاوه بر پایگاه داده گات.
- به صورت زیر با برنامه موبایل EFRConnect ارتباط برقرار کنید:
-
- روی نماد «Bluetooth Browser» ضربه بزنید.
- روی نماد «اتصال» در دستگاهی به نام «آموزش» ضربه بزنید.
-
- ویژگی محافظت نشده را به صورت زیر بخوانید:
-
- روی پیوند «اطلاعات بیشتر» زیر سرویس ناشناس با UUID a815944e-da1e-9d2a- 02e2-a8d15e2430a0 ضربه بزنید.
- با ضربه زدن روی نماد «خواندن»، مشخصه محافظت نشده، UUID f9e91a44-ca91-4aba-1c33-fd43ca270b4c را بخوانید. اینجا جای تعجب نیست از آنجایی که مشخصه به هیچ وجه محافظت نمی شود، به صورت متن ساده ارسال می شود.
-
- اکنون مشخصه محافظت شده، UUID d4261dbb-dcd0-daab-ec95-deec088d532b را بخوانید. تلفن همراه شما باید از شما بخواهد جفت و متصل شوید، این پیام ممکن است بسته به سیستم عامل تلفن همراه شما متفاوت باشد. پس از اینکه درخواست جفت شدن را پذیرفتید، باید در کنسول پیامی به شرح زیر ارسال کنید:
توجه داشته باشید: ضمیمه A در انتهای این کتابچه راهنمای خلاصه ای از قابلیت های I/O و روش های جفت سازی برای مرجع است. پیوست B حالت های امنیتی بلوتوث را خلاصه می کند.
پیکربندی مدیر امنیت
مدیر امنیت بخشی از پشته بلوتوث است که تعیین می کند کدام ویژگی های امنیتی استفاده می شود. این ویژگیها عبارتند از محافظت از انسان در وسط (MITM)، اتصالات امن LE (معروف به ECDH)، نیاز به تأیید برای اتصال، و غیره. مدیر امنیتی همچنین قابلیتهای I/O را مدیریت میکند که برای تعیین روش مورد استفاده برای جفتسازی استفاده میشود. /bonding (برای خلاصه به پیوست A مراجعه کنید). در این بخش یک راه اندازی ساده را مشاهده خواهید کرد.
- SM را با پیکربندی دلخواه تنظیم کنید. سخت افزار این آزمایشگاه نمایش رمز عبور روی کنسول را آسان می کند. ورود رمز عبور برای فعال کردن حفاظت MITM الزامی است. کد زیر را به کنترل کننده رویداد sl_bt_system_boot_id خود اضافه کنید. این کار انسان در وسط را فعال می کند و به دستگاه راه دور اطلاع می دهد که ما توانایی نمایش کلید عبور را داریم، اما تمام.
- برای نمایش کلید عبور در کنسول، یک کنترل کننده رویداد مانند شکل زیر مورد نیاز است:
- حالت اتصال، حداکثر تعداد اتصالات و غیره را تنظیم کنید. برای شروع از کد زیر استفاده کنید:
از این تنظیمات میتوان برای محدود کردن توانایی مهاجم در ارتباط با دستگاه شما استفاده کرد. اگر محصول شما فقط باید یک کاربر داشته باشد، میتوانید حداکثر اوراق قرضه را به 1 محدود کنید. یک مکان خوب برای افزودن این تماسها در کنترلکننده رویداد sl_bt_system_boot_id است. ما در حال حاضر باندینگ را فعال نمیکنیم تا بقیه بخشهای آزمایشگاه راحتتر پیش برود، اما یک خطمشی باندینگ تعیین میکنیم که فقط یک اوراق قرضه را مجاز کند. برای مرجع، مستندات این APIها در اینجا و اینجا یافت می شوند.
- کنترلکنندههای رویداد را برای sl_bt_evt_sm_bonded_id و sl_bt_evt_sm_bonding_failed_id اضافه کنید. استفاده اصلی برای این رویدادها در حال حاضر آموزنده است، اما بعداً در آزمایشگاه، عملکرد را اضافه خواهید کرد.
- بسازید و به برد مورد نظر فلش کنید. با EFRConnect وصل شوید و مشخصه محافظت شده را مانند قبل بخوانید. این بار یک رمز عبور روی کنسول نمایش داده می شود. هنگامی که از شما خواسته شد این کلید عبور را در تلفن همراه خود وارد کنید.
- تأیید پیوند را امتحان کنید. این ویژگی به کاربر این امکان را میدهد که درخواستهای باندینگ را تایید کند. انجام این کار به برنامه کنترل میکند که با کدام دستگاههای همتا متصل میشود. یک امکان این است که کاربر را ملزم به فشار دادن یک دکمه قبل از اجازه دادن به پیوند کنید.
- تنظیمات بلوتوث را در تلفن همراه خود باز کنید و اتصال به دستگاه EFR32 را جدا کنید. پیاده سازی تلفن همراه متفاوت است، بنابراین ممکن است این مرحله ضروری نباشد. اگر دستگاه 'Training' را در تنظیمات بلوتوث خود نمی بینید، فقط به مرحله بعدی بروید.
- در اجزای نرم افزار، یک نمونه از کنترل کننده دکمه ساده را نصب کنید.
- هدر را درج کنید file sl_simple_button_instances.h در app.c
- یک کنترل کننده برای رویداد sl_bt_evt_sm_bonding_confirm_id اضافه کنید. وظیفه اصلی این کنترل کننده رویداد این است که به کاربر اطلاع دهد که یک دستگاه راه دور در حال درخواست پیوند جدید است.
- یک عملکرد پاسخ به تماس را برای کنترل کننده دکمه ساده اضافه کنید تا سیگنالی به پشته بلوتوث ارسال کند که نشان می دهد یک دکمه فشرده شده است. این فراخوانی پیشفرض را لغو میکند که به سادگی برمیگردد.
- یک کنترل کننده رویداد سیگنال خارجی اضافه کنید. این رویداد در پاسخ به دریافت سیگنال مانند مرحله قبل مطرح می شود. رویداد سیگنال خارجی برای تایید اتصال استفاده خواهد شد.
- تماس را به sl_bt_sm_configure تغییر دهید تا به تایید پیوند نیاز داشته باشید
- بازسازی و فلش.
- با EFRConnect وصل شوید و مشخصه محافظت شده را مانند قبل بخوانید. اکنون پیامی به شرح زیر در کنسول مشاهده خواهید کرد:
PB0 را فشار دهید تا اتصال را تأیید کنید. اکنون کنسول رمز عبوری را که برای اتصال روی تلفن همراه وارد می شود نمایش می دهد. برای تکمیل فرآیند اتصال، کلید عبور را وارد کنید.
نکته: هنگامی که پشته رویدادی را ارسال می کند که مدیریت نشده است، از حالت پیش فرض در کنترل کننده رویداد برای چاپ پیام استفاده کنید. پشته ممکن است سعی کند چیز مهمی را به شما بگوید.
فراتر از اصول
در این مرحله، شما پیشرفت کرده ایدtage از ویژگی های امنیتی است که پشته ما ارائه می دهد. اکنون بیایید پیاده سازی را با استفاده عاقلانه از ویژگی هایی که در اختیار داریم بهبود دهیم. مراحل زیر اختیاری و مستقل از هم هستند، میتوانید بعد از هر کدام بسازید و فلش کنید تا رفتار را ببینید یا همه را با هم امتحان کنید.
- در صورت تلاشهای ناموفق باند، اتصال را قطع کنید. اینجا مکان خوبی برای شناسایی تهدیدات است. اگر دستگاه راه دور از رمزگذاری/احراز هویت پشتیبانی نمی کند یا کلیدهای صحیح را ندارد، ممکن است یک هکر باشد. بنابراین، بیایید ارتباط را قطع کنیم. در رویداد sl_bt_sm_bonding_failed_id، یک تماس به sl_bt_connection_close() اضافه کنید. API در اینجا مستند شده است.
با وارد کردن رمز عبور اشتباه می توانید این ویژگی را آزمایش کنید.
- فقط در زمانهای معینی اجازه اتصال میدهد. این زمان زمانی را که مهاجم باید برای ایجاد پیوند ایجاد کند محدود میکند و استفاده از ویژگی «فقط اجازه اتصالات پیوندی» را ممکن میسازد. طراح می تواند نحوه فعال یا غیرفعال کردن حالت bondable را انتخاب کند. برای اهداف نمایشی در اینجا، یک "حالت راه اندازی" را با PB1 فعال می کنیم و از یک تایمر برای غیرفعال کردن آن پس از 30 ثانیه استفاده می کنیم.
- نمونه دوم رابط دکمه ساده را نصب کنید. این امکان استفاده از PB1 را فراهم می کند.
- پاسخ تماس را تغییر دهید تا سیگنال دیگری به پشته ارسال شود تا اتصال فعال/غیرفعال شود. نتیجه باید چیزی شبیه به این باشد:
- کنترل کننده رویداد سیگنال خارجی را طوری تغییر دهید که این سیگنال جدید را کنترل کند. نتیجه باید به این صورت باشد:
- یک کنترل کننده رویداد برای رویداد sl_bt_evt_system_soft_timer_id اضافه کنید. این برای غیرفعال کردن حالت تنظیم استفاده می شود.
- کد زیر را می توان برای فعال کردن حالت bondable و اجازه دادن به همه اتصالات یا غیرفعال کردن حالت bondable و فقط اجازه اتصال از دستگاه های متصل استفاده کرد:
- تماس زیر را در کنترل کننده رویداد sl_bt_system_boot_id اضافه کنید
- پروژه را بسازید و روی دستگاه فلش کنید.
- سعی کنید با EFRConnect به دستگاه متصل شوید. اتصال باید خراب شود.
- حالا قبل از اتصال با EFRConnect، PB1 را فشار دهید. این بار اتصال موفقیت آمیز خواهد بود. پس از 30 ثانیه، پیامی را در کنسول مشاهده می کنید که نشان می دهد دستگاه در حال خروج از حالت تنظیمات است. این بدان معناست که حالت bondable اکنون غیرفعال است.
- افزایش امنیت در ایجاد یک اتصال. از آنجایی که امنیت اختیاری است، ما باید در اسرع وقت به جای تکیه بر ویژگی های GATT درخواست یک اتصال رمزگذاری شده را داشته باشیم. API در اینجا مستند شده است. یک مکان خوب برای فراخوانی این API در رویداد sl_bt_evt_connection_opened_id است. دستگیره اتصال در متغیر اتصال موجود است.
هویت امن
اکنون که دستگاه بلوتوث ایمنتری داریم، اجازه میدهیم مرحله احراز هویت را بهبود ببخشیم. قبلاً نحوه تأیید هویت امن دستگاههای خرک را با خط فرمان در آزمایشگاههای آموزشی قبلی مشاهده کردهاید. در این قسمت خواهیم دید که چگونه یک دستگاه BLE می تواند هویت دستگاه BLE دیگر را با درخواست زنجیره گواهی خود و ارسال چالش تایید کند. تمام قطعات صندوق ایمنی دارای گواهینامه دستگاه و گواهی دسته ای خود هستند. گواهیهای کارخانه و ریشه در برنامه مشتری کدگذاری میشوند تا تأیید کل زنجیره گواهی را فعال کنند. برای جزئیات بیشتر در مورد هویت امن به AN1268 مراجعه کنید.
- یک بافر جهانی برای ذخیره امضای گواهی دستگاه به صورت زیر تعریف کنید:
- پیکربندی مدیر امنیتی را برای استفاده از جفت شدن JustWorks تنظیم کنید. این کار به گونه ای انجام می شود که اتصال رمزگذاری شود. در عمل، حفاظت MITM باید استفاده شود، اما برای ساده نگه داشتن آزمایشگاه، ما از JustWorks استفاده خواهیم کرد. تماس را به sl_bt_sm_configure به حالت زیر تغییر دهید:
همچنین، فراخوانی setup_mode (true) را در کنترل کننده رویداد system_boot بیان کنید.
- helpers.c را از مطالب ارائه شده باز کنید و محتویات را در app.c کپی کنید. این توابع پاسخ به تماس وظایفی مانند بخش بندی گواهی ها به گونه ای که بتوان آنها را از طریق BLE ارسال کرد، تأیید زنجیره گواهی، و تولید/تأیید چالش را انجام می دهد.
- لازم است حداکثر اندازه واحد انتقال (MTU) تعیین شود تا بتوان گواهی ها را قطعه بندی و دوباره جمع کرد. همانطور که در اینجا نشان داده شده است، یک متغیر سراسری برای ذخیره MTU تعریف کنید:
سپس یک کنترلر رویداد برای رویداد تبادل شده GATT MTU اضافه کنید، همانطور که در زیر نشان داده شده است:
- سه ویژگی داده کاربر وجود دارد که می توان آنها را خواند. این ویژگی ها برای ارتباط با گواهی دستگاه، گواهی دسته ای و چالش استفاده می شود. برای رسیدگی به این درخواستهای خواندن کاربر از یک تابع تماس مجدد استفاده میشود. یک کنترل کننده برای فراخوانی این تابع مانند شکل زیر اضافه کنید:
تماس برگشتی از MTU از مرحله #2 برای بخشبندی و ارسال گواهیها در صورت نیاز استفاده میکند. همچنین ارسال چالش امضا شده را انجام می دهد.
- کلاینت با نوشتن یکی از مشخصه های GATT یک چالش ارسال می کند، یک عدد تصادفی که توسط سرور امضا می شود. به همین دلیل، برنامه باید یک کنترل کننده برای رویداد درخواست نوشتن کاربر به شرح زیر داشته باشد:
- پشتیبانی از هویت امن را اضافه کنید files به پروژه:
- app_se_manager_macro.h، app_se_manager_secure_identity.c و app_se_secure_identity.h از مواد ارائه شده به پروژه. اینها files حاوی برخی از توابع کمکی برای کارهایی مانند دریافت اندازه گواهی، دریافت کلید عمومی دستگاه و امضای چالش است.
- app_se_manager_secure_identity.h را در app.c قرار دهید.
- gatt_configuration-attest.btconf ارائه شده را از مواد ارائه شده وارد کنید. این پایگاه داده GATT گواهی امن نامیده می شود که شامل چهار ویژگی است که برای تأیید هویت دستگاه ما استفاده می شود. اینها شامل گواهی دستگاه، گواهی دسته ای، چالش و پاسخ است.
- مشتری که برای شبیه سازی دستگاهی مانند دروازه استفاده می شود، به عنوان یک پروژه کامل ارائه می شود زیرا ساخت آن پیچیده تر است. به طور کلی عملکرد مشتری به شرح زیر است:
- دستگاههایی را که سرویس گواهی امن را تبلیغ میکنند اسکن میکند و به آنها متصل میشود.
- خدمات و ویژگی های پایگاه داده گات را کشف می کند.
- گواهینامه های دستگاه و دسته را می خواند و زنجیره گواهی را با استفاده از گواهی کارخانه و روت که در فلش ذخیره کرده است تأیید می کند.
- یک چالش تصادفی به سرور ارسال می کند.
- تلاش برای تأیید پاسخ به چالش.
- در صورت عدم موفقیت هر یک از تأییدها، اتصال را میبندد.
- پروژه سرور را روی سرور WSTK /radioboard خود بسازید و فلش کنید.
- پروژه مشتری را از پوشه مشتری در مواد ارائه شده وارد کنید. پروژه مشتری را روی WSTK/radioboard مشتری خود بسازید و فلش کنید.
- Reset را روی کلاینت WSTK فشار دهید و کنسول سریال را باز کنید. مشتری شروع به اسکن دستگاههایی میکند که سرویس هویت امن ما را تبلیغ میکنند و وقتی یکی را پیدا کرد به آن متصل میشود.
- مشتری پیام هایی را نشان می دهد که نشان می دهد سرور را با سرویس مورد نظر و پیام های وضعیت در مورد تأیید زنجیره گواهی پیدا کرده است.
- اگر تأیید تأیید شود، مشتری یک شماره تصادفی تولید می کند که چالش نامیده می شود و آن را به سرور ارسال می کند. سرور چالش را با کلید دستگاه خصوصی خود که به طور ایمن نگهداری می شود و امضای آن به مشتری باز می گردد، امضا می کند، این پاسخ چالش نامیده می شود. سپس مشتری از کلید عمومی موجود در گواهی دستگاه که قبلاً دریافت کرده است برای تأیید امضا استفاده می کند. این کار برای تأیید اینکه سرور واقعاً کلید خصوصی را دارد انجام می شود که ادعا می کرد دارد. اگر چالش به درستی تأیید شود، پیامی به همین منظور نمایش داده می شود. در غیر این صورت، اتصال بسته می شود و پیامی نمایش داده می شود که دلیل آن را توضیح می دهد.
- اکنون یک گواهی نامعتبر ارسال کنید تا تأیید کنید که تأیید واقعاً کار می کند. شما می توانید user_read_request_cb() را تغییر دهید تا داده های گواهی یا پاسخ چالش را خراب کند.
پیوست A – قابلیت های ورودی/خروجی و روش های جفت سازی 
ضمیمه B - حالت ها و سطوح امنیتی
حالت امنیتی 1 تنها حالتی است که برای بلوتوث کم انرژی در پشته Silicon Labs پشتیبانی می شود. سطوح به شرح زیر است:
- سطح 1 بدون امنیت
- سطح 2 جفت شدن احراز هویت نشده با رمزگذاری
- جفت شدن با رمزگذاری تأیید شده سطح 3
- اتصالات امن تایید شده سطح 4 با رمزگذاری قوی (تبادل کلید ECDH)
اسناد / منابع
![]() |
Silabs 21Q2 safe device BLE آزمایشگاه امنیت [pdf] دفترچه راهنمای کاربر آزمایشگاه امنیتی دستگاه BLE ایمن 21Q2، آزمایشگاه امنیتی دستگاه BLE ایمن، آزمایشگاه امنیت |