2017-06-02 28 views
0

考慮以下,使用bash 4.4在Linux內核3.19觀察:拒絕「權限」,在一個非特權子進程從過程替代FIFO讀

# in reality, this may access files "nobody" isn't allowed 
get_a_secret() { printf '%s\n' "This is a secret"; } 

# attach a process substitution reading the secret to FD 10 
exec 10< <(get_a_secret) 

# run a less-privileged program that needs the secret, passing it the file descriptor. 
chpst -u nobody:nobody -- cat /dev/fd/10 

...或短/簡單:

chpst -u nobody:nobody -- cat <(get_a_secret) 

無論失敗的方式類似於下面:

cat: /proc/self/fd/10: Permission denied 

因此,兩個分支到這樣一個問題:

  • 這是怎麼回事嗎?

  • 有沒有一種方法來獲得所需的行爲(將祕密讀取到被調用的單個子進程的方式不會持久地將該祕密暴露給以「nobody」運行的其他進程)而不會將FIFO的輸出暴露給其他進程?

(是的,我很清楚地知道,我需要鎖定的ptrace和/proc/*/mem防止拉祕密說出去,因爲它是被讀取的客戶端的另一個進程中運行的「無人」這一說, (1)我可以做的事情;(2)當進程只在調用任何潛在攻擊者控制的可執行文件之前運行時,暴露程度低於允許任何運行的進程作爲nobody在整個持續時間內將密鑰從/proc/*/environ中拉出該過程)。

回答

1

以下解決方法避免了這個問題:

exec 10< <(get_a_secret) 
chpst -u nobody:nobody -- sh -c 'cat <&10' 

注意重定向被寫成<&10 - </dev/fd/10</proc/self/fd/10(上提供/dev/fd平臺 - 的平臺上沒有這個設施,慶典重寫它變成一個fdup2()呼叫)。


與行爲的解釋的回答(也許是一個解決方法,使程序,接受FD號碼輸入到行動上讀出側?)會在一個位置,凌駕這個。 :)