LWN: 加固 virtio!

OVS-DPDK VM出现 virtio_net virtio4: output.0:id 30 is not a head 问题 dpdk-vhost bug fix 云环境中,部分vm运行一段时间,不对外发包,可正常收包,system log中出现:kernel: virtio_net virtio4: output.0:id 30 is not a head。       gdb ovs进程,发现rte_vhost_dequeue_burst 中,if (vq->last_used_idx == avail_idx) return ,直接判断没有数据可读。 阅读详情

关注了就能看到更多这么棒的文章哦~

Hardening virtio

August 9, 2021
This article was contributed by Marta Rybczyńska
DeepL assisted translation
https://lwn.net/Articles/865216/

一直以来在虚拟化环境中,host 都是受到 guest 的信任的,并且负责保护自己不能受到那些恶意 guest 的破坏。随着保密计算(confidential computing)等举措的开展,这一规则变得更进一步了,也就是:guest 不再信任 host。这种基本原则的变化,导致需要在以前没有加边界防御(boundary defence)的地方也要加上了。最近,Andi Kleen 提交了一组 patch set,希望在 virtio 中添加这些必需的保护措施。这组 patch set 所引发的讨论,再一次说明需要针对更多的使用场景来加固 virtio。

Virtio 为一些类型的设备(如网络或块设备)提供了一个标准化的接口。使用 virtio 的话,guest 可以运行一个简化的通用驱动程序,host 来处理与底层的真正设备的交互。virtio 设备(host 端)和驱动程序(guest 端)之间的通信是通过名为 virtqueues 的数据结构来进行的,这通常是一些 memory buffer,不过实际的实现方式还是取决于所使用的总线的。

The scope of the hardening

在 confidential-computing 世界里,host 不可以访问那些没有明确共享给它的 guest memory。此外,guest 的内存可以由处理器用 host 完全不知道的密钥来进行加密。Kleen 的工作是建立在英特尔即将推出的硬件功能之上,也就是名为信任域扩展(TDX,Trust Domain Extensions)的功能,其目标是希望保护云环境中的 guest。这个功能是基于一些架构扩展功能的,包括使用了 Multi-Key Total Memory Encryption(MKTME)的内存加密(在 2019 年在 LWN 提到的时候还是使用的另一套有些差异的内存加密 API),以及一种称为安全仲裁模式(SEAM, Secure-Arbitration Mode)的新增 CPU mode。在受保护的模式(protected mode)中,在 SEAM 下运行的代码只能利用指定的内存区域(也就是加密过的),而其他所有进程(还有 DMA 操作)都不能访问到该区域。Virtio 作为 guest 和 host 之间常用的接口,就必须格外小心,要避免损害 TDX 提供的安全性。

直到最近,virtio 驱动程序都认为另一边是可以信任的。因此,在处理与设备(即 host 这一侧)共享的各种元数据时(例如操作描述符、ring buffer 位置、最终结果代码等)时,有时没有进行必要的检查。因此,它们可能无法检测出坏指针,或者超出范围的 buffer index 之类的错误。因此,恶意的 host 完全可以利用 buffer overrun 来获得对 guest 内存的访问能力。其他情况下,也是需要检查 device 的元数据的,因为 virtio 不再只是在 guest 和 host 之间使用了,也有一些物理设备现在正在实现 virtio 接口。

这些 patch 可以分为三部分。第一部分是对 virtio 本身的加固,位于 virtio-ring。它还禁用了 virtio 的一些模式。第二部分是启用了 TDX 的 x86 系统的 mode restriction。最后,则是 swiotlb 的改动,swiodtlb 是用来在无法直接使用 DMA 的情况下经过 bounce buffer 来实现 DMA 功能。patch set 中包含的这些加固措施对恶意指针增加了额外检查。

Virtio modes

Virtio 定义了许多 mode ,分别具有不同的内存组织模式,这完全取决于设备和驱动程序的需求。这样依赖就导致有多种代码路径需要进行加固。显然,其中一部分 mode 修复起来更容易一些。Kleen 决定只保护 split mode,也就是每个 virtqueue 都由不同的部分组成,每个部分都可以由 driver 或 device 写入,但不可以被两者同时写入。

当前 patch set 中,当 guest 运行在 TDX 保护模式下时,不允许采用其他 mode。这样一来就无法使用 indirect descriptor 了(这是一种 split-mode extension,允许在另一个专门的内存区域分配多个描述符,通过增加 ring 的容量来改善性能)。同样被禁用的还有 packed mode,这是一种更紧凑的内存布局。这些限制引起了一些反对意见。Jason Wang 观测到,禁用 indirect descriptor 会造成很大的性能损失。Kleen 感到要保证这种模式的安全很困难,他认为这种模式太难保护了。Wang 认为这个问题可以解决,并承诺会发布一组 patch。

Andy Lutomirski 也不同意这种禁用了所有 mode 只保留一种的做法。他后来明确强调,不能让 device 在任何配置下损坏 driver,所以加固的做法需要更通用一些:

对于大多数 Linux 驱动来说,恶意的 device 如果会破坏 host memory ,那么这就是一个 bug 而不是一个 feature。如果某个 USB 设备可以破坏内核的内存,那就是一个严重的 bug。如果一个 USB-C 设备可以破坏内核 bug,这也是一个严重的 bug,尽管可悲的是,我们可能有很多这样的 bug。如果一个 Firewire device 可以破坏内核内存,11 频道的新闻都会报道了。如果一个蓝牙或 WiFi 的对端设备可以破坏内核内存,人们就会为它写十四行诗,并给它起各种特别的名字。那么为什么 virtio 就要是特别的?

根据 Lutomirski 的说法,驱动程序应该需要对所有的使用场景来说都是安全,而不仅仅是在使用 TDX 的情况。只在运行 TDX 时禁用其他 mode 并不能解决问题,因为这些 mode 中的漏洞可以被利用来攻击现有的系统。他还指出,virtio 不仅是一种软件实现,而且还有硬件设备也是采用了 virtio 兼容的接口暴露给驱动程序。在另一封邮件中,他建议将驱动程序分成现代版本和传统版本(这个传统版本可以包括所有那些并未真正使用的 mode,以及那些无法在不破坏兼容性的情况下修复的 mode),然后将现代版本完全彻底地加固起来。

Kleen 并不赞同,他说在其他情况下(可能是那些没有使用 TDX 这类机制的情况)完全没有内存保护,并且还有导致兼容性问题的风险(他并没有明确解释这一点)。边界检查是无条件启用的,但其他 virtio 模式只有在 TDX 激活时才被禁用。讨论就这样结束了,没有明确的结论。

Similar work

在讨论中,Wang 指出还有其他一些类似的加固需求,包括对 AMD 安全加密虚拟化(SEV, Secure Encryted Virtualization)的支持。另一个对 virtio 加固的需求来自于 SmartNIC 以及那些实现了 virtio 接口的设备,主要包括 vDPA (一种在 data path 上实现 virtio 的设备类型,它的 control path 上还有一个 vendor driver ) 以及 VDUSE (一种在用户空间实现的 vDPA 设备)。它们也有类似的问题,都不应该相信 device 所提供的元数据。根据 Kleen 的说法,这些其他情况只要基于他的改动之上增加一些改动应该就可以实现这个功能了。

Conclusions and next steps

对设备驱动进行加固,从而能对抗恶意设备,这是受到内核开发者欢迎的目标。讨论表明确实有多种使用场景需要这样的功能,而且不同的部分都需要这样的 fix。Kleen 的 patch set 在当前收到的评价有赞同也有反对。这里主要的问题似乎是它与 TDX 的工作关联太紧密了,而内核开发者们喜欢一个更通用的解决方案。我们可能会在未来看到这项工作的更多版本,以及 virtio 的其他加固修复工作。

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

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

手把手教你Windows操作系统添加Virtio驱动 1.需要用到的工具:正规渠道下载的windows操作系统镜像(ISO)文件,解压工具,Windows自动安装工具包(https://www.microsoft.com/zh-cn/search/DownloadResults.aspx?q=WAIK),UltraISO,Virtio驱动 2.解压windows操作系统,解压Windows自动安装工具包 3.解压WAIK Windows自动安装工具包,提取WAIKAMD64.msi并安装,如果是32位系统, 4.提取操作系统镜像里的boot.wi 阅读详情

相关推荐

在虚拟机中访问host文件的过程

基本配置信息: 虚拟机是由qemu启动,qemu使用kernel kvm启动虚拟机,VM是普通的linux系统。 qemu通过virtio-9p在host和guest之间共享文件 qemu 参数: -fsdev local,id=exp1,path=/tmp/,security_model=none -device virtio-9p-pci,fsdev=exp1,mount_tag=v_tmp On the client it can be mounted with: $ mount -t 9p

1463

KVM下windows虚拟机使用virtio驱动

KVM下windows虚拟机默认disk使用的是Qemu IDE硬盘,网卡默认是rtl8139网卡。为了使kvm主机在相同的配置下,有更好的效率,可以将网卡和磁盘替换成virtio的驱动。 windows的virtio驱动主要包括网卡以及磁盘的驱动,主要有三种方式,第一种是已有windows的操作系统,需要更新驱动,第二种是是安装时加载virtio驱动,第三种是直接制作virtio驱动的iso系...

weixin_30781631的博客 2452

AMDSEV:AMD安全加密虚拟化

目录 准备虚拟机 启动SEV VM Ubuntu-18.04 准备主机操作系统 准备虚拟机 启动SEV VM openSuse-风滚草 准备主机操作系统 启动SEV VM SEV集装箱 额外资源 常问问题 我怎么知道Hypervisor是否支持SEV 我如何知道访客中是否启用了SEV 我可以使用virt-manager来启动SEV访客吗 如何增加SWIOTLB限制 virtio-blk失败,出现缓冲区不足错误 安全加密虚拟化(SEV) SEV是对AMD-V体系结构的扩展,该体系结构支持在KVM的控制下运行加密的虚拟机(VM)。 加密的VM的页面(代码和数据)受保护,因此只有来宾本身可以访问未加密的版本。 每个加密的VM都有一个唯一的加密密钥。 如果使用其他密钥将其数据访问其他实体,则加密的来宾数据将被错误地解密,从而导致数据难以理解。 SEV支持已在上游项目中接受。 该存

自己集成sata 网卡 驱动 进入windows server 2003 sp2系统

此帖仅适合于偏执狂,强调系统稳定,不信任任何网络修改版本,又必需sata驱动的,还有动手能力的兄弟。。 最近整了一个宏基4741g笔记本,用的sata2硬盘,这下我的2003系统装起有点麻烦了。2003sp2不支持sata硬盘,一装系统就蓝屏,这时虽可以在BIOS里面将硬盘设置成IDE模式进行安装,安装后再装intel 的sata驱动,再将BIOS换成ARCH模式,但这样很麻烦的。考虑到微软

低调走过 8952

Xilinx XDMA IP核配置实战:AXI Memory Mapped vs Stream选型指南(附PCIe调试技巧)

本文深入解析Xilinx XDMA IP核配置中AXI Memory Mapped与AXI Stream两种DMA接口的核心区别与选型策略。针对PCIe高速数据传输场景,详细对比了二者在数据特性、延迟、硬件资源及软件复杂度上的差异,为FPGA工程师在数据采集、实时处理等项目中做出高效设计决策提供实战指南,并附有关键的PCIe调试技巧。

qsc901234的博客 585

银河麒麟系统V10 sp1,安装wine 9.0

银河麒麟系统V10 sp1 x86_64,安装wine 9.0

daqinzl的专栏 1万+

Windows操作系统添加VirtIO驱动图文教程

本教程分两部份: Part1 for Windows 8.1, 8, 7, Server 2012, 2008 | Part2 for Windows XP, 2003 本教程所需材料: Windows OS, WAIK, nLite, UltraISO, Haozip, VirtIO驱动 底部提供相关工具下载和使用说明,由于WindowsOS和UltraISO是付费产品,故不提供下载链接

ztsinghua的专栏 1万+

arcgis select by attributes一次选多个_视频:如何基于ArcGIS与GeoDa求莫兰指数和绘制莫兰散点图?...

莫兰指数是全域莫兰指数(Global Moran's I)的简称,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(Patrick Alfred Pierce Moran),在1950年提出的。详细介绍,如下:莫兰指数取值范围在-1.0至1.0之间。当Moran's I >0时,表示空间正相关性,其值越大,空间相关性越明显;当Moran's I <0时,表示空间负相关性...

weixin_39948247的博客 1759

LWN: 针对驱动程序设计的防火墙!

关注了就能看到更多这么棒的文章哦~A firewall for device driversBy Jonathan CorbetAugust 13, 2021DeepL assisted ...

Linux News搬运工 227

ANSYS HFSS 中的相控天线阵列仿真方法

相控天线阵列系统广泛使用,从国防雷达应用到商业 5G 应用。设计这些天线阵列涉及复杂的数学运算,需要全波仿真。Ansys HFSS 全场 3D 电磁仿真软件可以在合理的时间内以较低的计算成本仿真复杂的相控阵天线系统,同时考虑复杂激励、环境(即附近的天线)和平台对其性能的影响。本博客介绍了可用于有效仿真相控天线阵列的不同方法。以下是不同仿真方法的简要概述,视频链接中提供了完整的演示。ANSYS HFSS 提供 4 种不同的相控天线阵列仿真方法:1) 晶胞-无限阵列。

jkh920184196的博客 4248

当知识图谱遇见多模态:突破文本界限的智能认知革命

本文探讨了知识图谱与多模态技术的融合,揭示了其在医疗诊断、文化保护等领域的革命性应用。通过图神经网络、对比学习框架和跨模态注意力机制等技术,实现了文本、图像和音频数据的智能关联与认知。文章还分享了在Neo4j等图数据库中的实践案例和优化策略,为构建下一代智能认知系统提供了技术参考。

weixin_29197835的博客 462

Linux x86-64 IOMMU详解(二)——SWIOTLB(软件IOMMU)

SWIOTLB概述 上一篇文章已经提到,IOMMU的核心功能就是,实现在low buffer和high buffer之间的sync,也就是内存内容的复制操作。 读者可能会想,内存的复制,在内核中,不就是调用memcpy()函数来实现的吗?没错,这就是本文要介绍的IOMMU的软件实现方式——SWIOTLB。之所以说是软件实现,是因为sync操作在底层正是调用memcpy()函数,这完全是软件实现的。......

qq_34719392的博客 1万+

下采样优化实战:用ADown显著提升YOLOv11的多尺度特征保持能力

ADown 以“可编程梯度信息+多分支特征融合”打破了传统下采样的性能壁垒,为 YOLOv11 带来了多尺度特征的精准传递能力。从原理到代码集成,本教程已为你铺就了一条“小目标检测精度跃升”的实战路径。现在就动手尝试吧——当你看到模型对极小目标也能精准识别,且特征图细节完整时,你会明白这份技术探索的价值。我很乐意在你实践过程中帮你解决任何问题,让我们一起推动目标检测在下采样领域的边界。

FJN110的博客 421

smmu 使能前后设备如何从swiotlb切换到smmu

在smmu使能之前系统中的device都是用的swiotlb。那smmu使能之后设备如何切换到smmu呢 这个时候会分两种情况 第一种是如果设备在smmu使能之前已经开始使用dma了,那smmu只能时就要通知设备从swiotlb切换到smmu。 static int __init __iommu_dma_init(void) {     int ret;     ret = iomm

jason的笔记 2117

OAI-5G开源通信平台实践(一)-安装 部署及RFsimulator基本测试

OAI (Open Air Interface) 是目前开源5G/4G项目中最完善、最成熟的一个,并且仍然在持续更新。其包含基站、终端及核心网网元的代码,可基于x86\arm+射频卡搭建实际硬件平台,也可在x86平台上对rf\phy等层进行模拟,做各网元协议栈的单独测试验证。本文总结了x86平台下,oai的安装及运行方式。包括NTN分支和主分支的rf simulator、nos1、端到端部署等场景的验证流程,同时总结了验证过程中遇到的问题及解决方法。

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 2963

Sigrity Power Tree如何进行直流压降仿真分析操作指导

Sigrity Power Tree模式可以用于前仿真,在没有layout文件的情况下对电源进行直流压降仿真分析,用于评估原理图设计以及器件选型是否合理。Model:设置为Equal Current,设置为等电源模型,意思该负载每个电源pin都是等电流的。Current:设置每个负载的电流,U30为3A,U3-U6各为1A。Nominal Current:设置能够承载的最大电流,设置为10A。Upper/ Lower Tol:设置为压降范围为5%Output Current:设置输出电流为10A。

weixin_54787054的博客 730

swiotlb和smmu区别在map page这个函数

swiotlb和smmu最大的区别在map page这个函数,前面分析过smmu的map page函数会自建页表也映射iova和pa之间的映射。我们下面看看swiotlb的的map page static dma_addr_t __swiotlb_map_page(struct device *dev, struct page *page,                      unsig

jason的笔记 4051

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LWN:改进KVM来增强guest系统保护和安全!

点击上方蓝色“Linux News搬运工”关注我们~Enhancing KVM for guest protection and securityNovember 20, 2019Thi...

Linux News搬运工 442

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

vmware fusion 在此主机上不支持嵌套虚拟化。_从虚拟机逃逸看kvmqemu虚拟化安全防御...

注:不知道是出于啥原因,很少找到对虚拟化安全防御相关的中文资料,去年很想写这个话题,但我家三星笔记本uefi硬是没法关闭导致无法从硬盘安装双系统又加上virtualbox不支持vt-x嵌套(试了N种方法未成),当然我也没有u盘,故在看完phrack上经典的vm escape文章后留下遗憾,然最近打开一年未开机的笔记本竟然发现解锁版vmware完美支持vt-x嵌套,经过一顿实验后,决定写写...

weixin_39719729的博客 1529

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 223

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 149

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 328

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 195

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 117

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 104
上一篇: LWN: 对 edge-trigger 的误解!
下一篇: LWN:Linux Mint 20.2 中的变化!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值