[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAG48ez3-YEVsyuk1H6hjGy9Ogm-z46bmdnqy0JbW9YL297FsTw@mail.gmail.com>
Date: Mon, 31 Dec 2018 13:02:35 +0100
From: Jann Horn <jannh@...gle.com>
To: Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
joeyli <jlee@...e.com>, Andy Lutomirski <luto@...nel.org>
Cc: "Lee, Chun-Yi" <joeyli.kernel@...il.com>,
"Rafael J . Wysocki" <rafael.j.wysocki@...el.com>,
Pavel Machek <pavel@....cz>, Len Brown <len.brown@...el.com>,
"Martin K . Petersen" <martin.petersen@...cle.com>,
Randy Dunlap <rdunlap@...radead.org>,
Joe Perches <joe@...ches.com>,
Bart Van Assche <bvanassche@....org>,
kernel list <linux-kernel@...r.kernel.org>,
linux-pm@...r.kernel.org, Chen Yu <yu.c.chen@...el.com>,
Giovanni Gherdovich <ggherdovich@...e.cz>
Subject: Re: [PATCH 2/2] PM / Sleep: Check the file capability when writing
wake lock interface
On Mon, Dec 31, 2018 at 11:41 AM Greg Kroah-Hartman
<gregkh@...uxfoundation.org> wrote:
>
> On Mon, Dec 31, 2018 at 05:38:51PM +0800, joeyli wrote:
> > Hi Greg,
> >
> > On Sun, Dec 30, 2018 at 03:48:35PM +0100, Greg Kroah-Hartman wrote:
> > > On Sun, Dec 30, 2018 at 09:28:56PM +0800, Lee, Chun-Yi wrote:
> > > > The wake lock/unlock sysfs interfaces check that the writer must has
> > > > CAP_BLOCK_SUSPEND capability. But the checking logic can be bypassed
> > > > by opening sysfs file within an unprivileged process and then writing
> > > > the file within a privileged process. The tricking way has been exposed
> > > > by Andy Lutomirski in CVE-2013-1959.
> > >
> > > Don't you mean "open by privileged and then written by unprivileged?"
> > > Or if not, exactly how is this a problem? You check the capabilities
> > > when you do the write and if that is not allowed then, well
> > >
> >
> > Sorry for I didn't provide clear explanation.
> >
> > The privileged means CAP_BLOCK_SUSPEND but not file permission. The file permission
> > has already relaxed for non-root user. Then the expected behavior is that non-root
> > process must has CAP_BLOCK_SUSPEND capability for writing wake_lock sysfs.
> >
> > But, the CAP_BLOCK_SUSPEND restrict can be bypassed:
> >
> > int main(int argc, char* argv[])
> > {
> > int fd, ret = 0;
> >
> > fd = open("/sys/power/wake_lock", O_RDWR);
> > if (fd < 0)
> > err(1, "open wake_lock");
> >
> > if (dup2(fd, 1) != 1) // overwrite the stdout with wake_lock
> > err(1, "dup2");
> > sleep(1);
> > execl("./string", "string"); //string has capability
> >
> > return ret;
> > }
> >
> > This program is an unpriviledged process (has no CAP_BLOCK_SUSPEND), it opened
> > wake_lock sysfs and overwrited stdout. Then it executes the "string" program
> > that has CAP_BLOCK_SUSPEND.
>
> That's the problem right there, do not give CAP_BLOCK_SUSPEND rights to
> "string". If any user can run that program, there's nothing the kernel
> can do about this, right? Just don't allow that program on the system :)
>
> > The string program writes to stdout, which means that it writes to
> > wake_lock. So an unpriviledged opener can trick an priviledged writer
> > for writing sysfs.
>
> That sounds like a userspace program that was somehow given incorrect
> rights by the admin, and a user is taking advantage of it. That's not
> the kernel's fault.
Isn't it? Pretty much any setuid program will write to stdout or
stderr; even the glibc linker code does so if you set LD_DEBUG.
(Normally the output isn't entirely attacker-controlled, but it is in
the case of stuff like "procmail", which I think Debian still ships as
setuid root.) setuid programs should always be able to safely call
read() and write() on caller-provided file descriptors. Also, you're
supposed to be able to receive file descriptors over unix domain
sockets and then write to them without trusting the sender. Basically,
the ->read and ->write VFS handlers should never look at the caller's
credentials, only the opener's (with the exception of LSMs, which tend
to do weird things to the system's security model).
Powered by blists - more mailing lists