绕过dev / urandom | random进行测试

gcb*_*gcb 5 linux testing random chroot

我想编写一个功能测试用例,用随机数测试一个具有已知值的程序。我已经在单元测试期间使用模拟程序对其进行了测试。但我也希望将其用于功能测试(当然,并非所有功能都可以:)

/dev/urandom仅对一个进程进行覆盖的最简单方法是什么?有没有办法对chroot单个文件执行类似的操作,然后让所有其他文件“通过”?

afe*_*ter 6

如果您的系统足够新(例如RHEL 7)并且支持setnssyscall,则可以在安装名称空间的帮助下完成。需要根访问权限。

想法是为该进程创建一个单独的安装命名空间,然后在该命名空间内将其他文件或FIFO绑定安装,/dev/random以便该安装命名空间中的进程将从该绑定安装文件中读取数据。其他过程将看到常规/dev/random

这是这样做的方法。

准备:运行以下命令以使所有这些工作人员都可以工作(由于默认情况下可能无法工作,请参阅此问题以获取详细信息)。

# mount --make-rprivate /
Run Code Online (Sandbox Code Playgroud)

现在,让我们创建一个在新的安装命名空间内运行的shell。

# unshare -m /bin/bash
Run Code Online (Sandbox Code Playgroud)

您有一个bash具有其自己的安装命名空间的新启动项。您可以从此shell内部和其他shell中比较以下命令的结果:

这个shell:

# ls -l /proc/self/ns/mnt
lrwxrwxrwx. 1 root root 0 Sep 26 16:06 /proc/self/ns/mnt -> mnt:[4026532148]
Run Code Online (Sandbox Code Playgroud)

其他外壳:

$ ls -l /proc/self/ns/mnt
lrwxrwxrwx. 1 ec2-user ec2-user 0 Sep 26 16:06 /proc/self/ns/mnt -> mnt:[4026531840]
Run Code Online (Sandbox Code Playgroud)

请注意,数字不同,因此这两个外壳程序位于不同的安装名称空间中,并且从第一个外壳程序执行的安装对于系统中的其他进程(该外壳程序的所有子代除外)将不可见。

现在,在此shell中,我们可以在现有目录上绑定安装某些东西/dev/random

# echo 'some large text' > /tmp/fakerandom
# mount --bind /tmp/fakerandom /dev/random
Run Code Online (Sandbox Code Playgroud)

其他进程看不到,因为它们/dev/random照常工作:

$ ls -l /dev/random
crw-rw-rw-. 1 root root 1, 8 Sep 26 15:45 /dev/random
$ cat /dev/random
?Znp7?v?c???^C
Run Code Online (Sandbox Code Playgroud)

但是在我们的shell中,它很特别:

# ls -l /dev/random
-rw-r--r--. 1 root root 16 Sep 26 16:18 /dev/random
# cat /dev/random
some large text
Run Code Online (Sandbox Code Playgroud)

对于功能测试,您可能需要/dev/random用一些FIFO 代替,并在其他一些过程中将一些已知数据写入该FIFO(mkfifo(1)如果需要,请参见参考资料以获取更多信息)。

可以在这篇出色的文章中找到有关安装名称空间的更多信息。