From: Petr Vorel <pvorel@suse.cz>
To: Rick Edgecombe <rick.p.edgecombe@intel.com>
Cc: Liam.Howlett@oracle.com, ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v3] security/stack_clash: Add test for mmap() minding gap
Date: Wed, 12 Jul 2023 10:09:36 +0200 [thread overview]
Message-ID: <20230712080936.GA756025@pevik> (raw)
In-Reply-To: <20230711170335.13142-1-rick.p.edgecombe@intel.com>
Hi Rick,
Reviewed-by: Petr Vorel <pvorel@suse.cz>
...
> This logic is somewhat x86_64 specific, but may work for other
> architectures. Make the test only run on x86_64 for now.
...
> v3:
> - Use lapi/mmap.h (Petr Vorel)
> v2:
> - Add fixes commit (Cyril Hrubis)
> - Report placement test failure separately (Cyril Hrubis)
> - Use SAFE_FILE_SCANF (Cyril Hrubis)
> - Don't quit after failing placement test, so unmap the mapping that
> caused the failure. (Cyril Hrubis)
> - Drop CAN_DO_PLACEMENT_TEST (Cyril Hrubis)
> ---
> testcases/cve/stack_clash.c | 81 ++++++++++++++++++++++++++++++++++++-
> 1 file changed, 80 insertions(+), 1 deletion(-)
nit: You might want to add your copyright.
> diff --git a/testcases/cve/stack_clash.c b/testcases/cve/stack_clash.c
> index cd7f148c2..50a401e96 100644
> --- a/testcases/cve/stack_clash.c
> +++ b/testcases/cve/stack_clash.c
> @@ -18,11 +18,18 @@
> * to infinity and preallocate REQ_STACK_SIZE bytes of stack so that no calls
> * after `mmap` are moving stack further.
> *
> + * If the architecture meets certain requirements (only x86_64 is verified)
> + * then the test also tests that new mmap()s can't be placed in the stack's
> + * guard gap. This part of the test works by forcing a bottom up search. The
> + * assumptions are that the stack grows down (start gap) and either:
> + * 1. The default search is top down, and will switch to bottom up if
> + * space is exhausted.
> + * 2. The default search is bottom up and the stack is above mmap base
> + *
> * [1] https://blog.qualys.com/securitylabs/2017/06/19/the-stack-clash
> * [2] https://bugzilla.novell.com/show_bug.cgi?id=CVE-2017-1000364
> */
Doc could be turned into our docparse format (to place text in our automatically
generated documentation), but I can do it afterwards.
...
> +static void do_mmap_placement_test(unsigned long stack_addr, unsigned long gap)
> +{
> + void *map_test_gap;
> +
> + force_bottom_up();
> +
> + /*
> + * force_bottom_up() used up all the spaces below the stack. The search down
> + * path should fail, and search up might take a look at the guard gap
> + * region. If it avoids it, the allocation will be above the stack. If it
> + * uses it, the allocation will be in the gap and the test should fail.
> + */
> + map_test_gap = SAFE_MMAP(0, MAPPED_LEN,
> + PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
> +
> + if (stack_addr - gap <= (unsigned long)map_test_gap &&
> + (unsigned long)map_test_gap <= stack_addr) {
> + tst_res(TFAIL, "New mmap was placed in the guard gap.");
> + SAFE_MUNMAP(map_test_gap, MAPPED_LEN);
> + }
> +}
> +
> void do_child(void)
> {
> unsigned long stack_addr, stack_size;
> @@ -179,6 +252,11 @@ void do_child(void)
> dump_proc_self_maps();
> #endif
> +#ifdef __x86_64__
I wonder whether we should consider 32 bit as well:
#if defined(__x86_64__) || defined(__i386__)
Or is it really just for 64 bit?
> + do_mmap_placement_test(stack_addr, gap);
> +#endif
...
Kind regards,
Petr
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2023-07-12 8:09 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-11 17:03 [LTP] [PATCH v3] security/stack_clash: Add test for mmap() minding gap Rick Edgecombe
2023-07-12 8:09 ` Petr Vorel [this message]
2023-07-12 22:47 ` Edgecombe, Rick P
2023-07-13 8:05 ` Cyril Hrubis
2023-07-20 15:41 ` Edgecombe, Rick P
2023-07-20 15:47 ` Petr Vorel
2023-07-20 15:47 ` Edgecombe, Rick P
2023-07-20 15:40 ` Cyril Hrubis
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=20230712080936.GA756025@pevik \
--to=pvorel@suse.cz \
--cc=Liam.Howlett@oracle.com \
--cc=ltp@lists.linux.it \
--cc=rick.p.edgecombe@intel.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.