我一直在研究一个使用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...
我的问题:
我看到了上面的一些用例,比如隐藏在命令行中给出的密码(也是不好的做法)但是当我可以隐藏进程和欺骗cmdline
时,我会发现更多的问题/问题。它有被允许的原因吗?这不是系统漏洞吗?
如何预防或检测?我查看了/proc
挂载选项。我也知道可以使用lsof
根据意外行为识别欺骗过程,但这在我的情况下不起作用。目前我正在使用一种简单的方法来检测cmdline
是否包含至少一个空(\0
)字符,该字符假定至少存在一个参数。在上面的代码中,空格需要用空值替换以绕过该检查,这是我无法在perl中找到的方法 - 写入第一个\0
。
由于
答案 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 ...预防或发现什么?我的意思是,你无法从命令行判断一个进程正在做什么,但无论如何你无法分辨它正在做什么(有很多方法可以让一段代码在幕后做一些'奇怪的')。
答案是 - 相信您的安全模型。不要在特权上下文中运行不受信任的代码,这与他们所谓的内容大不相干。当然,你可以在进程列表中写出粗鲁的消息,但很明显是谁在做这件事。