为什么允许修改 argv[0]



我一直在做一个使用 PID、/proc和命令行分析来验证系统上的进程的项目。我的代码必须由安全人员检查,他们设法用一行就破解了它......糗!

#!/usr/bin/env perl
$0="I am running wild"; # I had no clue you can do this!
system("cat /proc/$$/cmdline");
print("n");
system("ps -ef | grep $$");
# do bad stuff here...

我的问题:

    我看到了
  1. 上述的一些用例,例如隐藏命令行上给出的密码(也是不好的做法),但是当可以隐藏进程和欺骗cmdline时,我看到了更多的问题/问题。有理由允许吗?这不是系统漏洞吗?

  2. 如何预防或检测这种情况?我已经研究了/proc安装选项。我也知道可以使用lsof根据意外行为识别欺骗过程,但这在我的情况下不起作用。目前,我正在使用一种简单的方法来检测cmdline是否包含至少一个空()字符,该字符假定至少存在一个参数。在上面的代码中,空格需要替换为空值以绕过该检查,这是我找不到如何在 Perl 中实现的内容 - 写入第一个

要回答 1:

这是因为启动一个新过程的实际工作方式。

fork()生成当前进程的重复实例,然后exec()启动新事物 - 它用"新"进程替换当前进程,因此 - 它必须重写$0

这在运行并行代码时实际上非常有用 - 我在fork()代码时相当频繁地这样做,因为它可以很容易地发现哪个"东西"卡住/运行过热。

例如:

use Parallel::ForkManager;
my $manager = Parallel::ForkManager -> new ( 10 ); 
foreach my $server ( @list_of_servers ) {
    $manager -> start and next;
    $0 = "$0 child: ($server)";
    #do stuff;
    $manager -> finish;
}

您可以立即在ps列表中看到正在发生的事情。您会在许多多处理服务(如 httpd )中看到这种行为。

但它不是一个漏洞,除非你认为它不是(就像你一样)。无论如何,无非是能够"mv"二进制文件。

无论如何,要回答2......预防或检测什么?我的意思是,您无法从命令行判断进程正在做什么,但无论如何您都无法判断它在做什么(有很多方法可以让一段代码在幕后做一些"奇怪"的事情)。

答案是 - 信任您的安全模型。不要在特权上下文中运行不受信任的代码,他们怎么称呼它在很大程度上是无关紧要的。当然,你可以在进程列表中写粗鲁的消息,但很明显是谁在做这件事。

相关内容

  • 没有找到相关文章

最新更新