Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1649728
| From | riel@redhat.com |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 1/5] random,stackprotect: introduce get_random_canary function |
| Date | 2017-05-24 18:00 +0200 |
| Message-ID | <tKGRz-4dh-13@gated-at.bofh.it> (permalink) |
| References | <tKGRz-4dh-7@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
From: Rik van Riel <riel@redhat.com>
Introduce the get_random_canary function, which provides a random
unsigned long canary value with the first byte zeroed out on 64
bit architectures, in order to mitigate non-terminated C string
overflows.
The null byte both prevents C string functions from reading the
canary, and from writing it if the canary value were guessed or
obtained through some other means.
Reducing the entropy by 8 bits is acceptable on 64-bit systems,
which will still have 56 bits of entropy left, but not on 32
bit systems, so the "ascii armor" canary is only implemented on
64-bit systems.
Inspired by the "ascii armor" code in the old execshield patches,
and Daniel Micay's linux-hardened tree.
Signed-off-by: Rik van Riel <riel@redhat.com>
---
include/linux/random.h | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/include/linux/random.h b/include/linux/random.h
index ed5c3838780d..1fa0dc880bd7 100644
--- a/include/linux/random.h
+++ b/include/linux/random.h
@@ -57,6 +57,27 @@ static inline unsigned long get_random_long(void)
#endif
}
+/*
+ * On 64-bit architectures, protect against non-terminated C string overflows
+ * by zeroing out the first byte of the canary; this leaves 56 bits of entropy.
+ */
+#ifdef CONFIG_64BIT
+# ifdef __LITTLE_ENDIAN
+# define CANARY_MASK 0xffffffffffffff00UL
+# else /* big endian, 64 bits: */
+# define CANARY_MASK 0x00ffffffffffffffUL
+# endif
+#else /* 32 bits: */
+# define CANARY_MASK 0xffffffffUL
+#endif
+
+static inline unsigned long get_random_canary(void)
+{
+ unsigned long val = get_random_long();
+
+ return val & CANARY_MASK;
+}
+
unsigned long randomize_page(unsigned long start, unsigned long range);
u32 prandom_u32(void);
--
2.9.3
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH v2 0/5] stackprotector: ascii armor the stack canary riel@redhat.com - 2017-05-24 18:00 +0200
[PATCH 1/5] random,stackprotect: introduce get_random_canary function riel@redhat.com - 2017-05-24 18:00 +0200
Re: [PATCH 1/5] random,stackprotect: introduce get_random_canary function Kees Cook <keescook@google.com> - 2017-05-24 18:20 +0200
[PATCH 4/5] arm64: ascii armor the arm64 boot init stack canary riel@redhat.com - 2017-05-24 18:00 +0200
Re: [PATCH 4/5] arm64: ascii armor the arm64 boot init stack canary Kees Cook <keescook@google.com> - 2017-05-24 18:20 +0200
[PATCH 3/5] x86: ascii armor the x86_64 boot init stack canary riel@redhat.com - 2017-05-24 18:00 +0200
Re: [PATCH 3/5] x86: ascii armor the x86_64 boot init stack canary Kees Cook <keescook@google.com> - 2017-05-24 18:20 +0200
[PATCH 2/5] fork,random: use get_random_canary to set tsk->stack_canary riel@redhat.com - 2017-05-24 18:00 +0200
Re: [PATCH 2/5] fork,random: use get_random_canary to set tsk->stack_canary Kees Cook <keescook@google.com> - 2017-05-24 18:20 +0200
[PATCH 5/5] sh64: ascii armor the sh64 boot init stack canary Rik van Riel <riel@redhat.com> - 2017-05-24 18:40 +0200
Re: [PATCH 5/5] sh64: ascii armor the sh64 boot init stack canary Kees Cook <keescook@google.com> - 2017-05-24 18:40 +0200
[PATCH 5/5] sh64: ascii armor the sh64 boot init stack canary riel@redhat.com - 2017-05-24 18:50 +0200
csiph-web