【问题标题】:How to manage "virtual root" filesystem with perl - sort of "pseudo chroot"如何使用 perl 管理“虚拟根”文件系统 - 类似于“伪 chroot”
【发布时间】:2013-11-17 13:29:18
【问题描述】:

正在寻找具有类似 perls chroot 功能的模块,但我不能使用 perl 的 chroot,因为它需要 root 权限。所以需要类似的东西:

#make a new "pseudo chroot"
my $dir = Chroot->new(path => '/some/path');

#change directory
$dir->cd('/tmp'); #the real path will be /some/path/tmp

$dir->pwd;        #returns "/tmp"

$dir->real_pwd;    #returns /some/path/tmp

$dir->cd('/lib')  #now $dir->pwd is /lib - $dir->real_pwd is /some/path/lib
$dir->cd('../../../tmp');

$dir->pwd;        #returns '/tmp' - ignores exceeded ../..
$dir->real_pwd    #returns '/some/path/tmp'

等等……

问题:

  1. 是否存在这样的 CPAN 模块? (可能不是 - 我没有找到)
  2. 如果不是,主要问题是:什么是最好的? (安全且快速)的方式来确保像 '../../../../some' 这样的相对路径保持在伪 chroot 的“内部”?。是否存在一些用于此的模块?

Ps:还没有代码示例,因为不知道如何开始 - 确保$dir->cd('../../any/long/../..//relative/../../../path') 保留在pseudo chrooted 环境中的正确方法是什么算法。

编辑:File::Spec->canonpath 不会清理../.. - 按照它的设计。 Cwd->realpath 在这里不适合,因为如果 pseudo chroot/some/path 简单的连接,Cwd->realpath( File::Spec->catpath('/some/path', '../../tmp') ) 将返回 /tmp(它存在)但它是错误的,因为它是我的“伪根”的“外部”......所以 - 还不知道......;(

【问题讨论】:

  • IMO,这个问题的答案远远超出了 SO 问题可以回答的范围。您将必须拥有大量的XS 代码,这些代码挂接到 Perl 的低级 IO 调用,并用间接 IO 调用代替。当然,这不会在 Perl 之外持续存在,因此如果用户使用system($string),Chroot 仿真将立即被破坏。
  • 那么openrequiremkdir 等呢?
  • @KentFredric 我需要一个简单的“路径清理”例程 - 可能问错了......

标签: perl path relative-path filepath chroot


【解决方案1】:

这是File::System 模块。 File::System::Real 可能适合您正在寻找的东西。它适用于绝对路径,并在File::System::Object 中实现了一个辅助方法

$clean_path = $obj->normalize_path($messy_path)

然后说:

强制执行“..”应用于根返回根的原则。 这通过防止用户访问文件来提供安全性 在根目录之外(假设对于给定的文件系统是可能的 实施)。

所以,你可以直接使用这个模块,或者你可以检查normalize_path 是如何编程的,以了解如何清理路径...

例子:

use Modern::Perl;
use File::System;
use Data::Dumper::Concise;

my $root = File::System->new("Real", root => '/some/path');
say Dumper $root;

my $file = $root->lookup('/etc/passwd'); #will looking for /some/path/etc/passwd
say Dumper $file;

my $content = $file->content;
say $content;

【讨论】:

  • 要去检查一下。谢谢。
【解决方案2】:

http://perldoc.perl.org/File/Spec.html#rel2abs()

查看 rel2abs,它应该能够将相对路径转换为绝对路径。之后,您可以使用例如正则表达式检查它是否在您的伪 chrooted 目录中

【讨论】:

  • 可能理解错了,但perl -MFile::Spec -E 'say File::Spec->rel2abs("../../etc/passwd", "/some/path")' 打印出/some/path/../../etc/passwd。所以...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多