c - 缓冲区溢出导致终端将额外的字符作为 shell 命令执行

标签 c security io limit buffer-overflow

我开始面临缓冲区溢出风险,尤其是在涉及低级 C 库输入/输出函数时,并试图了解它与内存利用之间的关系 em> 和代码注入(inject)

我正在考虑以下代码块及其执行给出的奇怪行为:

int main ()
{
     char buffer[10];

     int r = read (STDIN_FILENO, buffer, 14);
     puts(buffer);

     return EXIT_SUCCESS;
}

现在当给出以下 17 尺寸的输入

Hello, World !pwd

我得到以下输出:

Hello, Wor
> pwd
/media/...<current working directory path>

如输出所示,3 个额外字符(此处故意 pwd 用于演示目的) - 超出了 read 的指定限制范围。 function - 被终端接管并作为 shell 命令执行。

低级的角度来看,是什么导致了这种行为?
可以用来执行代码注入(inject)吗?

最佳答案

As shown by the output, the 3 extra characters (here intentionally pwd for demonstration purposes) - that were out of bounds for the specified limit of the read function - got taken over by the terminal and executed as a shell command.

How is that possible, from a low-level perspective ?

正如 @ChrisTurner 在评论中首先观察到的那样,在程序退出后,pwd 被解释为启动程序的 shell 的输入,这并不奇怪。尽管每个程序都有自己的句柄,但它们正在读取同一个文件,可能连接到终端。

不过,您的程序通过使用低级 I/O 函数 read 来提供帮助,该函数不会消耗该文件中比您请求的更多的字节。对比基于流的函数,例如 freadfgetsscanf,它们最常执行缓冲读取(这是它们所操作的流的特征,而不是函数本身)。在您的特定情况下,其中任何一个都会消耗所有输入,直到并包括第一个换行符。

您的程序中确实存在潜在的缓冲区溢出问题,但这是一个转移注意力的问题。您描述的行为确实取决于 read 读取所请求的完整 14 个字节,它不能保证这样做,但出于所有意图和目的,您可以在连接标准输入时依赖它来执行此操作到终端。这样做后,您的程序确实会表现出未定义的行为,但该 UB 的表现可能会受到程序输出的限制(注意它是如何被截断的?),甚至对您来说是不可见的。它不负责“pwd”被父 shell 读取为输入。

What about non-console program execution, like GUI apps, web apps, and so on ... How would they behave in this case ? And most importantly, what security issues does this situation raise, in terms of binary exploitation and code injection, and maybe other security aspects that I'm not aware of ?

只有能够直接访问该程序的父 shell(如果有)或该 shell 的控制终端的个人或程序才能向其提供输入。你还没有证明其他情况。没有特别的安全考虑需要讨论。

关于c - 缓冲区溢出导致终端将额外的字符作为 shell 命令执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51246989/

相关文章:

c - Windows 在释放内存时触发了断点

c++ - 如何创建一个空的全局类并在启动时实例化它?

security - tomcat 7 基于表单的身份验证

iphone - 将 SecKeyRef 设备生成的公钥/私钥对保存在磁盘上

process - 重定向从 Rust 生成的子进程的输出

c - 读取内部具有不同字节长度值的二进制文件

c++ - 读取文本文件中的多行并写入另一个文本文件

c - 需要帮助创建可变长度数组

android - Android 中支持的 OpenSL ES 功能

c++ - 安全登录逻辑