[PATCH v2] balloon: add VIRTIO_BALLOON_F_DEVICE_INIT_ON_INFLATE and Security Considerations
"Michael S. Tsirkin" <[email protected]> Sat, 2 May 2026 10:18:45 -0400
| Newsgroups | dev.linux.lists.virtio-comment |
|---|---|
| Message-ID | <9c69b992c3dd83dfef3db92cd86b2fd8a0730d48.1777731396.git.mst@redhat.com> |
Add VIRTIO_BALLOON_F_DEVICE_INIT_ON_INFLATE (bit 6): the device initializes inflated pages and returns a per-page bitmap indicating which pages were successfully initialized. When negotiated, the driver appends a device-writable bitmap buffer to each inflate descriptor chain. Bit N corresponds to PFN N. The device sets a bit to 1 if it successfully initialized the page. Also add Security Considerations section for the balloon device, covering information leakage and data integrity concerns with untrusted devices. Fixes: https://github.com/oasis-tcs/virtio-spec/issues/242 Signed-off-by: Michael S. Tsirkin <[email protected]> Assisted-by: Claude:claude-opus-4-6 --- Changes from v1: - reporting does not need a feature bit! we already have all info - in practice hypervisors zero (unmap) on inflate. change spec to match content.tex | 28 ++++-- device-types/balloon/description.tex | 100 ++++++++++++++++++++ device-types/balloon/device-conformance.tex | 2 + device-types/balloon/driver-conformance.tex | 2 + 4 files changed, 125 insertions(+), 7 deletions(-) diff --git a/content.tex b/content.tex index 5de811f..0f4d662 100644 --- a/content.tex +++ b/content.tex @@ -39,7 +39,7 @@ \section{\field{Device Status} Field}\label{sec:Basic Facilities of a Virtio Dev \item[DRIVER_OK (4)] Indicates that the driver is set up and ready to drive the device. -\item[FEATURES_OK (8)] Indicates that the driver has acknowledged all the +\item[FEATURES_OK (8)] Indicates that the driver has accepted all the features it understands, and feature negotiation is complete. \item[SUSPEND (16)] When VIRTIO_F_SUSPEND is negotiated, indicates that the @@ -89,13 +89,16 @@ \section{Feature Bits}\label{sec:Basic Facilities of a Virtio Device / Feature B Each virtio device offers all the features it understands. During device initialization, the driver reads this and tells the device the -subset that it accepts. The only way to renegotiate is to reset -the device. +subset that it accepts. The device validates this subset and +either completes the negotiation successfully (the last subset of features +that the driver accepted is considered negotiated then) or fails, +leaving the feature negotiation incomplete. Once the negotiation is +complete, the only way to renegotiate is to reset the device. This allows for forwards and backwards compatibility: if the device is enhanced with a new feature bit, older drivers will not write that feature bit back to the device. Similarly, if a driver is enhanced with a feature -that the device doesn't support, it see the new feature is not offered. +that the device doesn't support, it will see that the new feature is not offered. Feature bits are allocated as follows: @@ -189,8 +192,8 @@ \subsection{Legacy Interface: A Note on Feature Transitional Drivers MUST detect Legacy Devices by detecting that the feature bit VIRTIO_F_VERSION_1 is not offered. -Transitional devices MUST detect Legacy drivers by detecting that -VIRTIO_F_VERSION_1 has not been acknowledged by the driver. +Transitional devices MUST detect Legacy drivers, e.g. by detecting that +VIRTIO_F_VERSION_1 has not been accepted by the driver. In this case device is used through the legacy interface. @@ -314,6 +317,11 @@ \section{Device Configuration Space}\label{sec:Basic Facilities of a Virtio Devi greater than the specified 8-bit size. \end{note} +\drivernormative{\subsection}{Device Configuration Space}{Basic Facilities of a Virtio Device / Device Configuration Space} +Before reading a device-specific configuration field that is +conditional on a feature bit, the driver SHOULD first accept +that feature bit. + \devicenormative{\subsection}{Device Configuration Space}{Basic Facilities of a Virtio Device / Device Configuration Space} The device MUST allow reading of any device-specific configuration field before FEATURES_OK is set by the driver. This includes fields which are @@ -530,7 +538,13 @@ \section{Device Initialization}\label{sec:General Initialization And Device Oper \item\label{itm:General Initialization And Device Operation / Device Initialization / Read feature bits} Read device feature bits, and write the subset of feature bits understood by the OS and driver to the device. During this step the - driver MAY read (but MUST NOT write) the device-specific configuration fields to check that it can support the device before accepting it. + driver MAY read (but MUST NOT write) the device-specific configuration + fields to check that it can support the device before setting FEATURES_OK. + The driver SHOULD accept feature bits before reading configuration + fields conditional on them. The driver MAY then accept a different + subset of feature bits (e.g., deciding, based on the configuration + fields, not to use a certain feature), tell the device about the + updated subset, and repeat this process. \item\label{itm:General Initialization And Device Operation / Device Initialization / Set FEATURES-OK} Set the FEATURES_OK status bit. The driver MUST NOT accept new feature bits after this step. diff --git a/device-types/balloon/description.tex b/device-types/balloon/description.tex index e7b957c..7be9bb4 100644 --- a/device-types/balloon/description.tex +++ b/device-types/balloon/description.tex @@ -49,6 +49,12 @@ \subsection{Feature bits}\label{sec:Device Types / Memory Balloon Device / Featu \item[ VIRTIO_BALLOON_F_PAGE_REPORTING(5) ] The device has support for free page reporting. A virtqueue for reporting free guest memory is present. +\item[ VIRTIO_BALLOON_F_DEVICE_INIT_ON_INFLATE(6) ] The device initializes + inflated pages and returns a per-page bitmap indicating which pages + were successfully initialized. If VIRTIO_BALLOON_F_PAGE_POISON is + also negotiated, pages are filled with \field{poison_val}; otherwise, + they are filled with zeros. + \end{description} \drivernormative{\subsubsection}{Feature bits}{Device Types / Memory Balloon Device / Feature bits} @@ -632,3 +638,97 @@ \subsubsection{Free Page Reporting}\label{sec:Device Types / Memory Balloon Devi If the VIRTIO_BALLOON_F_PAGE_POISON feature has been negotiated, the device MUST NOT modify the the content of a reported page to a value other than \field{poison_val}. + +\subsubsection{Device Initialized Pages on Inflate}\label{sec:Device Types / Memory Balloon Device / Device Operation / Device Initialized Pages on Inflate} + +When VIRTIO_BALLOON_F_DEVICE_INIT_ON_INFLATE is negotiated, the +device initializes inflated pages and reports which pages were +successfully initialized via a per-page bitmap. + +The driver appends a device-writable bitmap buffer to each inflate +descriptor chain, after the PFN outbuf. The bitmap contains one +bit per balloon page (4KB), where bit N corresponds to the Nth PFN +in the inflate request. The device sets a bit to 1 if it +successfully initialized the corresponding page, or 0 if it did +not. + +If VIRTIO_BALLOON_F_PAGE_POISON is also negotiated, the device fills +pages with \field{poison_val}; otherwise, the device fills pages +with zeros. + +When the driver later deflates these pages, it may skip +initialization for pages that were marked as initialized in the +inflate bitmap. + +\drivernormative{\paragraph}{Device Initialized Pages on Inflate}{Device Types / Memory Balloon Device / Device Operation / Device Initialized Pages on Inflate} + +Normative statements in this section apply if the +VIRTIO_BALLOON_F_DEVICE_INIT_ON_INFLATE feature has been negotiated. + +The driver MUST append a device-writable bitmap buffer to each +inflate descriptor chain. The bitmap buffer MUST be at least +$\lceil N/8 \rceil$ bytes, where N is the number of PFNs in the +inflate request. + +The driver MUST NOT treat an inflated page as initialized unless +the corresponding bit in the bitmap is set to 1. + +The driver MAY skip initializing a deflated page if the +corresponding inflate bitmap bit was set to 1. + +\devicenormative{\paragraph}{Device Initialized Pages on Inflate}{Device Types / Memory Balloon Device / Device Operation / Device Initialized Pages on Inflate} + +Normative statements in this section apply if the +VIRTIO_BALLOON_F_DEVICE_INIT_ON_INFLATE feature has been negotiated. + +The device MUST set bit N in the bitmap to 1 if it successfully +initialized PFN N, or to 0 otherwise. + +If VIRTIO_BALLOON_F_PAGE_POISON is also negotiated, the device +MUST fill each successfully initialized page with \field{poison_val}. + +If VIRTIO_BALLOON_F_PAGE_POISON is not negotiated, the device +MUST fill each successfully initialized page with zeros. + +\subsection{Security Considerations}\label{sec:Device Types / Memory Balloon Device / Security Considerations} + +In environments where the device is not trusted, such as +confidential computing, the balloon device presents several +security concerns. + +\subsubsection{Information Leakage}\label{sec:Device Types / Memory Balloon Device / Security Considerations / Information Leakage} + +When the driver inflates the balloon, the addresses of the pages +are communicated to the device. On some systems, the page contents +themselves are also accessible to the device. These pages may +contain sensitive data from previous use by the guest. In systems +where the device is untrusted, the driver should sanitize pages +before inflating them. + +Free page hinting and free page reporting similarly expose +information about which pages are free, and in the case of +reporting, may make page contents accessible to the device. Memory +statistics reporting exposes guest memory usage patterns. + +\subsubsection{Data Integrity}\label{sec:Device Types / Memory Balloon Device / Security Considerations / Data Integrity} + +When the device is untrusted, the driver cannot rely on the device +to correctly initialize pages. An untrusted device may return +unsanitized or malicious data on deflation, or may set bits in the +VIRTIO_BALLOON_F_DEVICE_INIT_ON_INFLATE bitmap without actually +initializing the corresponding pages. If the driver treats such +pages as initialized (e.g., marking them as zeroed), this could +lead to information leakage between guest processes or other +security violations. + +Drivers operating in environments with untrusted devices should +not negotiate VIRTIO_BALLOON_F_DEVICE_INIT_ON_INFLATE, and should +initialize all pages themselves. + +\subsubsection{Denial of Service}\label{sec:Device Types / Memory Balloon Device / Security Considerations / Denial of Service} + +A malicious device could set \field{num_pages} to an +unreasonably large value, causing the driver to surrender most +of the guest's memory. Drivers should apply reasonable limits +and not inflate the balloon to the point where the guest +becomes unable to function. diff --git a/device-types/balloon/device-conformance.tex b/device-types/balloon/device-conformance.tex index ff9ac4f..dfa00c2 100644 --- a/device-types/balloon/device-conformance.tex +++ b/device-types/balloon/device-conformance.tex @@ -9,4 +9,6 @@ \item \ref{devicenormative:Device Types / Memory Balloon Device / Device Operation / Free Page Hinting} \item \ref{devicenormative:Device Types / Memory Balloon Device / Device Operation / Page Poison} \item \ref{devicenormative:Device Types / Memory Balloon Device / Device Operation / Free Page Reporting} +\item \ref{devicenormative:Device Types / Memory Balloon Device / Device Operation / Device Initialized Reported Pages} +\item \ref{devicenormative:Device Types / Memory Balloon Device / Device Operation / Device Initialized Deflated Pages} \end{itemize} diff --git a/device-types/balloon/driver-conformance.tex b/device-types/balloon/driver-conformance.tex index f898d74..c35f6fa 100644 --- a/device-types/balloon/driver-conformance.tex +++ b/device-types/balloon/driver-conformance.tex @@ -9,4 +9,6 @@ \item \ref{drivernormative:Device Types / Memory Balloon Device / Device Operation / Free Page Hinting} \item \ref{drivernormative:Device Types / Memory Balloon Device / Device Operation / Page Poison} \item \ref{drivernormative:Device Types / Memory Balloon Device / Device Operation / Free Page Reporting} +\item \ref{drivernormative:Device Types / Memory Balloon Device / Device Operation / Device Initialized Reported Pages} +\item \ref{drivernormative:Device Types / Memory Balloon Device / Device Operation / Device Initialized Deflated Pages} \end{itemize} -- MST