2016-03-04 201 views
2

我一直致力於使用PID,/proc和命令行分析來驗證系統上的進程的項目。我的代碼必須由安全人員檢查,他們設法用一條線來破壞它......令人尷尬!爲什麼允許修改argv [0]?

#!/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是否至少包含一個假定存在至少一個參數的空字符(\0)。在上面的代碼中,需要用空值來替換空格以繞過該檢查,這是我無法在perl中實現的東西 - 寫入到第一個\0

感謝

+0

預防或檢測什麼?當進程重新命名?爲了什麼目的? – Sobrique

回答

5

要回答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 ...防止或檢測什麼?我的意思是,你不能告訴一個進程的命令行做,但你不能告訴它反正這樣做,否則(有很多的方式,使一段代碼做一些「奇怪」的幕後)。

答案是 - 相信你的安全模型。不要在特權上下文中運行不受信任的代碼,而且它們在很大程度上與他們稱之爲無關。當然,你可以在流程列表中寫出粗魯的信息,但是很明顯誰在做。

+0

嗨Sobrique。我看到你在說什麼,我承認我正在使用'cmdline',可能是我不應該看到的東西(參見[this]](http://stackoverflow.com/questions/34380618/password-management-for-non-互動過程))。我也看到它在並行處理中的有用性。我的第二個問題是更多關於是否可以檢測到cmdline已被修改爲第一個/原始值以外的內容 – urban

+0

但這就是每個過程。系統中每個進程的「父」最終都是'init'。其他的一切都從那裏做了一個fork和exec - 並且在這個過程中,改變了它的名字。文件不知道他們自己的名字,名字就是目錄結構如何找到一個特定的inode。因此,流程不知道自己的名字,除了將$ 0設置爲合適的值。 – Sobrique

+0

我明白了......有道理......我擔心情況會如此 - 我承認你的答案,因爲你涵蓋了這兩個問題。您提供的技術信息也非常感謝 - 爲此歡呼:) – urban