2

我一直在从事一个使用 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包含至少一个 null ( \0) 字符,该字符假定至少存在一个参数。在上面的代码中,需要用空值替换空格以绕过该检查,这是我在 Perl 中找不到如何实现的检查 - 直到第一个\0.

4

1 回答 1

6

回答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... 预防或检测什么?我的意思是,你不能从命令行知道一个进程在做什么,但无论如何你也不能知道它在做什么(有很多方法可以让一段代码在幕后做一些“奇怪”的事情)。

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

于 2016-03-04T09:31:17.240 回答