Bug 1395496

Summary: Libvirt allow paths symbol in ivshmem-plain/ivshmem name and qemu can access file out of /dev/shm
Product: Red Hat Enterprise Linux 7 Reporter: Luyao Huang <lhuang>
Component: libvirtAssignee: Martin Kletzander <mkletzan>
Status: CLOSED ERRATA QA Contact: Jingjing Shao <jishao>
Severity: medium Docs Contact:
Priority: medium    
Version: 7.3CC: dyuan, jsuchane, rbalakri, xuzhang
Target Milestone: rc   
Target Release: ---   
Hardware: x86_64   
OS: Linux   
Whiteboard:
Fixed In Version: libvirt-3.2.0-1.el7 Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2017-08-01 17:19:14 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Luyao Huang 2016-11-16 03:20:03 UTC
Description of problem:
Libvirt allow paths symbol in ivshmem-plain/ivshmem name and qemu can access file out of /dev/shm

Version-Release number of selected component (if applicable):
libvirt-2.0.0-10.el7_3.2.x86_64

How reproducible:
100%

Steps to Reproduce:
1. prepare a guest with ivshmem-plain device like this:

    <shmem name='../../var/lib/libvirt/qemu/test-ivshmem'>
      <model type='ivshmem-plain'/>
      <size unit='M'>4</size>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </shmem>


2. start guest:

# virsh start r7
Domain r7 started

3. check qemu cmd line:

# ps aux|grep qemu
...
-object memory-backend-file,id=shmmem-shmem0,mem-path=/dev/shm/../../var/lib/libvirt/qemu/test-ivshmem,size=4194304,share=yes...

4. check qemu file:

# lsof /var/lib/libvirt/qemu/test-ivshmem
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
qemu-kvm 11816 qemu  mem    REG  253,0  4194304 67632139 /var/lib/libvirt/qemu/test-ivshmem
qemu-kvm 11816 qemu   22u   REG  253,0  4194304 67632139 /var/lib/libvirt/qemu/test-ivshmem


Actual results:

qemu can access file out of /dev/shm

Expected results:

I think it will be nice if libvirt forbid use paths symbol in ivshmem/ivshmem-plain name, and since guest can direct access that file on host.

Additional info:

Comment 2 Jaroslav Suchanek 2017-04-04 08:24:35 UTC
Related upstream commit:

commit 1c06d0faba152170de664f3ff4017cf4b59b44e4
Author:     Martin Kletzander <mkletzan>
AuthorDate: Wed Feb 1 17:14:00 2017 +0100
Commit:     Martin Kletzander <mkletzan>
CommitDate: Tue Feb 21 12:47:24 2017 +0100

    qemu: Forbid slashes in shmem name
    
    With that users could access files outside /dev/shm.  That itself
    isn't a security problem, but might cause some errors we want to
    avoid.  So let's forbid slashes as we do with domain and volume names
    and also mention that in the schema.
    
    Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1395496
    
    Signed-off-by: Martin Kletzander <mkletzan>

v3.0.0-261-g1c06d0f

Comment 4 Jingjing Shao 2017-05-16 11:12:20 UTC
Verify this bug as below.

# rpm -q libvirt
libvirt-3.2.0-5.el7.x86_64

# virsh edit r7.2

Add this xml as below to guest xml
 <shmem name='../../var/lib/libvirt/test-ivshmem'>
   <model type='ivshmem-plain'/>
    <size unit='M'>4</size>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
 </shmem>

Get the error as below

error: XML document failed to validate against schema: Unable to validate doc against /usr/share/libvirt/schemas/domain.rng
Extra element devices in interleave
Element domain failed to validate content

Failed. Try again? [y,n,i,f,?]: 

enter i finish the edit 
Domain r7.2 XML configuration edited.

# virsh start r7.2
error: Failed to start domain r7.2
error: unsupported configuration: shmem name '../../var/lib/libvirt/test-ivshmem' must not contain '/'

Edit the guest xml as below.
<shmem name='test-ivshmem'>
 <model type='ivshmem-plain'/>
  <size unit='M'>4</size>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</shmem>

# virsh start r7.2
Domain r7.2 started

# ps aux|grep qemu  | grep shmmem
.....
-object memory-backend-file,id=shmmem-shmem0,mem-path=/dev/shm/test-ivshmem,size=4194304,share=yes -device ivshmem-plain,id=shmem0,memdev=shmmem-shmem0,bus=pci.0,addr=0x3 -msg timestamp=on
....

Comment 5 errata-xmlrpc 2017-08-01 17:19:14 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHEA-2017:1846

Comment 6 errata-xmlrpc 2017-08-01 23:59:00 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHEA-2017:1846