On Thu, Oct 29, 2026 at 07:52:36AM +0100, Markus Armbruster wrote:
> Daniel P. Berrangé <[email protected]> writes:
> 
> > This adds documentation for the previously added 'insecure-input'
> > parameter to -compat, which controls policy for insecure
> > configuration requests.
> >
> > Signed-off-by: Daniel P. Berrangé <[email protected]>
> > ---
> >  qemu-options.hx | 22 +++++++++++++++++++++-
> >  1 file changed, 21 insertions(+), 1 deletion(-)
> >
> > diff --git a/qemu-options.hx b/qemu-options.hx
> > index 16d9c6c9072..0487e74bb3e 100644
> > --- a/qemu-options.hx
> > +++ b/qemu-options.hx
> > @@ -4696,7 +4696,9 @@ DEF("compat", HAS_ARG, QEMU_OPTION_compat,
> >      "-compat 
> > [deprecated-input=accept|reject|crash|warn][,deprecated-output=accept|hide]\n"
> >      "                Policy for handling deprecated management 
> > interfaces\n"
> >      "-compat 
> > [unstable-input=accept|reject|crash|warn][,unstable-output=accept|hide]\n"
> > -    "                Policy for handling unstable management interfaces\n",
> > +    "                Policy for handling unstable management interfaces\n"
> > +    "-compat [insecure-input=accept|reject|crash|warn]\n"
> > +    "                Policy for handling requests for insecure 
> > configuration requests\n",
> >      QEMU_ARCH_ALL)
> >  SRST
> >  ``-compat 
> > [deprecated-input=<input-policy>][,deprecated-output=<output-policy>]``
> > @@ -4734,6 +4736,24 @@ SRST
> >          Suppress unstable command results and events
> >  
> >      Limitation: covers only syntactic aspects of QMP.
> > +
> > +``-compat [insecure-input=<input-policy>]
> > +    Set policy for handling requests for insecure configuration
> > +    requests:
> > +
> > +    ``insecure-input=accept`` (default)
> > +        Accept insecure configurations requests silently
> > +    ``insecure-input=warn``
> > +        Accept insecure configuration requests with warning on stderr
> > +    ``insecure-input=reject``
> > +        Reject insecure configuration requests
> > +    ``insecure-input=crash``
> > +        Crash on insecure configuration requests
> > +
> > +    Limitation: an insecure configuration is one where QEMU has
> > +    not intended to provide a security boundary to protect against
> 
> "Where QEMU has not intended to provide" sounds odd to me.  Mind, I'm
> not a native speaker.  "Where QEMU does not provide".

Yeah, that language choice was me by pessimistic expecting that
QEMU is full of undiscovered flaws. I'll change to what you
suggested.

> > +    malicious usage. Covers only QOM types for devices, machine types
> > +    and accelerators.
> 
> The policy check is in
> 
> * qemu_create_machine(), which covers machine creation.
> 
> * do_configure_accelerator(), which covers accelerator creation.
> 
> * qdev_device_add_from_qdict(), which covers *some* device creation:
> 
>   * device_add and -device always
> 
>   * Half of -audio model=hda: covers the "intel-hda" device, but not the
>     "hda-duplex" device.  See intel_hda_and_codec_init().
> 
>   * The "primary device" created in failover_hide_primary_device() for
>     the virtio-net standby feature.
> 
>   * The "usb-host" device device created in xen-usb.c for some reason.
> 
>   There's plenty of device creation it doesn't cover.  Isn't this
>   problematic?  I certainly expected it to cover *all* device creation!

Yes, eventually, but not yet....

> 
>   Say board code creates a certain onboard device with the usual low
>   level interfaces like qdev_new() and qdev_realize().  Say we mark the
>   onboard device insecure.  The policy check doesn't apply.  We need to
>   manually mark the machine type insecure as well.  Feels awfully prone
>   to human error.
> 
>   Moreover, what if the onboard device is configurable?  Then the
>   machine type may be secure unless you configure this insecure device.
>   Marking the machine type would be too coarse.
> 
>   Could we check policy in qdev_realize() instead?

Yes and no.

To make this a tractable problem I only wanted to add '.secure = true'
annotations for public facing types initially, so needed the check in
the device_add/-device code path only.

This is sufficient to let us tell bug report filers to take their demo
command line and add

  '-compat insecure-input=reject -nodfaults'

as a pre-requisite for a bug being considered a security flaw
egligible for CVE handling.


If we put a check in qdev_realize(), then we need to add annotations
for *all* types, before the -compat insecure-input=....  option is
viable to use. That requires a much bigger effort to mark all types.

In the 12.0 dev cycle, my intention is to

 a) Expand ".secure = true" markers to all parents of leaf node types
    marked secure, and enforce them.
 b) Expand ".secure = true" markers to all built-in devices that are
    indirectly created by a leaf node type marked secure, when
    -nodefaults is present

Once (b) is done, then qdev_realize() will likely be the better place
to put the policy check.

With regards,
Daniel
-- 
|: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
|: https://libvirt.org          ~~          https://entangle-photo.org :|
|: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|


Reply via email to