LWN:再次提交fs-verity方案!最终版?!

Android15功能和 API 概览 Android 15 面向开发者引入了一些出色的新功能和 API。以下部分总结了这些功能,以帮助您开始使用相关 API。 阅读详情
640点击上方蓝色字关注我们~



Yet another try for fs-verity

By Jonathan Corbet
June 3, 2019

fs-verity机制起源于Android项目,目的是希望把部分文件配置成read-only,并且让kernel检测到任何对这个文件的修改,甚至包括offline改动(例如有人把eMMC chip取下来用其他方法更改了里面的block,再焊回手机)。此前的多种fs-verity实现方案在社区这边收到一些反对意见,所以都没能合入kernel。2019年5月23日又有了一个最新版本的实现方案被提了出来,这次使用了一个更改过的user-space API,可能更有机会被合入Linux主干代码。


fs-verity会对文件生成一组hash值。hash值就能用来监测文件是否被改动过。目前的实现方案里,hash都存在一个Merkle tree里面,这样在文件被访问的时候能以最高效率来验证hash。这个Merkle tree本身也被hash以及签名过,这样每次有hash值被修改了也能第一时间被监测到(此时对文件的访问会被阻塞住)。实用场景就是在Android里面对一些非常重要的package进行保护,万一有攻击者能修改本地存储设备的话也能立刻报出警报。


此前fs-verity的其他实现方式在社区这边被搁置,都是因为大家对这个API的工作方式很有意见。为了要保护某个文件,user space就需要首先生成一个Merkle tree并签名,然后把这个tree追加到这个文件末尾,并跟对应的文件系统块的起始地址和block size要align。再利用一个ioctl()调用通知kernel来隐藏这个tree,这样这个文件看起来就比它的真实长度要短一点,然后kernel此后就可以利用这个tree来验证文件内容了。这个机制很明显跟一些文件系统管理各个文件结束位置的方式不兼容。内核开发者还抱怨说这个API事实上把fs-verity的内部实现细节暴露过多给user space了。总之,此前的版本本来希望被加入Linux 5.0的,最终没能成功。


这组新patch set把Merkle tree的建立过程挪到kernel里面了,相当于把tree的存储位置细节信息都隐藏起来了。这样user-space application如果想对某个文件打开fs-verity,就先用read-only模式打开这个文件,获取到file descriptor(事实上文件其实会被改变,因为加上了protection并且被设为read-only)。然后调用新加的FS_IOC_ENABLE_VERITY ioctl(),传入这样一个结构给kernel:


这里的version值必须要设为1,主要是为了今后万一fs-verity的实现细节有改动之后的兼容性而准备的。同样的,reserved必须全部设为0。hash_algorithm就是告诉kernel需要用哪种hash算法来对文件内容进行哈希处理。目前唯一有意义的值是FS_VERITY_HASH_ALG_SHA256和FS_VERITY_HASH_ALG_SHA512。block_size就是表示hash的block size,必须跟文件系统的block size要对的上。如果salt_size和salt_ptr也设置了,就意味着要对每个block进行hash处理前要先添加个salt值(对数据加盐,增加hash的逆向破解的难度)。还有可以用sig_ptr和sig_size来指定数字签名,这是个可选项,下面也会有详细介绍。


这个ioctl()调用会把整个文件全部read一遍,生成Merkle tree,然后根据所使用的文件系统的特点来决定把tree存放到哪里。如果文件很大,这个操作就会花费不少时间,这个过程中如果有fatal signal(例如被kill -9)的话会中断,文件本身不会被改动。如果这个目标文件当前被人打开并且是可以写入的模式的话,对它打开fs-verity就会失败。 


ioctl如果成功了,这个文件就能支持fs-verity了,之后再用write模式打开此文件就会失败,哪怕文件权限属性里面允许此用户使用write权限打开这个文件也没有用。不过文件的部分metadata还是能够被改动的,也能被重命名或者删除。所有的读操作,如果度出来的数据跟存好的hash值对不上,那么读文件的操作也会fail(返回EIO)。不过如果user space很依赖fs-verity保护的话,它还是应该在打开文件之后主动用FS_IOC_MEASURE_VERITY这个ioctl()来验证fs-verity是打开的。此ioctl传入数据指针是这样的结构:


    struct fsverity_digest {
__u16 digest_algorithm;
__u16 digest_size; /* input/output */
__u8 digest[];
   };

假设文件已经用fs-verity保护起来了,hash summary信息就会填到这个结构里返回出来。User space可以用这个信息来验证digest数据是否符合预期。如果不这样测试一下的话,攻击者很可能把一个文件彻底替换成恶意文件并且同时使用相应的Merkle tree值。当然,digest也能被签名来保护起来,这样kernel就会在每次访问的时候验证签名确保安全。需要签名的就是这个结构:


    struct fsverity_signed_digest {
char magic[8];                  /* must be "FSVerity" */
__le16 digest_algorithm;
__le16 digest_size;
__u8 digest[];
   };

这些digest摘要信息都可以用上述的FS_IOC_MEASURE_VERITY ioctl()来从kernel获取。因此,要想对一个fs-verity文件加上签名,一个可行的方法就是:创建这个文件,打开fs-verity不过此时不要使用签名,然后获取digest摘要信息,最后再用签名信息第二次创建这个文件并打开fs-verity。真实使用场景里面,通过fs-verity保护起来的文件(就像Andriod的package文件)通常都是生成文件系统镜像文件时就已经配好了相应的签名数据,因此上述的两步创建签名保护的方法一般用不上。


要想完成签名以及验证,还需要提供一组公钥来做签名验证。fs-verity子系统会创建一个新的keyring(称为.fs-verity),有相应权限的用户可以往这个keyring钥匙环里添加证书用于文件验证。当然,用于签名的秘钥绝对不能在目标系统(target system)上存放。假设攻击者没有办法通过其他方式拿到秘钥,那么通过公钥进行的验证就能确保文件没有被更改过。


目前的patch set提供了对ext4和F2FS文件系统的支持。相应的也提供了详细的文档介绍如何使用以及它的实现原理。有些kernel feature在添加时没有提供足够的document,fs-verity这方面表现的非常非常不错。


此前的各版patch set都引起了很多热火朝天的讨论。这次,似乎大家都表现的很安静,因此作者Eric Biggers都不得不在mailinglist里提醒大家是否有comment要说。除非有人提出反对意见,否则之后意味着这回fs-verity真的很有可能已经扫清了大家的担忧,进而可能会被合入Linux 5.3版本中。


全文完

LWN文章遵循CC BY-SA 4.0许可协议。

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议上的修改再创作~


长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~


640?wx_fmt=jpeg

消息摘要算法在android上的应用 主要有包括OTA包传输、dm-verity、fs-verity、selinux重编译判断、bootconfig数据check、签名验签中的校验数据完整性(查看非对称算法)。 阅读详情

相关推荐

fs-verity-rs:不使用libfsverity的Rust支持Linux的fs-verity

fs-verity 此板条箱实现了用于处理Linux内核的fs-verity功能的实用程序。 什么是fs-verity ? 它使您可以使文件永久不变,并使内核为该文件计算并存储基于的哈希,可以立即从该文件检索该哈希。 内核还将再次验证从文件读取的所有数据以及Merkle树数据,如果不匹配,则拒绝读取。 这意味着(只要您信任正在运行的内核),就可以绝对确定此即时可检索的哈希将与您从文件读取的数据匹配。 您应该通过其他方式来确定哈希是否是预期的哈希,例如检查哈希是否在已由某些密钥签名的可接受哈希列表中。 内核的fs-verity代码确实实现了基本的(和可选的)内核内签名验证方案。 但是,由于您仍然必须手动检查打开的文件是否启用了fs-verity ,因此它不会增加太多价值,并且可能更多是概念验证。 此板条箱目前不支持此方案。 当前, fs-verity仅在f2fs和ext4文件系统

LWN:能在Fedora 36中加入fs-verity吗?

关注了就能看到更多这么棒的文章哦~Adding fs-verity support for Fedora 36?By Jake EdgeDecember 14, 2021DeepL ass...

Linux News搬运工 481

build

Android Make构建系统 这是Android构建系统中基于Makefile的部分。 有关如何运行构建的文档,请参见 有关对Android.mk编写者有用的行为更改列表,请参见 有关Android.mk文件的过时参考,请参阅 。我们的Android.mk文件看起来相似,但与NDK构建系统使用的Android.mk文件完全不同。在其他地方搜索文档时,请确保它是针对平台构建系统的-大多数不是。 这个基于Makefile的系统正在被取代, 是一个用Go编写的新构建系统。在过渡期间,所有这些makefile都由读取,并生成一个ninja文件,而不是直接执行。该文件与Soong读取的忍者文件结合在一起,因此可以将两个系统的构建图合并并作为一个整体运行。

一起看看Android15第一个开发者预览版新增了哪些特性

2024年2月16日,Google工程副总裁Dava Burke发布了Android15系统的第一个开发者预览版,旨在build a platform that helps improve your productivity while giving you new capabilities to produce superior media experiences...(更高的工作效率,卓越的媒体体验,最好的能耗,最流畅的应用性能,更好保护应用隐私...)不看这些了,下面是特性。

夏目艾拉的学习之路 1576

FCN---训练cityspaces

未经允许,不要随意转载! 最近想试试用FCN训练自己的数据集,想想标注是一件很费劲的事,于是就想到了用其他库里的数据,这里选用了cityspaces,默认已经配置好FCN. 1、下载cityspaces https://www.cityscapes-dataset.com/ 需要注册一个账号 cityspaces包含2...

wangyu088的专栏 2030

MATLAB下pdf文件操作读取示例

当遇到一些需要大量数据的项目,数据的读取与储存显得尤为重要。怎样把数据从其他格式的文件中读取,并运用到程序中是很多时候我们要解决的问题。对于平常的.txt,和.xlsx文件,MATLAB有对应的函数帮助读取,但是遇到pdf文件时MATLAB很难读取内容。本文以一个操作实例提供了一个从pdf文件中读取数据的方法。

UESTC 五高考3模拟的博客 6558

LWN: Linux 5.4系列kernel正式发布

点击上方蓝色“Linux News搬运工”关注我们~The 5.4 kernel has been released[Kernel] Posted Nov 25, 2019 3:28 U...

Linux News搬运工 581

GATK SNP过滤参数优化:从标准到个性化调整的实践指南

本文深入探讨了GATK SNP过滤参数的个性化调整策略,强调不应盲目套用官方标准参数。文章详细拆解了QD、FS、SOR等关键过滤参数的含义,并提供了通过数据分布分析、文献调研和迭代测试来确定适合自身数据(如动植物重测序)最佳阈值的实践方法,旨在帮助研究者在保留真实变异与剔除假阳性信号之间找到最优平衡。

weixin_29216049的博客 275

LWN: 对 BPF 所拥有的超能力进行限制!

关注了就能看到更多这么棒的文章哦~Taming the BPF superpowersBy Jonathan CorbetSeptember 29, 2021LPCDeepL assist...

Linux News搬运工 355

Python自动化神器:OP插件64位版从安装到实战(附雷电模拟器截图技巧)

本文详细介绍了Python自动化神器OP插件64位版的安装与实战应用,包括环境搭建、窗口控制、鼠标键盘模拟等核心功能。特别针对雷电模拟器提供了最小化截图技术和OCR识别优化方案,帮助开发者高效实现Windows自动化任务。

weixin_29094539的博客 330

Claude Code Skills 入门:内置技能与自定义技能开发

│ Skill 的特点 │1. 封装性:把复杂操作封装成简单命令2. 可复用:一次定义,随处使用3. 可定制:支持参数传入4. 可发现:通过 /skill-name 方式调用打个比方,如果说 Claude Code 的基础工具是「原材料」,那 Skills 就是「预制菜」——只需要简单加热(调用),就能得到成品(结果)。你可以创建自己的 Skill 来封装常用操作。Skill 支持参数,通过。

gaoxiang_120的专栏 670

LWN:9月份LPC上关于folio的一次讨论!

关注了就能看到更多这么棒的文章哦~A discussion on foliosBy Jake EdgeSeptember 22, 2021LPCDeepL assisted transla...

Linux News搬运工 599

Multica 自托管部署与使用入门:从上线到让 AI Agent 真正干活

Multica是一个将AI Agent作为团队成员的任务协作平台,支持自托管部署。本文介绍了完整的单机部署流程: 核心架构包括前端界面、后端服务、PostgreSQL数据库和Runtime执行机器 推荐使用Docker Compose部署,需配置数据持久化目录 提供详细的docker-compose.yml和.env配置文件说明 重点注意事项:数据库密码和JWT密钥必须修改,生产环境配置必须设为production 需正确配置前端访问地址和WebSocket连接 部署完成后,用户可创建AI Agent并将其

q742971636的博客 1696

LWN:针对完整性保护以及数据共享设计的Composefs!

关注了就能看到更多这么棒的文章哦~Composefs for integrity protection and data sharingBy Jake EdgeDecember 7, 2022DeepL assisted translationhttps://lwn.net/Articles/917097/最近在 linux-kernel 邮件列表中提出了一个只读文件系统的 RFC,希望用它来在不...

Linux News搬运工 528

YOLOv10改进,YOLOv10二次创新C2f结构采用WTConv卷积(感受野的小波卷积),ECCV 2024

WTConv 的核心思想是通过结合卷积神经网络(CNN)的强大特征提取能力与小波变换的多尺度特性,来实现大感受野的卷积操作,同时避免传统大卷积核带来的参数爆炸问题。传统的卷积操作通过滑动小窗口在图像上逐步执行局部特征提取,感受野的大小直接取决于卷积核的尺寸。随着卷积核的增大,参数量呈指数增长,导致网络训练效率降低、计算资源消耗增加。为解决这些问题,WTConv 提出了在小波域中执行卷积操作的策略。小波变换是一种常用于信号处理的技术,能够将信号分解为不同频率成分。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1022

高通SDX12:ProSLIC Si32185移植调试

高通 SDX12 语音芯片slic 音频驱动 Si32185

不秃头的程序猿Gabriel的博客 2037

LWN:讨论composefs!

关注了就能看到更多这么棒的文章哦~Debating composefsBy Jonathan CorbetFebruary 16, 2023ChatGPT assisted translationhttps://lwn.net/Articles/922851/去年 12 月,LWN 曾经报道过 Composefs 文件系统,并称针对这些 patch “几乎没有任何反馈”。但是现在情况已经发生了改变...

Linux News搬运工 662

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LWN:让Btrfs的数据改动需要预先经过认证!

关注了就能看到更多这么棒的文章哦~Authenticated BtrfsByJonathan CorbetApril 30, 2020原文来自:https://lwn.net/Arti...

Linux News搬运工 364

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LWN:5.15 合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~5.15 Merge window, part 1By Jonathan CorbetSeptember 2, 2021DeepL assisted tr...

Linux News搬运工 563

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LWN: Fedora筹划实现完整性检查!

关注了就能看到更多这么棒的文章哦~A possible step toward integrity measurement for FedoraBy Jonathan CorbetJan...

Linux News搬运工 307

LWN: 5.12 合并窗口,第一部分!

关注了就能看到更多这么棒的文章哦~5.12 Merge window, part 1By Jonathan CorbetFebruary 22, 2021DeepL assisted tr...

Linux News搬运工 524

LWN: 5.11 合并窗口,第二部分!

关注了就能看到更多这么棒的文章哦~5.11 Merge window, part 2By Jonathan CorbetDecember 28, 2020DeepL assisted t...

Linux News搬运工 307

LWN:6.10合并窗口的后半部分!

关注了就能看到更多这么棒的文章哦~The rest of the 6.10 merge windowBy Jonathan CorbetMay 27, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/974869/Linus Torvalds发布了 6.10-rc1并在 5 月 26 日关闭了 6.10 合并窗口。当时,已经有 ...

Linux News搬运工 550

6.6内核版本主要特性

2023年10月29日星期天,Linux 6.6发布。

weixin_49382066的博客 1313

LWN:5.19 合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~5.19 Merge window, part 1By Jonathan CorbetMay 27, 2022DeepL assisted translationhttps://lwn.net/Articles/896140/在撰写本文时,针对 5.19 开发周期,已经有将近 4600 个 non-merge changeset 合入 m...

Linux News搬运工 543

Android系统给第三方APP生成系统签名

Djava.library.path 用于指定本地库的路径, 本地库通常是使用Java Native Interface (JNI) 来调用本地代码的库文件。在aosp的根目录,给apk进行系统签名, 或者在其他目录,将下面的path参数设置为绝对路径。这里主要是用到libconscrypt_openjdk_jni.so这个库。就是签名后的apk.

cfp6523052的专栏 589
上一篇: LWN: Linux稳定分支状况以及相应测试
下一篇: LWN:Linux kernel要有几种test framework?
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值