Re: [Vulnerability Report] phosphor-logging / openpower-pels: Silent Log Task Dropping due to Timer Overlaps in HostNotifier

Bhargava Naidu Gulla <[email protected]> Tue, 2 Jun 2026 17:18:14 -0700
Newsgroups org.ozlabs.lists.openbmc
Message-ID <CAEPZvmNKzTP_BADFiAMDU=tjQOepOVnsSio=S+5Jq4QbeT5_9A@mail.gmail.com>
Hi Andrew,

My apologies for using the wrong list. Thanks for pointing me in the right
direction, I will forward this report over to
[email protected] and make sure to use that address for any
future reports.

Best,
Bhargava

On Tue, Jun 2, 2026 at 5:05 PM Andrew Jeffery <[email protected]>
wrote:

> Hi Bhargava,
>
> In the future, security vulnerability reports should be sent to:
>
>    [email protected]
>
> as per:
>
>
> https://github.com/openbmc/docs/blob/master/security/how-to-report-a-security-vulnerability.md
>
> Andrew
>
> On Tue, 2026-06-02 at 16:06 -0700, Bhargava Naidu Gulla wrote:
> > Hi OpenBMC Security Team,
> >
> > I would like to report a race condition and state corruption
> vulnerability
> > inside the Host Notifier state machine of the openpower-pels extension.
> >
> > Overview of the Vulnerability:
> > Rapid, concurrent, or noisy host state transitions can corrupt in-flight
> > task tracking for Platform Event Log (PEL) notifications. This results in
> > event log notifications being silently dropped, preventing critical
> system
> > error logs from being delivered to the host operating system.
> >
> > Affected File and Location:
> > File: extensions/openpower-pels/host_notifier.cpp
> > Line: 234
> >
> > Root Cause:
> > The `hostStateChange(true)` method arms the `_hostUpTimer` but does not
> > disable or cancel already active timers (such as `_retryTimer` or
> > `_hostFullTimer`).
> >
> > When the first timer expires, it invokes `doNewLogNotify()`, which
> launches
> > an asynchronous PLDM file transmission task and sets the tracking
> variable:
> >   _inProgressPEL = pelID;
> >
> > Because `doNewLogNotify()` lacks a command-in-progress guard check
> > (`_inProgressPEL != 0`), if the concurrent overlapping second timer
> expires
> > before the first PLDM command's asynchronous response is received, it
> > blindly executes `doNewLogNotify()` again. This second execution sends
> > another PLDM command and overwrites `_inProgressPEL` with a new ID. The
> > tracking for the first PEL is permanently dropped, and subsequent status
> > responses are mismatched.
> >
> > Proof of Concept:
> > 1. Force the HostNotifier into a retry state where the `_retryTimer` is
> > currently armed due to a full or blocked state.
> > 2. Rapidly trigger a D-Bus host state property change, invoking
> > `hostStateChange(true)`. This arms `_hostUpTimer` in parallel.
> > 3. The `_retryTimer` expires first, starting a PLDM send task for PEL ID
> A
> > and setting `_inProgressPEL = A`.
> > 4. The `_hostUpTimer` expires next before the D-Bus/PLDM response for
> PEL A
> > returns, and fires `doNewLogNotify()` again, sending a task for PEL ID B
> > and overwriting `_inProgressPEL = B`.
> > 5. Observe that tracking for PEL ID A is dropped from the queue and
> > permanently orphaned.
> >
> > Proposed Patch:
> > Add an active command guard check at the beginning of
> > `HostNotifier::doNewLogNotify()`:
> >
> > if (_inProgressPEL != 0 || _hostIface->cmdInProgress())
> > {
> >     return;
> > }
> >
> > Legal Name for Attribution: Bhargava Naidu Gulla
>