TQMa93-лого

TQMa93 Безбедно покретање

TQMa93-Secure-Boot-product

Информације о производу

Спецификације

  • Модел: TQMa93xx
  • Оперативни систем: Линукс (Убунту 22.04)
  • Безбедносна функција: Безбедно покретање

ПАЖЊА: Осигурачи (једнократно програмабилни) се подешавају у овом упутству, овај процес је неповратан. Стога се топло препоручује коришћење развојног обрасца за овај водич.

Процедура

Овај водич објашњава како се ланац поверења може успоставити од покретачког програма преко Линукс кернела до коренске партиције помоћу dm-verity.
Следећа табела даје поједностављени опис корака укључених у креирање ланца поверења и верификације током процеса покретања:

TQMa93-Secure-Boot-01

Припрема

Следећи пројекти су потребни за креирање потписаног бут стрима за TQMa93xx:

Покретни ток система за TQMa93xx се састоји од неколико артефаката. Да бисте добили све ове артефакте из истог извора, препоручује се коришћење радног простора TQ Yocto ci-meta-tq. Упутства која су тамо укључена могу се пратити за изградњу комплетне слике (tq-image-weston-debug или tq-image-generic-debug) за један од следећих уређаја заснованих на TQMa93xx:

  • ткма93xx-мба91xxца.цонф
  • ткма93xx-мба93xxца.цонф
  • ткма93xxla-мба93xxla.conf

ПАЖЊА: Да бисте креирали U-Boot са функционалношћу безбедног покретања (AHAB), следећи ред мора бити додат у local.conf:
DISTRO_FEATURES:append = „безбедно“
Затим, потребно је поново креирати ток покретања:
$ bitbake imx-boot

Радни простор TQ Yocto може се користити и за креирање слике комплетног ланца поверења представљеног овде. Подешавања потребна за ово су описана у одељку 5.2.
Изворни кодови за Линукс кернел и U-Boot су опциони, али се препоручују. Могу се преузети са Гитхаба:

У-Боот

Генерисање кључева
Потписивање и верификација покретачког тока се врше коришћењем инфраструктуре јавног кључа (PKI). Ако већ није доступан, алат за потписивање кода може се користити за креирање одговарајућег PKI-а. CST 3.4.x је tar.gz архива коју је потребно само распаковати. Није потребна даља инсталација. Следећи кораци се могу користити за генерисањеampкључеви за овај водич:

ПАЖЊА: Путање су релативне у односу на фасциклу извучену из архиве.

  1. Унесите серијски број првог сертификата у keys/serial (file мора бити креирано): 12345678
  2. Унесите лозинку два пута у keys/key_pass.txt (file мора бити креиран):
    моја_лозинка моја_лозинка
  3. Креирајте PKI стабло:
    $ кеис/ахаб_пки_трее.сх -екистинг-ца н -кт ецц -кл п521 -да сха512 -дуратион 10 -срк-ца н
    За објашњење опција, погледајте Кориснички водич који се налази у CST-у (у подфолдеру docs) или опцију –help горњег скрипта.
    Алтернативно, скрипта се може позвати и без опција и конфигурисати у интерактивном режиму.
    Скрипта генерише кључеве у keys/ и сертификате у crts/.
  4. Направите SRK табелу и SRK хеш табелу:
    $ linux64/bin/srktool -a -s sha512 -d sha256 -t SRK_1_2_3_4_table.bin \
    -e SRK_1_2_3_4_fuse.bin -f 1 -c
    crts/SRK1_sha512_secp521r1_v3_usr_crt.pem,crts/SRK2_sha512_secp521r1_v3_usr_crt. pem,crts/SRK3_sha512_secp521r1_v3_usr_crt.pem,crts/SRK4_sha512_secp521r1_v3_usr_ crt.pem
  5. Запишите SRK хеш таблицу у fuses:
    ПАЖЊА: Овај корак је могућ само једном и неповратан је. Следеће вредности су само примеренеampлес и морају бити замењене вашим сопственим вредностима.
    • Прикажи хешеве:
      $ hexdump -e '/4 “0x”' -e '/4 “%X””\n”' SRK_1_2_3_4_fuse.bin
      0к00000000
      0к11111111
      0к22222222
      0к33333333
      0к44444444
      0к55555555
      0к66666666
      0к77777777
    • Запишите хешеве у фузе (TQMa93xx U-Boot):
      => осигурач прог 16 0 0x00000000
      => осигурач прог 16 1 0x11111111
      => осигурач прог 16 2 0x22222222
      => осигурач прог 16 3 0x33333333
      => осигурач прог 16 4 0x44444444
      => осигурач прог 16 5 0x55555555
      => осигурач прог 16 6 0x66666666
      => осигурач прог 16 7 0x77777777

 Креирање потписаног покретачког тока

 U-Boot Proper и ATF

  1. Копирајте потребно fileс (претпоставља се успешна изградња TQ слике, видети горе, или U-Boot извори):
    • ARM поуздани фирмвер: ${DEPLOY_DIR_IMAGE}/bl31-imx93.bin, преименујте у bl31.bin
    • Правилан У-Чут:
      ${DEPLOY_DIR_IMAGE}/u-boot.bin
      Ово file је линк, па га копирајте са cp --dereference или прикажи и копирајте оригинал file са ls –-long
      or
      из самокомпилираних U-Boot извора
      Ове fileДатотеке морају бити копиране у imx-mkimage/iMX9/. Датотека imx-mkimage се може добити из горе поменутог Github репозиторијума, није потребна инсталација.
  2. Направите контејнер помоћу U-Boot Proper-а и ATF-а (покрените у фолдеру imx-mkimage):
    $ make SOC=iMX9 REV=A1 u-boot-atf-container.img include autobuild.mak
    • CST: КОНТЕЙНЕР 0 офсет: 0x0
    • CST: КОНТЕЙНЕР 0: Блок потписа: офсет је на 0x110
    • Офсети = 0x0 0x110
    • ДОНЕ.
    • Напомена: Молимо вас да копирате слику у офсет: IVT_OFFSET + IMAGE_OFFSET
      ПАЖЊА: Офсети за контејнер и блок потписа су потребни у следећем кораку.
    • Артефакт imx-mkimage/iMX9/u-boot-atf-container.img затим мора бити копиран у CST фолдер распакован у кораку „3.1 Генерисање кључева“.
  3. Пренесите офсет контејнера и блока потписа у секвенцу команди File (ЦСФ):
    • [Заглавље]
    • Циљ = АХАБ
    • Верзија = 1.0
    • [Инсталирај Шах Рукх Кана]
    • File = „SRK_1_2_3_4_table.bin“
    • Source = “crts/SRK1_sha512_secp521r1_v3_usr_crt.pem”
    • Индекс извора = 0
    • Изворни скуп = OEM
    • Опозиви = 0x0
    • [Аутентификујте податке]
    • File = „u-boot-atf-container.img“
    • Офсети = 0x0 0x110
    • ЦСФ заснован на: https://github.com/nxp-imx/uboot-imx/blob/lf_v2024.04/doc/imx/ahab/csf_examples/csf_uboot_atf.txt
    • CSF се такође чува у CST фолдеру под називом csf_uboot_atf.txt који је распакован у кораку „3.1 Генерисање кључева“.
  4. Контејнер за потпис (путања релативна до CST фасцикле):
    $ linux64/bin/cst -i csf_uboot_atf.txt -o signed-u-boot-atf-container.img Потписани контејнер се затим мора копирати назад у imx-mkimage/iMX9/u-boot-atf-container.img. Обратите пажњу на преименовање у u-boot-atf-container.img.

 Комплетан бутстреам

  1. Копирајте потребно fileс (претпоставља се успешна изградња TQ слике, видети горе, или U-Boot изворног кода):
    • Фирмвер за Edgelock Secure Enclave: ${DEPLOY_DIR_IMAGE}/mx93a1-ahab-container.img
    • РАМ фирмвер: ${DEPLOY_DIR_IMAGE}/lpddr4*.bin
    • У-Бут ЗПЛ:
      ${DEPLOY_DIR_IMAGE}/u-boot-spl.bin
      Ово file је линк, па га копирајте са cp --dereference или прикажи и копирајте оригинал file са ls –-long
      or
      из самокомпилираних U-Boot извора
    • Потписан контејнер са U-Boot Proper и ATF из корака „3.2.1 U-Boot Proper и ATF“
      Ове fileТакође се морају копирати у imx-mkimage/iMX9/.
  2. Направи бутстрим
    • $ make -j8 SOC=iMX9 REV=A1 флеш_синглбоот
      укључи autobuild.mak
    • CST: КОНТЕЙНЕР 0 офсет: 0x400
    • CST: КОНТЕЙНЕР 0: Блок потписа: офсет је на 0x490
    • Офсети = 0x400 0x490
    • ДОНЕ.
    • НапоменаМолимо копирајте слику у офсет: IVT_OFFSET + IMAGE_OFFSET додајте u-boot-atf-container.img на 379 KB, psige=1024
    • 1145+0 записа у
    • Изашло је 1145+0 записа
    • 1172480 бајтова (1.2 МБ, 1.1 МиБ) копирано, 0.00266906 с, 439 МБ/с
    • ПАЖЊА: Офсети за контејнер и блок потписа су потребни у следећем кораку.
      Артефакт imx-mkimage/iMX9/flash.bin затим мора бити копиран у CST фолдер распакован у кораку „3.1 Генерисање кључева“.
  3. Пренесите офсет контејнера и блока потписа у секвенцу команди File (ЦСФ):
    • [Заглавље]
    • Циљ = АХАБ
    • Верзија = 1.0
    • [Инсталирај Шах Рукх Кана]
    • File = „SRK_1_2_3_4_table.bin“
    • Source = “crts/SRK1_sha512_secp521r1_v3_usr_crt.pem”
    • Индекс извора = 0
    • Изворни скуп = OEM
    • Опозиви = 0x0
    • [Аутентификујте податке]
    • File = „флеш.бин“
    • Офсети = 0x400 0x490
    • ЦСФ заснован на: https://github.com/nxp-imx/uboot-imx/blob/lf_v2024.04/doc/imx/ahab/csf_examples/csf_boot_image.txt
    • CSF се чува у CST фолдеру под називом csf_boot_image.txt, распакованом у кораку „3.1 Генерисање кључева“.
  4. Потпишите bootstream
    • linux64/bin/cst -i csf_boot_image.txt -o signed-flash.bin

Кораци за замену boot stream-а могу се наћи у BSP слоју (https://github.com/tq-systems/meta-tq) под мета-тк/док.

Верификација
Да бисте проверили да ли је потписани бут стрим валидан, користите команду ahab_status у U-Boot-у:

  • => ахаб_статус
  • Животни циклус: 0x00000008, ОЕМ отворено
  • Није пронађен ниједан догађај!
  • Ако се пронађе догађај, стримовање покретања је неважеће и неће моћи да се покрене на закључаном уређају.

За фалсификовање, може се покренути непотписани bootstream, а затим се може позвати ahab_status:

  • => ахаб_статус
  • Животни циклус: 0x00000008, ОЕМ отворено
  • 0x0287fad6
  • IPC = MU APD (0x2)
  • CMD = ELE_OEM_CNTN_AUTH_REQ (0x87)
  • ИНД = ИНД_НЕИСПРАВНОГ_КЉУЧА_ХЕША_ЕЛЕКТРОН (0xFA)
  • STA = ELE_SUCCESS_IND (0xD6)
  • 0x0287fad6
  • IPC = MU APD (0x2)
  • CMD = ELE_OEM_CNTN_AUTH_REQ (0x87)
  • ИНД = ИНД_НЕИСПРАВНОГ_КЉУЧА_ХЕША_ЕЛЕКТРОН (0xFA)
  • STA = ELE_SUCCESS_IND (0xD6)

 Закључајте уређај

ПАЖЊА: Овај корак је неповратан и треба га извршити само ако је потребно. Ако је конфигурација нетачна, овај корак ће резултирати неупотребљивим уређајем.

Уређај се може закључати у U-Boot-у помоћу команде ahab_close. То значи да ће се покренути само валидни boot stream-ови које је верификовао Boot ROM. Након поновног покретања приказује се следећи статус:

  • => ахаб_статус
  • Животни циклус: 0x00000020, OEM затворено
  • Није пронађен ниједан догађај!

FIT-Image

ПАЖЊА: Информације о путањи се односе на нову, празну фасциклу, нпр.
fit_image_work, или изворни код језгра, ако је самокомпилиран. У даљем тексту се назива радни директоријум.

Генерисање пара кључева
Асиметрични пар кључева се користи за потписивање FIT слике. Такав пар се може генерисати помоћу OpenSSL-а:

$ openssl genpkey -algorithm RSA -out dev.key -pkeyopt rsa_keygen_bits:2048
$ openssl req -batch -new -x509 -key dev.key -out dev.crt

Направи извор стабла слика

  • Направите изворни код стабла слика sign.its за FIT слику.
  • /дтс-в1/;
  • / {
  • опис = „Слика језгра за TQMa93xx“;
  • #адреса-ћелија = <1>;
  • слике {
  • језгро-1 {
  • опис = „Линукс језгро“;
  • подаци = /инцбин/(„Слика“);
  • тип = „језгро“;
  • лук = „арм64“;
  • ОС = „линукс“;
  • компресија = „gzip“;
  • учитавање = <0x90000000>;
  • унос = <0x90000000>;
  • хеш-1 {
  • алго = „ша256“;
  • };
  • };
  • фдт-1 {
  • опис = „Сравњени блоб стабла уређаја“;
  • подаци = /инцбин/(“ „);
  • тип = „равна_дт“;
  • лук = „арм64“;
  • компресија = „нема“;
  • учитавање = <0x97000000>;
  • хеш-1 {
  • алго = „ша256“;
  • };
  • };
  • };
  • конфигурације {
  • подразумевано = „conf-1“;
  • конф-1 {
  • опис = „Линукс језгро, FDT блоб“;
  • језгро = „језгро-1“;
  • фдт = „фдт-1“;
  • хеш-1 {
  • алго = „ша256“;
  • };
  • потпис-1 {
  • алго = „sha256,rsa2048“;
  • назнака-имеа-кључа = „dev“;
  • паддинг = „пкцс-1.5“;
  • слике-знакова = „језгро“, „фдт“;
  • };
  • };
  • };
  • };

 Креирање потписане FIT слике

Напомена: За овај корак је потребан бинарни фајл devicetree-а за U-Boot. Готови бинарни фајлови devicetree-а могу се наћи у Yocto радном простору у U-Boot директоријуму за изградњу. Путања до директоријума за изградњу може се приказати помоћу bitbake virtual/bootloader –e | grep ^B=.

  1. Копирајте потребно fileс у радни директоријум:
    • Преименујте У-Боот девицетрее имк93-ткма9352-мба91ккца.дтб, имк93-ткма9352-мба93ккца.дтб или имк93-ткма9352-мба93ккла.дтб, у пубкеи.дтб:
      Из U-Boot директоријума за изградњу у Yocto радном простору (путања: bitbake virtual/bootloader –e | grep ^B=)
      or
      из самокомпилираних U-Boot извора
    • Линукс језгро:
      ${DEPLOY_DIR_IMAGE}/Слика
      Ово file је линк, па га копирајте са cp --dereference или прикажи и копирајте оригинал file са ls –-long
      or
      из самокомпилираних изворних кодова за Линукс
    • Линукс стабло уређаја:
      У зависности од варијанте ${DEPLOY_DIR_IMAGE}/imx93-tqma93…
      Ово file је линк, па га копирајте са cp --dereference или прикажи и копирајте оригинал file са ls –-long
      or
      из самокомпилираних изворних кодова за Линукс
    • Кључеви генерисани у кораку 4.1
    • ИТС file генерисан у кораку 4.2
  2. Направите FIT слику са потписом
    $ mkimage -f sign.its -K pubkey.dtb -k . -r image.itb
    Јавни кључ се уписује у стабло уређаја U-Boot-а. Овај кључ се користи за верификацију FIT слике потписане горе.

ПАЖЊА: Да бисте спаковали U-Boot стабло уређаја са јавним кључем у потписани bootstream из поглавља 3.2, кораци из поглавља 3.2 морају се поновити са прилагођеним U-Boot Proper u-boot.bin. Да бисте то урадили, стабло уређаја са јавним кључем pubkey.dtb мора бити наведено путем опције EXT_DTB приликом компајлирања U-Boot-а:
направи EXT_DTB=

Верификација
У U-Boot-у са јавним кључевима, потписана FIT слика image.itb може се покренути помоћу bootm-а након што је учитана са одговарајућег медијума (TFTP, eMMC, SD).
Приликом покретања FIT слике, U-Boot враћа информације „Verifing Hash Integrity … sha256,rsa2048:dev+ OK“ са именом, алгоритмом и дужином кључа генерисаног у поглављу 4.1 на конзоли:

  • ## Учитавање језгра из FIT слике на 80400000 …
  • Провера интегритета хеша … sha256,rsa2048:dev+ ОК
  • ## Учитавање рамдиска из FIT слике на 80400000 …
  • Провера интегритета хеша … sha256,rsa2048:dev+ ОК
  • ## Учитавање fdt-а из FIT слике на 80400000 …
  • Провера интегритета хеша … sha256,rsa2048:dev+ ОК

За фалсификовање, може се генерисати други пар кључева као што је описано у одељку 4.1 и користити за потписивање FIT слике. Ова FIT слика се не може покренути без размене кључа у U-Boot стаблу уређаја:
## Учитавање језгра из FIT слике на 80400000 …

Коришћење конфигурације 'conf-1'
Провера интегритета хеша ... sha256,rsa2048:test- грешка!
Верификација није успела за ' „хеш чвор“ у конфигурационом чвору „conf-1“
Није успела верификација потребног потписа „key-dev“
Лош хеш података
ГРЕШКА: не могу да добијем слику језгра!

Проширите ланац поверења: коренска партиција
Претходно успостављени ланац поверења верификује порекло U-Boot-а и Linux језгра. Са горе поменутим механизмима, само власник генерисаног приватног кључа може да потпише свој софтвер и покрене га на уређају. Даље везе се могу додати у ланац. Следећи одељак описује како се коренска партиција може заштитити од манипулације коришћењем dm-verity-ја. За стварну имплементацију, такође је приказано како се комплетан ланац може креирати помоћу TQ-BSP-а. Корак-по-корак водич за dm-verity заштиту је изостављен због сложености захтева.

 Скица: Verity Devicemapper

  1. Генериши Verity хешеве:
    veritysetup израчунава хеш вредности и чува их на крају коренске партиције. Коренска партиција може бити права file или блок уређај file (нпр. /dev/sdaX).
    • veritysetup \
    • –величина блока података=1024 \
    • –величина хеш-блока=4096 \
    • –hash-offset= \
    • формат \
    • \
    • veritysetup приказује следеће информације (са одговарајуће различитим вредностима):
    • Информације о заглављу VERITY за data.img
    • UUID: e06ff4cb-6b56-4ad4-bd97-0104505a70a5
    • Тип хеша: 1
    • Блокови података: 204800
    • Величина блока података: 1024
    • Величина хеш блока: 4096
    • Хеш алгоритам: sha256
    • Salt: 17328c48990b76fbb3e05d0ebfd236043674cf0d14c278bc875b42693621cc21
    • Root hash: a0e1a449d452f74d041706b955794c0041e3d8ad051068df6589e08485323698
    • Хеш коренске партиције је осетљива вредност коју је потребно заштитити. Ако је овај хеш угрожен, нпр. ако га може променити неовлашћена особа, онда је заштита интегритета коренске партиције помоћу dm-verity-ја безвредна.
  2. Интегришите коренски хеш у ланац поверења
    • Горе генерисани коренски хеш се чува у потписаној FIT слици, што је штити од манипулације. У ту сврху, FIT слици се додаје initramfs у којој се коренски хеш чува у file.
    • Чвор слика ITS-а file из поглавља 4.2 проширен је следећим одељком, између осталог:
    • ramdisk-1 {
    • опис = „дм-верити-имаге-инитрамфс“;
    • подаци = /инцбин/(“ „);
    • тип = „рамдиск“;
    • лук = „арм64“;
    • ОС = „линукс“;
    • компресија = „нема“;
    • учитавање = <0x98000000>;
    • унос = <0x98000000>;
    • хеш-1 {
    • алго = „ша256“;
    • };
    • };
  3. Проверите интегритет коренске партиције
    • Initramfs садржи одговарајући скрипт који генерише мапер уређаја из коренске партиције и коренског хеша.
    • veritysetup \
    • –величина-блока-података=${ВЕЛИЧИНА_БЛОКА_ПОДАТАКА} \
    • –hash-offset=${DATA_SIZE} \
    • креирај rootfs \
    • \
    • \

Мапер уређаја се затим монтира:

  • монтирати
  • -о ро \
  • /dev/mapper/rootfs \
  • /rootfs

Корен fileСистем је само за читање. Да бисте прешли на стварни коренски директоријум fileсистем, користите switch-root.

Аутоматизовано креирање помоћу TQ-BSP-а
У принципу, слика са ланцем поверења од покретачког програма до коренске партиције може се аутоматски креирати помоћу TQ-BSP-а.
За TQMa93xx следеће опције морају бити додате у local.conf:

  • # DISTRO_FEATURE обезбеђује неопходне опције конфигурације за U-Boot и Kernel
  • DISTRO_FEATURES:append = „безбедно“
  • # Име кључа који се користи за потписивање бутлоудера
  • IMX_HAB_KEY_NAME = „ахав“
  • # Активира потписивање FIT слике у процесу изградње
  • UBOOT_SIGN_ENABLE = „1“
  • # Ова класа садржи логику за креирање заштићене root партиције
  • КЛАСЕ_СЛИКА += „dm-verity-img“
  • # Име initramfs слике за руковање dm-verity-јем
  • ИНИТРАМФС_ИМАЖА = „дм-верити-имаџ-инитрамфс“
  • # Initramfs се чува као посебан артефакт у слици
  • ИНИТРАМФС_СЛИКА_ПАКЕТ = „0“
  • # Сачувајте FIT слику са initramfs-ом на boot партицији
  • IMAGE_BOOT_FILES:append = ” fitImage-${INITRAMFS_IMAGE}-${MACHINE}-
  • ${MACHINE};fitImage” # Слика коју треба заштитити помоћу dm-verity
  • # Алтернатива: tq-image-weston-debug
  • DM_VERITY_IMAGE = „tq-image-generic-debug“
  • # Укуцајте горњу слику
  • DM_VERITY_IMAGE_TYPE = „ext4“

ПАЖЊА: Тачне опције се могу променити у будућим верзијама BSP-а. Најновије информације можете пронаћи у документацији BSP слоја (https://github.com/tq-systems/meta-tq) под мета-тк/док.

Комплетна слика се креира помоћу команде bitbake tq-image-generic-debug и затим се може записати на SD картицу, на примерampле.

Верификација
У Линуксу, mount -a се може користити да се провери да ли је Verity Devicemapper монтиран као root fileсистем:

  • # моунт
  • /dev/mapper/rootfs на / унесите ext4 (ro,relatime)
  • Поред тога, цео корен file Систем је у овом случају само за читање:
  • # тест додира
  • додир: не може се додирнути 'тест': Само за читање file система

За фалсификовање, корен file Систем се може изменити ван мреже и уређај се може поново покренути. Модификација узрокује другачији коренски хеш и процес покретања се прекида: device-mapper: verity: 179:98: data block 1 is corrupted

Више информација о TQMa93xx можете пронаћи на TQ Support Wiki-ју: https://support.tq-group.com/en/arm/modules#nxp_imx_9_series

ТК-Системс ГмбХ
Милштрасе 2 l Гут Делинг l 82229 Зефелд Инфо@TQ-Група | TQ-Група

Често постављана питања

П: Да ли је могуће преокренути неповратни процес подешавања осигурача поменут у упутству?
A: Не, подешавање осигурача је неповратно. Препоручује се коришћење развојног обрасца.

П: Где могу да пронађем потребне изворне кодове за Линукс и У-Бут?

A: Линукс:
Линукс репозиторијум

У-боот: У-Боот
Репозиторијум

Документи / Ресурси

TQ TQMa93 Безбедно покретање [пдф] Упутство за кориснике
TQMa93xx, TQMa93 Безбедно покретање, Безбедно покретање, Покретање

Референце

Оставите коментар

Ваша емаил адреса неће бити објављена. Обавезна поља су означена *