2013-12-14 109 views
2

由於許可證問題,很少有庫不能靜態鏈接。如何防止LD_PRELOAD或ld.so.preload配置?

那麼是否可以通過LD_PRELOAD環境變量或通過/etc/ld.so.preload配置來防止/檢測預加載的庫?

以前可以通過getenv()檢測到。但我不知道其他方法。

我認爲可能有一個通用的方法來做到這一點,是嗎?

回答

9

是否可以通過LD_PRELOAD環境變量或通過/etc/ld.so.preload配置來防止/檢測預加載的庫?

您似乎試圖實施某種反黑客保護。如果是這樣,那麼研究現有的防裂技術是值得的。 This book描述了一些。

請注意,除了LD_PRELOAD/etc/ld.so.preload之外,還有許多其他技術將「外部」代碼注入到您的應用程序中。立即想到的一對是:LD_AUDIT,在調試器下運行,並且重命名/替換libc.so

你幾乎沒有希望阻止一箇中等複雜的攻擊者。在Linux上,我可以構建我自己的libc.so.6,並且我可以將LD_PRELOAD重命名爲其他內容。我也可以構建自己的內核,並讓它自動將myhack.so注入到您的進程中,而沒有任何用戶空間可見的效果。或者,我可以簡單地讓系統調用在應用程序執行時執行其他操作。

...的LD_PRELOAD ......可以通過getenv()

進行檢測,將停止只有至少熟練的攻擊者,原因有二:

  • 預裝的庫本身可能干預getenv(),並且可以從您的應用程序中隱藏LD_PRELOAD,而
  • LD_PRELOAD僅在進程啓動時很重要。處理過程開始後,預先加載的庫可以在應用程序有機會檢查它之前,輕鬆地從環境中刪除LD_PRELOAD