CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-55099

CVE-2026-55099: Algorithmic Complexity Denial of Service in icalendar Component Equality

Alon Barad
Alon Barad
Software Engineer

Aug 25, 2026·8 min read·69 visits

Executive Summary (TL;DR)

An exponential time complexity issue in icalendar's comparison logic allows unauthenticated remote attackers to cause Denial of Service by submitting deeply nested, lightweight calendar payloads.

An algorithmic complexity denial of service vulnerability exists in the Python icalendar library's component equality evaluation. Due to recursive nested comparisons inside list membership operations, parsing and validating calendar components with deep nesting triggers exponential execution time, blocking application threads and consuming 100% of the available CPU core.

Vulnerability Overview

The Python icalendar library is an RFC 5545 compatible parsing engine widely utilized in calendar servers, email clients, scheduling interfaces, and enterprise CRM solutions. It handles the parsing, generation, and synchronization of data, meaning its endpoints are frequently exposed to untrusted external calendar feeds. The primary attack surface resides in endpoints that parse, sync, or normalize these user-provided calendar records.

When a service processes calendar records, it often performs comparisons to execute deduplication, updating, or data reconciliation. In Python, these comparison operations trigger the Component.__eq__ magic method behind the scenes to verify if the parsed calendar items match. Prior to version 7.1.3, this equality comparison method contained a serious structural vulnerability when processing nested components.

The vulnerability is classified as an Algorithmic Complexity Denial of Service, mapped to CWE-407 and CWE-400. Because the library allowed arbitrarily nested calendar subcomponents without verifying or enforcing depth restrictions, verifying equality between deeply nested data structures causes computation time to grow exponentially. This enables a remote, unauthenticated attacker to exhaust server CPU cycles using highly optimized, lightweight payloads.

Root Cause Analysis

The vulnerability is rooted in the way the Component.__eq__ method evaluated multiset equivalence among subcomponents. Calendar elements are inherently unordered, unhashable, and cannot be sorted via standard keys. To determine whether two subcomponent arrays are equivalent, the implementation evaluated element presence by executing sequential membership tests using the Python in and not in operators.

Under standard Python semantics, evaluating list containment via not in requires iterating through the target list and checking equality on each item. Because child elements within the calendar may contain their own nested subcomponents, checking membership invokes the __eq__ method recursively down the subcomponent hierarchy. This design introduces nested loops where verifying a parent node triggers a branching cascade of recursive child comparisons.

For a calendar structure with nesting depth $d$ containing equal subcomponents, the execution pattern follows an exponential recurrence relation. The mathematical complexity is modeled as $T(d) = 2 \cdot T(d - 1)$, resulting in an overall time complexity of $O(2^d)$. While polynomial comparison costs are expected when handling massive lists, exponential scaling makes the runtime extremely fragile to structural depth changes.

Since the parser Component.from_ical does not enforce a maximum nesting depth limit, there is no system boundary controlling the size of this call tree. An ASCII payload of less than one kilobyte can contain a nesting structure 30 layers deep. Triggering a comparison on this small input requires over one billion mathematical steps, locking the execution thread and freezing the application process indefinitely.

Code Analysis

The vulnerable implementation in src/icalendar/cal/component.py highlights how recursive evaluation pathing created the bottleneck. The comparison relied on dual nested loops to verify membership between both lists of subcomponents:

# Vulnerable code block in icalendar version 7.1.0 to 7.1.2
for subcomponent in self.subcomponents:
    if subcomponent not in other.subcomponents: # Initiates recursive __eq__
        return False
 
for subcomponent in other.subcomponents:
    if subcomponent not in self.subcomponents: # Initiates redundant recursive __eq__
        return False

This implementation did not track which child components had already been successfully matched, leading to redundant verification traversals down equal sibling paths.

To remediate this issue, the patch introduced in version 7.1.3 removes the recursive comparison structure entirely. It replaces the call stack with an iterative state machine utilizing an explicit heap-allocated list. The fix introduces a helper dataclass, _ComponentEqFrame, to record comparison state, tracking index positions and unmatched child lists for each level of the tree:

@dataclass
class _ComponentEqFrame:
    """A pending component-equality comparison on the iterative stack."""
    a: Component
    b: Component
    unmatched: list | None = None
    a_index: int = 0
    candidate_index: int = 0

The updated __eq__ method operates using a manual stack structure inside a while loop. Instead of relying on Python's interpreter call stack to process child components, the loop dynamically pushes and pops _ComponentEqFrame contexts. This transition protects the system from stack overflows and removes the exponential $O(2^d)$ branching factor:

# Patched stack-based equality logic in version 7.1.3
stack = [_ComponentEqFrame(self, other)]
child_result = None
while stack:
    frame = stack[-1]
    # Evaluates properties and processes subcomponents iteratively
    # Full implementation prevents call-stack exhaustion

While the stack-based architecture successfully neutralizes the exponential growth curve, security engineers should monitor residual scaling patterns. For components containing flat, extremely wide sibling arrays, the algorithm still executes pairwise matching checks. This results in quadratic $O(W^2)$ polynomial complexity for sibling groups of width $W$, which can lead to notable CPU consumption if exceptionally large flat feeds are processed.

Exploitation

An attack leveraging CVE-2026-55099 requires no authentication credentials or complex target interaction. The attack surface is active wherever an application parses and compares external .ics calendar objects. This frequently includes calendar import features, synchronization workers reading from remote feeds, and automated processes tracking email invitation responses.

The exploit payload is highly compact and easily evades standard file size and network validation checks. An attacker creates a highly nested structure using repeated BEGIN:VEVENT tags, where each block is wrapped within another. Since each level represents a valid calendar component, the parsing engine process constructs the nested tree correctly without raising formatting errors.

BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
UID:1
BEGIN:VEVENT
UID:2
BEGIN:VEVENT
UID:3
... (repeated nesting up to 35 levels) ...
END:VEVENT
END:VEVENT
END:VEVENT
END:VCALENDAR

Once parsed, the denial of service occurs when the application runs any comparison step. This typically happens when validating uniqueness or matching the payload against an existing record database. The thread immediately enters a prolonged calculation phase, running at 100% CPU capacity and locking out worker execution.

import time
from icalendar.cal.component import Event
 
def build_nested_event(depth: int) -> Event:
    root = node = Event()
    for _ in range(depth):
        child = Event()
        node.add_component(child)
        node = child
    return root
 
# Demonstrates the CPU freeze condition on vulnerable versions
left = build_nested_event(30)
right = build_nested_event(30)
start_time = time.time()
is_equal = (left == right) # Locks core

Impact Assessment

The primary impact of this vulnerability is a complete Denial of Service on application nodes handling calendar data. Because Python implementations typically run on a single CPU core per process, a single thread entering the exponential comparison loop locks that entire core. In standard single-process worker architectures, this blocks all incoming traffic and halts the service.

In multi-threaded or multi-process web server configurations, the threat profile remains significant. A remote attacker can issue multiple parallel requests containing the malicious payload. By matching the number of requests to the available server threads, the attacker can systematically lock every worker process, forcing the target server to stop responding to legitimate users.

The Common Vulnerability Scoring System assigned CVE-2026-55099 a base score of 7.5, classifying it as high severity. No specialized execution conditions, specific configurations, or user interaction are required to exploit the flaw. While no active exploitation campaigns are recorded in public KEV repositories, the existence of functional proof-of-concept tests makes immediate defense critical.

Remediation

The definitive remediation for CVE-2026-55099 is upgrading the icalendar Python library to version 7.1.3 or higher. This update replaces the vulnerable recursive comparison framework with a safe, iterative stack-based algorithm. System administrators should update their pip packaging files immediately and re-deploy active application nodes.

If immediate library upgrades are not possible, administrators should deploy pre-parsing input validation rules. This workaround involves scanning incoming raw iCalendar files to verify that the nesting depth of blocks does not exceed a reasonable limit, such as five levels. Payloads that exceed the depth ceiling should be rejected immediately before reaching the parser.

def check_ics_nesting(ics_content: str, max_depth: int = 5) -> bool:
    current_depth = 0
    for line in ics_content.splitlines():
        cleaned = line.strip().upper()
        if cleaned.startswith("BEGIN:"):
            current_depth += 1
            if current_depth > max_depth:
                return False
        elif cleaned.startswith("END:"):
            current_depth = max(0, current_depth - 1)
    return True

Additionally, developers should avoid running direct equality checks on raw, unvalidated calendar structures. Restricting matching operations to specific parsed fields, such as matching only unique identifier strings (UID), eliminates the need to execute general tree-equality checks and bypasses the vulnerable code path completely.

Official Patches

CollectiveVersion 7.1.3 Release

Fix Analysis (2)

Technical Appendix

CVSS Score
7.5/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

Affected Systems

icalendar (Python library)

Affected Versions Detail

Product
Affected Versions
Fixed Version
icalendar
Collective
>= 7.1.0, < 7.1.37.1.3
AttributeDetail
CWE IDCWE-407
Attack VectorNetwork
ComplexityLow
CVSS v3.1 Score7.5 (High)
ImpactDenial of Service (Thread Exhaustion)
Exploit StatusPoC Available

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
CWE-407
Inefficient Algorithmic Complexity

The product of an algorithm has an inefficient complexity (such as O(n^2) or O(2^n)) that can be abused to cause a denial of service.

Vulnerability Timeline

Initial core fix developed
2026-05-28
Code cleanup and helper dataclass introduced
2026-05-29
icalendar 7.1.3 released and Advisory published
2026-06-15
CVE-2026-55099 officially assigned and published in NVD
2026-08-25

References & Sources

  • [1]GitHub Security Advisory

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•2 minutes ago•CVE-2026-109619
9.2

CVE-2026-109619: Remote Code Execution in PHP Core via Stale Global State Memory Corruption (PHP2Shell)

CVE-2026-109619 (PHP2Shell) is a critical Use-After-Free vulnerability in the core PHP engine caused by improper global state cleanup during out-of-memory exception handling across persistent worker requests.

Alon Barad
Alon Barad
1 views•6 min read
•5 minutes ago•CVE-2026-113721
4.5

CVE-2026-113721: Unsafe Link Resolution in virtualenv File Generation

In Python virtualenv prior to version 21.14.9, activation script generators and configuration writers use Path.exists() before writing files. Because Path.exists() resolves symbolic links, it returns False for dangling symlinks. Consequently, virtualenv skips unlinking pre-planted symbolic links or hard links, writing data directly to target locations outside the intended virtual environment directory.

Amit Schendel
Amit Schendel
1 views•5 min read
•9 days ago•CVE-2026-87697
8.8

CVE-2026-87697: Untrusted Deserialization in .NET PresentationCore Clipboard Handling

A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.

Alon Barad
Alon Barad
31 views•5 min read
•9 days ago•CVE-2026-70007
8.8

CVE-2026-70007: Out-of-Bounds Write Vulnerability in .NET Framework and WPF Subsystem

An out-of-bounds write vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio allows unauthenticated remote attackers to execute arbitrary code via crafted pixel-shader bytecode or auto-converted clipboard payloads.

Amit Schendel
Amit Schendel
19 views•6 min read
•10 days ago•CVE-2026-70186
7.5

CVE-2026-70186: ASP.NET Core Denial of Service Vulnerability via Framework Deadlock

ASP.NET Core contains a thread deadlock vulnerability (CWE-833) that allows an unauthenticated remote attacker to cause a denial of service over the network by exhausting server thread pool resources.

Amit Schendel
Amit Schendel
18 views•5 min read
•10 days ago•CVE-2026-70035
8.8

CVE-2026-70035: Insecure Deserialization Remote Code Execution in Microsoft .NET Framework and .NET Runtime

CVE-2026-70035 is a high-severity Remote Code Execution (RCE) vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio caused by improper handling during the deserialization of untrusted data (CWE-502). An unauthenticated attacker can execute arbitrary code within the context of the affected process by delivering a crafted serialized payload.

Amit Schendel
Amit Schendel
24 views•6 min read