|
|
Message-ID: <20190221024109.GA2869@pi3.com.pl>
Date: Thu, 21 Feb 2019 03:41:09 +0100
From: Adam Zabrocki <pi3@....com.pl>
To: lkrg-users@...ts.openwall.com
Subject: Re: Re: LKRG 6.0 Exploit Detection bypass
Hi,
At the beginning I would like to thank you for looking and evaluating new
version of LKRG! The more eyes, the more problems can be discovered and
fixed, so thanks again ;-)
I've spent some time on what you've researched. Here a are couple of notes:
- Before we published LKRG 0.6 Alexander suggested a feature to panic() the
kernel in case of SMEP violation if lkrg.ci_panic=1. I thought it is not
needed for now since new version of LKRG has tons of new code which requires
testing. This means I might have overlooked something in case of SMEP strict
rules which would result in some incompatibility issues. Nevertheless, I
haven't seen one, and I believe it could be a good mitigation for various
variants of bypasses.
- All versions of the bypasses are detected by LKRG via detection of SMEP
violation, nevertheless only 2 of the variants are being blocked:
a. variants (1) and (2) are blocked
b. variants (3) and (4) are correctly detected but not blocked:
I. variant (3) just detected
II. variant (4) detected but also Proof Of Concept process is being
killed. Nevertheless, SIGKILL is delivered to the process which does
exploitation, but UMH was injected into the queue of kernel threads (that's
how UMH works) so even though exploit is being killed, UMH continues to run
in parallel.
c. variant (5) is additionally detected by Runtime CI (hash doesn't
match).
so it looks like variant (3) is the most problematic one.
I went one step ahead and:
1. I'm introducing a new LKRG sysctl interface lkrg.smep_panic which will be
enabled by default. If LKRG detects SMEP violation it will kill the kernel
(invoke function panic()). This mitigation should be enough to stop bypasses
but it is only effective on machines which support SMEP
2. Additionally, I'm introducing a new LKRG sysctl interface lkrg.umh_lock
which will be disabled by default. If it is enabled, LKRG completely locks down
UMH functionality, and nothing can be executed via this interface. It has of
course side effects e.g. systemd daemon is using UMH to invoke
"systemd-cgroups-agent". If you enable lkrg.umh_lock then any call to the
systemd-cgroups-agent will fail. However, not all systems are using systemd.
Additionally, if you're super paranoid this feature can be useful for you.
3. For (3) I've also done some research and:
a. I've placed extra hook on "__queue_work" function where I only do SMEP
and WP bit verification. I send SIGKILL to any task which enters this function
when SMEP/WP is disabled and I do reenable them again.
b. I've placed extra hook on "lookup_fast" function where I do the same
check as for "__queue_work" + additionally I'm verifying just SP pointer (don't
do stack walk like full pCFI does).
it correctly stops (3) as well.
4. I've added SMEP and WP bits validation every time, when ED verification is
being executed and whenever inode is being marked as dirty.
Everything what I mentioned here is a relatively new code, and requires some
more testing. I've tested it but it needs more verification in the various
environment / kernels.
It is worth to point out that we might decide to cut / add or modify some of
the features mentioned here. Until we release a new official and stable version
of LKRG, I think that changes might be available to the community and I would
be thankful if more people test them.
These changes are available in the official LKRG repo here:
https://bitbucket.org/Adam_pi3/lkrg-main/src
Thanks,
Adam
On Thu, Feb 21, 2019 at 04:02:48AM +0400, Ilya Matveychikov wrote:
> One more ED bypass:
> - (5) LKRG ED bypass by disabling kprobes (patching the kernel)
>
> https://github.com/milabs/kernel-exploits/commit/a19d1d80e3e1fe10da6ccc6f5c296a94912e506b
>
>
> > On Feb 20, 2019, at 9:43 AM, Ilya Matveychikov <matvejchikov@...il.com> wrote:
> >
> > Hello,
> >
> > I’d like to show few more exploit detection bypass techniques:
> > https://github.com/milabs/kernel-exploits/commit/6bd99d97c3f99a0a743a012b9cb90fb2fe1c0970
> >
> > By this commit we have the list of following:
> > - (1) LKRG ED bypass using UMH and chmod + chwon, the very first bypass
> > - (2) LKRG ED bypass by owerwriting inode->i_{uid,gid,mode} using simple_setattr()
> > - (3) LKRG ED bypass by owerwriting inode->i_{uid,gid,mode} directly
> > - (4) LKRG ED bypass by unlocking "UMH lock down" with LD_PRELOAD
> > - LKRG "poor man's CFI" bypass
> >
> > (1) and (2) were introduced few months before.
> >
> > (3) is the improvement of (2) which uses DKOM technique to manipulate inode
> > directly without being detected by simple_setattr() hook.
> >
> > (4) is the bypass of "UMH locking by using whitelist of programs" which basically
> > allows one to use LD_PRELOAD to inject his payload to /sbin/modprobe or similar.
> >
> > Since the use of (3) and (4) is locked by pCFI (poor man's Control Flow Integrity)
> > mitigation introduced in LKRG 6.0 I had to add the “rich man’s CFI bypass” which
> > wraps calls to all of the listed bypasses with 2 macros which are actually fakes
> > the call stack for the time of exploitation so LKRG could not see this.
> >
> > Ilya
> >
>
--
pi3 (pi3ki31ny) - pi3 (at) itsec pl
http://pi3.com.pl
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.