CVE-2026-91859 PUBLISHED

MISP Access Log Entry Overwritten by Error Controller's Second beforeFilter Pass

Assigner: CIRCL
Reserved: 15.09.2026 Published: 15.09.2026 Updated: 15.09.2026

Affected versions of MISP can record incorrect access-log data for requests that terminate in an exception.

Because CakeErrorController extends AppController, exception rendering runs the application startup path a second time. As a result, __accessMonitor() calls AccessLog::logRequest() twice for one HTTP request. The second deferred writer measures the error-controller execution instead of the original request and can overwrite the row created by the first pass. The corrupted fields include request duration, SQL query count, memory usage, and potentially the recorded query log.

The bug was masked because the same model instance retained the ID of the first saved row, causing the later save to issue an UPDATE rather than insert an obvious duplicate row.

Version affected: ≤2.5.45

Metrics

CVSS Vector: CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
CVSS Score: 5.3

Product Status

Vendor MISP
Product MISP
Versions
  • affected from 0 to 2.5.46 (excl.)

Solutions

The fix introduces a per-instance boolean guard ($deferredWriterRegistered) in the AccessLog model so that logRequest() returns early on the second beforeFilter pass, preventing the error controller from overwriting the original request's log entry. Additionally, a $this->create() call is added before $this->save() in saveOnShutdown() to ensure each save issues an INSERT rather than an UPDATE, providing defense-in-depth against accidental row mutation.

Credits

  • iglocska remediation developer
  • Claude Opus 5 (1M context) remediation developer

References

Problem Types

  • CWE-778 Insufficient Logging CWE
  • CWE-223 Omission of Security-relevant Information in Logs CWE