2013-06-22 26 views
1

我正在尋找一種方法來模擬python的chroot類型行爲。根據文檔,os.chroot僅適用於Unix。我也需要它用於Windows。我試圖實現它的一種方法是定義根路徑和方法abs_path,它將相對於根的給定路徑進行轉換。刪除一些不相關的代碼後,這裏是abs_path的片段。 self.wd.get()獲取當前工作目錄。Python chroot類型行爲跨平臺

def abs_path(self, rel_path): 
     """ 
     Converts relative path to absolute path 
     Taking care of the virtual root 
     """ 
     if rel_path == '': 
      return os.path.abspath(os.path.join(self.root, self.wd.get())) 
     if rel_path[0] == '/': 
      ret = os.path.join(self.root, rel_path) 
     else: 
      ret = os.path.join(self.root, self.wd.get(), rel_path) 

     ret = os.path.abspath(ret) 
     if ret.find(self.root) == 0: 
      return ret 
     return self.root 

這似乎在Linux下工作得很好,我相信它也可以在Windows下正常工作。我擔心的主要問題是if ret.find(self.root) == 0:,我正在使用它來檢查ret的計算結果高於根的路徑。例如。如果root=/home/user/,則rel_path=/abc/../../應評估爲絕對路徑/home/user/。什麼應該是更好的實現方式?

回答

0

問題是,unix中的chroot()正在進程級別執行此操作,每個分叉進程都無法轉義。你的方法隱藏了其他方法,但是如果開發人員利用你的代碼來執行惡意代碼並且可以訪問你的整個文件系統。

在谷歌帶領一個小的搜索到這些問題的答案:

還有,做這幾個應用程序:

你可以做到這一點使用Windows API as suggested by this SO answer

最後,您可以自行創建抽象,在chix環境中使用chroot在UNIX系統上運行子進程,在Windows上使用runas!所有這一切,無需創建一個路徑致勝者,但具有更好的安全性。

+1

...作爲補充,不會高估'chroot'。是[不是一個真正的安全功能](http://securityblog.redhat.com/2013/03/27/is-chroot-a-security-feature/)。 –

+0

的確,我只能支持併爲您的評論投票。 OP詢問了一個可移植的「類似chroot」的功能,並且我向他建議了一種對此進行抽象的方法。他的解決方案比使用真正的「chroot」要安全得多,而且使用真正的chroot比使用虛擬化環境要安全得多(還有更多的安全功能可以用來保護他的系統)。 – zmo