linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: tip-bot for Baoquan He <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: luto@kernel.org, keescook@chromium.org, tglx@linutronix.de,
	yinghai@kernel.org, bp@suse.de, mingo@kernel.org, bhe@redhat.com,
	akpm@linux-foundation.org, brgerst@gmail.com, hpa@zytor.com,
	dvlasenk@redhat.com, luto@amacapital.net, bp@alien8.de,
	linux-kernel@vger.kernel.org, torvalds@linux-foundation.org,
	dyoung@redhat.com, vgoyal@redhat.com, peterz@infradead.org
Subject: [tip:x86/boot] x86/KASLR: Add virtual address choosing function
Date: Tue, 10 May 2016 01:42:24 -0700	[thread overview]
Message-ID: <tip-071a74930e60d1fa51207d71f00a35b4f9d4d179@git.kernel.org> (raw)
In-Reply-To: <1462825332-10505-6-git-send-email-keescook@chromium.org>

Commit-ID:  071a74930e60d1fa51207d71f00a35b4f9d4d179
Gitweb:     http://git.kernel.org/tip/071a74930e60d1fa51207d71f00a35b4f9d4d179
Author:     Baoquan He <bhe@redhat.com>
AuthorDate: Mon, 9 May 2016 13:22:08 -0700
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Tue, 10 May 2016 10:12:06 +0200

x86/KASLR: Add virtual address choosing function

To support randomizing the kernel virtual address separately from the
physical address, this patch adds find_random_virt_addr() to choose
a slot anywhere between LOAD_PHYSICAL_ADDR and KERNEL_IMAGE_SIZE.
Since this address is virtual, not physical, we can place the kernel
anywhere in this region, as long as it is aligned and (in the case of
kernel being larger than the slot size) placed with enough room to load
the entire kernel image.

For clarity and readability, find_random_addr() is renamed to
find_random_phys_addr() and has "size" renamed to "image_size" to match
find_random_virt_addr().

Signed-off-by: Baoquan He <bhe@redhat.com>
[ Rewrote changelog, refactored slot calculation for readability. ]
[ Renamed find_random_phys_addr() and size argument. ]
Signed-off-by: Kees Cook <keescook@chromium.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Borislav Petkov <bp@suse.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Dave Young <dyoung@redhat.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: kernel-hardening@lists.openwall.com
Cc: lasse.collin@tukaani.org
Link: http://lkml.kernel.org/r/1462825332-10505-6-git-send-email-keescook@chromium.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/boot/compressed/kaslr.c | 32 ++++++++++++++++++++++++++++----
 1 file changed, 28 insertions(+), 4 deletions(-)

diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c
index e55ebcb..016a4f4 100644
--- a/arch/x86/boot/compressed/kaslr.c
+++ b/arch/x86/boot/compressed/kaslr.c
@@ -417,8 +417,8 @@ static void process_e820_entry(struct e820entry *entry,
 	}
 }
 
-static unsigned long find_random_addr(unsigned long minimum,
-				      unsigned long size)
+static unsigned long find_random_phys_addr(unsigned long minimum,
+					   unsigned long image_size)
 {
 	int i;
 	unsigned long addr;
@@ -428,12 +428,36 @@ static unsigned long find_random_addr(unsigned long minimum,
 
 	/* Verify potential e820 positions, appending to slots list. */
 	for (i = 0; i < boot_params->e820_entries; i++) {
-		process_e820_entry(&boot_params->e820_map[i], minimum, size);
+		process_e820_entry(&boot_params->e820_map[i], minimum,
+				   image_size);
 	}
 
 	return slots_fetch_random();
 }
 
+static unsigned long find_random_virt_addr(unsigned long minimum,
+					   unsigned long image_size)
+{
+	unsigned long slots, random_addr;
+
+	/* Make sure minimum is aligned. */
+	minimum = ALIGN(minimum, CONFIG_PHYSICAL_ALIGN);
+	/* Align image_size for easy slot calculations. */
+	image_size = ALIGN(image_size, CONFIG_PHYSICAL_ALIGN);
+
+	/*
+	 * There are how many CONFIG_PHYSICAL_ALIGN-sized slots
+	 * that can hold image_size within the range of minimum to
+	 * KERNEL_IMAGE_SIZE?
+	 */
+	slots = (KERNEL_IMAGE_SIZE - minimum - image_size) /
+		 CONFIG_PHYSICAL_ALIGN + 1;
+
+	random_addr = get_random_long() % slots;
+
+	return random_addr * CONFIG_PHYSICAL_ALIGN + minimum;
+}
+
 /*
  * Since this function examines addresses much more numerically,
  * it takes the input and output pointers as 'unsigned long'.
@@ -464,7 +488,7 @@ unsigned char *choose_random_location(unsigned long input,
 	mem_avoid_init(input, input_size, output);
 
 	/* Walk e820 and find a random address. */
-	random_addr = find_random_addr(output, output_size);
+	random_addr = find_random_phys_addr(output, output_size);
 	if (!random_addr) {
 		warn("KASLR disabled: could not find suitable E820 region!");
 		goto out;

  reply	other threads:[~2016-05-10  8:43 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-09 20:22 [PATCH v7 0/9] x86/KASLR: Randomize virtual address separately Kees Cook
2016-05-09 20:22 ` [PATCH v7 1/9] x86/KASLR: Initialize mapping_info every time Kees Cook
2016-05-09 22:01   ` Yinghai Lu
2016-05-09 22:23     ` Yinghai Lu
2016-05-09 22:27       ` Yinghai Lu
2016-05-09 22:23     ` Kees Cook
2016-05-09 22:28       ` Yinghai Lu
2016-05-10  5:58         ` Ingo Molnar
2016-05-10 11:21           ` Borislav Petkov
2016-05-10  8:40   ` [tip:x86/boot] " tip-bot for Kees Cook
2016-05-09 20:22 ` [PATCH v7 2/9] x86/boot: Add missing file header comments Kees Cook
2016-05-10  8:41   ` [tip:x86/boot] " tip-bot for Kees Cook
2016-05-09 20:22 ` [PATCH v7 3/9] x86/KASLR: Add slot_area to manage random_addr slots Kees Cook
2016-05-10  8:41   ` [tip:x86/boot] x86/KASLR: Add 'struct slot_area' " tip-bot for Baoquan He
2016-05-09 20:22 ` [PATCH v7 4/9] x86/KASLR: Return earliest overlap when avoiding regions Kees Cook
2016-05-10  8:42   ` [tip:x86/boot] " tip-bot for Kees Cook
2016-05-09 20:22 ` [PATCH v7 5/9] x86/KASLR: Add virtual address choosing function Kees Cook
2016-05-10  8:42   ` tip-bot for Baoquan He [this message]
2016-05-09 20:22 ` [PATCH v7 6/9] x86/KASLR: Clarify purpose of each get_random_long() Kees Cook
2016-05-10  8:42   ` [tip:x86/boot] " tip-bot for Kees Cook
2016-05-09 20:22 ` [PATCH v7 7/9] x86/KASLR: Randomize virtual address separately Kees Cook
2016-05-09 20:22 ` [PATCH v7 8/9] x86/KASLR: Add physical address randomization >4G Kees Cook
2016-05-09 20:22 ` [PATCH v7 9/9] x86/KASLR: Allow randomization below load address Kees Cook

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=tip-071a74930e60d1fa51207d71f00a35b4f9d4d179@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=akpm@linux-foundation.org \
    --cc=bhe@redhat.com \
    --cc=bp@alien8.de \
    --cc=bp@suse.de \
    --cc=brgerst@gmail.com \
    --cc=dvlasenk@redhat.com \
    --cc=dyoung@redhat.com \
    --cc=hpa@zytor.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=luto@kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=vgoyal@redhat.com \
    --cc=yinghai@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).