sfill -Illv
创建一个包含数据的文件,/dev/urandom
直到它填满分区。制作这样的大文件需要花费很多时间。iotop
告诉我写入速度约为 1 MB/s。
不过dd if=/dev/urandom >> ./randomfile
,它可以做同样的事情,但速度约为 12 MB/s。为什么是sfill
慢了这么多?
编辑:我使用的是稳定的 Debian 11。12 MB/s 的数据正在写入机械硬盘上的 ntfs 分区。我尝试了另外两个 Ext4 格式的 HD,使用 dd 获得了大约 100 MB/s 的速度。sfill
然而,在这些磁盘上的性能仍然很差。
答案1
比较基准
我想知道sfill
到底有多慢;所以我对它进行了基准测试:
由于我不信任sfill
(已阅读其源代码,感觉更像是进入国际混淆C代码大赛比我相信能够安全地执行某些操作的编写良好的系统软件要好),我至少通过在虚拟机中运行它来隔离它,其中我通过 podman 在 OCI 容器中运行它,使用 1GB 环回安装的 XFS 映像作为体积:
mkfs.xfs fsimage.xfs
udisksctl loop-setup -f fsimage.xfs
# I get a mountpoint automatically here
sudo mkdir /run/media/testuser/a02ab05f-8c6f-41ed-bd28-dc81ca7df1a1/test
sudo chown testuser:testuser /run/media/testuser/a02ab05f-8c6f-41ed-bd28-dc81ca7df1a1/test
podman run podman run --pull newer --rm -it -v /run/media/testuser/a02ab05f-8c6f-41ed-bd28-dc81ca7df1a1/test:/data:Z debian:11
我安装apt install secure-delete
并运行sfill -Illv /data
。我htop
在系统上运行并观察到写入速率为 11 到 12 MB/s。因此,通过大约 4 层间接层,速度是系统的 12 倍;)
为什么sfill -Illv
慢?
我刚刚阅读了sfill
源代码(链接到已签入 git repo 的存档;叹息……git 中的二进制文件。安全人员通常不是优秀的软件工程师;他们是优秀的软件工程师。但这对各方来说都是不必要的痛苦)。
这个软件在过去的20年里没有见过爱,说实话,在20年前它是非常不干净的。所以,读起来并不愉快。
无论如何,其核心sfill
是打开文件,向其中填充数据,然后删除它们。
因此,默认情况下,它会使用O_SYNC
– 出于未指定的原因打开该文件。这保证了糟糕的性能,并且绝对没有理由不在最后简单地刷新到磁盘。
在您的选项中添加一个-f
以禁用同步写入。对我来说,这将写入速率加快到大约 130 MB/s。
作为比较,cat /dev/urandom > /data/tmpfile
达到近 500 MB/s;这是可以预料到的,因为 1GB 的写入缓冲区并不是那么多 RAM。
命令 | 速度 | 与您的测量相比的加速 |
---|---|---|
sfill -Illv /data |
12MB/秒 | 12 |
sfill -Illvf /data |
130MB/秒 | 130 |
cat /dev/urandom > /data/tmpfile |
~ 500 MB/秒 | 〜500 |
仔细阅读perf top
,很明显可以看到,cat /dev/urandom > /data/tmpfile
实际上只是开始让 CPU 稍微陷入性能瓶颈——我的内核的chacha_permute
,urandom(半伪)RNG 的一部分,实际上出现了。
因此,同步写入仍然不能完全解释糟糕的性能,因此我不得不将其余部分归咎于它们生成随机位的极其低效的方式;*buf++ = (unsigned char) (256.0*rand()/(RAND_MAX+1.0))
, 严重地?这不仅没有必要进行浮点数学运算,甚至没有提供良好的随机性,而在现代 GNU/Linux 系统上,随机性RAND_MAX
恰好是 2^3,所以你确实得到了 31 位的 OK 随机性,然后你就严重破坏了它,并获得 8 位不良随机性……
得到教训
- 不要指望已经失效 20 年的软件还能有相当的性能
- 每当您在安全研究人员社区中看到软件广告时,请注意软件质量
- 有时,更简单的解决方案就是更好的解决方案:写入充满随机性的文件,直到可用磁盘空间用完绝不需要一个特殊的程序
sfill
;任何产生随机数据的东西,通过管道传输到文件中,直到由于磁盘已满而失败为止,然后将其删除,都会做同样的事情 - Gutmann USENIX 的文章远非没有争议。相对普遍的共识是,在现代存储和文件系统上,它本质上是在树错树。现代硬盘驱动器非常接近物理极限,因此以前的写入与您理论上可以通过量子理论允许的测量精确读出的内容之间的互信息足够低,以至于您无法做太多事情那。因此,是否需要用随机数据覆盖是值得怀疑的。
从技术上来说,可以肯定的是,自 1980 年以来的任何硬盘驱动器都会有一个所谓的加扰器,它准备进入写入头的符号,以便写入一长行零(或一)不会导致恒定信号;因此,从磁介质的物理原理来看,用随机位覆盖“秘密”数据并不比用零覆盖它更随机——因为这些零就像随机数据一样,在写入之前会被扰乱。然而,当然,加扰序列本质上是已知的,因此,如果之前的写入实际上存在一些剩余磁化强度,那么您可以可以从某种意义上说,那么这确实会包含有关先前数据的更多信息。再次强调,这不是今天的物理相关攻击。