• Matt Fleming's avatar
    efivars: explicitly calculate length of VariableName · ec50bd32
    Matt Fleming authored
    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: default avatarFrederic 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: default avatarMatt Fleming <matt.fleming@intel.com>
    ec50bd32
efivars.c 52.3 KB