034e47c CVE-2015-5313: storage: don't allow '/' in filesystem volume names

Authored and Committed by ericb 8 years ago
    CVE-2015-5313: storage: don't allow '/' in filesystem volume names
    
    The libvirt file system storage driver determines what file to
    act on by concatenating the pool location with the volume name.
    If a user is able to pick names like "../../../etc/passwd", then
    they can escape the bounds of the pool.  For that matter,
    virStoragePoolListVolumes() doesn't descend into subdirectories,
    so a user really shouldn't use a name with a slash.
    
    Normally, only privileged users can coerce libvirt into creating
    or opening existing files using the virStorageVol APIs; and such
    users already have full privilege to create any domain XML (so it
    is not an escalation of privilege).  But in the case of
    fine-grained ACLs, it is feasible that a user can be granted
    storage_vol:create but not domain:write, and it violates
    assumptions if such a user can abuse libvirt to access files
    outside of the storage pool.
    
    Therefore, prevent all use of volume names that contain "/",
    whether or not such a name is actually attempting to escape the
    pool.
    
    This changes things from:
    
    $ virsh vol-create-as default ../../../../../../etc/haha --capacity 128
    Vol ../../../../../../etc/haha created
    $ rm /etc/haha
    
    to:
    
    $ virsh vol-create-as default ../../../../../../etc/haha --capacity 128
    error: Failed to create vol ../../../../../../etc/haha
    error: Requested operation is not valid: volume name '../../../../../../etc/haha' cannot contain '/'
    
    Signed-off-by: Eric Blake <eblake@redhat.com>