All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nick Desaulniers <ndesaulniers@google.com>
To: Candle Sun <candlesea@gmail.com>
Cc: David Laight <David.Laight@aculab.com>,
	"keescook@chromium.org" <keescook@chromium.org>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"natechancellor@gmail.com" <natechancellor@gmail.com>,
	"candle.sun@unisoc.com" <candle.sun@unisoc.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"clang-built-linux@googlegroups.com" 
	<clang-built-linux@googlegroups.com>
Subject: Re: [PATCH] lkdtm: fix memory copy size for WRITE_KERN
Date: Tue, 26 Jan 2021 10:39:47 -0800	[thread overview]
Message-ID: <CAKwvOdnH8kXt+jAutjqsL_5H5PzswLGEZOieaGru2SDn13pj+w@mail.gmail.com> (raw)
In-Reply-To: <CAPnx3XPRnpPQyW7UO_TTmQrHwitDw+_i3ESVkaGq+JyiY9Pu0w@mail.gmail.com>

On Tue, Jan 26, 2021 at 6:13 AM Candle Sun <candlesea@gmail.com> wrote:
>
> On Mon, Jan 25, 2021 at 6:37 PM David Laight <David.Laight@aculab.com> wrote:
> >
> > From: Candle Sun
> > > Sent: 25 January 2021 08:56
> > >
> > > From: Candle Sun <candle.sun@unisoc.com>
> > >
> > > Though do_overwritten() follows do_nothing() in source code, the final
> > > memory address order is determined by compiler. We can't always assume
> > > address of do_overwritten() is bigger than do_nothing(). At least the
> > > Clang we are using places do_overwritten() before do_nothing() in the
> > > object. This causes the copy size in lkdtm_WRITE_KERN() is *really*
> > > big and WRITE_KERN test on ARM32 arch will fail.
> > >
> > > Compare the address order before doing the subtraction.
> >
> > It isn't clear that helps.
> > Compile with -ffunction-sections and/or do LTO an there
> > is no reason at all why the functions should be together.
> >
> > Even without that lkdtm_WRITE_KERN() could easily be between them.
> >
> > You need to get the size of the 'empty function' from the
> > symbol table.
> >
> >         David
>
> Thanks David.
>
> I think using abs() by Nick's advice would be better. But could you
> point out which kernel function can get function size?

The Elf symbol table should contain this info, IIUC.

Given a string literal of a symbol (such as a function identifier),
kallsyms_lookup_name() can be used to return its address.

From there we'd want to fetch the Elf_Sym for the address which should
contain a st_size field which I think corresponds to the size in bytes
of the function.  (At least, from playing with `llvm-readelf -s`)
Probably would want to validate it's an STT_FUNC symbol type, too.  We
basically want something like kexec_purgatory_find_symbol(), but that
knows about the entire kernel image, and not the purgatory image used
during kexec.  I don't see any such function currently in the
kernel...but it's a large codebase to search through.

>
> Regards,
> Candle
>
>
> >
> > >
> > > Signed-off-by: Candle Sun <candle.sun@unisoc.com>
> > > ---
> > >  drivers/misc/lkdtm/perms.c | 19 +++++++++----------
> > >  1 file changed, 9 insertions(+), 10 deletions(-)
> > >
> > > diff --git a/drivers/misc/lkdtm/perms.c b/drivers/misc/lkdtm/perms.c
> > > index 2dede2ef658f..fbfbdf89d668 100644
> > > --- a/drivers/misc/lkdtm/perms.c
> > > +++ b/drivers/misc/lkdtm/perms.c
> > > @@ -31,13 +31,13 @@ static unsigned long ro_after_init __ro_after_init = 0x55AA5500;
> > >   * This just returns to the caller. It is designed to be copied into
> > >   * non-executable memory regions.
> > >   */
> > > -static void do_nothing(void)
> > > +static noinline void do_nothing(void)
> > >  {
> > >       return;
> > >  }
> > >
> > >  /* Must immediately follow do_nothing for size calculuations to work out. */
> > > -static void do_overwritten(void)
> > > +static noinline void do_overwritten(void)
> > >  {
> > >       pr_info("do_overwritten wasn't overwritten!\n");
> > >       return;
> > > @@ -110,15 +110,14 @@ void lkdtm_WRITE_RO_AFTER_INIT(void)
> > >
> > >  void lkdtm_WRITE_KERN(void)
> > >  {
> > > -     size_t size;
> > > -     volatile unsigned char *ptr;
> > > +     unsigned long value_dow = (unsigned long)do_overwritten;
> > > +     unsigned long value_do =  (unsigned long)do_nothing;
> > > +     size_t size = (size_t)(value_dow > value_do ?
> > > +                     value_dow - value_do : value_do - value_dow);
> > >
> > > -     size = (unsigned long)do_overwritten - (unsigned long)do_nothing;
> > > -     ptr = (unsigned char *)do_overwritten;
> > > -
> > > -     pr_info("attempting bad %zu byte write at %px\n", size, ptr);
> > > -     memcpy((void *)ptr, (unsigned char *)do_nothing, size);
> > > -     flush_icache_range((unsigned long)ptr, (unsigned long)(ptr + size));
> > > +     pr_info("attempting bad %zu byte write at %px\n", size, do_overwritten);
> > > +     memcpy((void *)value_dow, (void *)value_do, size);
> > > +     flush_icache_range(value_dow, value_dow + (unsigned long)size);
> > >       pr_err("FAIL: survived bad write\n");
> > >
> > >       do_overwritten();
> > > --
> > > 2.17.0
> >
> > -
> > Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
> > Registration No: 1397386 (Wales)
> >



-- 
Thanks,
~Nick Desaulniers

  reply	other threads:[~2021-01-27  1:51 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-25  8:56 [PATCH] lkdtm: fix memory copy size for WRITE_KERN Candle Sun
2021-01-25 10:37 ` David Laight
2021-01-26 14:13   ` Candle Sun
2021-01-26 18:39     ` Nick Desaulniers [this message]
2021-01-26 22:53       ` David Laight
2021-01-27 11:00         ` Candle Sun
2021-01-27 17:42         ` Nick Desaulniers
2021-01-25 21:16 ` Nick Desaulniers
2021-01-26 14:17   ` Candle Sun

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=CAKwvOdnH8kXt+jAutjqsL_5H5PzswLGEZOieaGru2SDn13pj+w@mail.gmail.com \
    --to=ndesaulniers@google.com \
    --cc=David.Laight@aculab.com \
    --cc=arnd@arndb.de \
    --cc=candle.sun@unisoc.com \
    --cc=candlesea@gmail.com \
    --cc=clang-built-linux@googlegroups.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=natechancellor@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.