2012-12-19 11 views
10

Mam program, który przechowuje w pamięci informacje ważne dla bezpieczeństwa (takie jak klucze prywatne), ponieważ używa ich w całym okresie istnienia programu. Wersje produkcyjne tego programu ustawiają wartość RLIMIT_CORE na 0, aby upewnić się, że zrzut główny, który może zawierać te poufne informacje, nigdy nie zostanie utworzony.Jak mogę się upewnić, że mój program linuksowy nie generuje zrzutów głównych?

Jednakże, podczas gdy nie jest to wspomniane w core(8) manpage, że apport documentation on the Ubuntu wiki roszczenia,

Należy pamiętać, że nawet jeśli ulimit jest ustawiony niepełnosprawnych plików bazowych (przez specyfing się rdzenia rozmiar pliku zera stosując ulimit -c 0), apport będzie nadal przechwytywał awarię .

Czy jest jakiś sposób w moim procesie (tj. Bez polegania na konfiguracji zewnętrznego systemu), że mogę zagwarantować, że podstawowy zrzut mojego procesu nigdy nie zostanie wygenerowany?

Uwaga: zdaję sobie sprawę, że istnieje wiele metod (takich jak te wymienione w komentarzach poniżej), w których użytkownik z uprawnieniami właściciela root lub procesu mógł nadal uzyskiwać dostęp do poufnych danych. Celem tego jest zapobieganie niezamierzonemu udostępnianiu wrażliwych danych poprzez zapisywanie ich na dysku, wysyłanie do systemu śledzenia błędów Ubuntu lub podobne rzeczy. (Podziękowania dla Basile Starynkevitch za wyraźne przedstawienie).

+0

Zauważ, że określony użytkownik może załatać własne jądro z uruchomioną aplikacją, aby nadal otrzymywać podstawowe zrzuty. –

+0

A pamięć procesu jest również dostępna przez '/ proc /' –

Odpowiedz

1

Zgodnie z the POSIX spec zrzuty pamięci występują tylko w odpowiedzi na sygnały, których działanie jest działaniem domyślnym, a których domyślnym działaniem jest "nieprawidłowe zakończenie procesu z dodatkowymi akcjami".

Tak więc, jeśli przewiniesz do listy w the description of signal.h, wszystko z "A" w kolumnie "Domyślna akcja" jest sygnałem, o który musisz się martwić. Użyj sigaction, aby złapać wszystkie z nich i po prostu zadzwoń pod exit (lub _exit) do obsługi sygnału.

Wierzę, że są to jedyne sposoby, w jakie POSIX umożliwia generowanie zrzutu pamięci. Niewykluczone, że Linux może mieć inne "tylne drzwi" do tego celu; niestety nie jestem wystarczającym ekspertem od jądra, aby się upewnić ...

+0

Dobra myśl. Jednak bardzo trudno jest mi upewnić się, że właściwie go wdrożyłeś i że będzie działać we wszystkich sytuacjach. Dwa potencjalne błędy, które mogę wymyślić z ręki: 1) Zapomniałem lub błędnie przeczytałem twoją dokumentację specyficzną dla systemu i straciłem sygnał, i 2) złapałem coś takiego jak SIGSEGV, ale mój (oczywiście zepsuty) program ustawił się w stanie, w którym nie można poprawnie zakończyć, a mimo to generowany jest zrzut rdzenia. –

+0

Poprawka dla 1. jest następująca: http://ftp.gnu.org/gnu/coreutils/ <- Pobierz najnowszą wersję, rozpakuj ją i spójrz na źródło kill.c. Ma funkcję o nazwie list_signals, która w zasadzie wyliczy wszystkie dostępne sygnały w sposób zgodny ze standardem (jeśli się nie mylę). Do 2. Sugeruję, że jeśli podniesiony zostanie sygnał o takiej surowości, który wskazywałby na zły stan, wystarczy po prostu wyjść tam i nie próbując w ogóle dojść do siebie. –

Powiązane problemy