伪造不存在完整路径的目录路径

伪造不存在完整路径的目录路径

我正在使用一个依赖于引用源文件等的绝对路径的构建系统。当我想使用不同的工具链测试构建时,我将 src 目录挂载在 VM 或 chroot 中。问题是我的主机上的 src 目录的路径非常复杂 - 比方说 /a/b/c/d/src - 并且它必须与安装的路径匹配。

我希望能够将我的 src 目录挂载在 /mnt/src 之类的地方,但我总是最终需要创建一个符号链接 /a/b/c/d/src 到 /mnt/src,或者只是将挂载点设置为直接/a/b/c/d/src。

文件系统中包含 /a/b/c/d 感觉很脏,通常您甚至可能没有在 /a/b/c/d (或任何父目录)中创建文件的权限。有没有办法伪造这条路径来安抚我的构建系统?

答案1

最好的解决方案是告诉构建系统源路径和安装路径不是同一件事,但我假设你不能这样做。

最直接的方法是将源路径安排为可以轻松复制的路径,例如/var/tmp/mybuild.如果构建系统不是太令人讨厌,那么将其作为文件所在位置的符号链接就足够了。如果构建系统坚持规范化符号链接,您应该能够通过使用绑定挂载反而。使用bindfs,您不需要root权限,您只需要对要让文件出现的位置具有写权限。

如果您无法对源系统进行操作,另一种方法是预加载重定向某些文件访问的动态库。这假设将运行的所有可执行文件都是动态链接的。链接示例中的代码演示了如何从特定文件执行此操作;可以对其进行调整以重定向路径以特定前缀开头的所有文件。代替

if (!strcmp(path, FROM)) {
    path = TO;
}
return ret;

通过类似的东西(未经测试)

char *other_path = NULL;
if (!strncmp(path, FROM, strlen(FROM))) {
    other_path = malloc(strlen(path) - strlen(FROM) + strlen(TO) + 1);
    if (other_path == NULL) return -ENOENT; // return NULL in fopen
    memcpy(other_path, TO, strlen(TO));
    memcpy(other_path + strlen(TO), path + strlen(FROM), strlen(path) - strlen(FROM) + 1);
    path = other_path;
}
free(other_path);
return ret;

答案2

如果您的目标是避免测试构建的残留物污染“主机”,那么在firejail具有持久覆盖层的内部构建应该是一个不错的选择。通过这种方法,它可以像真实的一样构建并可能安装,但文件最终会出现在覆盖层中,而不是污染“真实的”文件系统。

缺点是您需要在覆盖层中找到测试构建结果,但同时这可能具有保留连续测试构建结果的优点,例如,用于比较它们,或您可能需要的任何其他后续取证做。

相关内容