Czy są jakieś metody sprawdzenia, co faktycznie wykonujesz ze skryptu bash?
Powiedzieć skrypt bash dzwoni kilka poleceń (na przykład: tar
, mail
, scp
, mysqldump
) i są chętni, aby upewnić się, że tar
jest rzeczywista, prawdziwa tar
, która jest do ustalenia przez root
użytkownika będącego właścicielem pliku i katalog nadrzędny, a tylko jeden z uprawnieniami do zapisu a nie jakiś /tmp/surprise/tar
z www-data
lub apache2
będąc właścicielem.
Jasne, że wiem o PATH
i środowisku, jestem ciekawy, czy można to dodatkowo sprawdzić w działającym skrypcie bash, a jeśli tak, to w jaki sposób?
Przykład: (pseudo-kod)
tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...
bash
shell-script
shell
security
Miloš Đakonović
źródło
źródło
which
niepoprawnego powiedzenia, cotar
zrobi, na co odpowiedziała xhienne,ls
może zostać zhakowany w celu zwrócenia fałszywych informacji o plikach, jeśli takie istnieją.grep
Może również zostać zhakowany w celu zwrócenia fałszywych informacji; można tego uniknąć, używając zamiast tego dopasowywania powłok, ale następnie można włamać się do powłoki. A powłoka może zostać zhakowana, aby dać błędne wynikitype
- lub zastąpiona całkowicie, ponieważ wymienność powłoki była ważną innowacją Uniksa w porównaniu z 50-letnimi systemami operacyjnymi. Zobacz adres Turinga Kena Thompsona z 1984 r. Żółwie są na dole.TE
) - który ma bazę danych z podpisami (tj. Bardziej rozbudowaną niż suma kontrolna MD5. Gdy TE jest aktywny ORAZ plik znajduje się w bazie danych, możesz wybrać czy program działa - czy tylko ostrzega, że nie jest on zgodny z bazą danych. Ponadto istnieją dwa inne ustawienia: (zaufana ścieżka PATH)TEP
iTLP
(zaufana ścieżka LIBrary). Można wykonywać tylko programy w TEP i biblioteki mogą być ładowane tylko katalog jest zawarty w TLP W Linux I jest coś, co nazywa się „AppArmor”, które może ci pomócOdpowiedzi:
Zamiast sprawdzania poprawności plików binarnych, które zamierzasz wykonać, możesz uruchomić odpowiednie pliki binarne od samego początku. Np. Jeśli chcesz się upewnić, że nie zamierzasz uruchomić
/tmp/surprise/tar
, po prostu uruchom/usr/bin/tar
skrypt. Alternatywnie, ustaw swoją$PATH
rozsądną wartość przed uruchomieniem czegokolwiek.Jeśli nie ufasz plikom
/usr/bin/
i innym katalogom systemowym, nie ma możliwości odzyskania zaufania. W twoim przykładzie sprawdzasz właścicielals
, ale skąd wiesz, że możesz mu zaufaćls
? Ten sam argument dotyczy innych rozwiązań, takich jakmd5sum
istrace
.Tam, gdzie wymagane jest wysokie zaufanie do integralności systemu, stosowane są specjalistyczne rozwiązania, takie jak IMA . Ale nie jest to coś, czego można użyć ze skryptu: cały system musi być skonfigurowany w specjalny sposób, z koncepcją niezmiennych plików.
źródło
/bin
zamiast/usr/bin
.$PATH
więc obie ścieżki, jeśli potrzebna jest obsługa wielu dystrybucji.Jeśli intruz uzyskał dostęp do twojego systemu i jest w stanie go zmodyfikować
$PATH
(co nie powinno obejmować/tmp
w żadnych okolicznościach), jest już za późno, aby zacząć martwić się o własność plików wykonywalnych.Zamiast tego powinieneś przeczytać o tym, jak radzić sobie z włamaniem .
Lepiej skoncentrować się na całkowitym unikaniu włamań.
Jeśli masz system, w którym tego rodzaju sprawy mają znaczenie, dobrym pomysłem może być odizolowanie jego części, które muszą być publiczne, od części, które muszą być prywatne, a także przeprowadzenie audytu sposobów komunikacji między nimi.
źródło
Jest to możliwe do pewnego stopnia poprzez weryfikację
md5sum
pliku. Tak więc w systemach korzystających zapt
zarządzania pakietami - w moim szczególnym przypadku Ubuntu 16.04 - znajduje się plik/var/lib/dpkg/info/tar.md5sums
, w którym przechowywane są sumy md5 wszystkich plików pochodzących ztar
instalacji. Możesz więc napisać prostą instrukcję if, która sprawdza, czy dane wyjściowemd5sum /bin/tar
pasują do zawartości tego pliku.To oczywiście zakłada, że sam plik nie został zmieniony. Może się to oczywiście zdarzyć tylko wtedy, gdy atakujący uzyska dostęp do roota / sudo, w którym to momencie wszystkie zakłady są wyłączone.
źródło
/usr/bin/md5sum
?/bin/tar
lub/usr/bin/tar
, jest bardzo prawdopodobne, że może również po prostu zastąpićmd5sum
lub/var/lib/dpkg/info/tar.md5sums
. Lub$SHELL
.tar
wskazuje inny plik binarny, będzie to działać. Kiedy system zostanie przejęty na poziomie root, masz jedną opcję, a następnie - nuke go z orbityTak, istnieje metoda: wbudowana
type
. W przeciwieństwie dowhich
polecenia, które wyszukuje tylko w ŚCIEŻCE,type
powie ci, czy nazwa polecenia jest faktycznie słowem kluczowym zastrzeżonym, wbudowanym, aliasem, funkcją lub plikiem dyskowym.Ponadto
type -a
otrzymasz wszystkich kandydatów do twojego dowództwa (od pierwszego do ostatniego wyboru):Wreszcie, jeśli martwisz się tylko plikami binarnymi na dysku, możesz użyć,
type -Pa
aby uzyskać wszystkie pliki binarne w ŚCIEŻCE (w tej samej kolejności, jak powyżej):To powiedziawszy,
type
sam nie powie dokładnie, jakie polecenie zostanie w końcu wywołane. Na przykład, jeślitar
jest aliasem, który wywołuje binarnym (npalias tar="/tmp/tar"
) wtedytype
powie to jestalias
.źródło
type -a
obejmuje wszystkie formularze (np. zarówno alias, jak i program zewnętrzny)type
powie ci inasfar, jak wie bash, ale jeśli jesteśmy pod kontrolą złośliwego atakującego, nie ma powodu, aby wierzyć, że to, co myśli, że bash wie, odzwierciedla rzeczywistą prawdę. Z tego co wiesz, istniejeLD_PRELOAD
moduł przechwytujący każde pojedyncze wywołanie biblioteki C.which
.enable
. Skorzystałem z rad zawartych w tych odpowiedziach, abytype enable
sprawdzić, czy jest to wbudowana powłoka, a następniehelp enable
zobaczyć, co robi.Możesz sprawdzić, które polecenia są dokładnie wykonywane przez skrypt, używając
strace
. Na przykład:Za pomocą następującego skryptu:
strace
poda dokładną ścieżkę do poleceń wykonanych przy użyciu z-e execve
parametrem:Parametry (od strace man):
-f
: Śledź procesy potomne, ponieważ są one tworzone przez aktualnie śledzone procesy w wyniku wywołań systemowych fork (2), vfork (2) i clone (2). Pamiętaj, że-p PID -f
dołączą wszystkie wątki PID procesu, jeśli jest on wielowątkowy, a nie tylko wątek z id_wątku = PID.-e trace=file
: Śledź wszystkie wywołania systemowe, które przyjmują nazwę pliku jako argument. Można to potraktować jako skrót, dla-e trace=open,stat,chmod,unlink,...
którego przydatne jest sprawdzenie, do jakich plików odnosi się proces. Ponadto użycie skrótu zapewni, że nie zapomnisz przypadkowo dołączyć do listy połączenia takiego jak lstat.źródło
strace
sam nie został obalony.Linux OS jest oparty na plikach i wiele poleceń wykonanych w systemie Linux prawdopodobnie rozwiąże niektóre zmiany w plikach znajdujących się na twoim komputerze. Z tego powodu może to najlepsze rozwiązanie twojego problemu. Możesz przetestować swoje komendy pod kątem wszelkich zmian w systemie plików przed jego wykonaniem.
Istnieje polecenie „strace”, które rozkłada polecenie na części…
Jeśli naprawdę chcesz zagłębić się w grę, sprawdź dekompilatory skryptów, które mają zostać wykonane. Innymi słowy, musisz sprawdzić interpretację asemblera tego polecenia. Na bash tam
objdump -d
. Skrypty bin systemu Linux są tworzone głównie wC
języku programowania, więc używaj dobregoC
dekompilatora.źródło