2012-12-19 38 views
10

我有一個程序可以將安全敏感的信息(如私鑰)保存在內存中,因爲它在程序的整個生命週期中都使用它們。該程序的生產版本將RLIMIT_CORE設置爲0,以確保永遠不會生成可能包含此敏感信息的核心轉儲。如何確保我的Linux程序不會產生核心轉儲?

然而,雖然這不是在core(8)手冊頁提到的,apport documentation on the Ubuntu wiki索賠,

請注意,即使ulimit設置爲禁用核心文件(通過使用的ulimit specyfing零 核心文件大小-c 0),apport仍然會捕獲 這次事故。

在我的過程中(即,不依賴於系統外部配置),我可以確保永遠不會生成我的進程的核心轉儲嗎?

注意:我知道有很多方法(如下面的評論中提到的那些方法),具有根或進程所有者權限的用戶仍然可以訪問敏感數據。我在這裏瞄準的是通過將敏感數據保存到磁盤,發送到Ubuntu bug跟蹤系統或類似的東西來防止敏感數據的無意暴露。 (感謝Basile Starynkevitch作出明確說明。)

+0

請注意,一個確定的用戶可以修補他自己的內核來運行你的應用程序,仍然可以獲得核心轉儲。 –

+0

和進程內存也可以通過'/ proc /' –

回答

1

根據the POSIX spec,核心轉儲僅響應於其操作是缺省操作並且其默認操作是「用其他操作異常終止進程」的信號發生。

因此,如果您向下滾動至the description of signal.h的列表,則「默認操作」列中帶有「A」的所有內容都是您需要擔心的信號。使用sigaction來捕獲所有這些信號,並在信號處理程序中調用exit(或_exit)。

我相信這些是POSIX讓你生成核心轉儲的唯一方法。可以想象,Linux可能有其他「後門」用於此目的;不幸的是,我不能滿足內核專家的要求......

+0

一個好主意。然而,這讓我很難確保您已經正確實施它,並且它在任何情況下都能正常工作。我可以想到的兩個潛在的錯誤:1)我忘記或誤讀了系統特定的文檔並錯過了一個信號,2)我找到了像SIGSEGV這樣的東西,但是我的(顯然已經破壞的)程序已經處於一種狀態無法正常退出,無論如何都會產生核心轉儲。 –

+0

1的修正是這樣的:http://ftp.gnu.org/gnu/coreutils/ < - 下載最新版本,解壓縮並查看kill.c源代碼。它有一個名爲list_signals的函數,它基本上將枚舉符合標準的所有可用信號(如果我沒有弄錯的話)。對於2.我建議,如果一個信號被提出的嚴重程度如此之高,以至於它會表明狀態不好,那麼只需從那裏退出,然後再不嘗試恢復。 –