如何修复存档中的文件在从我的端点下载时权限被拒绝?

How to fix files within archive having permission denied when downloaded from my endpoint?

提问人:Finlay Weber 提问时间:10/22/2023 最后编辑:John KugelmanFinlay Weber 更新时间:10/22/2023 访问量:78

问:

我正在使用 Actix Web 和 Tokio Tar 实现一个端点来下载存档文件。

存档生成的代码灵感来自此处示例中所示的代码。现转载如下:

let mut ar = Builder::new(Cursor::new(vec![]));

for (path, file) in files {
    let mut header = Header::new_gnu();
    header.set_size(file.len() as u64);
    header.set_cksum();
    ar.append_data(&mut header, path, Cursor::new(file)).await?;
}
let ar_data = ar.into_inner().await?;

Ok(HttpResponse::Ok()
    .append_header(("Content-Disposition", "attachment; filename=\"archive.tar\""))
    .body(ar_data.into_inner()))

当我访问端点时,我可以下载存档,也可以解压缩它。现在的问题是,存档中的所有文件似乎都具有错误的权限。我无法打开它。

当我检查权限时,这是我得到的:

ls -l /Users/me/Downloads/archive
total 32
----------  1 me  staff    83 Jan  1  1970 one.md
----------  1 me  staff  2267 Jan  1  1970 two.png
----------  1 me  staff  4708 Jan  1  1970 three.svg
drwxr-xr-x@ 3 me  staff    96 Oct 21 19:37 src

当我手动更新权限以允许读/写时,我可以打开该文件。

问题是,为什么使用此权限生成存档?更重要的是,如何使端点生成具有正确权限的存档,以允许用户能够读取和写入它?

文件权限 tar rust-tokio

评论


答:

1赞 JMAA 10/22/2023 #1

您的代码不是从磁盘上的文件创建存档。相反,它从磁盘读取文件,然后使用该文件的读取器为要存档的文件提供字节。换言之,存档库永远不会看到原始文件元数据(包括权限),因此不可能复制原始权限。std::io::Read

因此,您需要以文件权限是您想要的方式创建存档。我不是这方面的专家,但快速浏览一下文档表明,您可能想要使用或显式构建具有所需权限的标头(它有很多设置文件元数据的方法)。tokio-tarBuilder::append_file

一般来说,习惯于阅读您正在使用的板条箱的文档是个好主意。看看有哪些功能和类型可用,四处阅读,你可能会发现一些为你指明正确方向的东西。


通常,您应该非常明确地说明通过网络发送数据的存档的权限。文件权限可能是一种攻击媒介。

例如,最近在 Cargo 中修复了一个 CVE,其中 Cargo 在不检查权限的情况下解压缩了 crate 存档,这意味着 crate 作者可以创建一个 crate,其中所有文件都是所有用户的 rwx,这意味着恶意用户可以通过覆盖缓存下载的 crate 的源代码来攻击同一台机器上的另一个用户。小心。