Skip to content
Heist/ feed
Back to feed
Medium

SFTP chroot bypass via path traversal in SSH_FXP_FSETSTAT

Type: advisorySources: OSV

Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') vulnerability in Erlang OTP ssh (ssh_sftpd module) allows an authenticated SFTP user to modify file attributes outside the configured chroot directory. The SFTP daemon (ssh_sftpd) stores the raw, user-supplied path in file handles instead of the chroot-resolved path. When SSH_FXP_FSETSTAT is issued on such a handle, file attributes (permissions, ownership, timestamps) are modified on the real filesystem path, bypassing the root directory boundary entirely. Any authenticated SFTP user on a server configured with the root option can modify file attributes of files outside the intended chroot boundary. The prerequisite is that a target file must exist on the real filesystem at the same relative path. Note that this vulnerability only allows modification of file attributes; file contents cannot be read or altered through this attack vector. If the SSH daemon runs as root, this enables direct privilege escalation: an attacker can set the setuid bit on any binary, change ownership of sensitive files, or make system configuration world-writable. This vulnerability is associated with program files lib/ssh/src/ssh_sftpd.erl and program routines ssh_sftpd:do_open/4 and ssh_sftpd:handle_op/4. This issue affects OTP from OTP 17.0 before OTP 28.4.3, OTP 27.3.4.11 and OTP 26.2.5.20, corresponding to ssh from 3.0.1 before 5.5.3, 5.2.11.7 and 5.1.4.15.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-32147
Confirmed fixed CVEs
Not specified
Updated in this feed
5 Nov 2026, 01:20 UTC · Revision 1

Source evidence

SFTP chroot bypass via path traversal in SSH_FXP_FSETSTAT

core-osv · Original source

Published 21 Apr 2026, 12:01 UTC

Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') vulnerability in Erlang OTP ssh (ssh_sftpd module) allows an authenticated SFTP user to modify file attributes outside the configured chroot directory. The SFTP daemon (ssh_sftpd) stores the raw, user-supplied path in file handles instead of the chroot-resolved path. When SSH_FXP_FSETSTAT is issued on such a handle, file attributes (permissions, ownership, timestamps) are modified on the real filesystem path, bypassing the root directory boundary entirely. Any authenticated SFTP user on a server configured with the root option can modify file attributes of files outside the intended chroot boundary. The prerequisite is that a target file must exist on the real filesystem at the same relative path. Note that this vulnerability only allows modification of file attributes; file contents cannot be read or altered through this attack vector. If the SSH daemon runs as root, this enables direct privilege escalation: an attacker can set the setuid bit on any binary, change ownership of sensitive files, or make system configuration world-writable. This vulnerability is associated with program files lib/ssh/src/ssh_sftpd.erl and program routines ssh_sftpd:do_open/4 and ssh_sftpd:handle_op/4. This issue affects OTP from OTP 17.0 before OTP 28.4.3, OTP 27.3.4.11 and OTP 26.2.5.20, corresponding to ssh from 3.0.1 before 5.5.3, 5.2.11.7 and 5.1.4.15.

osv:CVE-2026-32147
Complete source record
{
  "id": "790711ec13e2c90ade9853a24a01e1a74b71842b0a58481c31b5aa5db267036e",
  "url": "https://osv.dev/vulnerability/CVE-2026-32147",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "SFTP chroot bypass via path traversal in SSH_FXP_FSETSTAT",
    "summary": "Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') vulnerability in Erlang OTP ssh (ssh_sftpd module) allows an authenticated SFTP user to modify file attributes outside the configured chroot directory. The SFTP daemon (ssh_sftpd) stores the raw, user-supplied path in file handles instead of the chroot-resolved path. When SSH_FXP_FSETSTAT is issued on such a handle, file attributes (permissions, ownership, timestamps) are modified on the real filesystem path, bypassing the root directory boundary entirely. Any authenticated SFTP user on a server configured with the root option can modify file attributes of files outside the intended chroot boundary. The prerequisite is that a target file must exist on the real filesystem at the same relative path. Note that this vulnerability only allows modification of file attributes; file contents cannot be read or altered through this attack vector. If the SSH daemon runs as root, this enables direct privilege escalation: an attacker can set the setuid bit on any binary, change ownership of sensitive files, or make system configuration world-writable. This vulnerability is associated with program files lib/ssh/src/ssh_sftpd.erl and program routines ssh_sftpd:do_open/4 and ssh_sftpd:handle_op/4. This issue affects OTP from OTP 17.0 before OTP 28.4.3, OTP 27.3.4.11 and OTP 26.2.5.20, corresponding to ssh from 3.0.1 before 5.5.3, 5.2.11.7 and 5.1.4.15.",
    "evidence": "osv:CVE-2026-32147",
    "products": [],
    "severity": "medium",
    "structured": {
      "id": "CVE-2026-32147",
      "aliases": [
        "CVE-2026-32147",
        "EEF-CVE-2026-32147",
        "GHSA-28jg-mw9x-hpm5"
      ],
      "metrics": [
        {
          "type": "CVSS_V4",
          "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/erlang/otp",
              "type": "GIT",
              "events": [
                {
                  "introduced": "07b8f441ca711f9812fad9e9115bab3c3aa92f79"
                },
                {
                  "fixed": "e5d6d95c9aac559b59b78c66eb558ee54bd4e006"
                },
                {
                  "introduced": "601a012837ea0a5c8095bf24223132824177124d"
                },
                {
                  "fixed": "c0ce26bb20ab5fcd6e214fa285aec5a409772e61"
                },
                {
                  "introduced": "9e6f6742c4d9e9915ee8af0dcb7d97cf1f836116"
                },
                {
                  "fixed": "359d91e66ffdede8f7855565087d324581c28f2e"
                },
                {
                  "fixed": "28c5d5a6c5f873dc701b597276271763e7d1c004"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "cpe": "cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*",
                    "range": [
                      {
                        "introduced": "17.0"
                      },
                      {
                        "fixed": "26.2.5.20"
                      }
                    ],
                    "source": "CPE_RANGE"
                  },
                  {
                    "cpe": "cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*",
                    "range": [
                      {
                        "introduced": "27.0"
                      },
                      {
                        "fixed": "27.3.4.11"
                      }
                    ],
                    "source": "CPE_RANGE"
                  },
                  {
                    "cpe": "cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*",
                    "range": [
                      {
                        "introduced": "28.0"
                      },
                      {
                        "fixed": "28.4.3"
                      }
                    ],
                    "source": "CPE_RANGE"
                  },
                  {
                    "range": [
                      {
                        "fixed": "28c5d5a6c5f873dc701b597276271763e7d1c004"
                      }
                    ],
                    "source": "REFERENCES_COMMIT"
                  }
                ]
              }
            }
          ],
          "versions": [
            "patch-base-27",
            "OTP-27.3.4",
            "OTP-27.3.4.9",
            "OTP-27.3.4.10",
            "patch-base-26",
            "OTP-26.2.5",
            "OTP-28.4",
            "OTP-27.0",
            "OTP-26.2.5.9",
            "OTP-28.4.1",
            "OTP-28.4.2",
            "OTP-26.2.5.19",
            "OTP-28.0",
            "OTP-26.2.5.18",
            "OTP-26.2.5.17",
            "OTP-27.3.4.8",
            "OTP-27.3.4.6",
            "OTP-27.3.4.7",
            "OTP-26.2.5.16",
            "OTP-26.2.5.12",
            "OTP-27.3",
            "OTP-27.3.4.5",
            "OTP-27.3.4.4",
            "OTP-26.2.5.15",
            "OTP-26.2.3",
            "OTP-28.1",
            "OTP-27.3.4.3",
            "OTP-27.3.3",
            "OTP-26.2.5.14",
            "OTP-27.3.4.2",
            "OTP-26.0",
            "OTP-26.2.5.13",
            "OTP-25.0",
            "OTP-27.3.4.1",
            "OTP-26.2.5.11",
            "OTP-27.3.2",
            "OTP-26.2.5.10",
            "OTP-27.2",
            "OTP-27.3.1",
            "OTP-26.2.5.8",
            "OTP-26.2.5.7",
            "OTP-26.2.5.6",
            "OTP-27.1",
            "OTP-26.2.5.5",
            "OTP-26.2.5.4",
            "OTP-26.2.5.3",
            "OTP-26.2",
            "OTP-26.2.5.2",
            "OTP-26.2.5.1",
            "OTP-26.2.4",
            "OTP-24.0",
            "OTP-26.1",
            "OTP-26.0-rc3",
            "OTP-26.0-rc2",
            "OTP-26.0-rc1",
            "OTP-23.0",
            "OTP-21.0",
            "OTP-25.0-rc3",
            "OTP-25.0-rc2",
            "OTP-25.0-rc1",
            "OTP-22.0",
            "OTP-24.0-rc3",
            "OTP-24.0-rc2",
            "OTP-24.0-rc1",
            "OTP-23.0-rc3",
            "OTP-23.0-rc2",
            "OTP-23.0-rc1",
            "OTP-20.0",
            "OTP-22.0-rc3",
            "OTP-22.0-rc2",
            "OTP-22.0-rc1",
            "OTP-19.0",
            "OTP-21.0-rc2",
            "OTP-18.0",
            "OTP-21.0-rc1",
            "OTP-17.0",
            "OTP-20.0-rc2",
            "OTP-20.0-rc1",
            "OTP-19.0-rc2",
            "OTP-19.0-rc1",
            "OTP-18.0-rc1"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-32147.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:41.269454777Z",
      "provider": "osv",
      "references": [
        "https://cna.erlef.org/cves/CVE-2026-32147.html",
        "https://github.com",
        "https://osv.dev/vulnerability/EEF-CVE-2026-32147",
        "https://www.erlang.org/doc/system/versions.html#order-of-versions",
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/32xxx/CVE-2026-32147.json",
        "https://github.com/erlang/otp/security/advisories/GHSA-28jg-mw9x-hpm5",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-32147",
        "https://github.com/erlang/otp/commit/28c5d5a6c5f873dc701b597276271763e7d1c004",
        "https://github.com/erlang/otp"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-22"
        ],
        "cna_assigner": "EEF",
        "unresolved_ranges": [
          {
            "extracted_events": [
              {
                "range": [
                  {
                    "introduced": "3.01"
                  },
                  {
                    "fixed": "5.5.3"
                  }
                ],
                "source": "AFFECTED_FIELD",
                "strategy": "ChangesAt"
              }
            ]
          }
        ],
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/32xxx/CVE-2026-32147.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-32147",
        "evidence": "/id"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 509015,
  "published_at": "2026-04-21T12:01:20.35+00:00"
}