From: Olivier Dion <olivier.dion@polymtl.ca>
To: qemu-devel@nongnu.org
Cc: Olivier Dion <olivier.dion@polymtl.ca>, john.ogness@linutronix.de
Subject: [Qemu-devel] [PATCH v2 0/1] Handle /proc/self/exe in execve
Date: Mon, 16 Sep 2019 11:55:44 -0400 [thread overview]
Message-ID: <20190916155545.29928-1-olivier.dion@polymtl.ca> (raw)
In-Reply-To: <20190807135458.32440-1-dion@linutronix.de>
* Changes from v1
- Introduce the patch as a bug fix, rather than a security fix
- Use do_openat and safe_execveat instead of copying exec_path
- Extensive test case example
* Test case
I will present a short program that demonstrated the bug, i.e. what
is the expected behavior and what really happens. Then, I will
explain how this patch fixes this bug.
** The program
-------------------------------------------------------------------
#include <errno.h>
#include <string.h>
#include <unistd.h>
static char *ARG0 = "STOP";
static char *ARG1 = "-this-is-not-an-option";
int main(int argc, char *argv[], char *envp[])
{
(void)argc;
if (0 == strcmp(argv[0], ARG0))
return 0;
argv[0] = ARG0;
argv[1] = ARG1;
execve("/proc/self/exe",
(char **const)argv,
(char **const)envp);
return errno;
}
-------------------------------------------------------------------
Note that in every cases, this program should be run with at least
one argument, so that argv[1] points to something.
*** Expected behavior
This program when run normally, i.e. without an emulator or with
this patch applied, will run two times. The first time, it will
change its argv[0] and argv[1] and recursively call itself. The
second time, it will stop at the string comparaison between argv[0]
and the sentinel ARG0, returning 0. Thus, we expect the program to
finish with error code 0 and nothing is printed to stdout&stderr.
*** What really happens
When emulated by qemu-user, this program will fail to call itself
recursively and will instead call qemu-user. This is where ARG1
becomes useful. It's indeed set to an option that is not supported
by qemu-user, and thus we expected two things
1) A message will be printed to stdout&|stderr
2) A error code different from 0 will be returned
For example, I get the following output with error code 1
-------------------------------------------------------------------
qemu: unknown option 'this-is-not-an-option'
-------------------------------------------------------------------
*** Automated testing
The following is a quick bash script that demonstrates how to use
this test case. I suppose here that qemu-user is the correct
emulator for the arch of the compiled program a.out.
------------------------------------------------------------------
#!/bin/bash
out=$(qemu-user ./a.out foo)
ret=0
if [[ $out != "" || $? != 0 ]]; then
ret=1
fi
exit $ret
------------------------------------------------------------------
* Fixing the bug
This patch introduces the use of safe_execveat instead of
safe_execve for the emulation of execve. By using the do_openat
function, we ensure that the executable file descriptor is really
the one the user wants.
Olivier Dion (1):
Handle /proc/self/exe in syscall execve
linux-user/syscall.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
--
2.23.0
next prev parent reply other threads:[~2019-09-16 16:49 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-07 13:54 [Qemu-devel] [PATCH 0/1] Handle /proc/self/exe in execve dion
2019-08-07 13:54 ` [Qemu-devel] [PATCH 1/1] linux-user: Handle /proc/self/exe in syscall execve dion
2019-08-23 16:58 ` Laurent Vivier
2019-09-02 17:36 ` Olivier Dion
2019-09-02 19:02 ` Laurent Vivier
2019-09-16 15:55 ` Olivier Dion [this message]
2019-09-16 15:55 ` [Qemu-devel] [PATCH v2 1/1] " Olivier Dion
2019-09-16 16:55 ` [Qemu-devel] [PATCH v2 0/1] Handle /proc/self/exe in execve no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190916155545.29928-1-olivier.dion@polymtl.ca \
--to=olivier.dion@polymtl.ca \
--cc=john.ogness@linutronix.de \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).