1a46d47aeSShao Mingyin.. SPDX-License-Identifier: GPL-2.0 2a46d47aeSShao Mingyin 3a46d47aeSShao Mingyin.. include:: ../disclaimer-zh_CN.rst 4a46d47aeSShao Mingyin 5a46d47aeSShao Mingyin:Original: Documentation/filesystems/ubifs-authentication.rst 6a46d47aeSShao Mingyin 7a46d47aeSShao Mingyin:翻译: 8a46d47aeSShao Mingyin 9a46d47aeSShao Mingyin 邵明寅 Shao Mingyin <shao.mingyin@zte.com.cn> 10a46d47aeSShao Mingyin 11a46d47aeSShao Mingyin:校译: 12a46d47aeSShao Mingyin 13*679e5d29Sshaomingyin 杨涛 yang tao <yang.tao172@zte.com.cn> 14a46d47aeSShao Mingyin 15a46d47aeSShao Mingyin============= 16a46d47aeSShao MingyinUBIFS认证支持 17a46d47aeSShao Mingyin============= 18a46d47aeSShao Mingyin 19a46d47aeSShao Mingyin引言 20a46d47aeSShao Mingyin==== 21a46d47aeSShao MingyinUBIFS 利用 fscrypt 框架为文件内容及文件名提供保密性。这能防止攻击者在单一 22a46d47aeSShao Mingyin时间点读取文件系统内容的攻击行为。典型案例是智能手机丢失时,攻击者若没有文件 23a46d47aeSShao Mingyin系统解密密钥则无法读取设备上的个人数据。 24a46d47aeSShao Mingyin 25a46d47aeSShao Mingyin在现阶段,UBIFS 加密尚不能防止攻击者篡改文件系统内容后用户继续使用设备的攻 26a46d47aeSShao Mingyin击场景。这种情况下,攻击者可任意修改文件系统内容而不被用户察觉。例如修改二 27a46d47aeSShao Mingyin进制文件使其执行时触发恶意行为 [DMC-CBC-ATTACK]。由于 UBIFS 大部分文件 28a46d47aeSShao Mingyin系统元数据以明文存储,使得文件替换和内容篡改变得相当容易。 29a46d47aeSShao Mingyin 30a46d47aeSShao Mingyin其他全盘加密系统(如 dm-crypt)可以覆盖所有文件系统元数据,这类系统虽然能 31a46d47aeSShao Mingyin增加这种攻击的难度,但特别是当攻击者能多次访问设备时,也有可能实现攻击。对于 32a46d47aeSShao Mingyin基于 Linux 块 IO 层的 dm-crypt 等文件系统,可通过 dm-integrity 或 33a46d47aeSShao Mingyindm-verity 子系统[DM-INTEGRITY, DM-VERITY]在块层实现完整数据认证,这些 34a46d47aeSShao Mingyin功能也可与 dm-crypt 结合使用[CRYPTSETUP2]。 35a46d47aeSShao Mingyin 36a46d47aeSShao Mingyin本文描述一种为 UBIFS 实现文件内容认证和完整元数据认证的方法。由于 UBIFS 37a46d47aeSShao Mingyin使用 fscrypt 进行文件内容和文件名加密,认证系统可与 fscrypt 集成以利用密 38a46d47aeSShao Mingyin钥派生等现有功能。但系统同时也应支持在不启用加密的情况下使用 UBIFS 认证。 39a46d47aeSShao Mingyin 40a46d47aeSShao Mingyin 41a46d47aeSShao MingyinMTD, UBI & UBIFS 42a46d47aeSShao Mingyin---------------- 43a46d47aeSShao Mingyin在 Linux 中,MTD(内存技术设备)子系统提供访问裸闪存设备的统一接口。运行于 44a46d47aeSShao MingyinMTD 之上的重要子系统是 UBI(无序块映像),它为闪存设备提供卷管理功能,类似 45a46d47aeSShao Mingyin于块设备的 LVM。此外,UBI 还处理闪存特有的磨损均衡和透明 I/O 错误处理。 46a46d47aeSShao MingyinUBI 向上层提供逻辑擦除块(LEB),并透明地映射到闪存的物理擦除块(PEB)。 47a46d47aeSShao Mingyin 48a46d47aeSShao MingyinUBIFS 是运行于 UBI 之上的裸闪存文件系统。因此 UBI 处理磨损均衡和部分闪存 49a46d47aeSShao Mingyin特性,而 UBIFS专注于可扩展性、性能和可恢复性。 50a46d47aeSShao Mingyin 51a46d47aeSShao Mingyin:: 52a46d47aeSShao Mingyin 53a46d47aeSShao Mingyin +------------+ +*******+ +-----------+ +-----+ 54a46d47aeSShao Mingyin | | * UBIFS * | UBI-BLOCK | | ... | 55a46d47aeSShao Mingyin | JFFS/JFFS2 | +*******+ +-----------+ +-----+ 56a46d47aeSShao Mingyin | | +-----------------------------+ +-----------+ +-----+ 57a46d47aeSShao Mingyin | | | UBI | | MTD-BLOCK | | ... | 58a46d47aeSShao Mingyin +------------+ +-----------------------------+ +-----------+ +-----+ 59a46d47aeSShao Mingyin +------------------------------------------------------------------+ 60a46d47aeSShao Mingyin | MEMORY TECHNOLOGY DEVICES (MTD) | 61a46d47aeSShao Mingyin +------------------------------------------------------------------+ 62a46d47aeSShao Mingyin +-----------------------------+ +--------------------------+ +-----+ 63a46d47aeSShao Mingyin | NAND DRIVERS | | NOR DRIVERS | | ... | 64a46d47aeSShao Mingyin +-----------------------------+ +--------------------------+ +-----+ 65a46d47aeSShao Mingyin 66a46d47aeSShao Mingyin 图1:处理裸闪存的 Linux 内核子系统 67a46d47aeSShao Mingyin 68a46d47aeSShao Mingyin 69a46d47aeSShao Mingyin 70a46d47aeSShao MingyinUBIFS 内部维护多个持久化在闪存上的数据结构: 71a46d47aeSShao Mingyin 72a46d47aeSShao Mingyin- *索引*:存储在闪存上的 B+ 树,叶节点包含文件系统数据 73a46d47aeSShao Mingyin- *日志*:在更新闪存索引前收集文件系统变更的辅助数据结构,可减少闪存磨损 74a46d47aeSShao Mingyin- *树节点缓存(TNC)*:反映当前文件系统状态的内存 B+ 树,避免频繁读取闪存。 75a46d47aeSShao Mingyin 本质上是索引的内存表示,但包含额外属性 76a46d47aeSShao Mingyin- *LEB属性树(LPT)*:用于统计每个 UBI LEB 空闲空间的闪存B+树 77a46d47aeSShao Mingyin 78a46d47aeSShao Mingyin本节后续将详细讨论UBIFS的闪存数据结构。因为 TNC 不直接持久化到闪存,其在此 79a46d47aeSShao Mingyin处的重要性较低。更多 UBIFS 细节详见[UBIFS-WP]。 80a46d47aeSShao Mingyin 81a46d47aeSShao Mingyin 82a46d47aeSShao MingyinUBIFS 索引与树节点缓存 83a46d47aeSShao Mingyin~~~~~~~~~~~~~~~~~~~~~~ 84a46d47aeSShao Mingyin 85a46d47aeSShao MingyinUBIFS 在闪存上的基础实体称为 *节点* ,包含多种类型。如存储文件内容块的数据 86a46d47aeSShao Mingyin节点 87a46d47aeSShao Mingyin( ``struct ubifs_data_node`` ),或表示 VFS 索引节点的 inode 节点 88a46d47aeSShao Mingyin( ``struct ubifs_ino_node`` )。几乎所有节点共享包含节点类型、长度、序列 89a46d47aeSShao Mingyin号等基础信息的通用头 90a46d47aeSShao Mingyin( ``ubifs_ch`` )(见内核源码 ``fs/ubifs/ubifs-media.h`` )。LPT条目 91a46d47aeSShao Mingyin和填充节点(用于填充 LEB 92a46d47aeSShao Mingyin尾部不可用空间)等次要节点类型除外。 93a46d47aeSShao Mingyin 94a46d47aeSShao Mingyin为避免每次变更重写整个 B+ 树,UBIFS 采用 *wandering tree* 实现:仅重写 95a46d47aeSShao Mingyin变更节点,旧版本被标记废弃而非立即擦除。因此索引不固定存储于闪存某处,而是在 96a46d47aeSShao Mingyin闪存上 *wanders* ,在 LEB 被 UBIFS 重用前,闪存上会存在废弃部分。为定位 97a46d47aeSShao Mingyin最新索引,UBIFS 在 UBI LEB 1 存储称为 *主节点* 的特殊节点,始终指向最新 98a46d47aeSShao MingyinUBIFS 索引根节点。为增强可恢复性,主节点还备份到 LEB 2。因此挂载 UBIFS 只 99a46d47aeSShao Mingyin需读取 LEB 1 和 2 获取当前主节点,进而定位最新闪存索引。 100a46d47aeSShao Mingyin 101a46d47aeSShao MingyinTNC 是闪存索引的内存表示,包含未持久化的运行时属性(如脏标记)。TNC 作为回 102a46d47aeSShao Mingyin写式缓存,所有闪存索引修改都通过 TNC 完成。与其他缓存类似,TNC 无需将完整 103a46d47aeSShao Mingyin索引全部加载到内存中,需要时从闪存读取部分内容。 *提交* 是更新闪存文件系统 104a46d47aeSShao Mingyin结构(如索引)的 UBIFS 操作。每次提交时,标记为脏的 TNC 节点被写入闪存以更 105a46d47aeSShao Mingyin新持久化索引。 106a46d47aeSShao Mingyin 107a46d47aeSShao Mingyin 108a46d47aeSShao Mingyin日志 109a46d47aeSShao Mingyin~~~~ 110a46d47aeSShao Mingyin 111a46d47aeSShao Mingyin为避免闪存磨损,索引仅在满足特定条件(如 ``fsync(2)`` )时才持久化(提交)。 112a46d47aeSShao Mingyin日志用于记录索引提交之间的所有变更(以 inode 节点、数据节点等形式)。挂载时 113a46d47aeSShao Mingyin从闪存读取日志并重放到 TNC(此时 TNC 按需从闪存索引创建)。 114a46d47aeSShao Mingyin 115a46d47aeSShao MingyinUBIFS 保留一组专用于日志的 LEB(称为 *日志区* )。日志区 LEB 数量在文件系 116a46d47aeSShao Mingyin统创建时配置(使用 ``mkfs.ubifs`` )并存储于超级块节点。日志区仅含两类节 117a46d47aeSShao Mingyin点: *引用节点* 和 *提交起始节点* 。执行索引提交时写入提交起始节点,每次日 118a46d47aeSShao Mingyin志更新时写入引用节点。每个引用节点指向构成日志条目的其他节点( inode 节点、 119a46d47aeSShao Mingyin数据节点等)在闪存上的位置,这些节点称为 *bud* ,描述包含数据的实际文件系 120a46d47aeSShao Mingyin统变更。 121a46d47aeSShao Mingyin 122a46d47aeSShao Mingyin日志区以环形缓冲区维护。当日志将满时触发提交操作,同时写入提交起始节点。因此 123a46d47aeSShao Mingyin挂载时 UBIFS 查找最新提交起始节点,仅重放其后的引用节点。提交起始节点前的引 124a46d47aeSShao Mingyin用节点将被忽略(因其已属于闪存索引)。 125a46d47aeSShao Mingyin 126a46d47aeSShao Mingyin写入日志条目时,UBIFS 首先确保有足够空间写入引用节点和该条目的 bud。然后先 127a46d47aeSShao Mingyin写引用节点,再写描述文件变更的 bud。在日志重放阶段,UBIFS 会记录每个参考节 128a46d47aeSShao Mingyin点,并检查其引用的 LEB位置以定位 buds。若这些数据损坏或丢失,UBIFS 会尝试 129a46d47aeSShao Mingyin通过重新读取 LEB 来恢复,但仅针对日志中最后引用的 LEB,因为只有它可能因断 130a46d47aeSShao Mingyin电而损坏。若恢复失败,UBIFS 将拒绝挂载。对于其他 LEB 的错误,UBIFS 会直接 131a46d47aeSShao Mingyin终止挂载操作。 132a46d47aeSShao Mingyin 133a46d47aeSShao Mingyin:: 134a46d47aeSShao Mingyin 135a46d47aeSShao Mingyin | ---- LOG AREA ---- | ---------- MAIN AREA ------------ | 136a46d47aeSShao Mingyin 137a46d47aeSShao Mingyin -----+------+-----+--------+---- ------+-----+-----+--------------- 138a46d47aeSShao Mingyin \ | | | | / / | | | \ 139a46d47aeSShao Mingyin / CS | REF | REF | | \ \ DENT | INO | INO | / 140a46d47aeSShao Mingyin \ | | | | / / | | | \ 141a46d47aeSShao Mingyin ----+------+-----+--------+--- -------+-----+-----+---------------- 142a46d47aeSShao Mingyin | | ^ ^ 143a46d47aeSShao Mingyin | | | | 144a46d47aeSShao Mingyin +------------------------+ | 145a46d47aeSShao Mingyin | | 146a46d47aeSShao Mingyin +-------------------------------+ 147a46d47aeSShao Mingyin 148a46d47aeSShao Mingyin 149a46d47aeSShao Mingyin 图2:包含提交起始节点(CS)和引用节点(REF)的日志区闪存布局,引用节点指向含 150a46d47aeSShao Mingyin bud 的主区 151a46d47aeSShao Mingyin 152a46d47aeSShao Mingyin 153a46d47aeSShao MingyinLEB属性树/表 154a46d47aeSShao Mingyin~~~~~~~~~~~~ 155a46d47aeSShao Mingyin 156a46d47aeSShao MingyinLEB 属性树用于存储每个 LEB 的信息,包括 LEB 类型、LEB 上的空闲空间和 157a46d47aeSShao Mingyin*脏空间* (旧空间,废弃内容) [1]_ 的数量。因为 UBIFS 从不在单个 LEB 混 158a46d47aeSShao Mingyin合存储索引节点和数据节点,所以 LEB 的类型至关重要,每个 LEB 都有特定用途, 159a46d47aeSShao Mingyin这对空闲空间计算非常有帮助。详见[UBIFS-WP]。 160a46d47aeSShao Mingyin 161a46d47aeSShao MingyinLEB 属性树也是 B+ 树,但远小于索引。因为其体积小,所以每次提交时都整块写入, 162a46d47aeSShao Mingyin保存 LPT 是原子操作。 163a46d47aeSShao Mingyin 164a46d47aeSShao Mingyin 165a46d47aeSShao Mingyin.. [1] 由于LEB只能追加写入不能覆盖,空闲空间(即 LEB 剩余可写空间)与废弃 166a46d47aeSShao Mingyin 内容(先前写入但未擦除前不能覆盖)存在区别。 167a46d47aeSShao Mingyin 168a46d47aeSShao Mingyin 169a46d47aeSShao MingyinUBIFS认证 170a46d47aeSShao Mingyin========= 171a46d47aeSShao Mingyin 172a46d47aeSShao Mingyin本章介绍UBIFS认证,使UBIFS能验证闪存上元数据和文件内容的真实性与完整性。 173a46d47aeSShao Mingyin 174a46d47aeSShao Mingyin 175a46d47aeSShao Mingyin威胁模型 176a46d47aeSShao Mingyin-------- 177a46d47aeSShao Mingyin 178a46d47aeSShao MingyinUBIFS 认证可检测离线数据篡改。虽然不能防止篡改,但是能让(可信)代码检查闪 179a46d47aeSShao Mingyin存文件内容和文件系统元数据的完整性与真实性,也能检查文件内容被替换的攻击。 180a46d47aeSShao Mingyin 181a46d47aeSShao MingyinUBIFS 认证不防护全闪存内容回滚(攻击者可转储闪存内容并在后期还原)。也不防护 182a46d47aeSShao Mingyin单个索引提交的部分回滚(攻击者能部分撤销变更)。这是因为 UBIFS 不立即覆盖索 183a46d47aeSShao Mingyin引树或日志的旧版本,而是标记为废弃,稍后由垃圾回收擦除。攻击者可擦除当前树部 184a46d47aeSShao Mingyin分内容并还原闪存上尚未擦除的旧版本。因每次提交总会写入索引根节点和主节点的新 185a46d47aeSShao Mingyin版本而不覆盖旧版本,UBI 的磨损均衡操作(将内容从物理擦除块复制到另一擦除块 186a46d47aeSShao Mingyin且非原子擦除原块)进一步助长此问题。 187a46d47aeSShao Mingyin 188a46d47aeSShao MingyinUBIFS 认证不覆盖认证密钥提供后攻击者在设备执行代码的攻击,需结合安全启动和 189a46d47aeSShao Mingyin可信启动等措施确保设备仅执行可信代码。 190a46d47aeSShao Mingyin 191a46d47aeSShao Mingyin 192a46d47aeSShao Mingyin认证 193a46d47aeSShao Mingyin---- 194a46d47aeSShao Mingyin 195a46d47aeSShao Mingyin为完全信任从闪存读取的数据,所有存储在闪存的 UBIFS 数据结构均需认证: 196a46d47aeSShao Mingyin- 包含文件内容、扩展属性、文件长度等元数据的索引 197a46d47aeSShao Mingyin- 通过记录文件系统变更来包含文件内容和元数据的日志 198a46d47aeSShao Mingyin- 存储 UBIFS 用于空闲空间统计的 UBI LEB 元数据的 LPT 199a46d47aeSShao Mingyin 200a46d47aeSShao Mingyin 201a46d47aeSShao Mingyin索引认证 202a46d47aeSShao Mingyin~~~~~~~~ 203a46d47aeSShao Mingyin 204a46d47aeSShao Mingyin借助 *wandering tree* 概念,UBIFS 仅更新和持久化从叶节点到根节点的变更 205a46d47aeSShao Mingyin部分。这允许用子节点哈希增强索引树节点。最终索引基本成为 Merkle 树:因索引 206a46d47aeSShao Mingyin叶节点含实际文件系统数据,其父索引节点的哈希覆盖所有文件内容和元数据。文件 207a46d47aeSShao Mingyin变更时,UBIFS 索引从叶节点到根节点(含主节点)相应更新,此过程可挂钩以同步 208a46d47aeSShao Mingyin重新计算各变更节点的哈希。读取文件时,UBIFS 可从叶节点到根节点逐级验证哈希 209a46d47aeSShao Mingyin确保节点完整性。 210a46d47aeSShao Mingyin 211a46d47aeSShao Mingyin为确保整个索引真实性,UBIFS 主节点存储基于密钥的哈希(HMAC),覆盖自身内容及 212a46d47aeSShao Mingyin索引树根节点哈希。如前所述,主节点在索引持久化时(即索引提交时)总会写入闪存。 213a46d47aeSShao Mingyin 214a46d47aeSShao Mingyin此方法仅修改 UBIFS 索引节点和主节点以包含哈希,其他类型节点保持不变,减少了 215a46d47aeSShao Mingyin对 UBIFS 用户(如嵌入式设备)宝贵的存储开销。 216a46d47aeSShao Mingyin 217a46d47aeSShao Mingyin:: 218a46d47aeSShao Mingyin 219a46d47aeSShao Mingyin +---------------+ 220a46d47aeSShao Mingyin | Master Node | 221a46d47aeSShao Mingyin | (hash) | 222a46d47aeSShao Mingyin +---------------+ 223a46d47aeSShao Mingyin | 224a46d47aeSShao Mingyin v 225a46d47aeSShao Mingyin +-------------------+ 226a46d47aeSShao Mingyin | Index Node #1 | 227a46d47aeSShao Mingyin | | 228a46d47aeSShao Mingyin | branch0 branchn | 229a46d47aeSShao Mingyin | (hash) (hash) | 230a46d47aeSShao Mingyin +-------------------+ 231a46d47aeSShao Mingyin | ... | (fanout: 8) 232a46d47aeSShao Mingyin | | 233a46d47aeSShao Mingyin +-------+ +------+ 234a46d47aeSShao Mingyin | | 235a46d47aeSShao Mingyin v v 236a46d47aeSShao Mingyin +-------------------+ +-------------------+ 237a46d47aeSShao Mingyin | Index Node #2 | | Index Node #3 | 238a46d47aeSShao Mingyin | | | | 239a46d47aeSShao Mingyin | branch0 branchn | | branch0 branchn | 240a46d47aeSShao Mingyin | (hash) (hash) | | (hash) (hash) | 241a46d47aeSShao Mingyin +-------------------+ +-------------------+ 242a46d47aeSShao Mingyin | ... | ... | 243a46d47aeSShao Mingyin v v v 244a46d47aeSShao Mingyin +-----------+ +----------+ +-----------+ 245a46d47aeSShao Mingyin | Data Node | | INO Node | | DENT Node | 246a46d47aeSShao Mingyin +-----------+ +----------+ +-----------+ 247a46d47aeSShao Mingyin 248a46d47aeSShao Mingyin 249a46d47aeSShao Mingyin 图3:索引节点哈希与主节点 HMAC 的覆盖范围 250a46d47aeSShao Mingyin 251a46d47aeSShao Mingyin 252a46d47aeSShao Mingyin 253a46d47aeSShao Mingyin健壮性性和断电安全性的关键在于以原子操作持久化哈希值与文件内容。UBIFS 现有 254a46d47aeSShao Mingyin的变更节点持久化机制专为此设计,能够确保断电时安全恢复。为索引节点添加哈希值 255a46d47aeSShao Mingyin不会改变该机制,因为每个哈希值都与其对应节点以原子操作同步持久化。 256a46d47aeSShao Mingyin 257a46d47aeSShao Mingyin 258a46d47aeSShao Mingyin日志认证 259a46d47aeSShao Mingyin~~~~~~~~ 260a46d47aeSShao Mingyin 261a46d47aeSShao Mingyin日志也需要认证。因为日志持续写入,必须频繁地添加认证信息以确保断电时未认证数 262a46d47aeSShao Mingyin据量可控。方法是从提交起始节点开始,对先前引用节点、当前引用节点和 bud 节点 263a46d47aeSShao Mingyin创建连续哈希链。适时地在bud节点间插入认证节点,这种新节点类型包含哈希链当前 264a46d47aeSShao Mingyin状态的 HMAC。因此日志可认证至最后一个认证节点。日志尾部无认证节点的部分无法 265a46d47aeSShao Mingyin认证,在日志重放时跳过。 266a46d47aeSShao Mingyin 267a46d47aeSShao Mingyin日志认证示意图如下:: 268a46d47aeSShao Mingyin 269a46d47aeSShao Mingyin ,,,,,,,, 270a46d47aeSShao Mingyin ,......,........................................... 271a46d47aeSShao Mingyin ,. CS , hash1.----. hash2.----. 272a46d47aeSShao Mingyin ,. | , . |hmac . |hmac 273a46d47aeSShao Mingyin ,. v , . v . v 274a46d47aeSShao Mingyin ,.REF#0,-> bud -> bud -> bud.-> auth -> bud -> bud.-> auth ... 275a46d47aeSShao Mingyin ,..|...,........................................... 276a46d47aeSShao Mingyin , | , 277a46d47aeSShao Mingyin , | ,,,,,,,,,,,,,,, 278a46d47aeSShao Mingyin . | hash3,----. 279a46d47aeSShao Mingyin , | , |hmac 280a46d47aeSShao Mingyin , v , v 281a46d47aeSShao Mingyin , REF#1 -> bud -> bud,-> auth ... 282a46d47aeSShao Mingyin ,,,|,,,,,,,,,,,,,,,,,, 283a46d47aeSShao Mingyin v 284a46d47aeSShao Mingyin REF#2 -> ... 285a46d47aeSShao Mingyin | 286a46d47aeSShao Mingyin V 287a46d47aeSShao Mingyin ... 288a46d47aeSShao Mingyin 289a46d47aeSShao Mingyin因为哈希值包含引用节点,攻击者无法重排或跳过日志头重放,仅能移除日志尾部的 290a46d47aeSShao Mingyinbud 节点或引用节点,最大限度将文件系统回退至上次提交。 291a46d47aeSShao Mingyin 292a46d47aeSShao Mingyin日志区位置存储于主节点。因为主节点通过 HMAC 认证,所以未经检测无法篡改。日 293a46d47aeSShao Mingyin志区大小在文件系统创建时由 `mkfs.ubifs` 指定并存储于超级块节点。为避免篡 294a46d47aeSShao Mingyin改此值及其他参数,超级块结构添加 HMAC。超级块节点存储在 LEB 0,仅在功能标 295a46d47aeSShao Mingyin志等变更时修改,文件变更时不修改。 296a46d47aeSShao Mingyin 297a46d47aeSShao Mingyin 298a46d47aeSShao MingyinLPT认证 299a46d47aeSShao Mingyin~~~~~~~ 300a46d47aeSShao Mingyin 301a46d47aeSShao MingyinLPT 根节点在闪存上的位置存储于 UBIFS 主节点。因为 LPT 每次提交时都以原子 302a46d47aeSShao Mingyin操作写入和读取,无需单独认证树节点。通过主节点存储的简单哈希保护完整 LPT 303a46d47aeSShao Mingyin即可。因为主节点自身已认证,通过验证主节点真实性并比对存储的 LTP 哈希与读 304a46d47aeSShao Mingyin取的闪存 LPT 计算哈希值,即可验证 LPT 真实性。 305a46d47aeSShao Mingyin 306a46d47aeSShao Mingyin 307a46d47aeSShao Mingyin密钥管理 308a46d47aeSShao Mingyin-------- 309a46d47aeSShao Mingyin 310a46d47aeSShao Mingyin为了简化实现,UBIFS 认证使用单一密钥计算超级块、主节点、提交起始节点和引用 311a46d47aeSShao Mingyin节点的 HMAC。创建文件系统(`mkfs.ubifs`) 时需提供此密钥以认证超级块节点。 312a46d47aeSShao Mingyin挂载文件系统时也需此密钥验证认证节点并为变更生成新 HMAC。 313a46d47aeSShao Mingyin 314a46d47aeSShao MingyinUBIFS 认证旨在与 UBIFS 加密(fscrypt)协同工作以提供保密性和真实性。因为 315a46d47aeSShao MingyinUBIFS 加密采用基于目录的差异化加密策略,可能存在多个 fscrypt 主密钥甚至未 316a46d47aeSShao Mingyin加密目录。而 UBIFS 认证采用全有或全无方式,要么认证整个文件系统要么完全不 317a46d47aeSShao Mingyin认证。基于此特性,且为确保认证机制可独立于加密功能使用,UBIFS 认证不与 318a46d47aeSShao Mingyinfscrypt 共享主密钥,而是维护独立的认证专用密钥。 319a46d47aeSShao Mingyin 320a46d47aeSShao Mingyin提供认证密钥的API尚未定义,但可通过类似 fscrypt 的用户空间密钥环提供。需注 321a46d47aeSShao Mingyin意当前 fscrypt 方案存在缺陷,用户空间 API 终将变更[FSCRYPT-POLICY2]。 322a46d47aeSShao Mingyin 323a46d47aeSShao Mingyin用户仍可通过用户空间提供单一口令或密钥覆盖 UBIFS 认证与加密。相应用户空间工 324a46d47aeSShao Mingyin具可解决此问题:除派生的 fscrypt 加密主密钥外,额外派生认证密钥。 325a46d47aeSShao Mingyin 326a46d47aeSShao Mingyin为检查挂载时密钥可用性,UBIFS 超级块节点将额外存储认证密钥的哈希。此方法类 327a46d47aeSShao Mingyin似 fscrypt 加密策略 v2 提出的方法[FSCRYPT-POLICY2]。 328a46d47aeSShao Mingyin 329a46d47aeSShao Mingyin 330a46d47aeSShao Mingyin未来扩展 331a46d47aeSShao Mingyin======== 332a46d47aeSShao Mingyin 333a46d47aeSShao Mingyin特定场景下,若供应商需要向客户提供认证文件系统镜像,应该能在不共享 UBIFS 认 334a46d47aeSShao Mingyin证密钥的前提下实现。方法是在每个 HMAC 外额外存储数字签名,供应商随文件系统 335a46d47aeSShao Mingyin镜像分发公钥。若该文件系统后续需要修改,若后续需修改该文件系统,UBIFS 可在 336a46d47aeSShao Mingyin首次挂载时将全部数字签名替换为 HMAC,其处理逻辑与 IMA/EVM 子系统应对此类情 337a46d47aeSShao Mingyin况的方式类似。此时,HMAC 密钥需按常规方式预先提供。 338a46d47aeSShao Mingyin 339a46d47aeSShao Mingyin 340a46d47aeSShao Mingyin参考 341a46d47aeSShao Mingyin==== 342a46d47aeSShao Mingyin 343a46d47aeSShao Mingyin[CRYPTSETUP2] https://www.saout.de/pipermail/dm-crypt/2017-November/005745.html 344a46d47aeSShao Mingyin 345a46d47aeSShao Mingyin[DMC-CBC-ATTACK] https://www.jakoblell.com/blog/2013/12/22/practical-malleability-attack-against-cbc-en 346a46d47aeSShao Mingyincrypted-luks-partitions/ 347a46d47aeSShao Mingyin 348a46d47aeSShao Mingyin[DM-INTEGRITY] https://www.kernel.org/doc/Documentation/device-mapper/dm-integrity.rst 349a46d47aeSShao Mingyin 350a46d47aeSShao Mingyin[DM-VERITY] https://www.kernel.org/doc/Documentation/device-mapper/verity.rst 351a46d47aeSShao Mingyin 352a46d47aeSShao Mingyin[FSCRYPT-POLICY2] https://www.spinics.net/lists/linux-ext4/msg58710.html 353a46d47aeSShao Mingyin 354a46d47aeSShao Mingyin[UBIFS-WP] http://www.linux-mtd.infradead.org/doc/ubifs_whitepaper.pdf 355