绕过dev / urandom |随机进行测试

时间:2014-09-26 07:05:26

标签: linux testing random chroot

我想编写一个功能测试用例,用于测试具有已知随机数值的程序。我已经在单元测试期间用模拟测试了它。但我也想进行功能测试(当然不是全部:)

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

1 个答案:

答案 0 :(得分:6)

如果您的系统足够新(例如RHEL 7)并支持setns系统调用,则可以在mount命名空间的帮助下完成。需要root访问权限。

我们的想法是为进程创建一个单独的mount命名空间,并在该命名空间内绑定 - 挂载/dev/random上的其他文件或FIFO,以便来自此mount命名空间的进程将从此绑定中读取数据 - 装入文件。其他流程会看到常规/dev/random

以下是如何做到这一点。

准备:运行以下命令以使所有这些人员工作(因为默认情况下它可能不起作用,有关详细信息,请参阅this question。)

# mount --make-rprivate /

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

# unshare -m /bin/bash

你已经启动了新的bash,它有自己的mount命名空间。您可以在此shell和其他shell中比较以下命令的结果:

这个shell:

# ls -l /proc/self/ns/mnt
lrwxrwxrwx. 1 root root 0 Sep 26 16:06 /proc/self/ns/mnt -> mnt:[4026532148]

其他外壳:

$ ls -l /proc/self/ns/mnt
lrwxrwxrwx. 1 ec2-user ec2-user 0 Sep 26 16:06 /proc/self/ns/mnt -> mnt:[4026531840]

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

现在,在这个shell中,我们可以在现有的/dev/random上绑定一些东西。

# echo 'some large text' > /tmp/fakerandom
# mount --bind /tmp/fakerandom /dev/random

其他流程没有看到,对于他们/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

但在我们的外壳中它很特别:

# ls -l /dev/random
-rw-r--r--. 1 root root 16 Sep 26 16:18 /dev/random
# cat /dev/random
some large text

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

有关mount命名空间的更多信息,请参阅this优秀文章。