利用#include指令读取系统敏感文件的安全风险

本文探讨了在C语言编译过程中使用#include指令包含系统文件(如/etc/shadow)的安全风险,揭示了在线编译服务以root权限运行可能导致的敏感信息泄露问题,并提出了编译过程沙箱化的防护建议。

#include </etc/shadow> - Hanno的博客

2019年12月16日,星期一

最近我看到一条推文,有人提到可以在用gcc编译的C代码中包含/dev/stdin。这至少可以说是令人惊讶的。

当你从IT安全背景看到这样的事情时,你会开始思考这是否可以被滥用于攻击。虽然我没有想出任何具体的攻击方法,但我开始思考你还可以包含哪些其他文件。由于你基本上可以包含系统上的任意路径,这可能会被用于数据泄露——前提是你能说服别人编译你的代码。

有许多网页提供在线服务,你可以在其中输入C代码并运行它。很明显,如果运行的代码没有以某种方式沙箱化,这样的系统是不安全的。但是,编译器是否也需要沙箱化,这一点是否同样明显呢?

你会如何攻击这样的系统?直接通过代码泄露数据相对困难,因为你需要包含最终成为有效C代码的数据。也许有技巧可以让像/etc/shadow这样的文件成为有效的C代码(你可以在include之前和之后添加代码),但我没有找到。但也不需要这样做:编译器给出的错误消息就是你所需要的。我测试的所有在线工具都会在代码编译失败时显示错误信息。

我甚至发现有一个服务允许我添加:

1
#include </etc/shadow>

并显示了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
2
3
4
5
6
7
$ cat t.c
#include </etc/shadow>
$ gcc t.c
t.c:1:10: fatal error: /etc/shadow: Permission denied
 #include </etc/shadow>
          ^~~~~~~~~~~~~
compilation terminated.

#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

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计