c - 系统安全性如何(("/bin/ls");

标签 c linux security

我知道,如果您覆盖 PATH 变量,您可以进行诸如 system("ls"); 之类的调用,做任何您想做的事情。

但是,当用户没有 /bin/ls 的写入权限时,如何绕过对 system("/bin/ls"); 的调用呢?

请不要告诉我这与操作系统不兼容,我知道,这不是问题的重点。

谢谢!

最佳答案

这会导致类似的情况:

execve("/bin/sh", ["sh", "-c", "/bin/ls"], [/* 66 vars */]) = 0

所以并没有给太多的回旋余地,虽然我们可以创建一个 function /bin/ls { ... } ,对于上面的调用来说,当 sh 时实际上是bash bash不读取.rc文件,也不调用该函数。

$ /bin/ls
hello world
$ type -a /bin/ls
/bin/ls is a function
/bin/ls () 
{ 
    echo hello world
}
/bin/ls is /bin/ls
$ cat dols.c
#include <stdlib.h>
int main(void)
{
    system("/bin/ls");
    return 0;
}
$ ./dols
dols  dols.c  trace.9594  trace.9595
$ 

除了环境黑客(例如通过 ls 变量使 LD_ 与其他库链接)或 shell shock 类漏洞(例如 sh 本身的错误)之外,这可能没问题。 (如果不了解这些问题的人将代码编辑为不安全的 shell 命令,那就不行了……)

关于c - 系统安全性如何(("/bin/ls");,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32542350/

相关文章:

c - 我正在尝试为井字游戏编写代码

c - 当使用 char my_string[] = "some string"语法时,常量内存段中的字符串是否被删除或复制到堆栈?

c - C11 中多参数 C 函数的泛型

Linux 管道和重定向输出

安卓 : All app can access my password in AccountManager

c - 一些额外的字符被添加到传递给函数的参数中

c - 复制文件时删除了笔式驱动器

linux - 如何在 Linux 中查看巨大的文本文件?

javascript - 我可以在其他人的域上托管文件或文件夹吗?

asp.net - ASP.NET 兼容模式下的 WCF 服务 - 传递用户名/密码的最简单方法是什么