为什么允许修改argv ?

我一直在使用PID, /proc和命令行分析来validation系统上的进程。 我的代码必须由安全人员检查,谁设法打破一条线…尴尬!

 #!/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是否至less包含一个假定至less存在一个参数的null( \0 )字符。 在上面的代码中,需要用空值replace空格来绕过检查,这是我无法find如何在perl中实现 – 写入到第一个\0

谢谢

回答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这样的多处理服务的行为。

但是这不是一个漏洞,除非你认为它不是(像你一样)。 无论如何,无论如何,无论如何都能够“开启”二进制。

无论如何,要回答2 …防止或检测什么? 我的意思是,你不能说出一个进程在命令行上做了什么,但是无论如何你不能说出它在做什么(有很多方法可以让一段代码在后台做一些奇怪的事情)。

答案是 – 相信你的安全模型。 不要在特权上下文中运行不受信任的代码,这与他们所说的基本无关。 当然,你可以在流程列表中写出粗鲁的信息,但是谁在做这件事显而易见。