2009-09-21 60 views
16

我正在開發可用於並行程序的運行時系統,可以利用跨多個進程的公共地址空間佈局,可能遍佈數千個節點。很多時候,爲這種環境構建的軟件在默認情況下啓用了地址空間隨機化的Linux系統上運行,用戶可能不希望或者不能在系統範圍內禁用它(通過sysctl -w kernel.randomize_va_space=0等)。這對並行程序施加了一些限制,並且可能會損害性能。因此,我們想弄清楚如何爲我們構建的二進制文件禁用它。安全性不是問題,因爲此軟件始終在受控環境中運行。如何在Linux上禁用二進制的地址空間隨機化?

我發現各種標誌和變量,像ET_EXECEF_AS_NO_RANDOM(顯然並沒有合併?)和PF_RANDOMIZE,但我不能找到描述我能做些什麼來設置這些標誌的任何文件的引用。一個理想的答案會告訴我什麼編譯器/彙編器/鏈接器標誌將禁用所產生的二進制文件的隨機化,以及這個工具鏈/內核的工作版本是什麼。接下來最好的工具是在二進制文件生成後執行相同的工作。

由於我確定有人會提出這個建議,我已經意識到我們可以在運行時用setarch -R進行此更改,但最好將它記錄在可執行文件中。

它看起來像paxctl -rx應該做的伎倆,但它似乎並不適用於內核中使用的當前方法,不包括PaX修補程序。

回答

14

大概你有某種在節點上調用你的並行程序的守護進程。如果是這樣,你可以使這個公共的父進程禁用它創建的任何子進程的ASLR。

尋找GDB資源(7.0或CVS主題)瞭解如何操作。它的要點是在fork之後和exec之前撥打personality(orig_personality|ADDR_NO_RANDOMIZE)

+0

我會調查並嘗試這個。 – Novelocrat

+0

似乎已經工作。謝謝! – Novelocrat

0

Linux內核preserved offsets when forking中至少有一些早期版本的ASLR。您可以簡單地將它們安排在父/子流程層次結構中,而不是爲您的流程禁用隨機化,而是將父層/子層流程層次結構安排在保持相同父層分叉的二進制實例之間偏移量相同的層次之下?

+1

不,我們不能,因爲這些進程在多個節點上運行。如果我們不必跳過這些環節手動同步地址空間,線程遷移就變得容易多了。 – Novelocrat