考慮以下,使用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
中拉出該過程)。