Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Mon, 24 Oct 2016 16:14:40 -0700
From: Kees Cook <keescook@...omium.org>
To: "kernel-hardening@...ts.openwall.com" <kernel-hardening@...ts.openwall.com>
Cc: Hans Liljestrand <ishkamiel@...il.com>, Elena Reshetova <elena.reshetova@...el.com>, 
	David Windsor <dwindsor@...il.com>
Subject: Re: [RFC v2 PATCH 13/13] lkdtm: add tests for
 atomic over-/underflow

On Thu, Oct 20, 2016 at 3:25 AM, Elena Reshetova
<elena.reshetova@...el.com> wrote:
> From: Hans Liljestrand <ishkamiel@...il.com>
>
> This adds additional tests for modified atomic functions.
>
> Signed-off-by: Hans Liljestrand <ishkamiel@...il.com>
> Signed-off-by: Elena Reshetova <elena.reshetova@...el.com>
> Signed-off-by: David Windsor <dwindsor@...il.com>
> ---
>  drivers/misc/lkdtm.h      |  17 +++++++
>  drivers/misc/lkdtm_bugs.c | 122 +++++++++++++++++++++++++++++++++++++++-------
>  drivers/misc/lkdtm_core.c |  17 +++++++
>  3 files changed, 138 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/misc/lkdtm.h b/drivers/misc/lkdtm.h
> index cfa1039..224713a 100644
> --- a/drivers/misc/lkdtm.h
> +++ b/drivers/misc/lkdtm.h
> @@ -20,7 +20,24 @@ void lkdtm_HARDLOCKUP(void);
>  void lkdtm_SPINLOCKUP(void);
>  void lkdtm_HUNG_TASK(void);
>  void lkdtm_ATOMIC_UNDERFLOW(void);
> +void lkdtm_ATOMIC_DEC_RETURN_UNDERFLOW(void);
> +void lkdtm_ATOMIC_SUB_UNDERFLOW(void);
> +void lkdtm_ATOMIC_SUB_RETURN_UNDERFLOW(void);
>  void lkdtm_ATOMIC_OVERFLOW(void);
> +void lkdtm_ATOMIC_INC_RETURN_OVERFLOW(void);
> +void lkdtm_ATOMIC_ADD_OVERFLOW(void);
> +void lkdtm_ATOMIC_ADD_RETURN_OVERFLOW(void);
> +void lkdtm_ATOMIC_ADD_UNLESS_OVERFLOW(void);
> +void lkdtm_ATOMIC_INC_AND_TEST_OVERFLOW(void);
> +void lkdtm_ATOMIC_LONG_UNDERFLOW(void);
> +void lkdtm_ATOMIC_LONG_DEC_RETURN_UNDERFLOW(void);
> +void lkdtm_ATOMIC_LONG_SUB_UNDERFLOW(void);
> +void lkdtm_ATOMIC_LONG_SUB_RETURN_UNDERFLOW(void);
> +void lkdtm_ATOMIC_LONG_OVERFLOW(void);
> +void lkdtm_ATOMIC_LONG_INC_RETURN_OVERFLOW(void);
> +void lkdtm_ATOMIC_LONG_ADD_OVERFLOW(void);
> +void lkdtm_ATOMIC_LONG_ADD_RETURN_OVERFLOW(void);
> +void lkdtm_ATOMIC_LONG_SUB_AND_TEST(void);
>  void lkdtm_CORRUPT_LIST_ADD(void);
>  void lkdtm_CORRUPT_LIST_DEL(void);
>
> diff --git a/drivers/misc/lkdtm_bugs.c b/drivers/misc/lkdtm_bugs.c
> index f336206..bd79a88 100644
> --- a/drivers/misc/lkdtm_bugs.c
> +++ b/drivers/misc/lkdtm_bugs.c
> @@ -128,30 +128,116 @@ void lkdtm_HUNG_TASK(void)
>         schedule();
>  }
>
> -void lkdtm_ATOMIC_UNDERFLOW(void)
> -{
> -       atomic_t under = ATOMIC_INIT(INT_MIN);
> -
> -       pr_info("attempting good atomic increment\n");
> -       atomic_inc(&under);
> -       atomic_dec(&under);
> -
> -       pr_info("attempting bad atomic underflow\n");
> -       atomic_dec(&under);
> +#define ATOMIC_LKDTM_MIN(tag,fun) void lkdtm_ATOMIC_##tag(void)        \
> +{                                                                      \
> +       atomic_t atomic = ATOMIC_INIT(INT_MIN);                         \
> +                                                                       \
> +       pr_info("attempting good atomic_" #fun "\n");                   \
> +       atomic_inc(&atomic);                                            \
> +       TEST_FUNC(&atomic);                                             \
> +                                                                       \
> +       pr_info("attempting bad atomic_" #fun "\n");                    \
> +       TEST_FUNC(&atomic);                                             \
>  }
>
> -void lkdtm_ATOMIC_OVERFLOW(void)
> -{
> -       atomic_t over = ATOMIC_INIT(INT_MAX);
> +#define ATOMIC_LKDTM_MAX(tag,fun,...)                                  \
> +void lkdtm_ATOMIC_##tag(void)                                          \
> +{                                                                      \
> +       atomic_t atomic = ATOMIC_INIT(INT_MAX);                         \
> +                                                                       \
> +       pr_info("attempting good atomic_" #fun "\n");                   \
> +       atomic_dec(&atomic);                                            \
> +       TEST_FUNC(&atomic);                                             \
> +                                                                       \
> +       pr_info("attempting bad atomic_" #fun "\n");                    \
> +       TEST_FUNC(&atomic);                                             \
> +}
>
> -       pr_info("attempting good atomic decrement\n");
> -       atomic_dec(&over);
> -       atomic_inc(&over);
> +#define ATOMIC_LKDTM_LONG_MIN(tag,fun,...)                             \
> +void lkdtm_ATOMIC_LONG_##tag(void)                                     \
> +{                                                                      \
> +       atomic_long_t atomic  = ATOMIC_LONG_INIT(LONG_MIN);             \
> +                                                                       \
> +       pr_info("attempting good atomic_long_" #fun "\n");              \
> +       atomic_long_inc(&atomic);                                       \
> +       TEST_FUNC(&atomic);                                             \
> +                                                                       \
> +       pr_info("attempting bad atomic_long_" #fun "\n");               \
> +       TEST_FUNC(&atomic);                                             \
> +}
>
> -       pr_info("attempting bad atomic overflow\n");
> -       atomic_inc(&over);
> +#define ATOMIC_LKDTM_LONG_MAX(tag,fun,...)                             \
> +void lkdtm_ATOMIC_LONG_##tag(void)                                     \
> +{                                                                      \
> +       atomic_long_t atomic = ATOMIC_LONG_INIT(LONG_MAX);              \
> +                                                                       \
> +       pr_info("attempting good atomic_long_" #fun "\n");              \
> +       atomic_long_dec(&atomic);                                       \
> +       TEST_FUNC(&atomic);                                             \
> +                                                                       \
> +       pr_info("attempting bad atomic_long_" #fun "\n");               \
> +       TEST_FUNC(&atomic);                                             \
>  }
>
> +#define TEST_FUNC(x) atomic_dec(x)
> +ATOMIC_LKDTM_MIN(UNDERFLOW,dec)
> +#undef TEST_FUNC
> +#define TEST_FUNC(x) atomic_dec_return(x)
> +ATOMIC_LKDTM_MIN(DEC_RETURN_UNDERFLOW,dec_return);
> +#undef TEST_FUNC
> +#define TEST_FUNC(x) atomic_sub(1,x)

I wish there was some way to define the multi-arg test functions more
cleanly than this... I'll ponder some options.

-Kees

-- 
Kees Cook
Nexus Security

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.