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

Why is it allowed to modify argv[0]?

我一直在从事一个项目,该项目使用 PID、/proc 和命令行分析来验证系统上的进程。我的代码必须由设法用一行代码破解的安全人员检查...令人尴尬!

#!/usr/bin/env perl

[=10=]="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. 我看到了上面的一些用例,比如隐藏命令行上给出的密码(也是不好的做法)但我看到更多 problems/issues 当一个人可以隐藏进程和欺骗cmdline。有理由允许吗?不会是系统漏洞吧?

  2. 我该如何预防或发现这种情况?我研究了 /proc 挂载选项。我也知道可以使用 lsof 来识别基于意外行为的欺骗进程,但这对我来说行不通。目前,我正在使用一种简单的方法来检测 cmdline 是否包含至少一个空 ([=16=]) 字符,该字符假设至少存在一个参数。在上面的代码中,需要用空值替换空格以绕过该检查,这是我在 Perl 中找不到如何实现的东西 - 写到第一个 [=16=].

回答1:

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

fork() 生成当前进程的重复实例,然后您 exec() 开始新的东西 - 它取代您的 当前 进程使用 'new' 过程,结果 - 必须 重写 [=13=]

虽然在 运行 并行代码时这实际上非常有用 - 我在 fork() 并行代码时经常这样做,因为它可以很容易地发现 'thing' 正在获取stuck/running 热。

例如:

use Parallel::ForkManager;
my $manager = Parallel::ForkManager -> new ( 10 ); 

foreach my $server ( @list_of_servers ) {
    $manager -> start and next;
    [=10=] = "[=10=] child: ($server)";
    #do stuff;
    $manager -> finish;
}

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

但这不是漏洞,除非您假设它不是(像您所做的那样)。只不过是能够 'mv' 一个二进制文件而已。

无论如何,回答 2...防止或检测什么?我的意思是,你无法从命令行知道一个进程在做什么,但无论如何你也无法知道它在做什么(有很多方法可以让一段代码在幕后做一些事情 'odd' ).

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