为什么允许修改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...
我的问题:
我看到了上面的一些用例,比如隐藏命令行上给出的密码(也是不好的做法)但我看到更多 problems/issues 当一个人可以隐藏进程和欺骗cmdline
。有理由允许吗?不会是系统漏洞吧?
我该如何预防或发现这种情况?我研究了 /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' ).
答案是 - 相信您的安全模型。不要在特权上下文中 运行 不受信任的代码,这在很大程度上与他们所说的无关。当然,您可以在进程列表中写粗鲁的消息,但很明显是谁在做。
我一直在从事一个项目,该项目使用 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...
我的问题:
我看到了上面的一些用例,比如隐藏命令行上给出的密码(也是不好的做法)但我看到更多 problems/issues 当一个人可以隐藏进程和欺骗
cmdline
。有理由允许吗?不会是系统漏洞吧?我该如何预防或发现这种情况?我研究了
/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' ).
答案是 - 相信您的安全模型。不要在特权上下文中 运行 不受信任的代码,这在很大程度上与他们所说的无关。当然,您可以在进程列表中写粗鲁的消息,但很明显是谁在做。