VYPR
High severityNVD Advisory· Published Mar 24, 2021· Updated Aug 4, 2024

Path traversal

CVE-2020-26279

Description

Path traversal in go-ipfs < 0.8.0-rc1 allows overwriting or misplacing files when retrieving DAGs with relative paths.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

Path traversal in go-ipfs < 0.8.0-rc1 allows overwriting or misplacing files when retrieving DAGs with relative paths.

Vulnerability overview

CVE-2020-26279 is a path traversal vulnerability in go-ipfs, the Go implementation of the InterPlanetary File System (IPFS). The flaw exists in the handling of Directed Acyclic Graphs (DAGs) that contain relative paths during retrieval. When a user runs ipfs get on a maliciously crafted DAG, the relative path entries can escape the intended output directory, leading to files being written to arbitrary locations in the user's filesystem or overwriting existing files [1][3]. The root cause involves insufficient sanitization of tar archive paths in the tar-utils library used by go-ipfs, where a simple split on / was used without checking for .. components [2][4].

Attack vector and prerequisites

The attack is only exploitable via the ipfs get command; the IPFS gateway is not affected [3]. An attacker must first upload a DAG (for example, via ipfs add) that contains files or directories with relative-path components such as ../ naming. A victim who then retrieves that DAG with ipfs get will trigger the traversal. No authentication is required beyond normal IPFS interaction; the vulnerability can be leveraged by any peer offering such a DAG.

Impact

Successful exploitation allows an adversary to overwrite files on the victim's filesystem with arbitrary content, or to write files to unintended directories outside the extraction target [1][3]. This could lead to code execution (e.g., overwriting scripts, configuration files, or binaries) or denial of service, depending on the context where the victim uses ipfs get.

Mitigation

the vulnerability is fixed in go-ipfs version 0.8.0-rc1 and later [1]. The patch, applied via commit b7ddba7 [2], incorporates a fix from the upstream tar-utils library that checks for .. path components and rejects such paths with an error [4]. Users are advised to upgrade to the patched version. No workaround is available besides upgrading."

AI Insight generated on May 21, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
github.com/ipfs/go-ipfsGo
< 0.8.00.8.0

Affected products

2

Patches

2
b7ddba7fe47d

Merge pull request #7812 from ipfs/chore/update-deps

https://github.com/ipfs/go-ipfsAdin SchmahmannDec 8, 2020via ghsa
2 files changed · +21 17
  • go.mod+7 7 modified
    @@ -9,25 +9,25 @@ require (
     	github.com/dustin/go-humanize v1.0.0
     	github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302
     	github.com/fsnotify/fsnotify v1.4.9
    -	github.com/gabriel-vasile/mimetype v1.1.1
    +	github.com/gabriel-vasile/mimetype v1.1.2
     	github.com/go-bindata/go-bindata/v3 v3.1.3
     	github.com/gogo/protobuf v1.3.1
     	github.com/hashicorp/go-multierror v1.1.0
     	github.com/hashicorp/golang-lru v0.5.4
    -	github.com/ipfs/go-bitswap v0.3.2
    +	github.com/ipfs/go-bitswap v0.3.3
     	github.com/ipfs/go-block-format v0.0.2
     	github.com/ipfs/go-blockservice v0.1.4
     	github.com/ipfs/go-cid v0.0.7
     	github.com/ipfs/go-cidutil v0.0.2
     	github.com/ipfs/go-datastore v0.4.5
     	github.com/ipfs/go-detect-race v0.0.1
    -	github.com/ipfs/go-ds-badger v0.2.5
    +	github.com/ipfs/go-ds-badger v0.2.6
     	github.com/ipfs/go-ds-flatfs v0.4.5
     	github.com/ipfs/go-ds-leveldb v0.4.2
     	github.com/ipfs/go-ds-measure v0.1.0
     	github.com/ipfs/go-filestore v0.0.3
     	github.com/ipfs/go-fs-lock v0.0.6
    -	github.com/ipfs/go-graphsync v0.5.0
    +	github.com/ipfs/go-graphsync v0.5.1
     	github.com/ipfs/go-ipfs-blockstore v0.1.4
     	github.com/ipfs/go-ipfs-chunker v0.0.5
     	github.com/ipfs/go-ipfs-cmds v0.4.0
    @@ -41,7 +41,7 @@ require (
     	github.com/ipfs/go-ipfs-provider v0.4.3
     	github.com/ipfs/go-ipfs-routing v0.1.0
     	github.com/ipfs/go-ipfs-util v0.0.2
    -	github.com/ipfs/go-ipld-cbor v0.0.4
    +	github.com/ipfs/go-ipld-cbor v0.0.5
     	github.com/ipfs/go-ipld-format v0.2.0
     	github.com/ipfs/go-ipld-git v0.0.3
     	github.com/ipfs/go-ipns v0.0.2
    @@ -69,7 +69,7 @@ require (
     	github.com/libp2p/go-libp2p-kbucket v0.4.7
     	github.com/libp2p/go-libp2p-loggables v0.1.0
     	github.com/libp2p/go-libp2p-mplex v0.3.0
    -	github.com/libp2p/go-libp2p-noise v0.1.1
    +	github.com/libp2p/go-libp2p-noise v0.1.2
     	github.com/libp2p/go-libp2p-peerstore v0.2.6
     	github.com/libp2p/go-libp2p-pubsub v0.4.0
     	github.com/libp2p/go-libp2p-pubsub-router v0.4.0
    @@ -99,7 +99,7 @@ require (
     	github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc
     	github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1
     	github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7
    -	github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c
    +	github.com/whyrusleeping/tar-utils v0.0.0-20201201191210-20a61371de5b
     	go.uber.org/fx v1.13.1
     	go.uber.org/zap v1.16.0
     	golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
    
  • go.sum+14 10 modified
    @@ -152,8 +152,8 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV
     github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
     github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
     github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
    -github.com/gabriel-vasile/mimetype v1.1.1 h1:qbN9MPuRf3bstHu9zkI9jDWNfH//9+9kHxr9oRBBBOA=
    -github.com/gabriel-vasile/mimetype v1.1.1/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To=
    +github.com/gabriel-vasile/mimetype v1.1.2 h1:gaPnPcNor5aZSVCJVSGipcpbgMWiAAj9z182ocSGbHU=
    +github.com/gabriel-vasile/mimetype v1.1.2/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To=
     github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
     github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
     github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI=
    @@ -283,8 +283,8 @@ github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSA
     github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs=
     github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps=
     github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM=
    -github.com/ipfs/go-bitswap v0.3.2 h1:TdKx7lpidYe2dMAKfdeNS26y6Pc/AZX/i8doI1GV210=
    -github.com/ipfs/go-bitswap v0.3.2/go.mod h1:AyWWfN3moBzQX0banEtfKOfbXb3ZeoOeXnZGNPV9S6w=
    +github.com/ipfs/go-bitswap v0.3.3 h1:CrTO3OiOYFBcdliw074/C7T2QYHEOsPClgvR6RIYcO4=
    +github.com/ipfs/go-bitswap v0.3.3/go.mod h1:AyWWfN3moBzQX0banEtfKOfbXb3ZeoOeXnZGNPV9S6w=
     github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc=
     github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE=
     github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
    @@ -338,8 +338,8 @@ github.com/ipfs/go-ds-badger v0.2.1 h1:RsC9DDlwFhFdfT+s2PeC8joxbSp2YMufK8w/RBOxK
     github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE=
     github.com/ipfs/go-ds-badger v0.2.3 h1:J27YvAcpuA5IvZUbeBxOcQgqnYHUPxoygc6QxxkodZ4=
     github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk=
    -github.com/ipfs/go-ds-badger v0.2.5 h1:oKRP6xVdgunjioOvaW4Ue2N7rBI7h/sWNERHTguUmpE=
    -github.com/ipfs/go-ds-badger v0.2.5/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA=
    +github.com/ipfs/go-ds-badger v0.2.6 h1:Hy8jw4rifxtRDrqpvC1yh36oIyE37KDzsUzlHUPOFiU=
    +github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA=
     github.com/ipfs/go-ds-flatfs v0.4.5 h1:4QceuKEbH+HVZ2ZommstJMi3o3II+dWS3IhLaD7IGHs=
     github.com/ipfs/go-ds-flatfs v0.4.5/go.mod h1:e4TesLyZoA8k1gV/yCuBTnt2PJtypn4XUlB5n8KQMZY=
     github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc=
    @@ -355,8 +355,8 @@ github.com/ipfs/go-filestore v0.0.3 h1:MhZ1jT5K3NewZwim6rS/akcJLm1xM+r6nz6foeB9E
     github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE066SiKLSE=
     github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0=
     github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM=
    -github.com/ipfs/go-graphsync v0.5.0 h1:iaByvxq88Ys1KcaQzTS1wmRhNsNEo3SaUiSGqTSbGmM=
    -github.com/ipfs/go-graphsync v0.5.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk=
    +github.com/ipfs/go-graphsync v0.5.1 h1:4fXBRvRKicTgTmCFMmEua/H5jvmAOLgU9Z7PCPWt2ec=
    +github.com/ipfs/go-graphsync v0.5.1/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk=
     github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08=
     github.com/ipfs/go-ipfs-blockstore v0.1.0 h1:V1GZorHFUIB6YgTJQdq7mcaIpUfCM3fCyVi+MTo9O88=
     github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw=
    @@ -410,6 +410,8 @@ github.com/ipfs/go-ipld-cbor v0.0.3 h1:ENsxvybwkmke7Z/QJOmeJfoguj6GH3Y0YOaGrfy9Q
     github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc=
     github.com/ipfs/go-ipld-cbor v0.0.4 h1:Aw3KPOKXjvrm6VjwJvFf1F1ekR/BH3jdof3Bk7OTiSA=
     github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4=
    +github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8=
    +github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4=
     github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms=
     github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs=
     github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k=
    @@ -700,6 +702,8 @@ github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLK
     github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU=
     github.com/libp2p/go-libp2p-noise v0.1.1 h1:vqYQWvnIcHpIoWJKC7Al4D6Hgj0H012TuXRhPwSMGpQ=
     github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM=
    +github.com/libp2p/go-libp2p-noise v0.1.2 h1:IH9GRihQJTx56obm+GnpdPX4KeVIlvpXrP6xnJ0wxWk=
    +github.com/libp2p/go-libp2p-noise v0.1.2/go.mod h1:9B10b7ueo7TIxZHHcjcDCo5Hd6kfKT2m77by82SFRfE=
     github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo=
     github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es=
     github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY=
    @@ -1214,8 +1218,8 @@ github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9 h1:Y1/FEOpaCpD2
     github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
     github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds=
     github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI=
    -github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c h1:GGsyl0dZ2jJgVT+VvWBf/cNijrHRhkrTjkmp5wg7li0=
    -github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c/go.mod h1:xxcJeBb7SIUl/Wzkz1eVKJE/CB34YNrqX2TQI6jY9zs=
    +github.com/whyrusleeping/tar-utils v0.0.0-20201201191210-20a61371de5b h1:wA3QeTsaAXybLL2kb2cKhCAQTHgYTMwuI8lBlJSv5V8=
    +github.com/whyrusleeping/tar-utils v0.0.0-20201201191210-20a61371de5b/go.mod h1:xT1Y5p2JR2PfSZihE0s4mjdJaRGp1waCTf5JzhQLBck=
     github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow=
     github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg=
     github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8=
    
20a61371de5b

more closely match default tar errors (GNU + BSD binaries)

https://github.com/whyrusleeping/tar-utilsAdin SchmahmannDec 1, 2020via ghsa
1 file changed · +6 1
  • extractor.go+6 1 modified
    @@ -104,7 +104,12 @@ func (te *Extractor) Sanitize(toggle bool) {
     
     // outputPath returns the path at which to place tarPath
     func (te *Extractor) outputPath(tarPath string) (outPath string, err error) {
    -	elems := strings.Split(tarPath, "/")    // break into elems
    +	elems := strings.Split(tarPath, "/") // break into elems
    +	for _, e := range elems {
    +		if e == ".." {
    +			return "", fmt.Errorf("%s : path contains '..'", tarPath)
    +		}
    +	}
     	elems = elems[1:]                       // remove original root
     	outPath = strings.Join(elems, "/")      // join elems
     	outPath = gopath.Join(te.Path, outPath) // rebase on to extraction target root
    

Vulnerability mechanics

Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.