2012-10-05 29 views

回答

1

「經典」的解決方案實現權限分離是這樣工作的:

  • 在程序啓動時的早期使用setuid-0
  • 安裝該程序(爲此儘早,優選「第一事程序的確「):
    • 用socketpair創建一個組插座()
    • 叉()你的進程
    • 有你的主要過程丟棄所有其使用setuid root的UID的(),並繼續像往常一樣
  • 你的孩子的過程將執行一個循環來處理從主流程

的結果將是你的主要過程有沒有特殊權限發送的指令,但是你有一個根特權的子進程,它通過這些套接字連接到你的主進程。這些套接字是「未命名」的,這意味着沒有其他程序可以訪問它們。

當然,你仍然有點容易受到攻擊。即使你的代碼在你到達fork()之前是「安全的」,攻擊者以後仍然可以進入你的主程序,並向特權進程發送命令。即使子進程擅長驗證其輸入並且不能被破壞,當攻擊者發出有效命令時仍然可能導致問題 - 就像你的情況一樣,攻擊者可能會創建新帳戶,甚至可能會創建新帳戶0.

+1

爲了避免安全問題,它不是一個更好的解決方案,用更少的權利而不是分叉來啓動進程(內存優勢並不那麼重要)嗎? – user1723056

相關問題