dm-verity
の概要を説明します。 私の限られた知識によると、関連するものはAndroidで動作します。デバイスや ROM によって状況が異なる場合があります。
DM-VERITY はどのように適用されますか?
dm-verity
(検証済みのブートと AVB) および dm-crypt
(FDE) は device-mapper
のターゲットです Linux カーネルの機能。 dm-verity
ブロックデバイスから読み取られる各ブロックの整合性を検証します。 init_first_stage
により施行 fs_mgr_flags
のとおり fstab で設定します。 system-as-root デバイス (A/B
と non-A/B
)、/system
のマウント中に verity を強制するようにカーネルにパッチが適用されます および /vendor
verify
の場合 /avb
フラグは fstab デバイス ツリー (dtb) にあります。
dm-crypt
ブロックデバイスから/への読み取り/書き込み時にデータを透過的に復号化/暗号化します。 FBE は別のカーネル フレームワーク fscrypt
に基づいています;しかし、どちらも vold
によって管理されています (ネイティブ サービスとして実行) if fs_mgr_flags
voldmanaged
を含む .
FSTAB はどこにありますか?
fstab
は伝統的に、起動時にマウントされるファイルシステムを指定するための Linux 上のファイルでした。 fs_mgr
のコア コンポーネントです。 Android の機能。
Pre Oreo リリース fstab
ramdisk
にありました . Treble では /vendor
に移動しました (または /system/vendor
) system
の fstab エントリ と vendor
(そして odm
) はデバイス ツリー Blob (dtb
) に移動されます )。カーネルは dtb fstab
をエクスポートします /proc/device-tree/firmware/android
のデバイス ツリー ディレクトリのエントリ .
一部の OEM は fstab
も入れています odm
で または nvdata
ソース: Android ストレージ デバイスの構成
DTB はどこにありますか?
デバイス ツリーは、カーネルが検出できないハードウェアを記述するためのデータ構造です。デバイス ツリー ソース (dts
) dtb
に変換できます (DT のバイナリ blob) と dtc
を使用してその逆 . DTB は、ブート時にブートローダーによって読み込まれ、カーネルに渡されます。これにより、ハードウェアが検出され、それに応じてデバイス ノードが作成されます。
DTB は次のいずれかです:
- カーネル
zImage
に追加 またはImage.gz
boot.img
で .gzip
から分割できますsplit-appended-dtb (sadtb)
を使用してアーカイブする . -
または
dtbo
で 一部の OEM と同じようにパーティション分割します。これは以下で確認できます:~# ls -l /dev/block/bootdevice/by-name/dtbo* ~# grep -C5 PARTNAME=dtbo /sys/dev/block/*/uevent | grep DEVNAME | sed 's/.*=//; s|^|/dev/block/&|'
- または
boot.img
の末尾 第 2 段階の後、またはodm
で パーティション (まれですが、一部の OEM ではそうです)。
また、デバイスが non-A/B
の場合 、 dtb
(boot.img
より) および/または dtbo
partition) も recovery.img
に追加されます ヘッダー、カーネル、RAM ディスク、および第 2 段階の後の DTBO セクション。ただし、これは通常の起動には関係ありません。ただし、デバイスも system-as-root
の場合 、Magisk を boot.img
としてこのリカバリ パーティションにインストールする必要があります ramdisk
を含まない .
DTB がカーネルに追加されていない場合、dtb(s)
dtb.img
に変換されます mkdtimg
を使用 .同じツールで画像をダンプできます。
ソース: DTO の実装
DM-VERITY を無効にする方法
userdebug
で ROM、dm-verity
adb
を使用して無効にすることができます .ブロックデバイス上の最後のファイルシステムブロックの後に書き込まれる verity メタデータブロックのマジックナンバー (system
) を変更します。 または vendor
)。ここから引用:
このマジック ナンバーがないと、検証プロセスが停止します
AVBの場合、adb
vbmeta header
を変更します ハッシュツリー イメージの検証を無効にします。ここから引用:
AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED
の場合 最上位の vbmeta でフラグが設定されている場合、androidboot.veritymode
無効に設定されています
user
で ro.debuggable
をビルドします 0
です と adbd
ルートとして実行されていません。 ALLOW_ADBD_DISABLE_VERITY
のような他の違いもあります 、だから adb
dm-verity
を無効にしません .他のアプローチは verify
を削除することです または avb
fstab
からのフラグ .ここから引用:
パーティションを確認するには...
...
関連するエントリの fstab で、verify
を追加します。 fs_mgr
に
同様に暗号化を解除するには forceencrypt=
、 forcefdeorfbe=
または fileencryption=
encryptable=
に置き換える必要があります .ただし、暗号化は出荷時設定にリセットしないと削除できないため (FBE も?)、Preserve force encryption
のチェックを外します。 Magis アプリでは何もしません。
一部の OEM は support_scfs
も使用しています fs_mgr
フラグと ro.config.dmverity=true
dm-verity
を持つデバイスのプロパティ
dm-verity
を無効にするために使用できる、一部の OEM のブートローダーおよび adb 実装で発見されたエクスプロイトもいくつかあります。 影響を受けるデバイスで。ただし、このようなセキュリティ上の欠陥は通常、OEM からの更新によって時間の経過とともに修正されます。
オプション 1
Magisk をインストールする前に、構成ファイルでオプションを設定します。
~# echo 'KEEPVERITY=false' >/cache/.magisk
~# echo 'KEEPFORCEENCRYPT=true' >>/cache/.magisk
インストールされている場合、Preserve AVB v2.0/dm-verity
のチェックを外した後 アプリでは、Magisk を再インストールする必要があります。ここから引用:
Magisk Manager で、「Uninstall> Restore Images」でイメージを復元し、Advanced Settings で「Preserve AVB 2.0/dm-verity」ボックスをオンにしてから、アプリ経由で Magisk を再インストールします。
オプション 2
いくつかの dm-verity
を使用してください 無効化はこのように圧縮されます。
オプション 3
fstab
の場所を特定します /system
のエントリ と /vendor
ramdisk
の場合 (プレトレブル):
ramdisk
を抽出 、fstab
を変更します そして再梱包。-
または
ramdisk
にパッチを当てる 直接:~# magiskboot cpio ramdisk.cpio 'patch false true'
dtb
の場合 :
- カーネルに追加する場合:
boot.img
を抽出- 追加された
dtb(s)
を分割 - パッチ
dtb(s)
. dtb(s)
を追加 カーネルへ- リパック
boot.img
dtbo
の場合 パーティションまたはboot.img
第 2 段階の後、dtb.img
にパッチを当てます パーティションまたはboot.img
に書き戻します .
ブートまたはリカバリ イメージと RAM ディスクを解凍/再パックする方法
AIK または magiskboot
を使用 .
dtb
にパッチを当てる方法 ?
magiskboot
を使用して直接パッチを当てる または手動で dtb
を変換します dts
へ 、編集 dts
dm-verity
を削除する任意のテキスト エディターで フラグ、および変換 dts
dtb
に戻る .
関連:
- Magisk の仕組み
- Android デバイスのパーティションとファイル システム