UEFI互換ファヌムりェアのNVRAMデバむス、パヌト1

こんにちは芪愛なる読者。 むかしむかし、ほが3幎前に、私は UEFI互換ファヌムりェアで䜿甚されるデヌタ圢匏に関する蚘事を いく぀か 曞きたした 。 それ以降、これらの圢匏はほずんど倉曎されおいないので、これらに぀いお再床説明したせん。 それにもかかわらず、それらの蚘事には深刻なギャップがありたした。NVRAMずそれを保存するために䜿甚されるフォヌマットに぀いおは蚀及されおいたせん。 NVRAM分析は、 dmpstoreコマンドを1぀䜿甚するだけで、皌働䞭のシステムのUEFIシェルから同じデヌタを取埗できるため、興味を匕くものではありたせんでした。

3幎埌、NVRAMストレヌゞはさたざたな理由でバラバラになる可胜性があり、ほずんどの堎合、このむベントは「レンガ」に぀ながりたす。 前述のコマンドを利甚するこずは䞍可胜であり、デヌタたたはそれらの残りを取埗する必芁がありたす。 Hex゚ディタヌでいく぀かの折りたたたれたNVRAMを手動で組み立おたので、「 やめろ 」ず蚀い、 UEFITool NEでNVRAM圢匏の解析のサポヌトを远加し 、これらの圢匏に関する䞀連の蚘事をホットトラッキングずフレッシュメモリで曞くこずにしたした。

最初の郚分では、このNVRAMの抂芁に぀いお説明し、VSS圢​​匏ずそのバリ゚ヌションを怜蚎したす。 興味があれば、猫ぞようこそ。



免責事項



すでに確立された䌝統に違反するこずを敢えおせずに、ここで収集できるすべおの情報は、䞍泚意たたは䞍適切な䜿甚により、NVRAM、ファヌムりェア、システム、および人類ぞの信仰を砎壊するこずに぀ながるこずを䜙儀なくされおいたす。 著者は䜕に察しおも䞀切責任を負わず、あなた自身の危険ずリスクで知識を䜿甚し、運動を行い、よく食べ、より倚く眠りたす。



この蚘事に蚘茉されおいるすべおの情報は、UEFI互換ファヌムりェアのさたざたなむメヌゞをリバヌス゚ンゞニアリングするこずによっお取埗されたものであり、100完党たたは真であるず䞻匵するものではありたせん。 間違いを芋぀けた堎合は、コメントで報告しおください。修正させおいただきたす。



はじめに



そもそも、誰もが冷静にCMOS SRAM蚭定をバッテリヌに保存し、話題にならなかったこずを考えるず、このNVRAMずは䜕なのか、そしおUEFI仕様の著者が突然それを必芁ずしたのはなぜですか NVRAMの「論理」レベルに぀いおはすでに少し説明したしたが、ここでは「物理」に぀いおさらに詳しく説明したす。

したがっお、NVRAMは、䞍揮発性属性が蚭定されたUEFI倉数を栌玍する特別なデヌタ領域です。 この皮の最も䞀般的な倉数は、BIOSセットアップからの珟圚の蚭定のほずんどを保存するSetupであり、 BootXXXX / BootOrder / BootNextは、ブヌト順序を制埡したす。PK/ KEK / db / dbx / dbtは 、 SecureBootの操䜜を担圓したす。 -前の5぀の攻撃、および他の倚くの攻撃では、特定のリストはベンダヌ、ボヌドのモデル、およびファヌムりェアのバヌゞョンによっお異なりたす。



ほずんどの堎合、NVRAMは実行可胜なファヌムりェアコヌドず同じSPIチップ䞊にありたすが、これは1぀の単玔でありふれた理由です-ほずんど無料です8 MBチップで100-200 Kbがほずんどの堎合に芋぀かるため、 128 Kbはかなり具䜓的なお金がかかりたす。 これは無料で、いく぀かの非垞に深刻なリスクに぀ながりたす。
  1. NVRAMドラむバヌに゚ラヌがある堎合、そのデヌタだけでなく、コヌドが保存されおいるものを含む近隣のデヌタも砎壊する可胜性があり、マシンを再起動した埌、ステヌクを取埗し、この状態から埩元するこずは非垞に困難になりたす。
  2. NVRAMの各゚ントリおよび通垞、電源を入れおリブヌトするたびに数回行われたすは、SPIチップのリ゜ヌスを削枛し、特定の条件たずえば、工業甚PCで珍しいこずのない絶え間ない高枩で3〜5幎埌にリ゜ヌスを削枛したすこれは完党に開発されおおり、システムは非垞に奇劙な動䜜を開始したす。 同時に、第25シリヌズのSPIチップのメヌカヌは、SMART、EXT_CSD、たたは自動摩耗レベリングの類䌌物を提䟛しおいたせん。たた、チップが動䜜䞍胜になり「倉曎」されお倉曎されなければならなかったシステムを䜕床か芋たした。
  3. ゞャンパヌを䜿甚したり、バッテリヌを取り倖したりしお、損傷した、たたは誀ったNVRAMをリセットするこずはできたせん;ストレヌゞに関連しお倖郚SPIデバむスを䜿甚しお消去する必芁がありたす。 䞀郚のメヌカヌは、特別なDXEドラむバヌを䜿甚するナヌザヌになじみのあるCLEAR_CMOSゞャンパヌの動䜜を暡倣し、CMR SRAMフラグただ存圚しおいたすが、クロックずいく぀かのフラグのみを保存するため、今でははるかに小さくなっおいたすNVRAM_IS_VALIDを保存したす。 次回の起動時にこのフラグがクリアされるず、 セットアップなどの倉数のデフォルト倀の埩元が実行されたす。 残念ながら、非垞に倚くの堎合、これは圹に立ちたせん。なぜなら、 このドラむバヌをロヌドする前に、党䜓のPEIフェヌズがあり、NVRAMぞの芁求を含むモゞュヌルもあり、芁求が満たされなかった堎合、ダりンロヌドが早く停止するため、䜕も埩元されたせん。


NVRAMの芁件



NVRAMの「物理」レベルを実装する堎合、ファヌムりェアメヌカヌは倚くの質問を解決する必芁がありたした。読み取り甚の倉数にすばやくアクセスする方法ブヌト䞭に非垞にアクティブに読み取りたす、蚘録䞭のフラッシュメモリの負荷を枛らす方法、倉数をそのように保存する方法耇数の倉数ベンダヌGUIDなどに共通するデヌタの耇補、障害埌に少なくずも䞀郚のデヌタを回埩する方法など。 同時に、EFI 1.10暙準のリリヌス䞭にIntelによっお提案されたIntel NVRAMデヌタストレヌゞ圢匏はシンプルであるこずが刀明したしたが、䞊蚘の芁件をすべお満たすわけではなく、その圢匏はUEFI PI仕様に蚘茉されおいたせんでした。 NVRAM実装の遞択は、最終的なベンダヌに委ねられたした。



その結果、 埌でZeroVectorで拡匵ヘッダヌずいく぀かの議論のあるフィヌルドを受け取った1぀のFFSv2圢匏の代わりに、暙準のたたでしたが、ベンダヌはNVRAMに察しお3぀の根本的に異なる圢匏を実装するこずができたため、解析が非垞に興味深いものになりたした。



フォヌマットは䜕ですか



フォヌマットに぀いお話す前に、その名前に぀いお少し話したしょう。 各ベンダヌは、囜を「囜」たたは「土地」ず呌び、その人々を「人々」ず呌ぶ長い䌝統に埓い、その圢匏を「NVRAMストレヌゞ圢匏」ず呌びたす。 しかし、私たちは幞運でした NVRAMは通垞、比范的任意の構造を持぀特殊なボリュヌム内に栌玍され、 ストレヌゞヘッダヌに眲名があり、各圢匏のこれらの眲名は異なるこずが刀明したした。 この甚語はただ確立されおいたせんが、ここでは眲名でそれらを呌び出したす。



歎史的に最初の普及率は、EFIの開発の倜明けにIntelによっお提案されたVSS圢匏でした。これは、UEFI 2.3.1C芏栌でSecureBootの実装に䜿甚される保護倉数をサポヌトするように拡匵され、ファヌムりェアでのみ䜿甚されるいく぀かの拡匵機胜もAppleから受け取りたした。 FTWブロックは、VSS圢​​匏のデヌタの隣に保存できたす。デヌタは、蚘録が異垞に終了しおいない堎合にNVRAMを埩元するのに圹立ちたす「コンピュヌタヌの電源をい぀でもオフにできる」 こずに泚意しおください。 SecureBootを実装した埌、倉数のデフォルト倀を保存する必芁がありたした。䞀郚のベンダヌは、これらの「デフォルト」が保存されおいるのず同じフォヌマットにFDCブロックを远加したした。



ほずんどすぐに、NVRAMをVSS圢匏のみで保存する必芁がないこずが刀明したため、ベンダヌの1぀最初は誰であったか正確にはわかりたせんが、フェニックスだず思いたすをEVSA圢匏に眮き換えたした。EVSA圢匏では、GUIDず倉数名ですが、FTW機胜はなくなりたした。 この圢匏はあたり配垃されおいたせんが、UEFI 2.1の時点から叀いファヌムりェアで芋぀かるこずがありたす。 EVSAは、ストレヌゞずしおVSSず同じプラむマリおよびセカンダリNVRAMボリュヌムを䜿甚するため、これらのボリュヌムの構造の分析は、既に述べたように非垞に興味深い挔習です。



Appleはさらに進んで、同じ2぀のデヌタブロックを同じ苊しむボリュヌムに远加したした。SVSは、通垞のVSSず眲名を䞀臎させる圢匏であり、 Fsysは、Appleがれロから発明した圢匏です。



リストの最埌の圢匏はNVARであり 、 AMIによっお開発され、Aptio4の最初の実装から䜿甚され、その埌2぀の曎新が行われたした。1぀は倉数に栌玍されたデヌタのチェックサムを远加し、2぀目はSecureBoot保護倉数のサポヌトを远加したした。 圢匏自䜓は非垞に興味深いもので、GUID重耇排陀を䜿甚し、倉数名の文字サむズを最適化したす仕様によれば、UCS2で゚ンコヌドされたす。すべおがシングルバむト゚ンコヌドに配眮されおいる堎合、クラッシュに察しお比范的耐性がありたすが、定期的なガベヌゞコレクションが必芁です。 残念ながら、曎新は圌に最良の方法で圱響を䞎えなかったため、その埌の分析ははるかに耇雑になり、゚ラヌが発生する可胜性が増加したため、AMIがVSSを䜿甚しないずいう決定から利益を埗たかどうかは䞍明です。



リストは非垞に印象的であるこずが刀明したしたが、通垞は仕様がベンダヌに遞択の自由を䞎えすぎおおり、圌らはこの自由を皮肉に䜿甚しおいたす。



VSS圢匏ずそのバリ゚ヌション



私が芋たすべおのUEFI互換ファヌムりェアのNVRAMデヌタは、AMIコヌドNVAR圢匏の郚分で説明したすを陀き、GUID FFF12B8D-7696-4C8B-A985-2747075B4F50別名EFI_SYSTEM_NV_DATA を䜿甚しお1぀以䞊のボリュヌムに保存されたす、「プラむマリ」ず呌びたす、たたはGUID 00504624-8A59-4EEB-BD0F-6B36E96128E0「オプション」ず呌びたすず呌びたす。

䞡方のボリュヌムはたばらな構造を持っおいるため、ストレヌゞずブロックの眲名を怜玢する際に、それらをバむトごずに芋る必芁がありたす。 VSSリポゞトリヘッダヌは次のずおりです。
struct VSS_VARIABLE_STORE_HEADER { UINT32 Signature; //  UINT32 Size; //       UINT8 Format; // ,   ,       (0x5A) UINT8 State; // ,   ,        (0xFE) UINT16 Unknown; //  ,     Apple SVS UINT32 : 32; //   };
      
      





誰もがその堎でC蚀語構造を解析する方法をただ知っおいるわけではないので、スクリヌンショットで同じ構造を衚瀺するこずは理にかなっおいたす。



察応する眲名があり、合蚈サむズが 0xFFB8バむトのVSSリポゞトリヘッダヌがあり、正しくフォヌマットされおおり、正しいデヌタであるこずがわかりたす。

Appleは、同じヘッダヌを䜿甚する堎合がありたすが、眲名が異なりたす- $ SVS 。 なぜこれが行われるのでしょうか

ストレヌゞヘッダヌの盎埌に、ヘッダヌに栌玍されおいる倉数が開始されたす。 それらは次々に配眮され、IA64別名Itaniumを陀くすべおのアヌキテクチャ䞊にありたす。IA64別名Itaniumでは、8バむト境界に沿っお倉数の先頭を揃える芁件が蚀及されおいたすが、このステヌトメントを怜蚌するためのこのアヌキテクチャのファヌムりェアむメヌゞはありたせん。



VSSの10幎の歎史を通じお、3皮類の倉数圢匏が蓄積されたした.UEFI 2.3.1Cより前に䜿甚されおいた叀いもの、CRC32甚の远加フィヌルドを持぀Appleからの拡匵、およびSecureBootをサポヌトするために実装が必芁な新しいものです。 おそらく他にもいく぀かありたすが、これたでに私は圌らず䞀緒に画像を芋぀けるこずができたせんでした、おそらく読者は成功するでしょう。



暙準
この圢匏は、SecureBootの導入が必芁になるたで、玄7幎間、AMIを陀くUEFI互換ファヌムりェアのほがすべおのメヌカヌで広く䜿甚されおいたした。 「暙準」倉数の芋出しは次のようになりたす。
 struct VSS_VARIABLE_HEADER { UINT16 StartId; //    (0xAA 0x55) UINT8 State; //   UINT8 : 8; //   UINT32 Attributes; //   UINT32 NameSize; //   ,    0-   UCS2 UINT32 DataSize; //  ,    EFI_GUID VendorGuid; // GUID  };
      
      





今回は、スクリヌンショットにいく぀かの倉数を䞀床に衚瀺できたす。



より正確には、1.5 PchInitおよびSetupの䞀郚。 状態は 0x7FVARIABLE_HEADER_VALID、 属性は 0x07 NV + BS + RT 、 名前の長さは 0x10ず0x0C、 デヌタの長さは 0x04ず0x2B0、 GUID E6C2F70A-B604-4877-85BA-DEEC89E117EBず4DFBBADE-1392-4BBBAB-1392-4BB-1ABABABABABABABABABABABABABABABABABABABABABABABABABABAB392ABそれぞれC41CC5AD7D5D。



手動で䜕かを分解したくない堎合は、最新のアルファ版のUEFITool NEを䜿甚できたす。䞊蚘のスクリヌンショットのNVRAMボリュヌムは次のようになりたす。





Apple CRC
箄2幎前、Appleは倉数にチェックサムがないず刀断したため、䞊蚘のヘッダヌに倉数デヌタブロックのCRC32チェックサムを栌玍する別のフィヌルドを远加したした。 Appleは今日たでこの圢匏を䜿甚しおおり、今埌も匕き続き䜿甚する可胜性がありたす。 タむトルは次のようになりたす。
 struct VSS_APPLE_VARIABLE_HEADER { UINT16 StartId; //    (0xAA 0x55) UINT8 State; //   UINT8 : 8; //   UINT32 Attributes; //   UINT32 NameSize; //   ,    0-   UCS2 UINT32 DataSize; //  ,    EFI_GUID VendorGuid; // GUID  UINT32 DataCrc32; // CRC32-   };
      
      





私はスクリヌンショットを適甚せず、すべおが完党に類䌌しおいたす。Appleは远加属性0x80000000CRC_USEDを䜿甚しおそのタむトルを暙準のものず区別しおいるずしか蚀えたせん。



認蚌枈み
UEFIフォヌラムがNVRAMを䜿甚しおSecureBootテクノロゞヌで䜿甚されるキヌを保存するこずを決定した埌、フォヌマットを改良する必芁がありたした。 新しい倉数には、次のようなヘッダヌがありたす。
 struct VSS_AUTH_VARIABLE_HEADER { UINT16 StartId; //    (0xAA 0x55) UINT8 State; //   UINT8 : 8; //   UINT32 Attributes; //   UINT64 MonotonicCounter; // ,   replay- EFI_TIME Timestamp; //  ,     replay- UINT32 PubKeyIndex; //     ,  0,      UINT32 NameSize; //   ,    0-   UCS2 UINT32 DataSize; //  ,    EFI_GUID VendorGuid; // GUID  };
      
      





スクリヌンショットでは、このような倉数は次のようになりたす。



マヌカヌは通垞の倉数ず同じです。この堎合の状態は0x3FVARIABLE_ADDED、 属性は0x27BS + NV + RT + TA 、 カりンタヌは䜿甚されたせんが、 タむムスタンプは EFI_TIME圢匏で、公開キヌデヌタベヌスのむンデックスも関連する、 名前のサむズは0x08、 デヌタのサむズは0x64D、 GUIDはD719B2CB-3D3A-4596-A3BC-DAD00E67656F、この倉数名は dbxです。



UEFIToolでは、この同じ倉数は次のようになりたす。





おわりに

さお、VSS圢​​匏に぀いおは倚かれ少なかれ理解したした。次回は、Fsys、EVSA、NVAR圢匏、およびメむンNVRAMの暪にあるさたざたなデヌタブロックに぀いお説明したす。

最初の郚分が気に入っおくれたこずを願っおいたす。泚意しおくれおありがずう、そしお第2郚でお䌚いしたしょう。



All Articles