#include </etc/shadow> - Hanno的博客
2019年12月16日,星期一
最近我看到一条推文,有人提到可以在用gcc编译的C代码中包含/dev/stdin。这至少可以说是令人惊讶的。
当你从IT安全背景看到这样的事情时,你会开始思考这是否可以被滥用于攻击。虽然我没有想出任何具体的攻击方法,但我开始思考你还可以包含哪些其他文件。由于你基本上可以包含系统上的任意路径,这可能会被用于数据泄露——前提是你能说服别人编译你的代码。
有许多网页提供在线服务,你可以在其中输入C代码并运行它。很明显,如果运行的代码没有以某种方式沙箱化,这样的系统是不安全的。但是,编译器是否也需要沙箱化,这一点是否同样明显呢?
你会如何攻击这样的系统?直接通过代码泄露数据相对困难,因为你需要包含最终成为有效C代码的数据。也许有技巧可以让像/etc/shadow这样的文件成为有效的C代码(你可以在include之前和之后添加代码),但我没有找到。但也不需要这样做:编译器给出的错误消息就是你所需要的。我测试的所有在线工具都会在代码编译失败时显示错误信息。
我甚至发现有一个服务允许我添加:
|
|
并显示了root密码的哈希值。这实际上意味着该服务以root权限运行编译任务。
包含/etc中的各种文件可以了解系统的信息。例如,/etc/lsb-release通常提供有关正在使用的发行版的信息。有趣的是,包含/proc中的伪文件不起作用。gcc似乎将它们视为空文件。这限制了了解系统的可能性。/sys和/dev可以工作,但它们包含的人类可读信息较少。
总之,我认为允许他人编译代码的服务应考虑沙箱化编译过程,从而确保无法通过这些攻击向量泄露有趣的信息。
发布者:Hanno Böck
分类:代码、英语、Linux、安全
时间:18:38
评论(7)| 引用(0)
评论
#1 Jon · 2019-12-17 12:13
用编译器访问/etc/shadow?当然不行。在我所有可用的系统上,我得到以下结果:
|
|
#1.1 pikzel · 2019-12-17 12:58
正如他所说:“这实际上意味着该服务以root权限运行编译任务”
我假设你不是以root权限运行编译器。
#2 Arctic Kona · 2019-12-18 03:44
这让我想起了一种编译器炸弹攻击,涉及精心制作的C源代码,需要大量内存和磁盘空间来编译。
#2.1 Han You · 2020-01-09 15:51
我曾经通过#Include </dev/zero>使我的大学在线编译器崩溃。
#2.2 Han You · 2020-01-09 15:52
#include </dev/random>
#3 mzr · 2019-12-21 20:31
在某些操作系统和文件系统上,你还可以将目录作为常规文件包含。这允许你枚举系统上的文件。
#3.1 mzr · 2019-12-21 20:33
使用.incbin