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-63349

CVE-2026-63349: Privilege Dropping Bypass and Denial of Service in AnyIO Subprocess Module

Alon Barad
Alon Barad
Software Engineer

Sep 19, 2026·5 min read·78 visits

Executive Summary (TL;DR)

A typo in AnyIO 4.14.0 and 4.14.1 causes subprocesses to retain the parent's supplementary groups (such as 'docker' or 'shadow'), bypassing security boundaries designed to drop privileges.

CVE-2026-63349 is a critical privilege-dropping bypass vulnerability in the AnyIO asynchronous framework (versions 4.14.0 and 4.14.1) on POSIX platforms. Due to a variable assignment typo, supplementary groups specified by the developer are not correctly propagated to the execution backend, resulting in subprocesses retaining the parent process's elevated supplementary group permissions.

Vulnerability Overview

The AnyIO asynchronous framework serves as a compatibility layer abstracting Python's asyncio and trio engines. A core component of AnyIO is its subprocess execution module, which permits the creation and management of secondary processes through helper functions like open_process and run_process.

On POSIX-compliant operating systems, running highly privileged parent applications must drop permissions when executing untrusted child tasks. This security control is established by setting specific credentials: the primary user identity, primary group, and supplementary groups. In Python, these parameters map to user, group, and extra_groups respectively.

Versions 4.14.0 and 4.14.1 of AnyIO introduced a critical security regression within the POSIX credentials mapping. A logical typo during argument preparation causes the library to ignore or overwrite the specified extra_groups parameter. This failure bypasses supplementary group-dropping policies, exposing systems to privilege escalation attacks.

Root Cause Analysis

The root cause of this vulnerability lies in a direct variable assignment error in src/anyio/_core/_subprocesses.py. When a developer provides the extra_groups parameter, AnyIO is designed to construct an arguments dictionary to pass to the asynchronous execution backend.

Instead of assigning the extra_groups list to the corresponding key in kwargs, the code incorrectly maps the primary group variable to the extra_groups key. The vulnerable code statement is: kwargs['extra_groups'] = group.

This assignment leads to two failure states based on the supplied parameters. If group is undefined or None, kwargs['extra_groups'] is set to None, which signals the operating system to inherit all supplementary groups from the parent process. Alternatively, if group is configured as an integer, the backend interpreter throws a TypeError because an integer is not an iterable, inducing a denial of service on process execution.

Code-Level Vulnerability & Patch Analysis

To analyze the vulnerability, we inspect the mapping logic inside src/anyio/_core/_subprocesses.py in the vulnerable version 4.14.0:

# Vulnerable implementation in AnyIO 4.14.0
if group is not None:
    kwargs["group"] = group
 
if extra_groups is not None:
    kwargs["extra_groups"] = group  # Bug: incorrect variable mapping

The patch in commit eb562e6462ee46b1904e50b02ce00a858cdeb200 corrects this mapping mistake:

# Patched implementation in AnyIO 4.14.2
if group is not None:
    kwargs["group"] = group
 
if extra_groups is not None:
    kwargs["extra_groups"] = extra_groups  # Corrected parameter assignment

The fix is complete and robust because it maps the correct local variable and ensures that the backend receives the intended list of groups. The maintainers added mock tests to verify that every parameter is explicitly verified during integration.

Exploitation and Privilege Escalation Mechanics

Exploitation of CVE-2026-63349 requires a specific execution context where an application running with elevated privileges executes untrusted commands under dropped privileges.

Consider a daemon running as root that executes a hook script on behalf of a low-privileged user. The daemon attempts to run the hook script with dropped privileges:

await anyio.run_process(
    ["/home/user/hook.sh"],
    user="nobody",
    group="nogroup",
    extra_groups=[]
)

Under AnyIO 4.14.0, because extra_groups is assigned the value of group, the backend receives extra_groups='nogroup'. On some systems, passing a string to an iterable argument raises errors, but if the primary group parameter is not set and defaults to None, the backend receives extra_groups=None. The child process then retains the elevated supplementary groups of the parent (such as docker or shadow), allowing the script to escalate privileges on the host system.

Here is a visual representation of the execution path:

Impact Assessment

The security impact of CVE-2026-63349 is classified as high, carrying a CVSS v4.0 base score of 7.0. The vulnerability allows an attacker to bypass critical security boundaries designed to enforce least privilege.

If the parent application belongs to administrative groups like docker, disk, or shadow, a child process spawned with lowered UID/GID can still interact with high-privilege resources. This allows an attacker who controls the executed subprocess to gain full administrative control over the host operating system.

No active exploitation has been reported in the wild, and the vulnerability is not listed in the CISA KEV catalog. The attack complexity is rated high because it depends on specific configuration patterns where an application drops credentials using AnyIO subprocess wrappers.

Remediation & Defensive Strategies

Remediation requires upgrading the anyio package to version 4.14.2 or higher. This completely restores the correct parameter propagation and mitigates the privilege retention issue.

If upgrading is not immediately possible, developers must bypass AnyIO's subprocess module when spawning processes that require privilege dropping. This is achieved by invoking the standard library's asyncio or subprocess APIs directly.

# Safe workaround utilizing standard asyncio
import asyncio
 
async def spawn_safe_process(cmd, user_id, group_id, extra_gids):
    return await asyncio.create_subprocess_exec(
        *cmd,
        user=user_id,
        group=group_id,
        extra_groups=extra_gids
    )

We recommend implementing automated checks to prevent anyio dependencies below version 4.14.2 from being deployed in production environments.

Official Patches

AnyIO MaintainersFix commit
AnyIO MaintainersPull Request with fix
AnyIO MaintainersRelease notes for 4.14.2
GitHub Advisory DatabaseAdvisory GHSA-3w57-8xmc-8v26

Fix Analysis (1)

Technical Appendix

CVSS Score
7.0/ 10
CVSS:4.0/AV:L/AC:H/AT:P/PR:H/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
EPSS Probability
0.01%
Top 100% most exploited

Affected Systems

AnyIO (Python asynchronous library) versions 4.14.0 and 4.14.1 running on POSIX systems

Affected Versions Detail

Product
Affected Versions
Fixed Version
AnyIO
agronholm
>= 4.14.0, < 4.14.24.14.2
AttributeDetail
CWE IDCWE-266 / CWE-269
Attack VectorLocal
CVSS v4.0 Score7.0 (High)
Exploit StatusProof-of-Concept / Theoretical
KEV StatusNot Listed
Affected Componentanyio._core._subprocesses

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-266
Incorrect Privilege Assignment

The software incorrectly assigns privileges or permissions to a resource, or does not properly drop privileges when launching a subprocess.

Vulnerability Timeline

Vulnerability identified and fix commit pushed
2026-07-08
GitHub Security Advisory GHSA-3w57-8xmc-8v26 published
2026-09-18
CVE-2026-63349 registered in NVD
2026-09-18
AnyIO 4.14.2 released with official fix
2026-09-18

References & Sources

  • [1]NVD - CVE-2026-63349
  • [2]GitHub Security Advisory GHSA-3w57-8xmc-8v26

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

•about 19 hours ago•CVE-2026-62374
7.1

CVE-2026-62374: Silent Claim-Set Reduction and Verification Bypass in SD JWT JS

CVE-2026-62374 (GHSA-f9j6-8p6x-r9j6) is a verification bypass vulnerability in the OpenWallet Foundation SD JWT JS library (@sd-jwt/core and @sd-jwt/decode versions 0.19.0 and earlier). Due to permissive UTF-8 decoding and the omission of mandatory reference checks during presentation verification, tampered or unreferenced disclosures are silently dropped rather than rejected. This deviates from RFC 9901 §7.1 requirements and allows attackers to execute silent claim-set reduction attacks against relying parties.

Alon Barad
Alon Barad
9 views•10 min read
•about 20 hours ago•GHSA-J656-3HF2-FVJC
6.1

GHSA-j656-3hf2-fvjc: Read-Only SQL Validation Bypass via Comment Interpretation Conflict in Bytebase DBHub

An interpretation conflict in Bytebase DBHub (< 0.22.6) allows attackers to bypass read-only SQL query restrictions when connected to MySQL or MariaDB instances. Because DBHub's custom SQL tokenizer treats any '--' sequence as a comment, whereas MySQL and MariaDB require trailing whitespace or a control character, crafted queries containing '--' immediately followed by non-whitespace characters allow stacked destructive SQL statements to execute on connections configured as read-only.

Alon Barad
Alon Barad
6 views•9 min read
•3 days ago•CVE-2026-118777
4.8

CVE-2026-118777: Prototype Pollution in Forge HTTP Client Cookie Management

CVE-2026-118777 is a prototype pollution vulnerability (CWE-1321) in the Forge JavaScript cryptography and networking library (distributed on npm as node-forge) prior to version 1.4.1. The flaw resides in the forge.http client subsystem, where incoming HTTP cookie names and paths parsed from Set-Cookie response headers are stored directly into standard JavaScript objects without key validation or property isolation. By returning crafted Set-Cookie headers containing keys such as __proto__ or constructor, a malicious HTTP server can inject arbitrary properties into Object.prototype, attach attributes to the global Object constructor, or delete built-in prototype methods to cause an application-wide denial of service.

Amit Schendel
Amit Schendel
10 views•10 min read
•3 days ago•CVE-2026-118775
3.7

CVE-2026-118775: ASN.1 OID First Arc Truncation and Ambiguity in node-forge

CVE-2026-118775 (GHSA-4642-5mcj-2rqw) is an integer overflow and validation flaw in the ASN.1 serialization module of Forge (node-forge) prior to version 1.4.1. The asn1.oidToDer() function fails to validate the range of the first two arcs of an Object Identifier (OID) and truncates the packed initial subidentifier to a single 8-bit integer. Applications that perform policy checks on untrusted OID strings before encoding them into Distinguished Encoding Rules (DER) format can be tricked into emitting DER bytes that correspond to a completely different, restricted OID.

Amit Schendel
Amit Schendel
11 views•10 min read
•3 days ago•CVE-2026-119194
7.5

CVE-2026-119194: Algorithmic Complexity Denial of Service in pyasn1 Schemaless ASN.1 Decoder

CVE-2026-119194 is an algorithmic complexity vulnerability (CWE-407) in the pyasn1 library for Python, affecting versions 0.3.3 through 0.6.4. The flaw resides in the schemaless decoding routine ConstructedPayloadDecoderBase._decodeComponentsSchemaless used across BER, CER, and DER codecs. By sending an ASN.1 container populated with child components whose tag identifiers are separated by multiples of CPython's integer hash modulus (sys.hash_info.modulus), an unauthenticated attacker can force worst-case hash collisions in an unbounded Python set, degrading decoding performance from O(N) to O(N^2) and causing a Denial of Service (DoS).

Alon Barad
Alon Barad
9 views•9 min read
•3 days ago•CVE-2026-119195
7.5

CVE-2026-119195: Quadratic-Time Denial of Service in pyasn1 BER/CER/DER Decoders

CVE-2026-119195 is an algorithmic complexity vulnerability (CWE-407) in the pyasn1 library for Python, affecting all versions prior to 0.6.5. When decoding constructed strings or indefinite-length ANY types across BER, CER, and certain DER code paths, the payload decoders repeatedly concatenate incoming fragments onto an immutable bytes object using the += operator. Because Python bytes objects cannot be resized in-place, each fragment iteration allocates a new buffer and copies all previously accumulated bytes, resulting in quadratic O(N^2) time and memory copy complexity. An unauthenticated remote attacker can supply a highly fragmented ASN.1 stream to exhaust CPU cycles and stall application worker threads.

Amit Schendel
Amit Schendel
10 views•10 min read