All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/1] qemu/nbd: fix segmentation fault when .desc is not null-terminated
@ 2018-01-05 13:32 Murilo Opsfelder Araujo
  2018-01-05 13:32 ` [Qemu-devel] [PATCH 1/1] block/nbd: " Murilo Opsfelder Araujo
  0 siblings, 1 reply; 5+ messages in thread
From: Murilo Opsfelder Araujo @ 2018-01-05 13:32 UTC (permalink / raw)
  To: qemu-devel
  Cc: qemu-block, qemu-ppc, Max Reitz, Kevin Wolf, Paolo Bonzini,
	Eric Blake, R Nageswara Sastry, Murilo Opsfelder Araujo

Hello, QEMU community.

The following patch is to fix a segmentation fault when nbd_runtime_opts.desc is
not null-terminated.

This issue emerged when building QEMU with --enable-gcov, as described by
https://bugs.launchpad.net/qemu/+bug/1727259.

To reproduce on ppc64le, run the following commands on QEMU git tree:

mkdir build
mkdir -p tests/qemu-iotests/scratch
cd build
../configure --target-list=ppc64-softmmu --enable-gcov
make -j$(nproc)

./qemu-img create -f qcow2 -o compat=1.1 ./tests/qemu-iotests/scratch/t.qcow2 64M
./qemu-io --cache writeback -f qcow2 -c "write -P 0xa 0x1000 0x1000" ./tests/qemu-iotests/scratch/t.qcow2
./qemu-io --cache writeback -f qcow2 -c "write -P 0xb 0x2000 0x1000" ./tests/qemu-iotests/scratch/t.qcow2
./qemu-img snapshot -c sn1 ./tests/qemu-iotests/scratch/t.qcow2
./qemu-io --cache writeback -f qcow2 -c "write -P 0xc 0x1000 0x1000" ./tests/qemu-iotests/scratch/t.qcow2
./qemu-io --cache writeback -f qcow2 -c "write -P 0xd 0x2000 0x1000" ./tests/qemu-iotests/scratch/t.qcow2
./qemu-img check -f qcow2 ./tests/qemu-iotests/scratch/t.qcow2
./qemu-io --cache writeback -f qcow2 -c "read -P 0xc 0x1000 0x1000" ./tests/qemu-iotests/scratch/t.qcow2
./qemu-io --cache writeback -f qcow2 -c "read -P 0xd 0x2000 0x1000" ./tests/qemu-iotests/scratch/t.qcow2

# run in background, wait some seconds until it starts
./qemu-nbd -v -t -k ${PWD}/tests/qemu-iotests/scratch/test_qemu_nbd_socket ./tests/qemu-iotests/scratch/t.qcow2 -l sn1 &
sleep 5

# this will cause qemu-io to segfault
./qemu-io --cache writeback -f qcow2 -f raw --cache=writeback -r -c "read -P 0xa 0x1000 0x1000" nbd:unix:${PWD}/tests/qemu-iotests/scratch/test_qemu_nbd_socket

# kill qemu-nbd
kill $(pidof qemu-nbd)

Cheers
Murilo

Murilo Opsfelder Araujo (1):
  block/nbd: fix segmentation fault when .desc is not null-terminated

 block/nbd.c | 1 +
 1 file changed, 1 insertion(+)

-- 
2.14.3

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 1/1] block/nbd: fix segmentation fault when .desc is not null-terminated
  2018-01-05 13:32 [Qemu-devel] [PATCH 0/1] qemu/nbd: fix segmentation fault when .desc is not null-terminated Murilo Opsfelder Araujo
@ 2018-01-05 13:32 ` Murilo Opsfelder Araujo
  2018-01-05 13:57   ` Eric Blake
  0 siblings, 1 reply; 5+ messages in thread
From: Murilo Opsfelder Araujo @ 2018-01-05 13:32 UTC (permalink / raw)
  To: qemu-devel
  Cc: qemu-block, qemu-ppc, Max Reitz, Kevin Wolf, Paolo Bonzini,
	Eric Blake, R Nageswara Sastry, Murilo Opsfelder Araujo

The find_desc_by_name() from util/qemu-option.c relies on the .name not being
NULL to call strcmp(). This check becomes unsafe when the list is not
NULL-terminated, which is the case of nbd_runtime_opts in block/nbd.c, and can
result in segmentation fault when strcmp() tries to access an invalid memory:

    #0 0x00007fff8c75f7d4 in __strcmp_power9 () from /lib64/libc.so.6
    #1 0x00000000102d3ec8 in find_desc_by_name (desc=0x1036d6f0, name=0x28e46670 "server.path") at util/qemu-option.c:166
    #2 0x00000000102d93e0 in qemu_opts_absorb_qdict (opts=0x28e47a80, qdict=0x28e469a0, errp=0x7fffec247c98) at util/qemu-option.c:1026
    #3 0x000000001012a2e4 in nbd_open (bs=0x28e42290, options=0x28e469a0, flags=24578, errp=0x7fffec247d80) at block/nbd.c:406
    #4 0x00000000100144e8 in bdrv_open_driver (bs=0x28e42290, drv=0x1036e070 <bdrv_nbd_unix>, node_name=0x0, options=0x28e469a0, open_flags=24578, errp=0x7fffec247f50) at block.c:1135
    #5 0x0000000010015b04 in bdrv_open_common (bs=0x28e42290, file=0x0, options=0x28e469a0, errp=0x7fffec247f50) at block.c:1395

>From gdb, the desc[i].name was not NULL and resulted in strcmp() accessing an
invalid memory:

    >>> p desc[5]
    $8 = {
      name = 0x1037f098 "R27A",
      type = 1561964883,
      help = 0xc0bbb23e <error: Cannot access memory at address 0xc0bbb23e>,
      def_value_str = 0x2 <error: Cannot access memory at address 0x2>
    }
    >>> p desc[6]
    $9 = {
      name = 0x103dac78 <__gcov0.do_qemu_init_bdrv_nbd_init> "\001",
      type = 272101528,
      help = 0x29ec0b754403e31f <error: Cannot access memory at address 0x29ec0b754403e31f>,
      def_value_str = 0x81f343b9 <error: Cannot access memory at address 0x81f343b9>
    }

This patch fixes the segmentation fault in strcmp() by adding a NULL element at
the end of nbd_runtime_opts.desc list, which is the common practice to most of
other structs like runtime_opts in block/null.c. Thus, the desc[i].name != NULL
check becomes safe because it will not evaluate to true when .desc list reached
its end.

Reported-by: R. Nageswara Sastry <nasastry@in.ibm.com>
Buglink: https://bugs.launchpad.net/qemu/+bug/1727259
Signed-off-by: Murilo Opsfelder Araujo <muriloo@linux.vnet.ibm.com>
---
 block/nbd.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/block/nbd.c b/block/nbd.c
index a50d24b50a..8b8ba56cdd 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -388,6 +388,7 @@ static QemuOptsList nbd_runtime_opts = {
             .type = QEMU_OPT_STRING,
             .help = "ID of the TLS credentials to use",
         },
+        { /* end of list */ }
     },
 };
 
-- 
2.14.3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] block/nbd: fix segmentation fault when .desc is not null-terminated
  2018-01-05 13:32 ` [Qemu-devel] [PATCH 1/1] block/nbd: " Murilo Opsfelder Araujo
@ 2018-01-05 13:57   ` Eric Blake
  2018-01-05 14:47     ` Murilo Opsfelder Araújo
  0 siblings, 1 reply; 5+ messages in thread
From: Eric Blake @ 2018-01-05 13:57 UTC (permalink / raw)
  To: Murilo Opsfelder Araujo, qemu-devel
  Cc: qemu-block, qemu-ppc, Max Reitz, Kevin Wolf, Paolo Bonzini,
	R Nageswara Sastry, qemu-stable

[-- Attachment #1: Type: text/plain, Size: 1821 bytes --]

On 01/05/2018 07:32 AM, Murilo Opsfelder Araujo wrote:
> The find_desc_by_name() from util/qemu-option.c relies on the .name not being
> NULL to call strcmp(). This check becomes unsafe when the list is not
> NULL-terminated, which is the case of nbd_runtime_opts in block/nbd.c, and can
> result in segmentation fault when strcmp() tries to access an invalid memory:

Thanks for the report and patch.  Adding qemu-stable in cc.

> 
> This patch fixes the segmentation fault in strcmp() by adding a NULL element at
> the end of nbd_runtime_opts.desc list, which is the common practice to most of
> other structs like runtime_opts in block/null.c. Thus, the desc[i].name != NULL
> check becomes safe because it will not evaluate to true when .desc list reached
> its end.
> 
> Reported-by: R. Nageswara Sastry <nasastry@in.ibm.com>
> Buglink: https://bugs.launchpad.net/qemu/+bug/1727259
> Signed-off-by: Murilo Opsfelder Araujo <muriloo@linux.vnet.ibm.com>

I'll update the commit message to add in the commit id that introduced
the problem, as well as check that other QemuOptsList do not have a
similar problem; I'm queueing this on the NBD tree and will submit a
pull request soon.

Reviewed-by: Eric Blake <eblake@redhat.com>

> ---
>  block/nbd.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/block/nbd.c b/block/nbd.c
> index a50d24b50a..8b8ba56cdd 100644
> --- a/block/nbd.c
> +++ b/block/nbd.c
> @@ -388,6 +388,7 @@ static QemuOptsList nbd_runtime_opts = {
>              .type = QEMU_OPT_STRING,
>              .help = "ID of the TLS credentials to use",
>          },
> +        { /* end of list */ }
>      },
>  };
>  
> 

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] block/nbd: fix segmentation fault when .desc is not null-terminated
  2018-01-05 13:57   ` Eric Blake
@ 2018-01-05 14:47     ` Murilo Opsfelder Araújo
  2018-01-05 17:08       ` Eric Blake
  0 siblings, 1 reply; 5+ messages in thread
From: Murilo Opsfelder Araújo @ 2018-01-05 14:47 UTC (permalink / raw)
  To: Eric Blake, qemu-devel
  Cc: Kevin Wolf, qemu-ppc, qemu-block, qemu-stable, Max Reitz,
	R Nageswara Sastry, Paolo Bonzini

On 01/05/2018 11:57 AM, Eric Blake wrote:
> On 01/05/2018 07:32 AM, Murilo Opsfelder Araujo wrote:
>> The find_desc_by_name() from util/qemu-option.c relies on the .name not being
>> NULL to call strcmp(). This check becomes unsafe when the list is not
>> NULL-terminated, which is the case of nbd_runtime_opts in block/nbd.c, and can
>> result in segmentation fault when strcmp() tries to access an invalid memory:
> 
> Thanks for the report and patch.  Adding qemu-stable in cc.
> 
>>
>> This patch fixes the segmentation fault in strcmp() by adding a NULL element at
>> the end of nbd_runtime_opts.desc list, which is the common practice to most of
>> other structs like runtime_opts in block/null.c. Thus, the desc[i].name != NULL
>> check becomes safe because it will not evaluate to true when .desc list reached
>> its end.
>>
>> Reported-by: R. Nageswara Sastry <nasastry@in.ibm.com>
>> Buglink: https://bugs.launchpad.net/qemu/+bug/1727259
>> Signed-off-by: Murilo Opsfelder Araujo <muriloo@linux.vnet.ibm.com>
> 
> I'll update the commit message to add in the commit id that introduced
> the problem, as well as check that other QemuOptsList do not have a
> similar problem; I'm queueing this on the NBD tree and will submit a
> pull request soon.
> 
> Reviewed-by: Eric Blake <eblake@redhat.com>

Hi, Eric.

A quick look brought my attention to:

block/ssh.c
530:static QemuOptsList ssh_runtime_opts = {

I've sent a patch to fix it too.

Thanks.
-- 
Murilo

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] block/nbd: fix segmentation fault when .desc is not null-terminated
  2018-01-05 14:47     ` Murilo Opsfelder Araújo
@ 2018-01-05 17:08       ` Eric Blake
  0 siblings, 0 replies; 5+ messages in thread
From: Eric Blake @ 2018-01-05 17:08 UTC (permalink / raw)
  To: Murilo Opsfelder Araújo, qemu-devel
  Cc: Kevin Wolf, qemu-ppc, qemu-block, qemu-stable, Max Reitz,
	R Nageswara Sastry, Paolo Bonzini

[-- Attachment #1: Type: text/plain, Size: 1326 bytes --]

On 01/05/2018 08:47 AM, Murilo Opsfelder Araújo wrote:

>>> This patch fixes the segmentation fault in strcmp() by adding a NULL element at
>>> the end of nbd_runtime_opts.desc list, which is the common practice to most of
>>> other structs like runtime_opts in block/null.c. Thus, the desc[i].name != NULL
>>> check becomes safe because it will not evaluate to true when .desc list reached
>>> its end.
>>>
>>> Reported-by: R. Nageswara Sastry <nasastry@in.ibm.com>
>>> Buglink: https://bugs.launchpad.net/qemu/+bug/1727259
>>> Signed-off-by: Murilo Opsfelder Araujo <muriloo@linux.vnet.ibm.com>
>>
>> I'll update the commit message to add in the commit id that introduced

Commit 7ccc44fd7, in 2.7.0.

>> the problem, as well as check that other QemuOptsList do not have a
>> similar problem; I'm queueing this on the NBD tree and will submit a
>> pull request soon.
>>
>> Reviewed-by: Eric Blake <eblake@redhat.com>
> 
> Hi, Eric.
> 
> A quick look brought my attention to:
> 
> block/ssh.c
> 530:static QemuOptsList ssh_runtime_opts = {
> 
> I've sent a patch to fix it too.

And my audit matches yours that there were no other culprits besides
those two.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-01-05 17:08 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-05 13:32 [Qemu-devel] [PATCH 0/1] qemu/nbd: fix segmentation fault when .desc is not null-terminated Murilo Opsfelder Araujo
2018-01-05 13:32 ` [Qemu-devel] [PATCH 1/1] block/nbd: " Murilo Opsfelder Araujo
2018-01-05 13:57   ` Eric Blake
2018-01-05 14:47     ` Murilo Opsfelder Araújo
2018-01-05 17:08       ` Eric Blake

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.