Tworzę interfejs API, który przyjmuje dowolne polecenie (w bash) i wykonuje je w katalogu głównym. Chcę się upewnić, że to polecenie to RO i nic nie pisze. Wszelkie pomysły, jak to zrobić? Może można go tymczasowo wyłączyć za pomocą timera?
Tworzę interfejs API, który przyjmuje dowolne polecenie (w bash) i wykonuje je w katalogu głównym. Chcę się upewnić, że to polecenie to RO i nic nie pisze. Wszelkie pomysły, jak to zrobić? Może można go tymczasowo wyłączyć za pomocą timera?
Odpowiedzi:
Nie sądzę, że to jest możliwe. Możesz upewnić się, że cokolwiek napisane stdout
lub stderr
na przykład zostanie przekierowane /dev/null
. Jeśli jednak narzędzie chce zapisać do pliku, nie ma możliwości, aby temu zapobiec lub nawet o tym wiedzieć.
Standardową praktyką bezpieczeństwa jest nigdy nie uruchamiać niezaufanych programów z uprawnieniami roota.
Nie sądzę, że istnieje sposób, aby w ogólnym przypadku upewnić się, że przypadkowy program nic nie napisze. Patrzysz na coś podobnego do rozwiązania problemu zatrzymania , z niespodzianką (stdout i stderr są również widoczne jako uchwyty pilników).
Możesz jednak utworzyć małą bibliotekę, która zastąpi odpowiednią garść standardowych wywołań biblioteki, takich jak creat (2), open (2), write (2) i kilka innych, aby nie utrzymywać niczego na dysku. Prawdopodobnie byłoby to coś podobnego do libfaketime i powinno być rozsądnie wykonalne. Byłby przenośny dla dowolnej aplikacji za pośrednictwem mechanizmu wstępnego ładowania biblioteki LD_PRELOAD dynamicznego modułu ładującego.
Jednak prawie na pewno nie byłoby to pełne rozwiązanie. Zwłaszcza proces działający jako root może dość łatwo zastąpić to wszystko, jeśli wie, że się tego spodziewa i chce czynić zło. Z jednej strony zależy to od takich wywołań przechodzących przez wspólne interfejsy, takie jak biblioteka C, co nie jest gwarantowane; proces może równie łatwo skopiować kod biblioteki C bezpośrednio do własnego kodu. Może wykonywać bezpośrednie połączenia z interfejsami systemowymi jądra. Biblioteka C nie jest jakąś magiczną rzeczą; to kod przestrzeni użytkownika jak każdy inny. Plik binarny może być statycznie powiązany, w którym to przypadku dynamiczny moduł ładujący nie zostanie w ogóle wywołany. Prawdopodobnie można obejść te ograniczenia i zapobiec zapisywaniu, ale ...
Bardzo prawdopodobne jest również, że zrobienie pisma (2) i zaprzyjaźnienie się z innymi osobami zepsuje na innym końcu, gdy proces oczekuje, że plik, w którym zapisał się, przechowa dane, które zostały zapisane.
A co, jeśli tak naprawdę nic nie pisze, ale po prostu czyta kilka krytycznych dla bezpieczeństwa plików konfiguracyjnych (/ etc / crypttab, / etc / shadow, /etc/bind/rndc.key, ... masz pomysł) i przekazuje te dane gdzie indziej; może przez sieć, czy zrzuca ją, aby stała się dostępna poprzez atak boczny?
Poszedłem o krok dalej niż savanto . Standardową praktyką bezpieczeństwa nie powinno być uruchamianie niezaufanego oprogramowania, kropka. I zdecydowanie nie powinieneś uruchamiać niezaufanego oprogramowania jako root. W przypadku wszystkiego, co działa jako root, możesz zablokować kilka przeszkód, ale nie możesz zagwarantować, że nie zrobi nic, co zechce. SELinux może pomóc i prawdopodobnie jest dość długi, gdy jest właściwie używany, ale jest bestią do skonfigurowania i prawdopodobnie spowoduje, że wszelkie naruszenia zasad doprowadzą do niepowodzenia połączenia z błędem i prawdopodobnie trudnym procesem, więc wygrał w ogóle nie będziesz wdzięczny.
Myślę, że najbardziej zbliżona do tego, co chcesz zrobić, co będzie działać w ogólnym przypadku, byłaby izolowana maszyna wirtualna z możliwością wycofywania modyfikacji wprowadzonych na dysku (zwykle nazywana funkcją przywracania migawek) . Będzie to jednak dalekie od bezproblemowego i będzie wiązało się z dużymi kosztami, ponieważ dla wszystkich celów i celów korzystasz z drugiej instancji systemu operacyjnego, z tym wszystkim, co to oznacza.