Bug 1386742 - Stack smash due to writing out of bounds in cg_get_procname_from_proc_cmdline
Summary: Stack smash due to writing out of bounds in cg_get_procname_from_proc_cmdline
Keywords:
Status: CLOSED ERRATA
Alias: None
Product: Red Hat Enterprise Linux 6
Classification: Red Hat
Component: libcgroup
Version: 6.7
Hardware: All
OS: Linux
medium
medium
Target Milestone: rc
: ---
Assignee: Nikola Forró
QA Contact: Chao Ye
URL:
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2016-10-19 14:36 UTC by Paulo Andrade
Modified: 2020-05-14 15:21 UTC (History)
6 users (show)

Fixed In Version: libcgroup-0.40.rc1-23.el6
Doc Type: If docs needed, set a value
Doc Text:
Clone Of:
Environment:
Last Closed: 2017-03-21 09:11:48 UTC
Target Upstream Version:


Attachments (Terms of Use)
Simple python reproducer (524 bytes, text/plain)
2016-10-21 12:58 UTC, Nikola Forró
no flags Details
api.c: fix potential buffer overflow (1.27 KB, patch)
2016-10-21 12:58 UTC, Nikola Forró
no flags Details | Diff


Links
System ID Private Priority Status Summary Last Updated
Red Hat Product Errata RHBA-2017:0583 0 normal SHIPPED_LIVE libcgroup bug fix update 2017-03-21 12:24:20 UTC

Description Paulo Andrade 2016-10-19 14:36:36 UTC
The code declares variables as:

	char path[FILENAME_MAX];
	char buf_pname[FILENAME_MAX];
	char buf_cwd[FILENAME_MAX];

and on a coredump provided by an user, buf_cwd
has a sane value (it has a smaller value, thus
not overwritten), but buf_pname is pointing to
a very large shell script, having written more
than 16k bytes before the crash. The code looks
like:

	while (c != EOF) {
		c = fgetc(f);
		if ((c != EOF) && (c != '\0')) {
			buf_pname[len] = c;
			len++;
			continue;
		}
		buf_pname[len] = '\0';

from gdb I also see:
(gdb) p pname_status
$28 = 0x102b3e0 "sh"

so, I believe the crash was caused by some variant
of a logic like:

$ /bin/sh -c "$(cat /some/really/large/script)"

where contents of /some/really/large/script will be
in /proc/$PID/cmdline.

  The pseudo patch to prevent the crash would be:

-		if ((c != EOF) && (c != '\0')) {
+		if ((c != EOF) && (c != '\0') && len < 4095) {

another possible cause would be a corrupted
/proc/$PID/cmdline, but the above description
looks a lot more likely the crash condition.

Comment 4 Nikola Forró 2016-10-21 12:58:31 UTC
Created attachment 1212848 [details]
Simple python reproducer

Comment 5 Nikola Forró 2016-10-21 12:58:52 UTC
Created attachment 1212849 [details]
api.c: fix potential buffer overflow

Comment 12 errata-xmlrpc 2017-03-21 09:11:48 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://rhn.redhat.com/errata/RHBA-2017-0583.html


Note You need to log in before you can comment on or make changes to this bug.