qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [Qemu-devel] [PATCH] block: Deprecate QCOW/QCOW2 encryp


From: Daniel P. Berrange
Subject: Re: [Qemu-block] [Qemu-devel] [PATCH] block: Deprecate QCOW/QCOW2 encryption
Date: Mon, 16 Mar 2015 10:27:13 +0000
User-agent: Mutt/1.5.23 (2014-03-12)

On Fri, Mar 13, 2015 at 09:09:40PM +0100, Markus Armbruster wrote:
> We've steered users away from QCOW/QCOW2 encryption for a while,
> because it's a flawed design (commit 136cd19 Describe flaws in
> qcow/qcow2 encryption in the docs).
> 
> In addition to flawed crypto, we have comically bad usability, and
> plain old bugs.  Let me show you.
> 
> = Example images =
> 
> I'm going to use a raw image as backing file, and two QCOW2 images,
> one encrypted, and one not:
> 
>     $ qemu-img create -f raw backing.img 4m
>     Formatting 'backing.img', fmt=raw size=4194304
>     $ qemu-img create -f qcow2 -o 
> encryption,backing_file=backing.img,backing_fmt=raw geheim.qcow2 4m
>     Formatting 'geheim.qcow2', fmt=qcow2 size=4194304 
> backing_file='backing.img' backing_fmt='raw' encryption=on cluster_size=65536 
> lazy_refcounts=off
>     $ qemu-img create -f qcow2 -o backing_file=backing.img,backing_fmt=raw 
> normal.qcow2 4m
>     Formatting 'normal.qcow2', fmt=qcow2 size=4194304 
> backing_file='backing.img' backing_fmt='raw' encryption=off 
> cluster_size=65536 lazy_refcounts=off
> 
> = Usability issues =
> 
> == Confusing startup ==
> 
> When no image is encrypted, and you don't give -S, QEMU starts the
> guest immediately:
> 
>     $ qemu-system-x86_64 -nodefaults -display none -monitor stdio normal.qcow2
>     QEMU 2.2.50 monitor - type 'help' for more information
>     (qemu) info status
>     VM status: running
> 
> But as soon as there's an encrypted image in play, the guest is *not*
> started, with no notification whatsoever:
> 
>     $ qemu-system-x86_64 -nodefaults -display none -monitor stdio geheim.qcow2
>     QEMU 2.2.50 monitor - type 'help' for more information
>     (qemu) info status
>     VM status: paused (prelaunch)
> 
> If the user figured out that he needs to type "cont" to enter his
> keys, the confusion enters the next level: "cont" asks for at most
> *one* key.  If more are needed, it then silently does nothing.  The
> user has to type "cont" once per encrypted image:
> 
>     $ qemu-system-x86_64 -nodefaults -display none -monitor stdio -drive 
> if=none,file=geheim.qcow2 -drive if=none,file=geheim.qcow2
>     QEMU 2.2.50 monitor - type 'help' for more information
>     (qemu) info status
>     VM status: paused (prelaunch)
>     (qemu) c
>     none0 (geheim.qcow2) is encrypted.
>     Password: ******
>     (qemu) info status
>     VM status: paused (prelaunch)
>     (qemu) c
>     none1 (geheim.qcow2) is encrypted.
>     Password: ******
>     (qemu) info status
>     VM status: running
> 
> == Incorrect passwords not caught ==
> 
> All existing encryption schemes give you the GIGO treatment: garbage
> password in, garbage data out.  Guests usually refuse to mount
> garbage, but other usage is prone to data loss.
> 
> == Need to stop the guest to add an encrypted image ==
> 
>     $ qemu-system-x86_64 -nodefaults -display none -monitor stdio
>     QEMU 2.2.50 monitor - type 'help' for more information
>     (qemu) info status
>     VM status: running
>     (qemu) drive_add "" if=none,file=geheim.qcow2
>     Guest must be stopped for opening of encrypted image
>     (qemu) stop
>     (qemu) drive_add "" if=none,file=geheim.qcow2
>     OK
> 
> Commit c3adb58 added this restriction.  Before, we could expose images
> lacking an encryption key to guests, with potentially catastrophic
> results.  See also "Use without key is not always caught".
> 
> = Bugs =
> 
> == Use without key is not always caught ==
> 
> Encrypted images can be in an intermediate state "opened, but no key".
> The weird startup behavior and the need to stop the guest are there to
> ensure the guest isn't exposed to that state.  But other things still
> are!
> 
> * drive_backup
> 
>     $ qemu-system-x86_64 -nodefaults -display none -monitor stdio geheim.qcow2
>     QEMU 2.2.50 monitor - type 'help' for more information
>     (qemu) drive_backup -f ide0-hd0 out.img raw
>     Formatting 'out.img', fmt=raw size=4194304
> 
>   I guess this writes encrypted data to raw image out.img.  Good luck
>   with figuring out how to decrypt that again.
> 
> * commit
> 
>     $ qemu-system-x86_64 -nodefaults -display none -monitor stdio geheim.qcow2
>     QEMU 2.2.50 monitor - type 'help' for more information
>     (qemu) commit ide0-hd0
> 
>   I guess this writes encrypted data into the unencrypted raw backing
>   image, effectively destroying it.
> 
> == QMP device_add of usb-storage fails when it shouldn't ==
> 
> When the image is encrypted, device_add creates the device, defers
> actually attaching it to when the key becomes available, then fails.
> This is wrong.  device_add must either create the device and succeed,
> or do nothing and fail.
> 
>     $ qemu-system-x86_64 -nodefaults -display none -usb -qmp stdio -drive 
> if=none,id=foo,file=geheim.qcow2
>     {"QMP": {"version": {"qemu": {"micro": 50, "minor": 2, "major": 2}, 
> "package": ""}, "capabilities": []}}
>     { "execute": "qmp_capabilities" }
>     {"return": {}}
>     { "execute": "device_add", "arguments": { "driver": "usb-storage", "id": 
> "bar", "drive": "foo" } }
>     {"error": {"class": "DeviceEncrypted", "desc": "'foo' (geheim.qcow2) is 
> encrypted"}}
>     {"execute":"device_del","arguments": { "id": "bar" } }
>     {"timestamp": {"seconds": 1426003440, "microseconds": 237181}, "event": 
> "DEVICE_DELETED", "data": {"path": "/machine/peripheral/bar/bar.0/legacy[0]"}}
>     {"timestamp": {"seconds": 1426003440, "microseconds": 238231}, "event": 
> "DEVICE_DELETED", "data": {"device": "bar", "path": 
> "/machine/peripheral/bar"}}
>     {"return": {}}
> 
> This stuff is worse than useless, it's a trap for users.
> 
> If people become sufficiently interested in encrypted images to
> contribute a cryptographically sane implementation for QCOW2 (or
> whatever other format), then rewriting the necessary support around it
> from scratch will likely be easier and yield better results than
> fixing up the existing mess.
> 
> Let's deprecate the mess now, drop it after a grace period, and move
> on.
> 
> Signed-off-by: Markus Armbruster <address@hidden>

Reviewed-by: Daniel P. Berrange <address@hidden>


Looks good for this release, then we kill in next release.


Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|



reply via email to

[Prev in Thread] Current Thread [Next in Thread]