CVE-2026-96596 (GCVE-0-2026-96596)

Vulnerability from cvelistv5 – Published: 2026-10-14 16:56 – Updated: 2026-10-14 21:46
VLAI
Title
erl_tar:extract/2 loops forever on a GNU sparse member with a trailing hole
Summary
Loop with Unreachable Exit Condition ('Infinite Loop') vulnerability in Erlang OTP stdlib (erl_tar module), hexpm hex_core (hex_erl_tar module), hexpm hex (mix_hex_erl_tar module) and erlang rebar3 (r3_hex_erl_tar module) allows an attacker who supplies a tar archive to cause a denial of service via a crafted GNU sparse member. When erl_tar:extract/1,2 writes a member to disk, erl_tar:stream_to_file_loop/3 reads it in chunks of 65536 bytes by default. For a GNU sparse member whose sparse map ends before its real size, erl_tar:do_sparse_read/3 matches its trailing-hole clause before its zero-length clause. After the chunk is used up, the trailing-hole clause reads zero bytes, does not advance the position, and recurses forever. A 2048-byte archive keeps the extracting process and one scheduler busy until the process is killed. The {max_size, N} option prevents this only when N is below the real size of the member. Extraction with the memory option is not affected. hex_core ships its own copy of erl_tar as hex_erl_tar, and Hex and rebar3 ship hex_core with prefixed module names (mix_hex_erl_tar and r3_hex_erl_tar). These copies contain the same code and do not call stdlib's erl_tar, so they are affected on any OTP version. OTP 28 is not affected, but an application running on OTP 28 is affected if it extracts archives through an affected version of hex_core, Hex or rebar3. This issue affects OTP from OTP 29.0 before OTP 29.1.2, corresponding to stdlib from 8.0 before 8.1.1, and rebar3 from 3.27.1 onward, and hex from 2.4.2 before 2.5.3; hex_core: from 0.14.0 before 0.20.1.
CWE
  • CWE-835 - Loop with Unreachable Exit Condition ('Infinite Loop')
Assigner
EEF CNA under the mitre root
CNA scorecard A 97/100 over 314 records in the last 180 days details
Impacted products
Vendor Product Version CPE status
Erlang OTP Affected: 29.0 , < 29.1.2 (otp)
    cpe:2.3:a:erlang:erlang\/otp:*:*:*:*:*:*:*:*
Create a notification for this product.
Erlang OTP Affected: 8.0 , < 8.1.1 (otp)
    cpe:2.3:a:erlang:erlang\/otp:*:*:*:*:*:*:*:*
Create a notification for this product.
Erlang OTP Affected: fbf2c7194f6fce4b7b66dc0bcaa4f6b4b85e088f , < 3086307f311b78b38644a7787a3aca6a3f95a9d5 (git)
    cpe:2.3:a:erlang:erlang\/otp:*:*:*:*:*:*:*:*
Create a notification for this product.
erlang rebar3 Affected: 3.27.1 , < * (semver)
    cpe:2.3:a:erlang:rebar3:*:*:*:*:*:*:*:*
Create a notification for this product.
erlang rebar3 Affected: 23dbdb5d1f87f56902aef296c88a20049cd0c6e4 , < * (git)
    cpe:2.3:a:erlang:rebar3:*:*:*:*:*:*:*:*
Create a notification for this product.
hexpm hex_core Affected: 0.14.0 , < 0.20.1 (semver)
    cpe:2.3:a:hexpm:hex_core:*:*:*:*:*:*:*:*
Create a notification for this product.
hexpm hex_core Affected: 13bb9fbba418a406af614790b8d5cd458259ee70 , < a2ece683e6e88a3ec95ad20b09aca426e08b372e (git)
    cpe:2.3:a:hexpm:hex_core:*:*:*:*:*:*:*:*
Create a notification for this product.
hexpm hex Affected: 2.4.2 , < 2.5.3 (semver)
    cpe:2.3:a:hexpm:hex:*:*:*:*:*:*:*:*
Create a notification for this product.
hexpm hex Affected: 5543a1919c709d8eb2b317f62aad76ca1eed375c , < * (git)
    cpe:2.3:a:hexpm:hex:*:*:*:*:*:*:*:*
Create a notification for this product.
Date Public
2026-10-14 16:56
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "cpes": [
            "cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "erl_tar"
          ],
          "packageName": "otp",
          "packageURL": "pkg:software-id/erlang.org/otp",
          "product": "OTP",
          "programFiles": [
            "lib/stdlib/src/erl_tar.erl"
          ],
          "programRoutines": [
            {
              "name": "erl_tar:do_sparse_read/3"
            },
            {
              "name": "erl_tar:stream_to_file_loop/3"
            },
            {
              "name": "erl_tar:extract/1"
            },
            {
              "name": "erl_tar:extract/2"
            }
          ],
          "vendor": "Erlang",
          "versions": [
            {
              "lessThan": "29.1.2",
              "status": "affected",
              "version": "29.0",
              "versionType": "otp"
            }
          ]
        },
        {
          "cpes": [
            "cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "erl_tar"
          ],
          "packageName": "stdlib",
          "packageURL": "pkg:otp/stdlib?repository_url=https:%2F%2Fgithub.com%2Ferlang%2Fotp\u0026vcs_url=git%2Bhttps:%2F%2Fgithub.com%2Ferlang%2Fotp.git",
          "product": "OTP",
          "programFiles": [
            "src/erl_tar.erl"
          ],
          "programRoutines": [
            {
              "name": "erl_tar:do_sparse_read/3"
            },
            {
              "name": "erl_tar:stream_to_file_loop/3"
            },
            {
              "name": "erl_tar:extract/1"
            },
            {
              "name": "erl_tar:extract/2"
            }
          ],
          "repo": "https://github.com/erlang/otp",
          "vendor": "Erlang",
          "versions": [
            {
              "lessThan": "8.1.1",
              "status": "affected",
              "version": "8.0",
              "versionType": "otp"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "erl_tar"
          ],
          "packageName": "erlang/otp",
          "packageURL": "pkg:github/erlang/otp",
          "product": "OTP",
          "programFiles": [
            "lib/stdlib/src/erl_tar.erl"
          ],
          "programRoutines": [
            {
              "name": "erl_tar:do_sparse_read/3"
            },
            {
              "name": "erl_tar:stream_to_file_loop/3"
            },
            {
              "name": "erl_tar:extract/1"
            },
            {
              "name": "erl_tar:extract/2"
            }
          ],
          "repo": "https://github.com/erlang/otp",
          "vendor": "Erlang",
          "versions": [
            {
              "lessThan": "3086307f311b78b38644a7787a3aca6a3f95a9d5",
              "status": "affected",
              "version": "fbf2c7194f6fce4b7b66dc0bcaa4f6b4b85e088f",
              "versionType": "git"
            }
          ]
        },
        {
          "cpes": [
            "cpe:2.3:a:erlang:rebar3:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "r3_hex_erl_tar",
            "r3_hex_tarball"
          ],
          "packageName": "rebar3",
          "packageURL": "pkg:otp/rebar3?repository_url=https:%2F%2Fgithub.com%2Ferlang%2Frebar3\u0026vcs_url=git%2Bhttps:%2F%2Fgithub.com%2Ferlang%2Frebar3.git",
          "product": "rebar3",
          "programFiles": [
            "apps/rebar/src/vendored/r3_hex_erl_tar.erl",
            "apps/rebar/src/vendored/r3_hex_tarball.erl"
          ],
          "programRoutines": [
            {
              "name": "r3_hex_erl_tar:do_sparse_read/3"
            },
            {
              "name": "r3_hex_erl_tar:stream_to_file_loop/3"
            },
            {
              "name": "r3_hex_erl_tar:extract/1"
            },
            {
              "name": "r3_hex_erl_tar:extract/2"
            },
            {
              "name": "r3_hex_tarball:unpack/2"
            },
            {
              "name": "r3_hex_tarball:unpack/3"
            },
            {
              "name": "r3_hex_tarball:unpack_docs/2"
            },
            {
              "name": "r3_hex_tarball:unpack_docs/3"
            }
          ],
          "repo": "https://github.com/erlang/rebar3",
          "vendor": "erlang",
          "versions": [
            {
              "lessThan": "*",
              "status": "affected",
              "version": "3.27.1",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:erlang:rebar3:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "r3_hex_erl_tar",
            "r3_hex_tarball"
          ],
          "packageName": "erlang/rebar3",
          "packageURL": "pkg:github/erlang/rebar3",
          "product": "rebar3",
          "programFiles": [
            "apps/rebar/src/vendored/r3_hex_erl_tar.erl",
            "apps/rebar/src/vendored/r3_hex_tarball.erl"
          ],
          "programRoutines": [
            {
              "name": "r3_hex_erl_tar:do_sparse_read/3"
            },
            {
              "name": "r3_hex_erl_tar:stream_to_file_loop/3"
            },
            {
              "name": "r3_hex_erl_tar:extract/1"
            },
            {
              "name": "r3_hex_erl_tar:extract/2"
            },
            {
              "name": "r3_hex_tarball:unpack/2"
            },
            {
              "name": "r3_hex_tarball:unpack/3"
            },
            {
              "name": "r3_hex_tarball:unpack_docs/2"
            },
            {
              "name": "r3_hex_tarball:unpack_docs/3"
            }
          ],
          "repo": "https://github.com/erlang/rebar3",
          "vendor": "erlang",
          "versions": [
            {
              "lessThan": "*",
              "status": "affected",
              "version": "23dbdb5d1f87f56902aef296c88a20049cd0c6e4",
              "versionType": "git"
            }
          ]
        },
        {
          "collectionURL": "https://repo.hex.pm",
          "cpes": [
            "cpe:2.3:a:hexpm:hex_core:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "hex_erl_tar",
            "hex_tarball"
          ],
          "packageName": "hex_core",
          "packageURL": "pkg:hex/hex_core",
          "product": "hex_core",
          "programFiles": [
            "src/hex_erl_tar.erl",
            "src/hex_tarball.erl"
          ],
          "programRoutines": [
            {
              "name": "hex_erl_tar:do_sparse_read/3"
            },
            {
              "name": "hex_erl_tar:stream_to_file_loop/3"
            },
            {
              "name": "hex_erl_tar:extract/1"
            },
            {
              "name": "hex_erl_tar:extract/2"
            },
            {
              "name": "hex_tarball:unpack/2"
            },
            {
              "name": "hex_tarball:unpack/3"
            },
            {
              "name": "hex_tarball:unpack_docs/2"
            },
            {
              "name": "hex_tarball:unpack_docs/3"
            }
          ],
          "repo": "https://github.com/hexpm/hex_core",
          "vendor": "hexpm",
          "versions": [
            {
              "lessThan": "0.20.1",
              "status": "affected",
              "version": "0.14.0",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:hexpm:hex_core:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "hex_erl_tar",
            "hex_tarball"
          ],
          "packageName": "hexpm/hex_core",
          "packageURL": "pkg:github/hexpm/hex_core",
          "product": "hex_core",
          "programFiles": [
            "src/hex_erl_tar.erl",
            "src/hex_tarball.erl"
          ],
          "programRoutines": [
            {
              "name": "hex_erl_tar:do_sparse_read/3"
            },
            {
              "name": "hex_erl_tar:stream_to_file_loop/3"
            },
            {
              "name": "hex_erl_tar:extract/1"
            },
            {
              "name": "hex_erl_tar:extract/2"
            },
            {
              "name": "hex_tarball:unpack/2"
            },
            {
              "name": "hex_tarball:unpack/3"
            },
            {
              "name": "hex_tarball:unpack_docs/2"
            },
            {
              "name": "hex_tarball:unpack_docs/3"
            }
          ],
          "repo": "https://github.com/hexpm/hex_core",
          "vendor": "hexpm",
          "versions": [
            {
              "lessThan": "a2ece683e6e88a3ec95ad20b09aca426e08b372e",
              "status": "affected",
              "version": "13bb9fbba418a406af614790b8d5cd458259ee70",
              "versionType": "git"
            }
          ]
        },
        {
          "cpes": [
            "cpe:2.3:a:hexpm:hex:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "mix_hex_erl_tar",
            "mix_hex_tarball"
          ],
          "packageName": "hex",
          "packageURL": "pkg:otp/hex?repository_url=https:%2F%2Fgithub.com%2Fhexpm%2Fhex\u0026vcs_url=git%2Bhttps:%2F%2Fgithub.com%2Fhexpm%2Fhex.git",
          "product": "hex",
          "programFiles": [
            "src/mix_hex_erl_tar.erl",
            "src/mix_hex_tarball.erl"
          ],
          "programRoutines": [
            {
              "name": "mix_hex_erl_tar:do_sparse_read/3"
            },
            {
              "name": "mix_hex_erl_tar:stream_to_file_loop/3"
            },
            {
              "name": "mix_hex_erl_tar:extract/1"
            },
            {
              "name": "mix_hex_erl_tar:extract/2"
            },
            {
              "name": "mix_hex_tarball:unpack/2"
            },
            {
              "name": "mix_hex_tarball:unpack/3"
            },
            {
              "name": "mix_hex_tarball:unpack_docs/2"
            },
            {
              "name": "mix_hex_tarball:unpack_docs/3"
            }
          ],
          "repo": "https://github.com/hexpm/hex",
          "vendor": "hexpm",
          "versions": [
            {
              "lessThan": "2.5.3",
              "status": "affected",
              "version": "2.4.2",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:hexpm:hex:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "mix_hex_erl_tar",
            "mix_hex_tarball"
          ],
          "packageName": "hexpm/hex",
          "packageURL": "pkg:github/hexpm/hex",
          "product": "hex",
          "programFiles": [
            "src/mix_hex_erl_tar.erl",
            "src/mix_hex_tarball.erl"
          ],
          "programRoutines": [
            {
              "name": "mix_hex_erl_tar:do_sparse_read/3"
            },
            {
              "name": "mix_hex_erl_tar:stream_to_file_loop/3"
            },
            {
              "name": "mix_hex_erl_tar:extract/1"
            },
            {
              "name": "mix_hex_erl_tar:extract/2"
            },
            {
              "name": "mix_hex_tarball:unpack/2"
            },
            {
              "name": "mix_hex_tarball:unpack/3"
            },
            {
              "name": "mix_hex_tarball:unpack_docs/2"
            },
            {
              "name": "mix_hex_tarball:unpack_docs/3"
            }
          ],
          "repo": "https://github.com/hexpm/hex",
          "vendor": "hexpm",
          "versions": [
            {
              "changes": [
                {
                  "at": "8e1067131a13949eff30623f31648a945ffd5418",
                  "status": "unaffected"
                },
                {
                  "at": "7847c23d09ab52113614c3718e1e7d368743da5d",
                  "status": "unaffected"
                }
              ],
              "lessThan": "*",
              "status": "affected",
              "version": "5543a1919c709d8eb2b317f62aad76ca1eed375c",
              "versionType": "git"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "29.1.2",
                  "versionStartIncluding": "29.0",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:a:erlang:rebar3:*:*:*:*:*:*:*:*",
                  "versionStartIncluding": "3.27.1",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:a:hexpm:hex_core:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "0.20.1",
                  "versionStartIncluding": "0.14.0",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:a:hexpm:hex:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "2.5.3",
                  "versionStartIncluding": "2.4.2",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "AND"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Eric Meadows-J\u00f6nsson"
        },
        {
          "lang": "en",
          "type": "reporter",
          "value": "Eric Meadows-J\u00f6nsson"
        }
      ],
      "dateAssigned": "2026-10-07T13:11:38.000Z",
      "datePublic": "2026-10-14T16:56:18.000Z",
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eLoop with Unreachable Exit Condition (\u0027Infinite Loop\u0027) vulnerability in Erlang OTP stdlib (\u003ccode\u003eerl_tar\u003c/code\u003e module), hexpm hex_core (\u003ccode\u003ehex_erl_tar\u003c/code\u003e module), hexpm hex (\u003ccode\u003emix_hex_erl_tar\u003c/code\u003e module) and erlang rebar3 (\u003ccode\u003er3_hex_erl_tar\u003c/code\u003e module) allows an attacker who supplies a tar archive to cause a denial of service via a crafted GNU sparse member.\u003c/p\u003e\n\u003cp\u003eWhen \u003ccode\u003eerl_tar:extract/1,2\u003c/code\u003e writes a member to disk, \u003ccode\u003eerl_tar:stream_to_file_loop/3\u003c/code\u003e reads it in chunks of 65536 bytes by default. For a GNU sparse member whose sparse map ends before its real size, \u003ccode\u003eerl_tar:do_sparse_read/3\u003c/code\u003e matches its trailing-hole clause before its zero-length clause. After the chunk is used up, the trailing-hole clause reads zero bytes, does not advance the position, and recurses forever. A 2048-byte archive keeps the extracting process and one scheduler busy until the process is killed. The \u003ccode\u003e{max_size, N}\u003c/code\u003e option prevents this only when N is below the real size of the member. Extraction with the \u003ccode\u003ememory\u003c/code\u003e option is not affected.\u003c/p\u003e\n\u003cp\u003ehex_core ships its own copy of \u003ccode\u003eerl_tar\u003c/code\u003e as \u003ccode\u003ehex_erl_tar\u003c/code\u003e, and Hex and rebar3 ship hex_core with prefixed module names (\u003ccode\u003emix_hex_erl_tar\u003c/code\u003e and \u003ccode\u003er3_hex_erl_tar\u003c/code\u003e). These copies contain the same code and do not call stdlib\u0027s \u003ccode\u003eerl_tar\u003c/code\u003e, so they are affected on any OTP version. OTP 28 is not affected, but an application running on OTP 28 is affected if it extracts archives through an affected version of hex_core, Hex or rebar3.\u003c/p\u003e\n\u003cp\u003eThis issue affects OTP from OTP\u0026nbsp;29.0 before OTP\u0026nbsp;29.1.2, corresponding to stdlib from 8.0 before 8.1.1, and rebar3 from 3.27.1 onward, and hex from 2.4.2 before 2.5.3; hex_core: from 0.14.0 before 0.20.1.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Loop with Unreachable Exit Condition (\u0027Infinite Loop\u0027) vulnerability in Erlang OTP stdlib (`erl_tar` module), hexpm hex_core (`hex_erl_tar` module), hexpm hex (`mix_hex_erl_tar` module) and erlang rebar3 (`r3_hex_erl_tar` module) allows an attacker who supplies a tar archive to cause a denial of service via a crafted GNU sparse member.\n\nWhen `erl_tar:extract/1,2` writes a member to disk, `erl_tar:stream_to_file_loop/3` reads it in chunks of 65536 bytes by default. For a GNU sparse member whose sparse map ends before its real size, `erl_tar:do_sparse_read/3` matches its trailing-hole clause before its zero-length clause. After the chunk is used up, the trailing-hole clause reads zero bytes, does not advance the position, and recurses forever. A 2048-byte archive keeps the extracting process and one scheduler busy until the process is killed. The `{max_size, N}` option prevents this only when N is below the real size of the member. Extraction with the `memory` option is not affected.\n\nhex_core ships its own copy of `erl_tar` as `hex_erl_tar`, and Hex and rebar3 ship hex_core with prefixed module names (`mix_hex_erl_tar` and `r3_hex_erl_tar`). These copies contain the same code and do not call stdlib\u0027s `erl_tar`, so they are affected on any OTP version. OTP 28 is not affected, but an application running on OTP 28 is affected if it extracts archives through an affected version of hex_core, Hex or rebar3.\n\nThis issue affects OTP from OTP\u00a029.0 before OTP\u00a029.1.2, corresponding to stdlib from 8.0 before 8.1.1, and rebar3 from 3.27.1 onward, and hex from 2.4.2 before 2.5.3; hex_core: from 0.14.0 before 0.20.1."
            }
          ],
          "value": "Loop with Unreachable Exit Condition (\u0027Infinite Loop\u0027) vulnerability in Erlang OTP stdlib (erl_tar module), hexpm hex_core (hex_erl_tar module), hexpm hex (mix_hex_erl_tar module) and erlang rebar3 (r3_hex_erl_tar module) allows an attacker who supplies a tar archive to cause a denial of service via a crafted GNU sparse member.\n\nWhen erl_tar:extract/1,2 writes a member to disk, erl_tar:stream_to_file_loop/3 reads it in chunks of 65536 bytes by default. For a GNU sparse member whose sparse map ends before its real size, erl_tar:do_sparse_read/3 matches its trailing-hole clause before its zero-length clause. After the chunk is used up, the trailing-hole clause reads zero bytes, does not advance the position, and recurses forever. A 2048-byte archive keeps the extracting process and one scheduler busy until the process is killed. The {max_size, N} option prevents this only when N is below the real size of the member. Extraction with the memory option is not affected.\n\nhex_core ships its own copy of erl_tar as hex_erl_tar, and Hex and rebar3 ship hex_core with prefixed module names (mix_hex_erl_tar and r3_hex_erl_tar). These copies contain the same code and do not call stdlib\u0027s erl_tar, so they are affected on any OTP version. OTP 28 is not affected, but an application running on OTP 28 is affected if it extracts archives through an affected version of hex_core, Hex or rebar3.\n\nThis issue affects OTP from OTP\u00a029.0 before OTP\u00a029.1.2, corresponding to stdlib from 8.0 before 8.1.1, and rebar3 from 3.27.1 onward, and hex from 2.4.2 before 2.5.3; hex_core: from 0.14.0 before 0.20.1."
        }
      ],
      "impacts": [
        {
          "capecId": "CAPEC-130",
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAn attacker who can get an application to extract a tar archive to disk keeps the extracting process and one scheduler busy forever. Each further archive occupies another scheduler, until the node stops responding.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "An attacker who can get an application to extract a tar archive to disk keeps the extracting process and one scheduler busy forever. Each further archive occupies another scheduler, until the node stops responding."
                }
              ],
              "value": "An attacker who can get an application to extract a tar archive to disk keeps the extracting process and one scheduler busy forever. Each further archive occupies another scheduler, until the node stops responding."
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "PRESENT",
            "attackVector": "LOCAL",
            "baseScore": 5.9,
            "baseSeverity": "MEDIUM",
            "privilegesRequired": "NONE",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
            "version": "4.0",
            "vulnAvailabilityImpact": "HIGH",
            "vulnConfidentialityImpact": "NONE",
            "vulnIntegrityImpact": "NONE",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-835",
              "description": "CWE-835 Loop with Unreachable Exit Condition (\u0027Infinite Loop\u0027)",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-14T21:46:30.112Z",
        "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "shortName": "EEF"
      },
      "references": [
        {
          "name": "GitHub Advisory",
          "tags": [
            "related",
            "vendor-advisory"
          ],
          "url": "https://github.com/erlang/otp/security/advisories/GHSA-phm5-m6cj-5382"
        },
        {
          "name": "EEF CNA record for CVE-2026-96596",
          "tags": [
            "related"
          ],
          "url": "https://cna.erlef.org/cves/CVE-2026-96596.html"
        },
        {
          "name": "OSV record EEF-CVE-2026-96596",
          "tags": [
            "related"
          ],
          "url": "https://osv.dev/vulnerability/EEF-CVE-2026-96596"
        },
        {
          "name": "Erlang/OTP version ordering",
          "tags": [
            "x_version-scheme"
          ],
          "url": "https://www.erlang.org/doc/system/versions.html#order-of-versions"
        },
        {
          "name": "Introducing commit fbf2c71 in erlang/otp",
          "tags": [
            "related"
          ],
          "url": "https://github.com/erlang/otp/commit/fbf2c7194f6fce4b7b66dc0bcaa4f6b4b85e088f"
        },
        {
          "name": "Fix commit 3086307 in erlang/otp",
          "tags": [
            "patch"
          ],
          "url": "https://github.com/erlang/otp/commit/3086307f311b78b38644a7787a3aca6a3f95a9d5"
        },
        {
          "name": "Introducing commit 23dbdb5 in erlang/rebar3",
          "tags": [
            "related"
          ],
          "url": "https://github.com/erlang/rebar3/commit/23dbdb5d1f87f56902aef296c88a20049cd0c6e4"
        },
        {
          "name": "Introducing commit 13bb9fb in hexpm/hex_core",
          "tags": [
            "related"
          ],
          "url": "https://github.com/hexpm/hex_core/commit/13bb9fbba418a406af614790b8d5cd458259ee70"
        },
        {
          "name": "Fix commit a2ece68 in hexpm/hex_core",
          "tags": [
            "patch"
          ],
          "url": "https://github.com/hexpm/hex_core/commit/a2ece683e6e88a3ec95ad20b09aca426e08b372e"
        },
        {
          "name": "Introducing commit 5543a19 in hexpm/hex",
          "tags": [
            "related"
          ],
          "url": "https://github.com/hexpm/hex/commit/5543a1919c709d8eb2b317f62aad76ca1eed375c"
        },
        {
          "name": "Fix commit 8e10671 in hexpm/hex",
          "tags": [
            "patch"
          ],
          "url": "https://github.com/hexpm/hex/commit/8e1067131a13949eff30623f31648a945ffd5418"
        },
        {
          "name": "Fix commit 7847c23 in hexpm/hex",
          "tags": [
            "patch"
          ],
          "url": "https://github.com/hexpm/hex/commit/7847c23d09ab52113614c3718e1e7d368743da5d"
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "title": "erl_tar:extract/2 loops forever on a GNU sparse member with a trailing hole",
      "workarounds": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003ePass \u003ccode\u003e{chunks, N}\u003c/code\u003e together with \u003ccode\u003e{max_size, N}\u003c/code\u003e, with the same value N, to \u003ccode\u003eerl_tar:extract/2\u003c/code\u003e. Extraction then rejects any member larger than N, and reads each remaining member in one call, so the loop cannot occur.\u003c/p\u003e\n\u003cp\u003eAlternatively, extract with the \u003ccode\u003ememory\u003c/code\u003e option and write the returned files to disk in the application.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Pass `{chunks, N}` together with `{max_size, N}`, with the same value N, to `erl_tar:extract/2`. Extraction then rejects any member larger than N, and reads each remaining member in one call, so the loop cannot occur.\n\nAlternatively, extract with the `memory` option and write the returned files to disk in the application."
            }
          ],
          "value": "Pass {chunks, N} together with {max_size, N}, with the same value N, to erl_tar:extract/2. Extraction then rejects any member larger than N, and reads each remaining member in one call, so the loop cannot occur.\n\nAlternatively, extract with the memory option and write the returned files to disk in the application."
        }
      ],
      "x_proofOfConcept": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003col\u003e\n\u003cli\u003eBuild a 2048-byte tar that holds one GNU sparse member (typeflag \u003ccode\u003eS\u003c/code\u003e). Give it a stored size of 4 bytes, one sparse map entry of 4 bytes at offset 0, and a real size of 1048576 bytes. Follow the 512-byte header with a 512-byte block that starts with the 4 data bytes, then 1024 zero bytes.\u003c/li\u003e\n\u003cli\u003eIn a separate process, call \u003ccode\u003eerl_tar:extract({binary, Tar}, [{cwd, Dir}])\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eThe call does not return. After 5 seconds the process has used more than 10^9 reductions. On OTP 28 the same call returns \u003ccode\u003eok\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "1. Build a 2048-byte tar that holds one GNU sparse member (typeflag `S`). Give it a stored size of 4 bytes, one sparse map entry of 4 bytes at offset 0, and a real size of 1048576 bytes. Follow the 512-byte header with a 512-byte block that starts with the 4 data bytes, then 1024 zero bytes.\n2. In a separate process, call `erl_tar:extract({binary, Tar}, [{cwd, Dir}])`.\n3. The call does not return. After 5 seconds the process has used more than 10^9 reductions. On OTP 28 the same call returns `ok`."
            }
          ],
          "value": "* Build a 2048-byte tar that holds one GNU sparse member (typeflag S). Give it a stored size of 4 bytes, one sparse map entry of 4 bytes at offset 0, and a real size of 1048576 bytes. Follow the 512-byte header with a 512-byte block that starts with the 4 data bytes, then 1024 zero bytes.\n* In a separate process, call erl_tar:extract({binary, Tar}, [{cwd, Dir}]).\n* The call does not return. After 5 seconds the process has used more than 10^9 reductions. On OTP 28 the same call returns ok."
        }
      ],
      "x_technicalAnalysis": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003e\u003cstrong\u003e1. Chunked extraction.\u003c/strong\u003e \u003ccode\u003eerl_tar:extract/2\u003c/code\u003e writes each member to disk through \u003ccode\u003estream_to_file_loop/3\u003c/code\u003e. This function calls \u003ccode\u003edo_read(Reader, ChunkSize)\u003c/code\u003e until the \u003ccode\u003enum_bytes\u003c/code\u003e field of the reader is 0. The default chunk size is 65536 bytes.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. Clause order in \u003ccode\u003edo_sparse_read/3\u003c/code\u003e.\u003c/strong\u003e For a sparse member, \u003ccode\u003edo_read/2\u003c/code\u003e calls \u003ccode\u003edo_sparse_read/3\u003c/code\u003e. The clause for a trailing hole matches when \u003ccode\u003esparse_map\u003c/code\u003e is \u003ccode\u003e[]\u003c/code\u003e and \u003ccode\u003ePos \u0026lt; Size\u003c/code\u003e. It comes before the clause that returns when \u003ccode\u003eLen\u003c/code\u003e is 0.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3. Unbounded recursion.\u003c/strong\u003e The member is a GNU sparse member (typeflag \u003ccode\u003eS\u003c/code\u003e) whose real size is larger than one chunk and whose sparse map ends before the real size. After the data fragments, the trailing-hole clause reads the rest of the chunk and recurses with \u003ccode\u003eLen = 0\u003c/code\u003e. The same clause matches again, and \u003ccode\u003eread_sparse_hole/3\u003c/code\u003e returns an empty binary and leaves \u003ccode\u003ePos\u003c/code\u003e unchanged. The zero-length clause is never reached, so the call never returns.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4. No mitigation from \u003ccode\u003emax_size\u003c/code\u003e.\u003c/strong\u003e For a sparse member, \u003ccode\u003e{max_size, N}\u003c/code\u003e is checked against the real size from the header. It stops the loop only when N is below that size. \u003ccode\u003eerl_tar:table/2\u003c/code\u003e lists the member as \u003ccode\u003eregular\u003c/code\u003e, so a caller cannot skip sparse members by type.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "**1. Chunked extraction.** `erl_tar:extract/2` writes each member to disk through `stream_to_file_loop/3`. This function calls `do_read(Reader, ChunkSize)` until the `num_bytes` field of the reader is 0. The default chunk size is 65536 bytes.\n\n**2. Clause order in `do_sparse_read/3`.** For a sparse member, `do_read/2` calls `do_sparse_read/3`. The clause for a trailing hole matches when `sparse_map` is `[]` and `Pos \u003c Size`. It comes before the clause that returns when `Len` is 0.\n\n**3. Unbounded recursion.** The member is a GNU sparse member (typeflag `S`) whose real size is larger than one chunk and whose sparse map ends before the real size. After the data fragments, the trailing-hole clause reads the rest of the chunk and recurses with `Len = 0`. The same clause matches again, and `read_sparse_hole/3` returns an empty binary and leaves `Pos` unchanged. The zero-length clause is never reached, so the call never returns.\n\n**4. No mitigation from `max_size`.** For a sparse member, `{max_size, N}` is checked against the real size from the header. It stops the loop only when N is below that size. `erl_tar:table/2` lists the member as `regular`, so a caller cannot skip sparse members by type."
            }
          ],
          "value": "1. Chunked extraction. erl_tar:extract/2 writes each member to disk through stream_to_file_loop/3. This function calls do_read(Reader, ChunkSize) until the num_bytes field of the reader is 0. The default chunk size is 65536 bytes.\n\n2. Clause order in do_sparse_read/3. For a sparse member, do_read/2 calls do_sparse_read/3. The clause for a trailing hole matches when sparse_map is [] and Pos \u003c Size. It comes before the clause that returns when Len is 0.\n\n3. Unbounded recursion. The member is a GNU sparse member (typeflag S) whose real size is larger than one chunk and whose sparse map ends before the real size. After the data fragments, the trailing-hole clause reads the rest of the chunk and recurses with Len = 0. The same clause matches again, and read_sparse_hole/3 returns an empty binary and leaves Pos unchanged. The zero-length clause is never reached, so the call never returns.\n\n4. No mitigation from max_size. For a sparse member, {max_size, N} is checked against the real size from the header. It stops the loop only when N is below that size. erl_tar:table/2 lists the member as regular, so a caller cannot skip sparse members by type."
        }
      ]
    }
  },
  "cveMetadata": {
    "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
    "assignerShortName": "EEF",
    "cveId": "CVE-2026-96596",
    "datePublished": "2026-10-14T16:56:18.530Z",
    "dateReserved": "2026-09-27T12:00:01.540Z",
    "dateUpdated": "2026-10-14T21:46:30.112Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-96596",
      "date": "2026-10-15",
      "epss": "0.00183",
      "percentile": "0.07363"
    },
    "nvd": {
      "cve": {
        "affected": [
          {
            "affectedData": [
              {
                "cpes": [
                  "cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "erl_tar"
                ],
                "packageName": "otp",
                "packageURL": "pkg:software-id/erlang.org/otp",
                "product": "OTP",
                "programFiles": [
                  "lib/stdlib/src/erl_tar.erl"
                ],
                "programRoutines": [
                  {
                    "name": "erl_tar:do_sparse_read/3"
                  },
                  {
                    "name": "erl_tar:stream_to_file_loop/3"
                  },
                  {
                    "name": "erl_tar:extract/1"
                  },
                  {
                    "name": "erl_tar:extract/2"
                  }
                ],
                "vendor": "Erlang",
                "versions": [
                  {
                    "lessThan": "29.1.2",
                    "status": "affected",
                    "version": "29.0",
                    "versionType": "otp"
                  }
                ]
              },
              {
                "cpes": [
                  "cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "erl_tar"
                ],
                "packageName": "stdlib",
                "packageURL": "pkg:otp/stdlib?repository_url=https:%2F%2Fgithub.com%2Ferlang%2Fotp\u0026vcs_url=git%2Bhttps:%2F%2Fgithub.com%2Ferlang%2Fotp.git",
                "product": "OTP",
                "programFiles": [
                  "src/erl_tar.erl"
                ],
                "programRoutines": [
                  {
                    "name": "erl_tar:do_sparse_read/3"
                  },
                  {
                    "name": "erl_tar:stream_to_file_loop/3"
                  },
                  {
                    "name": "erl_tar:extract/1"
                  },
                  {
                    "name": "erl_tar:extract/2"
                  }
                ],
                "repo": "https://github.com/erlang/otp",
                "vendor": "Erlang",
                "versions": [
                  {
                    "lessThan": "8.1.1",
                    "status": "affected",
                    "version": "8.0",
                    "versionType": "otp"
                  }
                ]
              },
              {
                "collectionURL": "https://github.com",
                "cpes": [
                  "cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "erl_tar"
                ],
                "packageName": "erlang/otp",
                "packageURL": "pkg:github/erlang/otp",
                "product": "OTP",
                "programFiles": [
                  "lib/stdlib/src/erl_tar.erl"
                ],
                "programRoutines": [
                  {
                    "name": "erl_tar:do_sparse_read/3"
                  },
                  {
                    "name": "erl_tar:stream_to_file_loop/3"
                  },
                  {
                    "name": "erl_tar:extract/1"
                  },
                  {
                    "name": "erl_tar:extract/2"
                  }
                ],
                "repo": "https://github.com/erlang/otp",
                "vendor": "Erlang",
                "versions": [
                  {
                    "lessThan": "3086307f311b78b38644a7787a3aca6a3f95a9d5",
                    "status": "affected",
                    "version": "fbf2c7194f6fce4b7b66dc0bcaa4f6b4b85e088f",
                    "versionType": "git"
                  }
                ]
              },
              {
                "cpes": [
                  "cpe:2.3:a:erlang:rebar3:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "r3_hex_erl_tar",
                  "r3_hex_tarball"
                ],
                "packageName": "rebar3",
                "packageURL": "pkg:otp/rebar3?repository_url=https:%2F%2Fgithub.com%2Ferlang%2Frebar3\u0026vcs_url=git%2Bhttps:%2F%2Fgithub.com%2Ferlang%2Frebar3.git",
                "product": "rebar3",
                "programFiles": [
                  "apps/rebar/src/vendored/r3_hex_erl_tar.erl",
                  "apps/rebar/src/vendored/r3_hex_tarball.erl"
                ],
                "programRoutines": [
                  {
                    "name": "r3_hex_erl_tar:do_sparse_read/3"
                  },
                  {
                    "name": "r3_hex_erl_tar:stream_to_file_loop/3"
                  },
                  {
                    "name": "r3_hex_erl_tar:extract/1"
                  },
                  {
                    "name": "r3_hex_erl_tar:extract/2"
                  },
                  {
                    "name": "r3_hex_tarball:unpack/2"
                  },
                  {
                    "name": "r3_hex_tarball:unpack/3"
                  },
                  {
                    "name": "r3_hex_tarball:unpack_docs/2"
                  },
                  {
                    "name": "r3_hex_tarball:unpack_docs/3"
                  }
                ],
                "repo": "https://github.com/erlang/rebar3",
                "vendor": "erlang",
                "versions": [
                  {
                    "lessThan": "*",
                    "status": "affected",
                    "version": "3.27.1",
                    "versionType": "semver"
                  }
                ]
              },
              {
                "collectionURL": "https://github.com",
                "cpes": [
                  "cpe:2.3:a:erlang:rebar3:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "r3_hex_erl_tar",
                  "r3_hex_tarball"
                ],
                "packageName": "erlang/rebar3",
                "packageURL": "pkg:github/erlang/rebar3",
                "product": "rebar3",
                "programFiles": [
                  "apps/rebar/src/vendored/r3_hex_erl_tar.erl",
                  "apps/rebar/src/vendored/r3_hex_tarball.erl"
                ],
                "programRoutines": [
                  {
                    "name": "r3_hex_erl_tar:do_sparse_read/3"
                  },
                  {
                    "name": "r3_hex_erl_tar:stream_to_file_loop/3"
                  },
                  {
                    "name": "r3_hex_erl_tar:extract/1"
                  },
                  {
                    "name": "r3_hex_erl_tar:extract/2"
                  },
                  {
                    "name": "r3_hex_tarball:unpack/2"
                  },
                  {
                    "name": "r3_hex_tarball:unpack/3"
                  },
                  {
                    "name": "r3_hex_tarball:unpack_docs/2"
                  },
                  {
                    "name": "r3_hex_tarball:unpack_docs/3"
                  }
                ],
                "repo": "https://github.com/erlang/rebar3",
                "vendor": "erlang",
                "versions": [
                  {
                    "lessThan": "*",
                    "status": "affected",
                    "version": "23dbdb5d1f87f56902aef296c88a20049cd0c6e4",
                    "versionType": "git"
                  }
                ]
              },
              {
                "collectionURL": "https://repo.hex.pm",
                "cpes": [
                  "cpe:2.3:a:hexpm:hex_core:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "hex_erl_tar",
                  "hex_tarball"
                ],
                "packageName": "hex_core",
                "packageURL": "pkg:hex/hex_core",
                "product": "hex_core",
                "programFiles": [
                  "src/hex_erl_tar.erl",
                  "src/hex_tarball.erl"
                ],
                "programRoutines": [
                  {
                    "name": "hex_erl_tar:do_sparse_read/3"
                  },
                  {
                    "name": "hex_erl_tar:stream_to_file_loop/3"
                  },
                  {
                    "name": "hex_erl_tar:extract/1"
                  },
                  {
                    "name": "hex_erl_tar:extract/2"
                  },
                  {
                    "name": "hex_tarball:unpack/2"
                  },
                  {
                    "name": "hex_tarball:unpack/3"
                  },
                  {
                    "name": "hex_tarball:unpack_docs/2"
                  },
                  {
                    "name": "hex_tarball:unpack_docs/3"
                  }
                ],
                "repo": "https://github.com/hexpm/hex_core",
                "vendor": "hexpm",
                "versions": [
                  {
                    "lessThan": "0.20.1",
                    "status": "affected",
                    "version": "0.14.0",
                    "versionType": "semver"
                  }
                ]
              },
              {
                "collectionURL": "https://github.com",
                "cpes": [
                  "cpe:2.3:a:hexpm:hex_core:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "hex_erl_tar",
                  "hex_tarball"
                ],
                "packageName": "hexpm/hex_core",
                "packageURL": "pkg:github/hexpm/hex_core",
                "product": "hex_core",
                "programFiles": [
                  "src/hex_erl_tar.erl",
                  "src/hex_tarball.erl"
                ],
                "programRoutines": [
                  {
                    "name": "hex_erl_tar:do_sparse_read/3"
                  },
                  {
                    "name": "hex_erl_tar:stream_to_file_loop/3"
                  },
                  {
                    "name": "hex_erl_tar:extract/1"
                  },
                  {
                    "name": "hex_erl_tar:extract/2"
                  },
                  {
                    "name": "hex_tarball:unpack/2"
                  },
                  {
                    "name": "hex_tarball:unpack/3"
                  },
                  {
                    "name": "hex_tarball:unpack_docs/2"
                  },
                  {
                    "name": "hex_tarball:unpack_docs/3"
                  }
                ],
                "repo": "https://github.com/hexpm/hex_core",
                "vendor": "hexpm",
                "versions": [
                  {
                    "lessThan": "a2ece683e6e88a3ec95ad20b09aca426e08b372e",
                    "status": "affected",
                    "version": "13bb9fbba418a406af614790b8d5cd458259ee70",
                    "versionType": "git"
                  }
                ]
              },
              {
                "cpes": [
                  "cpe:2.3:a:hexpm:hex:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "mix_hex_erl_tar",
                  "mix_hex_tarball"
                ],
                "packageName": "hex",
                "packageURL": "pkg:otp/hex?repository_url=https:%2F%2Fgithub.com%2Fhexpm%2Fhex\u0026vcs_url=git%2Bhttps:%2F%2Fgithub.com%2Fhexpm%2Fhex.git",
                "product": "hex",
                "programFiles": [
                  "src/mix_hex_erl_tar.erl",
                  "src/mix_hex_tarball.erl"
                ],
                "programRoutines": [
                  {
                    "name": "mix_hex_erl_tar:do_sparse_read/3"
                  },
                  {
                    "name": "mix_hex_erl_tar:stream_to_file_loop/3"
                  },
                  {
                    "name": "mix_hex_erl_tar:extract/1"
                  },
                  {
                    "name": "mix_hex_erl_tar:extract/2"
                  },
                  {
                    "name": "mix_hex_tarball:unpack/2"
                  },
                  {
                    "name": "mix_hex_tarball:unpack/3"
                  },
                  {
                    "name": "mix_hex_tarball:unpack_docs/2"
                  },
                  {
                    "name": "mix_hex_tarball:unpack_docs/3"
                  }
                ],
                "repo": "https://github.com/hexpm/hex",
                "vendor": "hexpm",
                "versions": [
                  {
                    "lessThan": "2.5.3",
                    "status": "affected",
                    "version": "2.4.2",
                    "versionType": "semver"
                  }
                ]
              },
              {
                "collectionURL": "https://github.com",
                "cpes": [
                  "cpe:2.3:a:hexpm:hex:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "mix_hex_erl_tar",
                  "mix_hex_tarball"
                ],
                "packageName": "hexpm/hex",
                "packageURL": "pkg:github/hexpm/hex",
                "product": "hex",
                "programFiles": [
                  "src/mix_hex_erl_tar.erl",
                  "src/mix_hex_tarball.erl"
                ],
                "programRoutines": [
                  {
                    "name": "mix_hex_erl_tar:do_sparse_read/3"
                  },
                  {
                    "name": "mix_hex_erl_tar:stream_to_file_loop/3"
                  },
                  {
                    "name": "mix_hex_erl_tar:extract/1"
                  },
                  {
                    "name": "mix_hex_erl_tar:extract/2"
                  },
                  {
                    "name": "mix_hex_tarball:unpack/2"
                  },
                  {
                    "name": "mix_hex_tarball:unpack/3"
                  },
                  {
                    "name": "mix_hex_tarball:unpack_docs/2"
                  },
                  {
                    "name": "mix_hex_tarball:unpack_docs/3"
                  }
                ],
                "repo": "https://github.com/hexpm/hex",
                "vendor": "hexpm",
                "versions": [
                  {
                    "changes": [
                      {
                        "at": "8e1067131a13949eff30623f31648a945ffd5418",
                        "status": "unaffected"
                      },
                      {
                        "at": "7847c23d09ab52113614c3718e1e7d368743da5d",
                        "status": "unaffected"
                      }
                    ],
                    "lessThan": "*",
                    "status": "affected",
                    "version": "5543a1919c709d8eb2b317f62aad76ca1eed375c",
                    "versionType": "git"
                  }
                ]
              }
            ],
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
          }
        ],
        "cveTags": [],
        "descriptions": [
          {
            "lang": "en",
            "value": "Loop with Unreachable Exit Condition (\u0027Infinite Loop\u0027) vulnerability in Erlang OTP stdlib (erl_tar module), hexpm hex_core (hex_erl_tar module), hexpm hex (mix_hex_erl_tar module) and erlang rebar3 (r3_hex_erl_tar module) allows an attacker who supplies a tar archive to cause a denial of service via a crafted GNU sparse member.\n\nWhen erl_tar:extract/1,2 writes a member to disk, erl_tar:stream_to_file_loop/3 reads it in chunks of 65536 bytes by default. For a GNU sparse member whose sparse map ends before its real size, erl_tar:do_sparse_read/3 matches its trailing-hole clause before its zero-length clause. After the chunk is used up, the trailing-hole clause reads zero bytes, does not advance the position, and recurses forever. A 2048-byte archive keeps the extracting process and one scheduler busy until the process is killed. The {max_size, N} option prevents this only when N is below the real size of the member. Extraction with the memory option is not affected.\n\nhex_core ships its own copy of erl_tar as hex_erl_tar, and Hex and rebar3 ship hex_core with prefixed module names (mix_hex_erl_tar and r3_hex_erl_tar). These copies contain the same code and do not call stdlib\u0027s erl_tar, so they are affected on any OTP version. OTP 28 is not affected, but an application running on OTP 28 is affected if it extracts archives through an affected version of hex_core, Hex or rebar3.\n\nThis issue affects OTP from OTP\u00a029.0 before OTP\u00a029.1.2, corresponding to stdlib from 8.0 before 8.1.1, and rebar3 from 3.27.1 onward, and hex from 2.4.2 before 2.5.3; hex_core: from 0.14.0 before 0.20.1."
          }
        ],
        "id": "CVE-2026-96596",
        "lastModified": "2026-10-15T14:45:10.783",
        "metrics": {
          "cvssMetricV40": [
            {
              "cvssData": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "availabilityRequirement": "NOT_DEFINED",
                "baseScore": 5.9,
                "baseSeverity": "MEDIUM",
                "confidentialityRequirement": "NOT_DEFINED",
                "exploitMaturity": "NOT_DEFINED",
                "integrityRequirement": "NOT_DEFINED",
                "modifiedAttackComplexity": "NOT_DEFINED",
                "modifiedAttackRequirements": "NOT_DEFINED",
                "modifiedAttackVector": "NOT_DEFINED",
                "modifiedPrivilegesRequired": "NOT_DEFINED",
                "modifiedSubAvailabilityImpact": "NOT_DEFINED",
                "modifiedSubConfidentialityImpact": "NOT_DEFINED",
                "modifiedSubIntegrityImpact": "NOT_DEFINED",
                "modifiedUserInteraction": "NOT_DEFINED",
                "modifiedVulnAvailabilityImpact": "NOT_DEFINED",
                "modifiedVulnConfidentialityImpact": "NOT_DEFINED",
                "modifiedVulnIntegrityImpact": "NOT_DEFINED",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
              "type": "Secondary"
            }
          ]
        },
        "published": "2026-10-14T17:20:28.983",
        "references": [
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://cna.erlef.org/cves/CVE-2026-96596.html"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://github.com/erlang/otp/commit/3086307f311b78b38644a7787a3aca6a3f95a9d5"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://github.com/erlang/otp/commit/fbf2c7194f6fce4b7b66dc0bcaa4f6b4b85e088f"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://github.com/erlang/otp/security/advisories/GHSA-phm5-m6cj-5382"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://github.com/erlang/rebar3/commit/23dbdb5d1f87f56902aef296c88a20049cd0c6e4"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://github.com/hexpm/hex/commit/5543a1919c709d8eb2b317f62aad76ca1eed375c"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://github.com/hexpm/hex/commit/7847c23d09ab52113614c3718e1e7d368743da5d"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://github.com/hexpm/hex/commit/8e1067131a13949eff30623f31648a945ffd5418"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://github.com/hexpm/hex_core/commit/13bb9fbba418a406af614790b8d5cd458259ee70"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://github.com/hexpm/hex_core/commit/a2ece683e6e88a3ec95ad20b09aca426e08b372e"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://osv.dev/vulnerability/EEF-CVE-2026-96596"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://www.erlang.org/doc/system/versions.html#order-of-versions"
          }
        ],
        "sourceIdentifier": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "vulnStatus": "Deferred",
        "weaknesses": [
          {
            "description": [
              {
                "lang": "en",
                "value": "CWE-835"
              }
            ],
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "type": "Secondary"
          }
        ]
      }
    },
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-10-15T14:40:25+00:00",
      "cve": "CVE-2026-96596",
      "id": "CVE-2026-96596",
      "initial_release_date": "2026-10-14T16:56:18.530000+00:00",
      "product_status:known_not_affected": "1",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "erlang: hex_core: hex: rebar3: erl_tar: Denial of Service via crafted GNU sparse TAR archive",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-96596.json",
      "version": "3"
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline

Sightings and recorded dates, grouped by day · UTC

JSON
Events included in the timeline

Loading timeline…


    Loading…

    Loading…

    Loading…

    Related by attack behaviour

    Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.