block: prevent snapshot mode $TMPDIR symlink attack
commitc2d76497b6eafcaedc806e07804e7bed55a98a0b
authorJim Meyering <jim@meyering.net>
Mon, 28 May 2012 07:27:54 +0000 (28 09:27 +0200)
committerKevin Wolf <kwolf@redhat.com>
Wed, 30 May 2012 08:18:20 +0000 (30 10:18 +0200)
tree306b4284d56aac08ad96865ff568d1834bc3c3bd
parent6f3c714eb7730630241fd0b33b799352d7feb876
block: prevent snapshot mode $TMPDIR symlink attack

In snapshot mode, bdrv_open creates an empty temporary file without
checking for mkstemp or close failure, and ignoring the possibility
of a buffer overrun given a surprisingly long $TMPDIR.
Change the get_tmp_filename function to return int (not void),
so that it can inform its two callers of those failures.
Also avoid the risk of buffer overrun and do not ignore mkstemp
or close failure.
Update both callers (in block.c and vvfat.c) to propagate
temp-file-creation failure to their callers.

get_tmp_filename creates and closes an empty file, while its
callers later open that presumed-existing file with O_CREAT.
The problem was that a malicious user could provoke mkstemp failure
and race to create a symlink with the selected temporary file name,
thus causing the qemu process (usually root owned) to open through
the symlink, overwriting an attacker-chosen file.

This addresses CVE-2012-2652.
http://bugzilla.redhat.com/CVE-2012-2652

Signed-off-by: Jim Meyering <meyering@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
block.c
block/vvfat.c
block_int.h