2012-03-19 29 views
9

在嵌入式系統(2.4內核)中,我需要原始套接字從進程而不是以root用戶身份訪問eth0接口。作爲Linux上的普通用戶的原始套接字訪問2.4

我試圖通過在命令行中設置CAP_NET_RAW功能並使用cap_set_proc()編程方式解決此問題,但兩者均未成功。看來,我沒有這樣的權限,在程序中我得到一個EPERM錯誤,命令行

無法設置上限的工藝'1586' 上:(不允許的操作)

有沒有更簡單的方法來做我想要的?如果沒有,成功設置CAP_NET_RAW功能需要執行哪些步驟?

編輯:我有根訪問權限,但永久運行該進程作爲根目錄是沒有選擇。 libcap的版本是1.10,沒有'setcap'二進制文件,但是'setpcaps'。

編輯 - 喬治回答Skoptsov:

如果我得到你的權利,你的建議是使用setuid啓動一個進程,然後設置CAP_NET_RAW能力,然後刪除權限。我用下面的代碼嘗試了這個,但它似乎不起作用,即使caps命令不返回錯誤。隨着seteuid()註釋,原始訪問的作品,但只有因爲該過程以root身份運行:

cap_t caps = cap_get_proc(); 
cap_value_t cap_list[1]; 
cap_list[0] = CAP_NET_RAW; 
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1) 
{ 
    printf("cap_set_flag error"); 
} 
if (cap_set_proc(caps) == -1) 
{ 
    printf("cap_set_proc error"); 
} 

if (seteuid(getuid()) != 0) 
{ 
    printf("seteuid error"); 
} 

function_that_needs_raw_access(); 

感謝您的幫助。 Chris

+0

如果你按照我的建議下面,你的過程將不會運行但是在啓動時將擁有root權限,這將允許它設置所需的功能。 – 2012-03-20 15:24:57

+0

感謝您的建議喬治,但是,我沒有成功......看到我的編輯。 – Chris 2012-03-21 07:37:09

+0

Chris,在'function_that_needs_raw_access()'中顯式需要時你可以非常小心地提升權限? – 2012-03-23 12:27:40

回答

6

通常,您需要需要 root權限才能接收接口上的原始數據包。此限制是安全防範措施,因爲接收原始數據包的進程可以訪問使用該接口的所有其他進程和用戶的通信。

但是,如果你有機會到根的機器上,你可以使用setuid標誌,讓您的過程root權限即使方法作爲非root用戶執行。

首先,確保在以root身份運行進程時成功設置此功能。然後使用

sudo chown root process 
sudo chmod ugo+s process 

將根設置爲進程的所有者並設置setuid標誌。然後檢查該進程是否由其他用戶運行時設置的功能。由於此過程現在將具有全部超級用戶權限,因此您應遵守安全防範措施,並在代碼不再需要時立即刪除權限(啓用CAP_NET_RAW後)。

您可以按照this method確保您正確放下它們。

+0

我不知道如何啓用CAP_NET_RAW。沒有setcap命令。當使用setuid標誌運行進程時一切正常,但我不想以超級用戶身份運行進程... – Chris 2012-03-20 15:24:43

+0

您不是以超級用戶身份運行進程。您可以在完成設置功能後立即放棄這些權限,這些權限在root下運行。 – 2012-03-20 15:28:15

+0

我原來的問題並沒有真正解決,但我接受這個答案,因爲喬治試圖幫助我,這是「最接近」的解決方案。 – Chris 2012-04-05 11:54:35

3

該進程必須以超級用戶身份運行,或者對可執行文件具有CAP_NET_RAW功能。

爲了設置CAP_NET_RAW,您需要以root身份運行setcap命令。一旦設置,您就可以作爲另一個用戶運行可執行文件,並且可以訪問原始數據包捕獲。

如果您無論如何都不具有root用戶訪問權限,也無法讓任何擁有root權限的用戶在可執行文件上設置CAP_NET_RAW或setuid root,您將無法以非root用戶的身份執行數據包捕獲。

+0

沒有setcap命令,只有setpcaps。我試圖以root身份運行setpcaps來設置正在運行的進程的大寫,但這不起作用(請參閱原始文章中的錯誤消息)。 – Chris 2012-03-20 15:09:07

1

您可以爲可執行程序提供使用CAP_NET_RAW權限而無需授予其他root權限的功能。

$ setcap cap_net_raw=pe *program* 

如果您沒有此權限,您不能授予此權限。當然,root可以賦予程序這種特權。

+0

Linux下'2.6.24'沒有文件功能。這就是問題所在。 – 2016-11-05 17:26:07

0

TL; DR恕我直言內核不支持< 3.0。

有關於在內核netdev郵件列表中支持它的討論: https://lwn.net/Articles/420800/https://lwn.net/Articles/420801/

並已將其列入提交 c319b4d76b9e583a5d88d6bf190e079c4e43213d,在內核3.0發佈:

commit c319b4d76b9e583a5d88d6bf190e079c4e43213d 
Author: Vasiliy Kulikov <[email protected]> 
Date: Fri May 13 10:01:00 2011 +0000 

    net: ipv4: add IPPROTO_ICMP socket kind 

Follows: v2.6.39-rc2 
Precedes: v3.0-rc1 

沒有CAP_NET_RAW運行ping(即不設置能力或沒有設定UID)是爲平在修訂實施87dbb3a5db657d5eae6934707beaf0507980a1c3 ,發佈在iputils s20150815:

commit 87dbb3a5db657d5eae6934707beaf0507980a1c3 
Author: Nikos Mavrogiannopoulos <[email protected]> 
Date: Fri May 29 11:01:00 2015 +0200 

    This patch allows running ping and ping6 without root privileges on 
    kernels that support it. Almost identical to Lorenzo 
    Colitti's original patch except: 
    ... 

Follows: s20140519 
Precedes: s20150815