为什么允许修改argv [0]?

时间:2016-03-04 08:49:51

标签: linux perl proc spoof cmdline-args

我一直在研究一个使用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是否包含至少一个空(\0)字符,该字符假定至少存在一个参数。在上面的代码中,空格需要用空值替换以绕过该检查,这是我无法在perl中找到的方法 - 写入第一个\0

  3. 由于

1 个答案:

答案 0 :(得分:5)

回答1:

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

fork()生成当前流程的重复实例,然后exec()启动新功能 - 它将当前流程替换为'new'进程,结果 - 重写$0

这实际上非常有用,虽然在运行并行代码时 - 我在fork()代码时经常这样做,因为它可以很容易地发现哪个“东西”卡住/运行热。

E.g:

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 ...预防或发现什么?我的意思是,你无法从命令行判断一个进程正在做什么,但无论如何你无法分辨它正在做什么(有很多方法可以让一段代码在幕后做一些'奇怪的')。

答案是 - 相信您的安全模型。不要在特权上下文中运行不受信任的代码,这与他们所谓的内容大不相干。当然,你可以在进程列表中写出粗鲁的消息,但很明显是谁在做这件事。