2010-02-18 49 views
4

在我開發的程序(Linux)中,我需要非常簡單的基於文本的IPC。爲此,使用標準的輸入/輸出管道將非常容易。我可以相信發送給進程stdin的消息不能被任何人讀取嗎?另外,我可以相信,如果我將管道保持在標準輸出狀態,只有我可以讀取它輸出的內容嗎?我只是想確保沒有基於procfs的技巧可以讀取這些技巧。stdio通信的安全

回答

0

在我自己的有限測試(運行uniq | sort然後試圖通過/proc/XXX/fd管道兩端),似乎我不能讀取什麼發送到管道,但我可以注入數據。

換句話說,做自己的測試,看看你能做什麼,不能做什麼。 :-)

+0

嗯......謝謝。能夠注入數據是不行的! :-)我想我只是用SO_PEERCRED使用本地套接字(不需要它是便攜的)。 – c4757p 2010-02-18 18:12:45

+1

我認爲這種注入要求您要麼以同一用戶身份運行,要麼以root身份運行?這似乎是不足以不信任stdin/stdout I/O的原因。 – 2010-02-18 18:43:04

1

據我所知,沒有「技巧」,其他用戶無法讀取標準輸入/標準輸出。請記住:

  • 其他進程以同一用戶身份運行,可以讀取進程的內存;這是因爲安全性可以保護您免受其他用戶的侵害。
  • 以超級用戶身份運行的進程可以執行所有操作。

這就是說,如果你正在處理敏感數據,看看mlock

1

有沒有技巧,我可以想到的唯一一個關於檢測標準輸出是否被重定向到其他地方的方法是在一個簡單的C函數中執行此操作,如isredirected所示,除此之外,您有責任確保消息保持安全...另一件事是,使用procfs欺騙需要root權限才能訪問某些procfs功能......所以請確保您在那裏放置一個支票以確保它不以root身份運行...

int isredirected(void){ 
if (!isatty(fileno(stdin))) return 1; 
return 0; 
} 

希望這會有所幫助, 最好的問候,湯姆。

+0

問題:'isatty'將返回管道錯誤,這是OP想要做的。 – 2010-02-18 17:22:20

+0

Cjy:當!好點子!!!!我在這一個想法...... ...) – t0mm13b 2010-02-18 17:27:46

1

老實說,我認爲這取決於您認爲您的應用程序需要多少安全。我在stdin上輸入我的GPG密鑰密碼。我總是問「什麼是可接受的風險?」。

也就是說,沒有任何東西可以保護您的應用程序免受內核空間中的rootkit攻擊。它不僅可以讀取std輸入/輸出終端,還可以讀取運行中的整個進程內存。並且可能會覆蓋您已有的一些保護措施。

您可能會考慮將SELinux沙盒與您正在做的事情結合使用 - 如果您確實需要這種保護級別,請在http://danwalsh.livejournal.com/處瞭解更多信息。 libselinux讓你連接它檢查保護存在等

+0

我不需要堡壘諾克斯 - 只是想確保沒有任何漏洞安全漏洞 – c4757p 2010-02-18 18:10:52