Androidで検証されたブート2.0vbmetaデータ構造分析

検証済みブートはAndroidの重要なセキュリティ機能であり、主に改ざんされたブートイメージにアクセスし、システムの攻撃防止機能を向上させるために使用されます。簡単な説明方法は、ブートプロセス中に検証チェーンを追加することです。つまり、BootLoaderを検証するためのROMコードです。BootLoaderの正当性と整合性を確認するには、BootLoaderはブートイメージを検証して、カーネルの起動に必要なイメージの正当性と整合性を確認する必要があります。Kernelは、システムパーティションとベンダーパーティション。

ROMコードとBootLoaderは通常、デバイスメーカーのOEMによって提供され、各企業の実際の慣行とR&D機能は同じではないため、デバイスメーカーが検証済みブート機能を導入しやすくするために、Googleは統合検証を開始しましたAndroid Oで起動します。フレームワークAndroid検証済みブート2.0には、このフレームワークに基づいて開発された検証済みブート機能がCDD要件を満たすことができるだけでなく、OEMのカスタマイズされたブート検証プロセスの柔軟性を維持できるという利点があります。

ROMコード検証BootLoaderの機能は通常IC設計に関連しているため、AVB2.0はBootLoader後の検証プロセスに重点を置いています。BootLoader後のシステム起動に関係する主要なイメージには、通常、boot.imgとsystem.imgが含まれます。AndroidOの高音プロジェクトでは、dtboとvendor.imgも導入されています。これらのイメージを1つずつ検証するのは時間と手間がかかると言えますが、AVB 2.0は実際には非常に単純で、新しいパーティションvbmeta.img(検証済みのブートメタデータ)を導入し、必要なすべてのコンテンツを導入します。検証済みはコンパイル時に計算およびパッケージ化されます。このパーティションに対して、BootLoaderは起動プロセス中にvbmeta.imgを検証するだけで、vbmetaのデータが信頼できるかどうかを確認できます。次に、vbmetaのデータを使用して、bootimg、dtbo、system、img、vendor.imgを比較します。OEMがvbmetaに入れる必要のある他のものについては、OEMが自由にカスタマイズでき、適切なカスタマイズスペースが確保されていると言えます。

最も基本的な検証ブートに加えて、AVB 2.0は、ロールバックを防止する機能とABパーティションバックアップのサポートも提供します。AVB2.0の詳細なドキュメントについては、Android Verified Boot2.0を参照してください。

起動を確認する場合でも、ロールバックを防止する場合でも、vbmetaは非常に重要なデータ構造です。以下は、最も単純なvbmeta構造体の分析と説明です。
以下は、vbmeta構造体の構造図です。

上記のvbmetaに含まれるデータは、2つの大きなブロックに分割できます。紫色のブロックは認証データブロックで、その他は補助データブロックです。BOARD_AVB_ALGORITHMがSHA256_RSA2048として定義されている場合、デフォルトでコンパイルされたvbmeta.imgは通常4KBです。vbmeta.imgの構成は次のとおりです。

-------------------------------------------------- ----------------------------
|   ヘッダー   |   認証データ   |    補助データ    |
-------------------------------------------------- ----------------------------

ヘッダーの固定長は0x100バイトで、認証データと補助データの長さはヘッダーに格納されます。

これらの3つの部分の次の分析、

ヘッダー分析

ヘッダーデータ構造は次のとおりです。typedefstructAvbVBMetaImageHeaderUEでvbmeta.imgを
開き、情報の最初の0x100バイトは次のとおりです。


struct AvbVBMetaImageHeaderによると、上の図のヘッダー情報は次のように解析されます。

認証データブロック解析

認証データブロックは、vbmeta.imgの正当性と整合性を検証するために使用されます。これには、ハッシュデータと署名データの2つの部分が含まれます。avbtoolのPythonスクリプトを
分析することで、ハッシュデータと署名データの生成プロセスを理解できます。

    
     ハッシュデータの生成ハッシュデータは、vbmetaのヘッダーと補助データブロックのハッシュ計算であるため、Mr。が補助データブロックになり、認証データブロックが生成されます。使用されるアルゴリズムは、ヘッダーのalgorithm_typeで指定されます。この記事では、SHA256を使用して計算します。ハッシュデータ出力の長さは0x20です。avbtoolをインターセプトするためのスクリプトコードは次のとおりです。

#ハッシュを計算します。

ha = hashlib.new(alg.hash_name)

ha.update(header_data_blob)

ha.update(aux_data_blob)

binary_hash.extend(ha.digest())


     署名データは、上記で計算れたハッシュデータをパディングすることによって生成されます。使用されるアルゴリズムは、ヘッダーのalgorithm_typeによっても指定されます。この記事では、RSA2048を使用し、計算された署名データの長さは0x100です。avbtoolをインターセプトするためのスクリプトコードは次のとおりです。

#署名を計算します。

padding_and_hash = str(bytearray(alg.padding))+ binary_hash

binary_signature.extend(raw_sign(signing_helper、signing_helper_with_files、algorithm_name、alg.signature_num_bytes、key_path、padding_and_hash))

注意すべき点の1つは、ハッシュデータと署名データを合計した全長は0x120ですが、ヘッダーの認証データブロックサイズは0x140です。これは、画像の配置では0x120を64で割り切れないようにする必要があるため、次のように入力します。 0x0長さは0x140です。

補助データブロック解析

補助データブロックのコンテンツは非常に豊富で、一般にAvbDescriptorとRSA公開鍵の2つのカテゴリに分類されます。

     AvbDescriptorの生成
avbtoolmake_vbmeta_imageコマンドでサポートされているパラメーターに従って、OEMはvbmeta.imgにパッケージ化する必要のある一部のデータを自由にカスタマイズできるため、バイナリデータのセグメントはのデータ構造に従って補助データブロックパッケージ化されます。AvbDescriptorAvbDescriptorは、さまざまなタグに応じて次のタイプに分類されます。

typedef enum {         AVB_DESCRIPTOR_TAG_PROPERTY、         AVB_DESCRIPTOR_TAG_HASHTREE、         AVB_DESCRIPTOR_TAG_HASH、         AVB_DESCRIPTOR_TAG_KERNEL_CMDLINE、         AVB_DESCRIPTOR_TAG_CHA };





最も一般的に使用されるパラメーター---include_descriptor_from_imageは、boot.img、dtbo、recovery.img、system.img、 vendor.img記述子であり、補助データブロックにパッケージ化されています。これらの記述子は、BootLoaderがvbmeta.imgの合法性と整合性を確認した後、boot.img、dtbo、recovery.img、system.img、vendor.imgを検証するために直接使用できます。

     RSA公開鍵の生成
これらの記述子に加えて、補助データブロックにはRSA公開鍵というもう1つの重要な情報があります。この公開鍵は、認証データブロック内の署名データを検証するために使用されます。
avbtool make_vbmeta_imageでは、--keyパラメータを使用して、署名データを生成するRSA秘密鍵を指定する必要があります。AOSPexternal/ avb / test / dataディレクトリにはテスト用のさまざまなRSA秘密鍵があり、形式はPEMです。avbtoolは、RSA秘密鍵に基づいて公開鍵を抽出し、RSA鍵ヘッダーを追加して補助データブロックにパッケージ化します。
を使用avbtool extract_public_key --key [priv_key_path] --output [outpubk_path]して、生成された公開鍵情報を表示できます
RSAキーヘッダーの形式は次のとおりです。

typedef struct AvbRSAPublicKeyHeader {          uint32_t key_num_bits;          uint32_t n0inv; } AVB_ATTR_PACKED AvbRSAPublicKeyHeader;


上記のヘッダーの公開鍵のサイズは、0x8バイトのAvbRSAPublicKeyHeaderの長さである0x208に、2048ビットの公開鍵の長さである0x200バイトを加えたものです。

上記は、パディングと0x0を除くvbmetaの主なデータ情報です。

 

 

 

 

 

 

 

 

 


著者:SmartEmily
リンク:https://www.jianshu.com/p/a2542426bdde
出典:ジェーンの本
は著者が著作権を所有しています。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。

著者:SmartEmily
リンク:https://www.jianshu.com/p/a2542426bdde
出典:ジェーンの本
は著者が著作権を所有しています。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。

おすすめ

転載: blog.csdn.net/pan0755/article/details/106712888