mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Luis Henriques <luis.henriques@canonical.com>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org,
	kernel-team@lists.ubuntu.com
Cc: Matthew Garrett <mjg59@srcf.ucam.org>,
	Josh Boyer <jwboyer@redhat.com>, Michael Schroeder <mls@suse.com>,
	"Lee, Chun-Yi" <jlee@suse.com>, Lingzhu Xiang <lxiang@redhat.com>,
	Seiji Aguchi <seiji.aguchi@hds.com>,
	Matt Fleming <matt.fleming@intel.com>,
	Hui Wang <hui.wang@canonical.com>,
	Luis Henriques <luis.henriques@canonical.com>
Subject: [PATCH 50/58] efivars: explicitly calculate length of VariableName
Date: Mon,  2 Sep 2013 09:54:35 +0100	[thread overview]
Message-ID: <1378112083-9475-51-git-send-email-luis.henriques@canonical.com> (raw)
In-Reply-To: <1378112083-9475-1-git-send-email-luis.henriques@canonical.com>

3.5.7.21 -stable review patch.  If anyone has any objections, please let me know.

------------------

From: Matt Fleming <matt.fleming@intel.com>

commit ec50bd32f1672d38ddce10fb1841cbfda89cfe9a upstream.

It's not wise to assume VariableNameSize represents the length of
VariableName, as not all firmware updates VariableNameSize in the same
way (some don't update it at all if EFI_SUCCESS is returned). There
are even implementations out there that update VariableNameSize with
values that are both larger than the string returned in VariableName
and smaller than the buffer passed to GetNextVariableName(), which
resulted in the following bug report from Michael Schroeder,

  > On HP z220 system (firmware version 1.54), some EFI variables are
  > incorrectly named :
  >
  > ls -d /sys/firmware/efi/vars/*8be4d* | grep -v -- -8be returns
  > /sys/firmware/efi/vars/dbxDefault-pport8be4df61-93ca-11d2-aa0d-00e098032b8c
  > /sys/firmware/efi/vars/KEKDefault-pport8be4df61-93ca-11d2-aa0d-00e098032b8c
  > /sys/firmware/efi/vars/SecureBoot-pport8be4df61-93ca-11d2-aa0d-00e098032b8c
  > /sys/firmware/efi/vars/SetupMode-Information8be4df61-93ca-11d2-aa0d-00e098032b8c

The issue here is that because we blindly use VariableNameSize without
verifying its value, we can potentially read garbage values from the
buffer containing VariableName if VariableNameSize is larger than the
length of VariableName.

Since VariableName is a string, we can calculate its size by searching
for the terminating NULL character.

Reported-by: Frederic Crozat <fcrozat@suse.com>
Cc: Matthew Garrett <mjg59@srcf.ucam.org>
Cc: Josh Boyer <jwboyer@redhat.com>
Cc: Michael Schroeder <mls@suse.com>
Cc: Lee, Chun-Yi <jlee@suse.com>
Cc: Lingzhu Xiang <lxiang@redhat.com>
Cc: Seiji Aguchi <seiji.aguchi@hds.com>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Cc: Hui Wang <hui.wang@canonical.com>
[ Hui Wang: backported to 3.5: adjusted context ]
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
---
 drivers/firmware/efivars.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index d7c3540..8c7a8cf 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -1006,6 +1006,31 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
 }
 
 /*
+ * Returns the size of variable_name, in bytes, including the
+ * terminating NULL character, or variable_name_size if no NULL
+ * character is found among the first variable_name_size bytes.
+ */
+static unsigned long var_name_strnsize(efi_char16_t *variable_name,
+				       unsigned long variable_name_size)
+{
+	unsigned long len;
+	efi_char16_t c;
+
+	/*
+	 * The variable name is, by definition, a NULL-terminated
+	 * string, so make absolutely sure that variable_name_size is
+	 * the value we expect it to be. If not, return the real size.
+	 */
+	for (len = 2; len <= variable_name_size; len += sizeof(c)) {
+		c = variable_name[(len / sizeof(c)) - 1];
+		if (!c)
+			break;
+	}
+
+	return min(len, variable_name_size);
+}
+
+/*
  * Let's not leave out systab information that snuck into
  * the efivars driver
  */
@@ -1232,6 +1257,8 @@ int register_efivars(struct efivars *efivars,
 						&vendor_guid);
 		switch (status) {
 		case EFI_SUCCESS:
+			variable_name_size = var_name_strnsize(variable_name,
+							       variable_name_size);
 			efivar_create_sysfs_entry(efivars,
 						  variable_name_size,
 						  variable_name,
-- 
1.8.3.2


  parent reply	other threads:[~2013-09-02  8:59 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-02  8:53 [ 3.5.y.z extended stable ] Linux 3.5.7.21 stable review Luis Henriques
2013-09-02  8:53 ` [PATCH 01/58] drm/i915/lvds: ditch ->prepare special case Luis Henriques
2013-09-02  8:53 ` [PATCH 02/58] ALSA: usb: Parse UAC2 extension unit like for UAC1 Luis Henriques
2013-09-02  8:53 ` [PATCH 03/58] serial: mxs: fix buffer overflow Luis Henriques
2013-09-02  8:53 ` [PATCH 04/58] fs/proc/task_mmu.c: fix buffer overflow in add_page_map() Luis Henriques
2013-09-02  8:53 ` [PATCH 05/58] af_key: initialize satype in key_notify_policy_flush() Luis Henriques
2013-09-02  8:53 ` [PATCH 06/58] vm: add no-mmu vm_iomap_memory() stub Luis Henriques
2013-09-02  8:53 ` [PATCH 07/58] iwl4965: set power mode early Luis Henriques
2013-09-02  8:53 ` [PATCH 08/58] iwl4965: reset firmware after rfkill off Luis Henriques
2013-09-02  8:53 ` [PATCH 09/58] ASoC: cs42l52: Reorder Min/Max and update to SX_TLV for Beep Volume Luis Henriques
2013-09-02  8:53 ` [PATCH 10/58] can: pcan_usb: fix wrong memcpy() bytes length Luis Henriques
2013-09-02  8:53 ` [PATCH 11/58] ALSA: 6fire: make buffers DMA-able (pcm) Luis Henriques
2013-09-02  8:53 ` [PATCH 12/58] ALSA: 6fire: make buffers DMA-able (midi) Luis Henriques
2013-09-02  8:53 ` [PATCH 13/58] jbd2: Fix use after free after error in jbd2_journal_dirty_metadata() Luis Henriques
2013-09-02  8:53 ` [PATCH 14/58] USB-Serial: Fix error handling of usb_wwan Luis Henriques
2013-09-02  8:54 ` [PATCH 15/58] USB: mos7840: fix big-endian probe Luis Henriques
2013-09-02  8:54 ` [PATCH 16/58] USB: adutux: fix big-endian device-type reporting Luis Henriques
2013-09-02  8:54 ` [PATCH 17/58] USB: ti_usb_3410_5052: fix big-endian firmware handling Luis Henriques
2013-09-02  8:54 ` [PATCH 18/58] ARM: 7809/1: perf: fix event validation for software group leaders Luis Henriques
2013-09-02  8:54 ` [PATCH 19/58] m68k/atari: ARAnyM - Fix NatFeat module support Luis Henriques
2013-09-02  8:54 ` [PATCH 20/58] m68k: Truncate base in do_div() Luis Henriques
2013-09-02  8:54 ` [PATCH 21/58] usb: add two quirky touchscreen Luis Henriques
2013-09-02  8:54 ` [PATCH 22/58] USB: mos7720: fix broken control requests Luis Henriques
2013-09-02  8:54 ` [PATCH 23/58] USB: keyspan: fix null-deref at disconnect and release Luis Henriques
2013-09-02  8:54 ` [PATCH 24/58] MIPS: Expose missing pci_io{map,unmap} declarations Luis Henriques
2013-09-02  8:54 ` [PATCH 25/58] microblaze: Update microblaze defconfigs Luis Henriques
2013-09-02  8:54 ` [PATCH 26/58] sound: Fix make allmodconfig on MIPS Luis Henriques
2013-09-02  8:54 ` [PATCH 27/58] sound: Fix make allmodconfig on MIPS correctly Luis Henriques
2013-09-02  8:54 ` [PATCH 28/58] alpha: makefile: don't enforce small data model for kernel builds Luis Henriques
2013-09-02  8:54 ` [PATCH 29/58] MIPS: Rewrite pfn_valid to work in modules, too Luis Henriques
2013-09-02  8:54 ` [PATCH 30/58] xtensa: fix linker script transformation for .text.unlikely Luis Henriques
2013-09-02  8:54 ` [PATCH 31/58] wusbcore: fix kernel panic when disconnecting a wireless USB->serial device Luis Henriques
2013-09-02  8:54 ` [PATCH 32/58] ARM: 7810/1: perf: Fix array out of bounds access in armpmu_map_hw_event() Luis Henriques
2013-09-02  8:54 ` [PATCH 33/58] iwlwifi: dvm: fix calling ieee80211_chswitch_done() with NULL Luis Henriques
2013-09-02  8:54 ` [PATCH 34/58] iwlwifi: pcie: disable L1 Active after pci_enable_device Luis Henriques
2013-09-02  8:54 ` [PATCH 35/58] zd1201: do not use stack as URB transfer_buffer Luis Henriques
2013-09-02  8:54 ` [PATCH 36/58] Hostap: copying wrong data prism2_ioctl_giwaplist() Luis Henriques
2013-09-02  8:54 ` [PATCH 37/58] ARM: at91/DT: fix at91sam9n12ek memory node Luis Henriques
2013-09-02  8:54 ` [PATCH 38/58] drm/i915: Invalidate TLBs for the rings after a reset Luis Henriques
2013-09-02  8:54 ` [PATCH 39/58] libata: apply behavioral quirks to sil3826 PMP Luis Henriques
2013-09-02  8:54 ` [PATCH 40/58] ARM: davinci: nand: specify ecc strength Luis Henriques
2013-09-02  8:54 ` [PATCH 41/58] ARM: 7816/1: CONFIG_KUSER_HELPERS: fix help text Luis Henriques
2013-09-02  8:54 ` [PATCH 42/58] sata_fsl: save irqs while coalescing Luis Henriques
2013-09-02  8:54 ` [PATCH 43/58] xen/events: initialize local per-cpu mask for all possible events Luis Henriques
2013-09-02  8:54 ` [PATCH 44/58] of: fdt: fix memory initialization for expanded DT Luis Henriques
2013-09-02  8:54 ` [PATCH 45/58] [SCSI] zfcp: fix lock imbalance by reworking request queue locking Luis Henriques
2013-09-02  8:54 ` [PATCH 46/58] [SCSI] zfcp: fix schedule-inside-lock in scsi_device list loops Luis Henriques
2013-09-02  8:54 ` [PATCH 47/58] nilfs2: remove double bio_put() in nilfs_end_bio_write() for BIO_EOPNOTSUPP error Luis Henriques
2013-09-02  8:54 ` [PATCH 48/58] nilfs2: fix issue with counting number of bio requests for BIO_EOPNOTSUPP error detection Luis Henriques
2013-09-02  8:54 ` [PATCH 49/58] Bluetooth: Add support for Atheros [0cf3:3121] Luis Henriques
2013-09-02  8:54 ` Luis Henriques [this message]
2013-09-02  8:54 ` [PATCH 51/58] workqueue: fix possible stall on try_to_grab_pending() of a delayed work item Luis Henriques
2013-09-02  8:54 ` [PATCH 52/58] x86/xen: do not identity map UNUSABLE regions in the machine E820 Luis Henriques
2013-09-02  8:54 ` [PATCH 53/58] jfs: fix readdir cookie incompatibility with NFSv4 Luis Henriques
2013-09-02  8:54 ` [PATCH 54/58] powerpc: Don't Oops when accessing /proc/powerpc/lparcfg without hypervisor Luis Henriques
2013-09-02  8:54 ` [PATCH 55/58] powerpc: Work around gcc miscompilation of __pa() on 64-bit Luis Henriques
2013-09-02  8:54 ` [PATCH 56/58] powerpc/hvsi: Increase handshake timeout from 200ms to 400ms Luis Henriques
2013-09-02  8:54 ` [PATCH 57/58] drivers/base/memory.c: fix show_mem_removable() to handle missing sections Luis Henriques
2013-09-02  8:54 ` [PATCH 58/58] x86 get_unmapped_area: Access mmap_legacy_base through mm_struct member Luis Henriques

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=1378112083-9475-51-git-send-email-luis.henriques@canonical.com \
    --to=luis.henriques@canonical.com \
    --cc=hui.wang@canonical.com \
    --cc=jlee@suse.com \
    --cc=jwboyer@redhat.com \
    --cc=kernel-team@lists.ubuntu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lxiang@redhat.com \
    --cc=matt.fleming@intel.com \
    --cc=mjg59@srcf.ucam.org \
    --cc=mls@suse.com \
    --cc=seiji.aguchi@hds.com \
    --cc=stable@vger.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

all inboxes | Powered by JetHome®