Advisory ID:
BRLY-DVA-2023-024

[BRLY-DVA-2023-024] The stack buffer overflow vulnerability leads to arbitrary code execution during DXE phase.

April 4, 2025
Severity:
High
CVSS Score
8.2
Public Disclosure Date:
April 4, 2025

Summary

BINARLY efiXplorer team has discovered a stack buffer overflow vulnerability that allows an attacker to execute arbitrary code.
Vendors Affected Icon

Vendors Affected

Qualcomm
Affected Products icon

Affected Products

Qualcomm PSIRT

Potential Impact

An attacker with local privileged access can exploit this vulnerability to elevate privileges from ring 3 or ring 0 (depends on the operating system) to a DXE driver and execute arbitrary code. A malicious code installed as a result of the vulnerability exploitation in a DXE driver could survive across an operating system (OS) boot process and runtime or modify NVRAM area on SPI flash storage (to gain persistence on target platform). Additionally, this vulnerability potentially could be used by threat actors to bypass OS security mechanisms (modify privileged memory or runtime variables), influence on the OS boot process, and in some cases would allow an attacker to hook or modify EFI Runtime services.

This vulnerability was detected by the Deep Vulnerability Analysis (DVA) component from Binarly Platform

Vulnerability Information

  • BINARLY internal vulnerability identifier: BRLY-DVA-2023-024
  • Qualcomm PSIRT assigned CVE identifier: CVE-2022-40516
  • CVSS v3.1 Score 8.2 High AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H

Affected Lenovo firmware with confirmed impact by BINARLY team

Device Module name Module SHA256 File GUID
Surface Duo 2 for Business QcomChargerDxeLA 1ba0dc20d9c2ce47686a59717889abb35e1aff780cf00a21e70fec4329324ec3 4bce7f36-428e-4393-99e3-7e0844404dba

Vulnerability description

The pseudocode of the vulnerable function is shown below:

EFI_STATUS sub_1AC8()
{
  UINTN DataSize;
  char Data;

  Data = 0;
  DataSize = 1;
  if ( (gPassed & 1) == 0 )
  {
    gPassed = 1;
    if ( !gRT->GetVariable(L"PrintChargerAppDbgMsg", &QCOM_TOKEN_SPACE_GUID, 0, &DataSize, &Data) )
      gPrintChargerAppDbgMsg = Data != 0;
    if ( !gRT->GetVariable(L"ChargerPDLogLevel", &QCOM_TOKEN_SPACE_GUID, 0, &DataSize, &Data) )
      gChargerPDLogLevel = Data;
    if ( !gRT->GetVariable(L"ChargerPDLogTimer", &QCOM_TOKEN_SPACE_GUID, 0, &DataSize, &Data) )
    {
      gChargerPDLogTimer = Data;
      gChargerPDLogTimerTrue = Data != 0;
    }
  }
  return EFI_SUCCESS;
}

As we can see from the pseudocode, DataSize is initialized only once (before the first call to gRT->GetVariable()).

Thus, if the data size of the variable in NVRAM is greater than 1, DataSize will be overwritten. Thus, a next call to gRT-GetVariable() may cause an overflow on the stack (and subsequent execution of arbitrary code).

In order to fix this vulnerability, the DataSize variable must be initialized before each call to gRT->GetVariable().

Disclosure timeline

This vulnerability is subject to a 90 day disclosure deadline. After 90 days elapsed or a patch has been made broadly available (whichever is earlier), the vulnerability report will become visible to the public.

Disclosure Activity Date (YYYY-mm-dd)
Qualcomm PSIRT is notified 2022-10-21
Qualcomm PSIRT confirmed reported issue 2022-10-30
Qualcomm PSIRT assigned CVE number 2022-12-19
Qualcomm PSIRT provide patch release 2023-01-03
BINARLY public disclosure date 2025-04-04

Acknowledgements

BINARLY efiXplorer team

References

Tags
No items found.
FWHunt
See if you are impacted now with our Firmware Vulnerability Scanner