lkml.org 
[lkml]   [2018]   [Dec]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 09/12] rodata_test: add verification for __wr_after_init
    Date
    The write protection of the __wr_after_init data can be verified with the
    same methodology used for const data.

    Signed-off-by: Igor Stoppa <igor.stoppa@huawei.com>

    CC: Andy Lutomirski <luto@amacapital.net>
    CC: Nadav Amit <nadav.amit@gmail.com>
    CC: Matthew Wilcox <willy@infradead.org>
    CC: Peter Zijlstra <peterz@infradead.org>
    CC: Kees Cook <keescook@chromium.org>
    CC: Dave Hansen <dave.hansen@linux.intel.com>
    CC: Mimi Zohar <zohar@linux.vnet.ibm.com>
    CC: linux-integrity@vger.kernel.org
    CC: kernel-hardening@lists.openwall.com
    CC: linux-mm@kvack.org
    CC: linux-kernel@vger.kernel.org
    ---
    mm/rodata_test.c | 27 ++++++++++++++++++++++++---
    1 file changed, 24 insertions(+), 3 deletions(-)

    diff --git a/mm/rodata_test.c b/mm/rodata_test.c
    index e1349520b436..a669cf9f5a61 100644
    --- a/mm/rodata_test.c
    +++ b/mm/rodata_test.c
    @@ -16,8 +16,23 @@

    #define INIT_TEST_VAL 0xC3

    +/*
    + * Note: __ro_after_init data is, for every practical effect, equivalent to
    + * const data, since they are even write protected at the same time; there
    + * is no need for separate testing.
    + * __wr_after_init data, otoh, is altered also after the write protection
    + * takes place and it cannot be exploitable for altering more permanent
    + * data.
    + */
    +
    static const int rodata_test_data = INIT_TEST_VAL;

    +#ifdef CONFIG_PRMEM
    +static int wr_after_init_test_data __wr_after_init = INIT_TEST_VAL;
    +extern long __start_wr_after_init;
    +extern long __end_wr_after_init;
    +#endif
    +
    static bool test_data(char *data_type, const int *data,
    unsigned long start, unsigned long end)
    {
    @@ -59,7 +74,13 @@ static bool test_data(char *data_type, const int *data,

    void rodata_test(void)
    {
    - test_data("rodata", &rodata_test_data,
    - (unsigned long)&__start_rodata,
    - (unsigned long)&__end_rodata);
    + if (!test_data("rodata", &rodata_test_data,
    + (unsigned long)&__start_rodata,
    + (unsigned long)&__end_rodata))
    + return;
    +#ifdef CONFIG_PRMEM
    + test_data("wr after init data", &wr_after_init_test_data,
    + (unsigned long)&__start_wr_after_init,
    + (unsigned long)&__end_wr_after_init);
    +#endif
    }
    --
    2.19.1
    \
     
     \ /
      Last update: 2018-12-19 22:35    [W:2.309 / U:1.396 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site