Pytanie:
Dlaczego system operacyjny chroni przed zaciemnianiem „To system Unix!” nie jest szeroko stosowany?
Indigenuity
2019-12-17 05:42:46 UTC
view on stackexchange narkive permalink

Scena Parku Jurajskiego, o której mowa w tytule, jest niesławna z powodu tego, jak absurdalnie brzmi dla tych, którzy znają się na technologii. Ale ilustruje również to, co wydaje mi się olbrzymią dziurą w bezpieczeństwie sieci, szczególnie w urządzeniach IoT - gdy tylko napastnicy dowiedzą się, że serwer, kamera lub niania działa pod Linuxem, natychmiast dowiadują się, jak to działa. Wiedzą, że polecenia takie jak sudo są dużymi, soczystymi celami i wiedzą, że dostęp do powłoki przyniesie ze sobą mnóstwo przydatnych narzędzi, takich jak ls i cat .

Dlaczego więc zaciemnianie systemu operacyjnego nie jest czymś więcej? Nie mówię tylko o ukrywaniu wersji w nagłówkach sieci. Podobnie jak w przypadku minifikacji lub zaciemniania JavaScript, mówię o zmianie nazw plików binarnych i ścieżek plików w samym systemie operacyjnym. Czy całe klasy ataków nie byłyby praktycznie bezużyteczne, gdyby system operacyjny miał polecenia ha7TrUO i RRI6e29 zamiast sudo i ls ? Wyobraź sobie hakera, który w jakiś sposób uzyskał zdalny dostęp do roota - co w ogóle zrobią, jeśli nie znają żadnych poleceń?

Implementacja byłaby dość łatwa dla kompilatorów. Weźmy najprostszy przypadek „zmień nazwę tej funkcji i wszystkich jej wywołań”. Możesz nadać kompilatorowi systemu operacyjnego i kompilatorowi aplikacji te same losowe nazwy, a one będą mogły rozmawiać ze sobą. Ale nawet jeśli aplikacja ma słabe zabezpieczenia i jest podatna na wstrzyknięcie bash, takie ataki byłyby bezowocne.

Oczywiście ta technika nie może być używana we wszystkich scenariuszach. Pomijając scenariusze, takie jak serwery obsługiwane przez ludzkich administratorów, wydaje mi się, że każde urządzenie lub serwer zarządzany przez automatyzację jest najlepszym kandydatem do tej obrony.

Wydaje mi się, że pytanie (a) musi być trochę więcej konkret:

  1. Czy zaciemnianie systemu operacyjnego, jak opisano, jest szeroko stosowane i po prostu się z nim nie spotkałem?
  2. Jeśli nie jest powszechnie używane, jakie są praktyczne lub techniczne przeszkody w użyciu?
Komentarze nie służą do rozszerzonej dyskusji;ta rozmowa została [przeniesiona do czatu] (https://chat.stackexchange.com/rooms/102384/discussion-on-question-by-indigenuity-why-is-this-defense-against-its-a-unix-s).
Można zaprojektować środowisko kompilacji, w którym wszystkie te symbole zmieniałyby nazwy automatycznie i losowo przy każdej kompilacji.Tak długo, jak masz źródło wszystkiego, byłoby to nowatorskie, ale nie trudne do zbadania.A gdybyś to zrobił raz, miałbyś to na zawsze.Debugowanie byłoby trudne.Ale w pewnym sensie podoba mi się ten pomysł.Byłaby to podobna myśl, jak https://en.wikipedia.org/wiki/Address_space_layout_randomization, ale w czasie kompilacji zamiast w czasie wykonywania i znacznie bardziej ambitna.Im więcej o tym myślę, tym bardziej szanuję pomysł.ZWIĘKSZA to bezpieczeństwo urządzeń wbudowanych.(Jednak bez srebrnej kuli.)
Czternaście odpowiedzi:
Mike Ounsworth
2019-12-17 09:50:05 UTC
view on stackexchange narkive permalink

Zanim rozerwę Twój pomysł, pozwól, że powiem, że to naprawdę interesujący pomysł i fajnie było o nim myśleć.

Proszę dalej myśleć na zewnątrz pudełko i zadawaj ciekawe pytania!

W porządku, zróbmy to!


Cofnijmy się i zapytajmy, dlaczego niania czy na pierwszym miejscu działa Linux? Co by było, gdyby nie było systemu operacyjnego, a aplikacja została napisana w czystym kodzie mikrokontrolera (pomyśl o kodzie arduino)? Wtedy nie byłoby sudo lub ls ani nawet powłoki, której mógłby użyć atakujący, prawda?

Nie jestem tutaj ekspertem, ale Spodziewam się, że jako branża skłoniliśmy się do umieszczenia Linuksa na czymkolwiek wystarczająco dużym, aby go uruchomić, głównie dla wygody programistów:

  1. Skrócenie czasu tworzenia: podczas budowania Twojego urządzenia obsługującego Wi-Fi i Bluetooth administrowany przez Internet, samonaprawiający się whizpopper z synchronizacją w chmurze z towarzyszącymi aplikacjami na Androida i iOS, Linux zawiera wszystkie biblioteki, narzędzia i sterowniki, których potrzebujesz.
  2. Zwiększenie możliwości testowania: jeśli urządzenie działa w trybie bash lub busybox z portem SSH, wtedy bardzo łatwo jest się połączyć i dowiedzieć się, co poszło nie tak podczas fazy testowania produktu.

Aby pomysł na zaciemnienie zadziałał, trzeba zaciemniać nie tylko nazwy narzędzi wiersza poleceń, takich jak sudo i ls , ale także każdy interfejs API jądra systemu Linux, aby uniemożliwić atakującemu upuszczenie we własnym skompilowanym pliku binarnym, który ok Wypełnia jądro bezpośrednio. Spójrzmy więc jeszcze raz na Twój pomysł:

Implementacja byłaby dość łatwa dla kompilatorów. Weźmy najprostszy przypadek „zmień nazwę tej funkcji i wszystkich jej wywołań”. Możesz nadać kompilatorowi systemu operacyjnego i kompilatorowi aplikacji te same losowe nazwy, a będą one mogły ze sobą rozmawiać.

Musisz samodzielnie wykonać tę losową kompilację; w przeciwnym razie ktoś mógłby wyszukać mapowania w Google.

Więc będziesz musiał zbudować jądro ze źródeł za pomocą swojego „zaciemniającego kompilatora”, aby tylko Ty znasz mapowania zaciemnionych interfejsów API jądra. (kiedykolwiek zbudowałeś jądro Linuksa ze źródeł? To z pewnością bardziej uciążliwe zadanie niż docker pull alpine , który jest kierunkiem, w którym zdaje się zmierzać kultura deweloperów) .

Ale system operacyjny to coś więcej niż tylko jądro. Potrzebujesz sterowników do układu Wi-Fi Broadcom BCM2837, który jest dostępny w tym mini-komputerze? Będziesz musiał zbudować ten sterownik w oparciu o swoje zajęte jądro za pomocą swojego kompilatora, jeśli Broadcom dostarczy Ci nawet kod źródłowy. Wtedy będziesz musiał zbudować całe stosy oprogramowania GNU wifi i oprogramowania sieciowego. Ile innych rzeczy będziesz potrzebować, aby znaleźć źródło i dodać do potoku kompilacji, zanim będziesz mieć działający system operacyjny?

Aha, i jeśli zewnętrzne repozytoria któregokolwiek z tych rzeczy wydają łatkę, jesteś teraz odpowiedzialny za jej ponowne zbudowanie (zakładając, że zapisałeś pliki mapowania zaciemnienia kompilatora, które pasują do twojego pliku binarnego jądra ) i wypychać to na swoje urządzenia, ponieważ - zgodnie z projektem - Twoje urządzenia nie mogą używać plików binarnych z łatkami utworzonych przez dostawcę.

Aha, i aby udaremnić hakerów, nie będzie żadnych tego „Oto pliki binarne dla Whizpopper 1.4.7” , o nie, musisz stworzyć unikalnie zaciemnioną wersję wszystkiego, od jądra w górę na urządzenie , wysyłasz.


A więc do twoich pytań:

  1. Czy zaciemnianie systemu operacyjnego, jak opisano, jest szeroko stosowane i po prostu nie spotkałem się z nim?
  2. Jakie są praktyczne lub techniczne bariery w używaniu, jeśli nie są powszechnie używane?

Myślę, że odpowiedź jest taka, że ​​to, co opisujesz, prawie całkowicie pokonuje w celu wykorzystania wcześniej istniejących komponentów oprogramowania, jeśli chcesz znaleźć i zbudować dosłownie wszystko od źródła. W rzeczywistości może być mniejszym wysiłkiem całkowite porzucenie systemu operacyjnego, udawanie, że jest rok 1960 i napisanie aplikacji bezpośrednio w mikrokodzie procesora.

Bezpieczeństwo lubię bardziej niż większość programistów, ale lubię f * to .

Konieczne byłoby również odbudowanie każdego narzędzia, pakietu i skryptu, które używa tych poleceń i narzędzi, aby wykonywać „zaciemnione” wywołanie.To * dużo * pracy.
Dni kompilacji na Core i7?CLFS kompiluje się znacznie szybciej: najwyżej kilka godzin.Nawet szybciej, jeśli wszystko, czego potrzebujesz, to kernel + busybox + some_small_utilities.To, co naprawdę zajmie trochę czasu, to robienie tej żmudnej funkcji zmiany nazwy i ponownego mapowania numerów wywołań systemowych, próbując niczego nie zepsuć.I dlaczego budowanie jądra Linuksa ze źródeł jest uciążliwe?Czy starasz się unikać jego pliku `Makefile`?
@Ruslan lol, powinienem był wiedzieć, że wejdę w tę debatę.Powiem tylko, że biorąc pod uwagę tempo i styl dzisiejszej kultury deweloperskiej, wysiłek związany z utworzeniem niestandardowego potoku kompilacji linuxa >> pobieranie COTS CentOS i `yum install nodejs`.
Świetna odpowiedź, dziękuję za poświęcony czas!Nie jestem do końca przekonany, że czas deweloperski musiałby zostać poświęcony, aby umożliwić specjalny krok kompilacji podczas „wydania”.Pomijając to, myślę, że twoja uwaga dotycząca sterowników urządzeń jest dość dużą barierą.Wątpię, aby można to przezwyciężyć bez znacznych zmian w systemie operacyjnym.Chociaż teraz zastanawiam się, czy zostawić w spokoju przestrzeń jądra i trochę zaciemnić przestrzeń użytkownika ...
@Indigenuity, w odniesieniu do samego zaciemniania przestrzeni użytkownika: istnieją znacznie skuteczniejsze sposoby zabezpieczania elektroniki użytkowej, takie jak ustawienie losowego hasła administratora dla każdego urządzenia i przestrzeganie dobrze ugruntowanych najlepszych praktyk.Ponadto, jeśli producent nie będzie zawracał sobie głowy używaniem czegokolwiek innego niż „admin123”, nie będzie również zainteresowany zaciemnianiem poleceń.
Był czas, kiedy elektroniczne nianie były wyłącznie urządzeniami analogowymi, bez kodu ani komputera ...
@MikeOunsworth, większość osób rozwijających IoT buduje wszystko, co dzieje się na urządzeniu, w tym jądro i program ładujący, a często także łańcuch narzędzi do kompilacji krzyżowych.To właśnie robią wbudowane narzędzia programistyczne.Yocto zaczyna się tylko od kompilatora hosta C i Pythona, Ptxdist zwykle otrzymuje wstępnie zbudowany kompilator krzyżowy.Płyty ARM wymagają konfiguracji specyficznej dla płyty, ponieważ nie mają żadnego standardowego BIOS-u, więc wymagane są określone kroki, a dla większości płyt po prostu nie dostajesz gotowych plików binarnych.Jest więc jeden łańcuch narzędzi do zmodyfikowania, jeśli ktoś chce.Prawdziwym problemem byłoby debugowanie.
Nawet jeśli wywołania systemowe / IOCTL zostały zaciemnione, można użyć znanych plików binarnych do odgadnięcia wzorca zaciemniania.Gdybym zobaczył plik binarny, który wywołał syscall 7551, a następnie wypisał go przy użyciu ciągu formatu, który wyglądał jak wynik polecenia `stat`, mógłbym się domyślić, że był to plik binarny` stat`, a numer wywołania systemowego `fstat` lub friends był7551.
Opierając się na moim doświadczeniu z Gentoo, prawdopodobnie mógłbyś skompilować kompletny stos Whizpopper w około cztery godziny, mniej, jeśli używasz lekkich pakietów, takich jak uclibc, busybox i lighttpd zamiast glibc, stosu GNU i apache.
„W rzeczywistości całkowite porzucenie systemu operacyjnego, udawanie, że jest rok 1960 i napisanie aplikacji bezpośrednio w mikrokodzie procesora, może być mniejszym wysiłkiem”.- Cóż, ludzie naprawdę pomyśleli o tym i wydali frameworki takie jak [includeos] (https://www.includeos.org/) (bez przynależności), które w zasadzie umożliwiają ci to zrobić (zamierzonym celem wydają się być maszyny wirtualne lub podobne konteneryna serwerach, pozbawione wszystkiego oprócz elementów niezbędnych do wykonania pracy).Nie jestem jednak pewien co do praktyczności dystrybucji tak minimalnych systemów do użytkownika końcowego ...
@hoffmale Termin badawczy dla takich systemów, które znam, to „unikernel”;zasadniczo zbiór statycznych bibliotek, które mają być skompilowane i zapewniają wszystkie funkcje systemu operacyjnego wymagane przez używane aplikacje.
Przepraszam, ale czy to zadziała, nawet jeśli założymy „idealne zaciemnienie” (tj. Wszystko zostało ponownie skompilowane)?Hakerzy to ludzie i będą w stanie dopasować połączenia i potencjalnie odbudować mapowanie, przynajmniej częściowo.Widzisz, jak to się nazywa?Połączmy te kropki.I znowu i znowu.Mam sobie wykres!Jak to wygląda?Porównajmy z jakimś wykresem czytelnych wywołań systemu operacyjnego / skryptów. Och, teraz rozumiem, `RRI6e29` to właściwie` ls`!(no może nie tak dosadnie, ale masz pomysł)
Nie zgadzam się z twoim stwierdzeniem, że Linux jest używany głównie dla wygody programistów.Napisanie systemu operacyjnego od podstaw dla kamery podłączonej do Internetu wymagałoby zaimplementowania wielu narzędzi pomocniczych i bibliotek.Każda warstwa jest trudna do zaimplementowania i istnieje duże prawdopodobieństwo, że Twój domowy system będzie miał mnóstwo luk, ponieważ nie jesteś ekspertem we wszystkich tych warstwach.Korzystanie z lekkiego systemu Linux i dodanie obsługi niestandardowego sterownika aparatu oraz warstwy zapewniającej wygodną konfigurację sieciową jest bezpieczniejsze.(i nadal wiele firm nie przeprowadza konfiguracji w bezpieczny sposób!)
"patrzysz na godziny i godziny (prawdopodobnie dni?) czasu kompilacji, nawet na i7" Myślę, że Threadripper jest teraz punktem odniesienia dla kompilacji projektów (szczególnie tych, które mogą być mocno zrównoleglone).cc @Ruslan
+1 za zachęcanie do innego myślenia
W szczególności, gdybyś używał Linuksa, musiałbyś zwolnić cały swój kod źródłowy lub udostępnić go na żądanie: „Odpowiednie źródło” pracy w postaci kodu wynikowego oznacza cały kod źródłowy potrzebny do wygenerowania, zainstalowania i (dlaplik wykonywalny) uruchomić kod wynikowy i zmodyfikować pracę, w tym skrypty kontrolujące te działania. 'Co myślę, że obejmowałoby twoje mapowania ...
@MikeOunsworth Mam pytanie, dlaczego nie mieć hasła przed wszystkimi wywołaniami `(jak sudo)`.Konfiguracja systemu zapyta, czy chcesz, aby połączenia były chronione hasłem, i jakie będzie to hasło.Zapobiega to zmianie czasu deweloperskiego i testowalności.Oczywiście nie mówię, że go rozwijamy, po prostu pytam, czy uważasz, że to możliwe.
@Nightwolf To właściwie krok wstecz od `sudo`.Przed `sudo`, jeśli chciałeś uruchamiać polecenia root'a, musiałeś znać hasło roota maszyny i uruchamiać je używając` su`.`sudo` pozwala użytkownikom uruchamiać polecenia roota (lub teoretycznie uruchamiać polecenia jak każdy inny użytkownik, jego konfiguracja jest niezwykle potężna i elastyczna) poprzez wpisanie _własnego_ hasła, ponieważ okazuje się, że ma jedno centralne hasło, które zapewnia dostęp do rootauprawnienia i jest znane każdemu, kto potrzebuje wykonywania uprzywilejowanych poleceń, jest straszne dla bezpieczeństwa.
@FeRD `To właściwie krok wstecz od sudo`.Zakładasz, że hasło usuwa inne zabezpieczenia.Nie chodzi mi o wszystkie istniejące zabezpieczenia oprócz zaciemnienia w postaci hasła.Alternatywnie możesz nazwać to solą zamiast hasła.
Można zaprojektować środowisko kompilacji, w którym wszystkie te symbole zmieniałyby nazwy automatycznie i losowo przy każdej kompilacji.Tak długo, jak masz źródło wszystkiego, byłoby to nowatorskie, ale nie trudne do zbadania.A gdybyś to zrobił raz, miałbyś to na zawsze.Debugowanie byłoby trudne.Ale w pewnym sensie podoba mi się ten pomysł.Byłaby to podobna myśl, jak https://en.wikipedia.org/wiki/Address_space_layout_randomization, ale w czasie kompilacji zamiast w czasie wykonywania i znacznie bardziej ambitna.Im więcej o tym myślę, tym bardziej szanuję pomysł.ZWIĘKSZA to bezpieczeństwo urządzeń wbudowanych.(Jednak bez srebrnej kuli.)
CBHacking
2019-12-17 17:18:28 UTC
view on stackexchange narkive permalink

Odpowiedź Mike'a mówi w zasadzie wszystko, co mam do zaoferowania na temat tego, dlaczego jest to zły pomysł z punktu widzenia rozwoju (i, jak mówi komentarz Ghedipunk, bezużyteczna funkcja bezpieczeństwa nie zapewnia bezpieczeństwa). Zamiast tego opowiem o tym, dlaczego z punktu widzenia bezpieczeństwa nigdy byś tego nie zrobił.

Odpowiedź jest zaskakująco prosta: to strata czasu i są zdecydowanie lepsze opcje. Każdy głupi doodad IoT (pamiętaj, „s” w „IoT” oznacza Secure), który nie zawraca sobie głowy wdrażaniem takich funkcji, na pewno nie pasowałby do takiego podejścia, jak sugerujesz.

  1. Cała idea po prostu nie zadziała przy ograniczaniu wywołań systemowych. Atakujący może po prostu ustawić kilka rejestrów i wywołać kod operacji i boom, znajduje się w jądrze wykonującym wybrane wywołanie systemowe; kogo obchodzi, jaka to symboliczna nazwa? Jasne, możesz manipulować tabelą wywołań systemowych, aby to komplikować (jeśli nie masz nic przeciwko konieczności ponownej kompilacji wszystkiego i uczynienia debugowania własnego jądra formą całkowitego piekła), ale jest to jak zaciemnianie używanego systemu operacyjnego; po co w ogóle zawracać sobie głowę, skoro jest tak niewielu kandydatów? Nawet jeśli atakujący nie chce poddać inżynierii wstecznej istniejącego kodu w systemie, brutalne wymuszanie powinno być możliwe, chyba że przestrzeń wyszukiwania użytecznych indeksów połączeń jest szersza niż kiedykolwiek widziałem w systemie osadzonym.
  2. Po co zaciemniać nazwy poleceń, skoro można je po prostu całkowicie uniemożliwić? chroot nie będzie działał z wbudowanymi powłokami jeśli używasz powłoki , ale działa dobrze na wszystko inne i naprawdę, dlaczego Twój niestandardowy pojedynczy - aplikacja w pudełku ma uruchamiać powłokę? Chodzi mi o to, że jednostki deweloperskie miałyby jedną zainstalowaną, do celów testowych, i być może nie zostanie to usunięte z obrazu detalicznego, ponieważ jesteś leniwy lub myślisz, że będziesz go ponownie potrzebować. Ale osoba atakująca nie byłaby w stanie uruchomić go z kontekstu, w którym działa jego aplikacja. Prosty chroot (lub bardziej skomplikowany sandbox / jail / container) może sprawić, że program nie będzie mógł uruchomić - a nawet uzyskać dostępu - żadnych plików poza tymi, które są wymagane do jego pracy.
  3. Dlaczego zaciemniać interfejsy API jądra, kiedy można po prostu usunąć do nich dostęp? Istnieje wiele systemów piaskownicy, które mogą ograniczać to, co wywołuje proces (lub jego potomkowie ... jeśli nawet wolno im tworzyć). Zobacz https://stackoverflow.com/questions/2146059/limiting-syscall-access-for-a-linux-application
Co więcej, szeroko przetestowane podejście do bezpieczeństwa, takie jak chroot w popularnej dystrybucji Linuksa lub OpenBSD, prawdopodobnie będzie bardziej niezawodne w środowisku naturalnym niż całkowicie nowe, celowo trudne do przetestowania podejście.Zamykanie niepotrzebnych portów:; również dobrze.
+1 dla „pamiętaj,„ s ”w„ IoT ”oznacza Secure” X ^ D
Jeśli kontrolujesz dystrybucję, możesz zmienić kolejność wywołań systemowych jądra.Po prostu przebudowujesz zgodne z glibc i tak dalej.
Jeśli chodzi o problem 1, system operacyjny PlayStation 4 faktycznie to zrobił.Jest oparty na FreeBSD, a same numery wywołań systemowych są losowe.Oczywiście hakerowi nie było trudno odkryć, jakie numery wywołań systemowych odnosiły się do wywołań systemowych, ponieważ każde wywołanie systemowe ma mniej lub bardziej unikalne zachowanie, gdy podano różne argumenty: https://cturt.github.io/ps4.html
Phil Frost
2019-12-18 00:43:31 UTC
view on stackexchange narkive permalink

Jeśli Twoim celem jest pozbawienie atakującego ls i cat , istnieje jeszcze lepsza alternatywa dla zaciemniania: po prostu nie instaluj tych narzędzi.

Chociaż nie powiedziałbym, że jest to podejście szeroko implementujące, jest to przynajmniej implementacja. Weźmy na przykład pod uwagę bez rozpraszania uwagi, zbiór obrazów dockerów, w których prawie nic nie ma. Niektóre z nich (jak ten na wynos) dosłownie nie mają w sobie nic . Atak na system działający w takim kontenerze nie może uzyskać dostępu do powłoki, ponieważ nie ma żadnej powłoki do uruchomienia.

Jedynym sposobem uzyskania dostępu do powłoki przez zaatakowanie aplikacji w takim kontenerze jest następnie ominąć środowisko wykonawcze kontenera, które ma na celu właśnie to zapobiegać.

Chociaż podałem przykład obrazu dockera, tę samą koncepcję można ogólnie zastosować do systemów operacyjnych. Na przykład ls i cat są częścią pakietu coreutils w Debianie. Możesz uruchomić apt-get remove coreutils i mieć pewność, że atakujący nie będzie mógł użyć ls lub cat jako części ataku. Oczywiście oznacza to, że nie możesz ich również używać i prawdopodobnie jest wiele innych rzeczy zależnych od coreutils , które również będą musiały zostać usunięte, ale w przypadku urządzenia wbudowanego lub serwera, który tak robi jedna rzecz może być w porządku.

Ogólna zasada to redukcja „powierzchni ataku”: im więcej „rzeczy” ma cel, tym łatwiej jest pójść na kompromis. Mogą to być otwarte porty sieciowe, linie kodu lub zainstalowane pliki binarne. Jeśli celem jest zwiększenie bezpieczeństwa, usunięcie wszystkich niepotrzebnych „rzeczy” jest dobrym początkiem.

Prawdopodobnie gdybym miał instalację z ls, cat, docker i niewiele więcej włączoną, pierwszą rzeczą, którą chciałbym usunąć, aby poprawić bezpieczeństwo, byłby docker.Większość rozsądnych rzeczy związanych z IoT używa busybox ls, cat, jeśli jest zainstalowany, co jest * tym samym binarnym * dla każdego narzędzia.
Dziękuję za wprowadzenie mnie w niezawodny, interesujący pomysł!
Powodzenia w diagnozowaniu problemów, gdy losowe skrypty psują się, ponieważ nie mogą znaleźć „kota” ...
@FedericoPoloni: `set -euxo pipefail` i` shellcheck` to dobry początek ... i tbh, większość uniksowych kotów skryptowych jest kandydatami do That Notorious Award.
Wiele lat temu Bruce Schneier wygłosił przemówienie na konferencji technicznej, na której wyjaśnił, że systemy, które jego firma zainstalowała w sieciach swoich klientów, korzystały z okrojonego jądra Linuksa bez funkcji „bash” lub wielu innych narzędzi, które mogłyby zostać użyte przez atakującego.Podał analogię, gdy ktoś zostawia skrzynkę z narzędziami pod zewnętrznym oknem sypialni, co byłoby wygodą dla włamywacza.Podstawowa zasada jest taka, że jeśli nie _ potrzebujesz_ tego, nie _ instalujesz_ go, co zmniejsza zawartość tego zestawu narzędzi.
Około 15 lat temu pracowałem nad połączeniem z jakimś sprzętem innej firmy.Część ich systemu była „prawdziwym” systemem wbudowanym, częścią była skrzynka Windows, która komunikowała się z drugim systemem z jednej strony i (zasadniczo) zdalne wywołania API dla mojego systemu z drugiej strony.Pewnego razu potrzebowali pomocy w debugowaniu na podstawie systemu testowego, który wysłali do mojego biura.Podłączyłem system Windows i sprawdziłem dla nich rzeczy - ** i miał wszystko, gry i wszystko **.Istniała ochrona fizyczna (zamknięte pudełko), ale gdyby nie była naprawdę zamknięta, byłaby poważną luką w zabezpieczeniach.
Tom
2019-12-18 13:06:37 UTC
view on stackexchange narkive permalink

Ponieważ zaciemnianie nie jest zabezpieczeniem i ponieważ zaciemnianie systemu operacyjnego jest w zasadzie nonsensem.

Jest tylko tyle powszechnych systemów operacyjnych i tak wiele sposobów na dokonywanie przemyślanych domysłów. Jeśli zauważysz, że używam IIS lub MSSQL Server, możesz zgadnąć, który system operacyjny działa pod spodem.

Nawet jeśli w jakiś sposób uda mi się uruchomić stos, który nie mówi nic o moim podstawowym systemie operacyjnym i maskuje również każdą inną wskazówkę (pobieranie odcisków palców jest rzeczą), wciąż nie wygrałem zbyt wiele.

Jeśli chodzi o bezpieczeństwo, wiesz, że używam Linuksa, a nawet że mam Debiana 8, nie daje ci wiele do pracy, ani mnie nie martwi. Jeśli jestem odpowiednio zahartowany i połatany, możesz wiedzieć, co chcesz. Jeśli jestem na poziomie poprawek, które wczoraj wprowadzono do muzeum oprogramowania, twój zestaw ataków otworzy mnie na oścież, po prostu wypróbowując je wszystkie, a zaciemnianie mojego systemu operacyjnego zmusza cię tylko do wypróbowania kilku bezużytecznych exploitów. W przypadku ataku automatycznego spowolni Cię to o kilka sekund.

Maskowanie nie działa. Ludzie mogą Cię zeskanować, odcisnąć palcem lub po prostu wyrzucić całą bibliotekę exploitów, aby zobaczyć, co działa.

Jeśli tracisz czas na to, co mogłeś poświęcić na faktyczne wzmacnianie, w rzeczywistości szkodzisz swojemu bezpieczeństwu .

Właściwe utwardzanie działa. Powiedziałem powyżej, że „możesz wiedzieć, co chcesz” . Opublikowałem swój adres IP i hasło roota na konferencjach poświęconych bezpieczeństwu, na których wygłosiłem przemówienie. SSH ze zdalnym logowaniem do roota i włączonymi kilkoma usługami. Poważnie wzmocniona maszyna SELinux. Nikomu nigdy nie udało się przerwać mojej wypowiedzi, chociaż pewnej osobie udało się kiedyś upuścić plik tekstowy do katalogu głównego, gdy moja polityka nie była jeszcze doskonała.


Dodatek: punktem wyjścia był film. Zaciemnianie to świetne narzędzie filmowe, ponieważ takie objawienie mówi widzom, że bohater (lub złoczyńca) znalazł jakąś informację i dzięki temu robi postęp. Jest to odpowiednik komputera, aby dowiedzieć się, gdzie jest sejf, mimo że nadal potrzebujesz kodu. Nie ma znaczenia, czy jest to zgodne ze stanem faktycznym, czy przekazuje publiczności odpowiedni przekaz emocjonalny.

Używasz ... Linuksa z Wine?W każdym razie system JP nie został * celowo * zaciemniony;nie było powodu, aby tak było, podobnie jak system operacyjny komputera stacjonarnego jest celowo zaciemniany.Bezpieczeństwo w JP opierałoby się na uwierzytelnianiu (i * fizycznym * bezpieczeństwie), tak jak w nowoczesnych systemach komputerowych.
Drobne zastrzeżenie: SQL Server 2019 faktycznie działa w systemie Linux (a także w Powershell i ASP.NET).Nie znam nikogo, kto faktycznie to robi ... ale jest to możliwe.
Roman Odaisky
2019-12-17 21:29:09 UTC
view on stackexchange narkive permalink

W przypadku niezwykle rozpowszechnionego przykładu, Intel Management Engine, który ma własny system operacyjny, robi coś takiego, gdy istnieje mechanizm aktualizacji oprogramowania układowego, ale oprogramowanie układowe musi być w bardzo specyficznym formacie, którego szczegóły są poufne. Wydaje się, że obejmuje kodowanie Huffmana z nieznanymi parametrami. Podobnie jak twoja propozycja (która jest w zasadzie symetrycznym szyfrowaniem oprogramowania układowego), ME wymaga określonych modyfikacji w czasie przygotowania oprogramowania i ma odpowiednie odchylenie od standardowych mechanizmów w czasie wykonywania.

Hmm.Myślałem, że oprogramowanie układowe Intel musi być podpisane kodem przez urząd certyfikacji Intel.Czy oprócz tego potrzebują więcej ochrony?Jakie jest zagrożenie, któremu zapobiega to zaciemnianie?
Maskowanie próbuje zapobiec inżynierii wstecznej, więc atakujący nie mogą znaleźć jeszcze więcej problemów z bezpieczeństwem podczas ich implementacji.
Albo nie jest wykluczone, że sami Intel robią coś podejrzanego, co chcieliby ukryć.
Warto zauważyć, że wiele [luk w zabezpieczeniach] (https://en.wikipedia.org/wiki/Intel_Management_Engine#Security_vulnerabilities) istniało i prawdopodobnie nadal istnieje w ME.A całe zaciemnianie utrudnia również analitykom bezpieczeństwa analizę.
Intel ME to kiepski żart
@johndoe Rozumiem, że nigdy nie słyszałeś o nowszym „silniku innowacji” firmy Intel.: P
user1169420
2019-12-19 03:28:08 UTC
view on stackexchange narkive permalink

To, co opisujesz, nazywa się „Security through Obscurity” i jest szeroko znanym antywzorem . Oznacza to, że nie jest to nowy pomysł, a raczej stary, zły pomysł, że ludzie niewtajemniczeni w filozofię bezpieczeństwa muszą być wykształceni, aby nie wpaść.

Wyobraź sobie, że projektujesz dom, aby był bezpieczny, a myślenie, że niejasność jest obiecującą strategią. Wszystkie domy są zbudowane z korytarzy i pokoi, drzwi z klamkami, włącznikami światła itp. Ponieważ są one powszechnie znane, można uznać, że jest to niebezpieczne, ponieważ intruz może łatwo poruszać się po domu za pomocą tych powszechnie znanych elementów konstrukcyjnych. Możesz spróbować przeprojektować zasady budowy od podstaw, zamienić klamki drzwi na kostki rubiks, zrobić półwysokie sufity, aby zmylić intruza itp. Skończysz z domem, w którym życie jest straszne, nie można go utrzymać, ponieważ żaden wykonawca niczego nie chce z tym zrobić, a co najgorsze, na nic, ponieważ każdy intruz, gdy znajdzie się w środku, może rozejrzeć się oczami i użyć mózgu, aby to zrozumieć. Hakerzy w głębi duszy są uzależnieni od puzzli.

Rozwiązaniem, które pozwoli zabezpieczyć Twój dom nie jest niestandardowa konstrukcja, lecz lepsze zamki, zabezpieczone okna, odpowiedni system zabezpieczeń itp. Chcę ukryć swoje złoto w sekretnym przejściu, ponieważ w końcu Abbot i Costello oprą się o ten świecznik i przypadkowo go otworzą. Umieść swoje złoto w sejfie z dobrą tajną kombinacją i alarmem sabotażowym. Odpowiednikiem komputerowym jest ograniczony dostęp poświadczony przez kryptografię klucza publicznego, ograniczone role użytkowników, systemy monitorowania, zmniejszanie narażonej powierzchni, ograniczanie wektora zagrożenia wejścia itp.

Wysiłki mające na celu uczynienie systemu komputerowego bardziej niejasnym sprawiają, że Twój system jest dalej od wsparcia, trudniej jest uzyskać łaty bezpieczeństwa , trudniej używać w bezpieczny sposób .

Edycja: Czasami niektóre zabezpieczenia przez są dopuszczalne, gdy są używane jako dodatek do rzeczywistych zabezpieczeń. Typowym przykładem jest uruchomienie SSH na wysokim porcie, np. 30000. SSH jest szyfrowane, a dostęp odbywa się za uwierzytelnieniem poświadczonym, to Twoje prawdziwe bezpieczeństwo. Ale posiadanie go na wysokim porcie sprawia, że ​​jest mniej zauważalny, jeśli ktoś wykonuje szybkie skanowanie. Cokolwiek bardziej zawiłego niż to, na przykład próba zaciemnienia systemu operacyjnego, sprawiłoby, że byłby koszmarem operacyjnym, który utrudniłby rzeczywiste środki bezpieczeństwa (takie jak bycie na bieżąco z łatkami).

„akceptowalne są pewne zabezpieczenia poprzez zaciemnienie”: Twój przykład użycia portu innego niż domyślny to nie * bezpieczeństwo *, to jest * wygoda *: w tym przypadku „Nie chcę, aby moje dzienniki ssh były pełne nieudanych prób”.Nie ma żadnego wpływu na bezpieczeństwo.
Masz rację.Słabe sformułowanie z mojej strony.
Więcej dyskusji na temat bezpieczeństwa przez zaciemnienie można znaleźć w artykułach [Czy wszystkie zabezpieczenia nie są przez zaciemnienie?] (/ A / 44096/129883) i [Ważna rola zaciemnienia] (/ a / 2431/129883).Komentarze są wnikliwe w tym drugim linku.Jeśli chodzi o zmianę domyślnych portów, są pewne zastrzeżenia, omówione w [Czy powinienem zmienić domyślny port SSH na serwerach linuxowych?] (/ A / 32311/129883).Znowu kilka przydatnych rzeczy w komentarzach.
@Piskvor Korzystanie z portu innego niż domyślny przyczynia się do bezpieczeństwa, zapobiegając przypadkowym błahom.Mój ojciec nauczył mnie, gdy byłem bardzo mały: zamki mają trzymać z daleka przeciętnego człowieka, a nie zatwardziałego przestępcę.Wytrąci twój zamek.rozbij je, rozwal okno i uzyskaj w ten sposób wejście.Powiedziawszy to, zamiast zmieniać port SSH na serwerze, po prostu nie kieruj do nich połączeń SSH przez zaporę ogniową (z wyjątkiem serwera SFTP, który został zaprojektowany do połączenia z Internetem).Pozwól legalnym administratorom uzyskać dostęp do sieci VPN, aby uzyskać zdalny dostęp.
** Nie umieszczaj SSH na wysokim porcie. ** Oczywiście możesz umieścić go na innym niż domyślnym porcie, ale umieszczenie go na wysokim porcie pozwala lokalnemu procesowi nieuprawnionemu na awarię serwera SSH i powiązanie z nimwysoki port na swoim miejscu.Niski port jest ważny dla serwerów, ponieważ wymaga rootowania (no cóż, pewnych funkcji, które są dostarczane z rootem) do wiązania.
@MontyHarder Dokładnie to napisałem: mniej spamu w dzienniku nieudanych logowania.Zabezpiecz się przed moją młodszą siostrą próbującą root: toor?I było dużo radości.(Tak.)
F. Hauri
2019-12-18 16:54:45 UTC
view on stackexchange narkive permalink

Pomyśl o użyteczności

  • Spróbuj wyjaśnić swojemu nowemu administratorowi systemu, że musi nacisnąć ha7TrUO insetead of sudo , RRI6e29 zamiast ls i tak dalej ... Tak, jest lista tłumaczeń, których po prostu musisz się nauczyć!
  • przeglądanie sieci lokalnej też nie może być możliwe: musisz prowadzić listę papierową, aby zachować ogólny widok !?

  • Jeśli zmienisz nazwę wszystkich krytycznych poleceń, będziesz musiał je sterować, aby dokonać aktualizacji systemu!

  • I jako Nick2253 skomentuj, jeśli spróbuj zbudować system osadzony, a następnie wykonaj zaciemnienie przed opublikowaniem produktu końcowego, będziesz musiał przetestować produkt końcowy.

    • Musisz stworzyć domowy skrypt, aby powiązać wszystko zaciemnianie.
    • Jeśli coś pójdzie nie tak, debugowanie będzie trudne.
    • Musisz utworzyć domowe skrypty deobfuskacji, aby móc coś zrobić debugowanie.
    • Niestandardowa informacja zwrotna (z log fi les) również będzie musiało zostać odszyfrowane .

    W ten sposób dodasz warstwę ważnej pracy z nowymi potencjalnymi błędami.

    Więcej informacji na temat nielicznych ulepszeń w zakresie bezpieczeństwa można znaleźć dalej.

Niewidzialność może zrobić sobie krzywdę.

Myśl o niższym poziomie

  • Nawet jeśli spróbujesz zmienić nazwy plików, działać na poziomie aplikacji i systemu operacyjnego, wszystko to wykorzysta standardowe biblioteki , które zostaną wywołane bezpośrednio, jeśli atakujący wysyłać binarne pliki wykonywalne. Możesz nawet rozważyć zaciemnienie wszystkich standardowych bibliotek! (W tym system plików, protokoły sieciowe ...)

  • Gdy używasz niezmodyfikowanego jądra, będą one używać standardowych zmiennych i przestrzeni nazw. Będziesz więc musiał stworzyć zaciemnioną wersję jądra ...

... Następnie połącz wszystko razem!

Cóż, nawet jeśli wszystko jest zaciemnione, aplikacja będzie musiała radzić sobie z Internetem. Maskowanie nie zapobiegnie błędom konceptualnym!

Niewidzialność Jeśli nie na wszystkich poziomach, nie poprawi bezpieczeństwa.

Pełna niejasność nie jest tak naprawdę możliwa ze względu na potrzebę korzystania z standardowe protokoły, aby móc radzić sobie z Internetem.

Pomyśl o licencji

Jeśli planujesz rozpowszechniać GNU / Linux, musisz udostępniać kod źródłowy zgodnie z opisem w OGÓLNA LICENCJA PUBLICZNA GNU GPLv3 i / lub OGÓLNA LICENCJA PUBLICZNA LESSER GNU LGPLv3 (w zależności od aplikacji i używane librairies). Będzie to oznaczało publikację metody zaciemniania wraz z każdym dystrybuowanym produktem.

Ściśle odpowiadając na Twoje dwa pytania:

Jestem ekspertem, ale z bardzo małe skupienie. Pracując nad wieloma różnymi infrastrukturami małych firm, kilka lat temu dokonałem pewnych wyborów. Ewolucja i historia wydają się potwierdzać moje wybory, ale to tylko mój osobisty punkt widzenia.

Czy zaciemnianie systemu operacyjnego, jak opisano, jest szeroko stosowane i po prostu się z nim nie spotkałem?

Naprawdę nie wiem, w której proporcji zaciemnianie jest szeroko używane, ale nie używam zabezpieczenia przez zaciemnienie i nie zalecamy.

Jeśli nie jest powszechnie używany, jakie są praktyczne lub techniczne bariery w użyciu?

Żadnych barier! Po prostu to przynosi efekt przeciwny do zamierzonego. Koszt czasu stał się gigantyczny, a poprawa bezpieczeństwa to przynęta.

Oczywiście, kilka minimalnych rzeczy jest do zrobienia:

  • Nie uruchamiaj ssh serwer, jeśli nie jest potrzebny
  • Nie instaluj sudo , używaj poprawnych uprawnień , grup i spójnej struktury.
  • Dbaj o aktualność swojej globalnej infrastruktury !!!”

Mała próbka , gdy światło przechodzi przez mrok

  • Zabezpieczanie ssh : dwukierunkowe.

    • Przenieś port ssh z 22 na 34567

      • lekkie i szybkie, ale

      jeśli napastnik je znalazł, mógłby użyć łagodnej, brutalnej siły przeciwko temu portowi przez długi czas, aż użytkownik końcowy je odkryje.

    • Zainstaluj zaporę ogniową

      • Silniejszy, wymaga większej wiedzy, ale.

      Bardziej bezpieczny, ale aktualny.

To tak naprawdę nie odpowiada na pytanie @OP's.Specjalnie odłożyli na bok systemy utrzymywane przez ludzi, więc argumenty dotyczące użyteczności tak naprawdę nie mają zastosowania.
Nawet system osadzony mógłby być utrzymywany, edytowany i aktualizowany.
Oczywiście.I założyłbym, na podstawie pytania OP, że te ręcznie obsługiwane systemy zostaną wykluczone.W szczególności OP wzywa do tego typu zaciemniania systemów „zarządzanych przez automatyzację”.Oczywiście ludzie są zaangażowani w zarządzanie całym systemem na pewnym poziomie, ale rozumiałem to jako systemy, które są bezpośrednio zarządzane przez automatyzację;lub inaczej mówiąc, narzędzia automatyzacji odciągają zarządzanie do punktu, w którym zaciemnianie na poziomie systemu operacyjnego byłoby nieistotne.
@Nick2253 Dodałem trochę więcej z mojego punktu widzenia.
Matthew
2019-12-18 23:57:23 UTC
view on stackexchange narkive permalink

Czy całe klasy ataków nie byłyby praktycznie bezużyteczne, gdyby system operacyjny miał polecenia ha7TrUO i RRI6e29 zamiast sudo i ls? Wyobraź sobie hakera, który w jakiś sposób uzyskał zdalny dostęp do roota - co w ogóle zrobią, jeśli nie znają żadnych poleceń?

Lepszą alternatywą byłoby po prostu nie instalowanie tych poleceń w pierwsze miejsce. Nie wierzę, że faktycznie potrzebujesz powłoki do uruchomienia jądra Linuksa, chociaż sugeruje to, że twój proces startowy jest czymś innym niż sysV-init lub systemd.

Jak inni zauważyli jednak, że jest to kompromis między bezpieczeństwem a łatwością rozwoju. Niestety, wielu producentów urządzeń bardziej przejmuje się tym ostatnim niż pierwszym.

Implementacja byłaby dość łatwa dla kompilatorów. Weźmy najprostszy przypadek „zmień nazwę tej funkcji i wszystkich jej wywołań”. Możesz nadać kompilatorowi systemu operacyjnego i kompilatorowi aplikacji te same losowe nazwy, a one będą mogły rozmawiać ze sobą. Ale nawet jeśli aplikacja ma słabe zabezpieczenia i jest podatna na iniekcję bash, takie ataki byłyby bezowocne.

Nie jestem pewien, czy potrzebujesz pomocy kompilatora pod adresem wszystko. Myślę, że można to osiągnąć głównie poprzez modyfikację linkera ¹, aby zastosować randomizację do wszystkich nazw symboli. Prawdopodobnie wystarczyłoby samo zastosowanie funkcji skrótu z solą znaną tylko producentowi. Nie jestem pewien, czy potrzebujesz do tego kodu źródłowego, tj. myślę , że możesz zastosować zniekształcenie do już skompilowanego kodu.

(¹ Myślę, że to coś w rodzaju kłamstwo. Być może będziesz musiał zmodyfikować kod obiektowy, aby zastąpić nazwy symboli, ale jest to nadal bardziej podobne do poziomu asemblera, czyli a) nie wykonujesz wszystkich trudnych bity kompilacji C / C ++ / etc. kod i b) nie potrzebujesz C / C ++ / jakiegokolwiek kodu źródłowego. OTOH Nie jestem pewien, czy w ogóle możesz to zrobić, jeśli kod twojego urządzenia jest podobny do języka Python.)

Nadal istnieje możliwość przeprowadzenia inżynierii wstecznej procesu, a ponadto może to naruszyć GPL² (zwłaszcza GPLv3), chyba że wydasz sól, która zniweczy cel.

W rzeczywistości „z powodu GPL” jest prawdopodobnie głównym powodem, dla którego tego nie widzisz; byłoby trudne do zaimplementowania w sposób, który byłby faktycznie użyteczny, gdyby nie uczynić każdego urządzenia innym . OTOH, to przynajmniej oznaczałoby, że atakujący mogą atakować tylko określone urządzenia, a nie mogą wykorzystać lukę na „ dowolnym urządzeniu z systemem Linux xyz”.

(² Dla uproszczenia, W całym tekście będę po prostu używać „GPL”, ale zauważ, że generalnie dotyczy to nawet rzeczy na L GPL.)

To powiedziawszy, zauważ, że GPL nie wymaga od ciebie opublikować sól, ponieważ „zmodyfikowałeś” źródła. Jeśli losowość nazwy symbolu ma miejsce w czasie kompilacji, nie zmodyfikowałeś źródeł. Powodem, dla którego musielibyście opublikować sól, jest to, że GPL wymaga, aby użytkownicy mogli zastępować własne wersje biblioteki na GPL, czego nie mogą zrobić, jeśli nie znają soli. (Jak już wspomniano, możesz się z tego wyrwać dzięki GPLv2, ale efekty techniczne są podobne do „uruchamiania tylko podpisanego oprogramowania”, do którego GPLv3 zostało specjalnie napisane).


Ostatecznie , może być tutaj pewna zaleta, ale nie zamierzasz uczynić żadnego konkretnego systemu szczególnie bezpieczniejszym (dobrze wiadomo, że „bezpieczeństwo przez zaciemnienie” generalnie nie jest zabezpieczeniem w ogóle). To, co możesz osiągnąć, to utrudnić namierzenie wielu systemów za pośrednictwem jednego wektora.

„Myślę, że można by zastosować zniekształcenie do już skompilowanego kodu”.To bardzo interesująca myśl, która wpłynęłaby na wiele innych odpowiedzi tutaj udzielonych.Nie jestem zaznajomiony z ideą oddzielenia linkowania od kompilacji, przynajmniej nie poza salami wykładowymi na uniwersytecie.
Archis Gore
2019-12-20 06:26:17 UTC
view on stackexchange narkive permalink

Uczciwe ujawnianie informacji: jestem dyrektorem technicznym w firmie, która właśnie to tworzy. Zrezygnuj z tego wszystkiego, co chcesz.

Rzeczywiście JEST możliwe całkowite zbudowanie jądra systemu, sterowników urządzeń, pakietów, całego stosu NA hosta, wiele razy dziennie i może być całkiem skuteczny. Dokładnie to robimy i pomagamy w tym naszym klientom. Nie jesteśmy jedynymi - możemy wywnioskować, że przynajmniej Google robi to również dla wszystkich swoich maszyn (wkrótce pojawią się informacje).

Jeśli miałbyś możliwość odbudowania dla każdego komputera od podstaw, co czy możesz coś zmienić?

Projekt Kernel Self Protection Project już na to pozwala poprzez losową zmianę kolejności struktur jądra: https://lwn.net/Articles/722293/. Ten artykuł wskazuje również na słynną giełdę, na której Linus Torvalds nazywa to teatrem bezpieczeństwa, ale autor projektu (który pracuje w Google) komentuje: „No cóż, Facebook i Google nie publikują swoich kompilacji jądra. :)”

Prowadzi to do wniosku, że przynajmniej Google to robi i uważa to za przydatne. Czy możemy zrobić WIĘCEJ typów mieszania na zamkniętym zestawie? Na najbardziej podstawowym poziomie, dlaczego wirus Windows nie działa na Linuksie lub Macu? Ponieważ formaty są różne. Pod spodem jest wszystko x86, a jednak to nie to samo. A co by było, gdyby dwa Linuksy różniły się w podobny sposób? Windows vs Linux nie jest „zaciemnianiem” tylko dlatego, że nie mamy wielu sposobów, aby Linux był tak inny, jak Windows. Ale to nie jest niemożliwe i nie jest nawet takie trudne. Zastosuj podejście KSPP i zastosuj je do wywołań systemowych, a następnie ponownie skompiluj wszystko na wierzchu względem tych wywołań systemowych. To będzie piekielnie trudne do złamania - przynajmniej nie w przelotny sposób.

Twoje pytanie dotyczyło jednak zmiany nazw symboli (nazw plików wykonywalnych, bibliotek itp.) Ma to dwa aspekty: (a) to to przydatne? (b) Czy można to zrobić niezawodnie?

Szukaliśmy sposobu na rozwiązanie problemu wstrzyknięć kodu PHP raz na zawsze. Wbrew temu, w co wierzy HackerNews, wstrzyknięcia kodu PHP nie są rozwiązanym problemem poza internetowymi forami dyskusyjnymi. Prawdziwi programiści PHP, administratorzy i użytkownicy są narażeni na ciągłą liczbę wstrzyknięć kodu.

Dlatego postanowiliśmy wypróbować Polyscripting (Open Source na licencji MIT): https: // github. com / polyverse / polyscripted-php

Udostępniamy to publicznie w celu uzyskania opinii i prowadzimy dwie witryny internetowe, polyscripted.com i nonpolyscripted.com, które robią dokładnie to, czego można się spodziewać na podstawie ich nazw. Zatrudniliśmy również pentestry, aby spróbowali to złamać.

A ja dopiero zaczynam eksperymentować z wykonywalnymi, współdzielonymi bibliotekami i zmienianiem nazw eksportowanych symboli w zamkniętym zestawie (na przykład w kontenerze docker). Osobiście nie sądzę, aby to dodało tyle wartości, ale czy to trochę zwiększy? Chyba tak. Sprowadza się to do kosztów. Jeśli możesz uzyskać niewielką wartość za jeszcze mniejszy koszt, dlaczego nie zrobić tego po prostu? Właśnie dlatego wszyscy mamy ASLR - nie jest to do końca najlepsza obrona od czasu krojonego chleba, ale jeśli masz już relokowalny kod i i tak zamierzasz go zmienić, dlaczego NIE przesuwać go do granic możliwości i nie wybierać losowo?

Krótko mówiąc, podejście, które opisujesz, jest stosowane przez wiele osób (w tym Google, Facebook, jądro Linuksa itp.), a także wielu naukowców z dziedziny Moving Target Defense i kilka firm jak nasi, którzy próbują uczynić go trywialnie użytecznym, jak ASLR.

Byłoby to poprawione, gdyby zredagowano go tak, by brzmiał mniej jak notatka prasowa, a bardziej ogólną odpowiedź z założeniem „mamy doświadczenie w robieniu tego”.Czy możesz skupić się bardziej na koncepcji, a mniej na swojej firmie?
yaroslaff
2019-12-24 17:30:53 UTC
view on stackexchange narkive permalink

Powiedziałbym, jak widzę to z punktu widzenia hakera.

Zdecydowanie, jeśli zmienisz nazwy wszystkich narzędzi - sprawi to, że wszystko będzie dla mnie znacznie trudniejsze i mniej wygodne, ale co mogłem zrobić?

  1. Jeśli mam już dostęp do powłoki w systemie, po prostu załadowałbym albo busybox (wszystkie podstawowe narzędzia w jednym pliku binarnym), albo pełny zestaw plików binarnych, których potrzebuję do podstawowych operacji.

  2. Aby dalej eskalować uprawnienia, być może będę musiał poszukać plików binarnych suid-root, a jest ich tylko kilka (sudo, mount itp.). Haker nie może przesyłać takich plików (chyba że jest już rootem). Mój prosty, mały system linux ma tylko 24 pliki binarne suid. Bardzo łatwo jest wypróbować każdą z nich ręcznie.

Jednak zgadzam się, że utrudniłoby to włamanie się do tego pudełka. Używanie (hakowanie) tego systemu byłoby trudne, ale możliwe. A haker pracuje w systemie przez godzinę, dzień lub miesiąc ... ale administrator / użytkownik może pracować w systemie latami i nie może zapamiętać nazw ha7TrUO i RRI6e29. Może nikt nawet nie spróbuje włamać się do systemu, ale admin będzie cierpiał każdego dnia.

Ale ... jeśli sprawisz, że bezpieczeństwo będzie zbyt wysokie, ale niewygodne dla użytkownika / administratora - często tak naprawdę obniżasz bezpieczeństwo. Podobnie jak w przypadku wymuszania skomplikowanych haseł składających się z ponad 20 znaków - najprawdopodobniej hasła zostaną zapisane na karteczkach samoprzylepnych na monitorze. Jeśli sprawisz, że system będzie tak zaciemniony - dobrym użytkownikom będzie bardzo ciężko nad nim pracować. I będą musieli zrobić kilka rzeczy, aby ułatwić sobie życie. Na przykład mogą przesłać swój plik binarny busybox. Tymczasowe. I zapomną o tym lub zostawią to tam celowo (ponieważ planują użyć go trochę później).

galaktycznyseba
2019-12-19 15:02:56 UTC
view on stackexchange narkive permalink

To się faktycznie dzieje, ponieważ połączenia ssh są szyfrowane. Zmiana nazw niektórych podstawowych plików binarnych nie daje nic więcej niż to. Spowodowałoby też sporo chaosu: np. wszelkie skrypty opierające się na tych narzędziach stają się bezużyteczne lub będziesz musiał mieć jakiś rodzaj „deobfuskatora” proxy, który z pewnością stanie się wektorem ataku. Jednak widziałem niektóre serwery na wolności, które nie pozwalają na logowanie jako root, zmuszając zamiast tego do używania sudo. Nazwy użytkowników sudoers pozostają w pewnym stopniu tajemnicą. Nie jestem pewien, czy to jest bezpieczne, ale nie jestem ekspertem.

Dusty
2019-12-20 20:12:36 UTC
view on stackexchange narkive permalink

Dlaczego nie wszystkie drzwi mają dziesięć otworów od klucza, z których tylko jedna faktycznie działała na klucze lub wytrychy? Odpowiedź: przeważnie kłopoty nie są warte dodatkowych dziesięciu sekund czasu złodzieja.

Gdyby istniały miliony unikalnych utworzonych osobno kodu źródłowego systemy operacyjne, zaciemnienie może być powszechne. Jednak ze względów praktycznych mamy około czterech unikalnych baz kodu w powszechnym użyciu - wszystkie informacje o wycieku na swój temat według czasu zdarzenia, a dla kilku niskopoziomowych funkcji systemu operacyjnego, w których producenci chipów dają przepisane sekwencje kodów bitowych maszyny, aby aktywować lub uzyskać dostęp do pewnych funkcji procesora, oni wszystkie prawdopodobnie mają krótkie sekwencje zawierające dokładnie ten sam kod.

Peter - Reinstate Monica
2019-12-18 22:42:25 UTC
view on stackexchange narkive permalink

Jeśli zaciemnisz system GNU / Linuksa na urządzeniu IoT rozpowszechnianym publicznie, będziesz zmuszony opublikować swój kod, ponieważ jest objęty GPL, lub wycofać urządzenie z rynku.

Ukrywanie oprogramowania na licencji GPL - strategia oparta na tajemnicy - nie jest dobrym pomysłem.

Nie wiem, dlaczego jest to odrzucane; ale jeśli obiekcje są w duchu komentarzy Charlesa: po prostu zmiana nazwy podstawowych narzędzi nie zadziała (dla prostego startu będziesz musiał edytować skrypty inicjujące GPL). Podejrzewam, że będziesz musiał ponownie skompilować wiele plików binarnych, które współdziałają z innymi plikami binarnymi, takimi jak sterownik kompilatora gcc, ld.so, sh / bash itp. Wszystkie skrypty powłoki i wiele plików konfiguracyjnych muszą znać nazwy i lokalizacje pliki binarne, więc trzeba je zmienić.

Wszystko to jest objęte licencją GPL i będziesz zmuszony opublikować zmienione źródła, skrypty i pliki konfiguracyjne, co udaremni wysiłki zaciemniania. Jeśli używasz urządzenia tylko w domu, nie ma obowiązku publikowania źródeł, ale jednocześnie sprawa zaciemniania jest znacznie słabsza: będziesz frustrować głównie siebie.

Z pewnością nie musisz publikować swoich nazw plików - i nigdy nie widziałem, aby ktokolwiek twierdził, że na przykład autor publikujący `someprog.tar.gz.sig` (nawet jeśli istnieją inni właściciele praw autorskich) jest zobowiązany do publikowaniaswój prywatny klucz podpisu, aby umożliwić innym odtworzenie podpisu.Takie twierdzenie byłoby wyśmiewane na sali sądowej.
... ponadto, jeśli załatasz coś do użytku * tylko we własnym centrum danych *, nie musisz w ogóle publikować tej poprawki;to tylko dystrybucja wyzwala wymagania licencyjne.
@CharlesDuffy Jeśli zmienisz źródło jądra Linuksa i narzędzi GNU oraz skrypty powłoki na licencji GPL (co należy zrobić, jeśli dobrze rozumiem OP), skompiluj je i umieść na urządzeniach wbudowanych, które wysyłasz do swoich klientów, z pewnościąmusisz opublikować swój kod źródłowy, który ujawni wszystkie mozolnie zaciemniane wywołania systemowe i pliki binarne gnu.Nie mówiłem o podpisywaniu kluczy ani o OP, jak sądzę.Nie musisz publikować zmienionych nazw plików, prawda;ale każdy skrypt lub program * używający *, którego nazwa została zmieniona na plik binarny lub skrypt, musi zostać zmieniony, a jego źródło zostanie opublikowane.
@CharlesDuffy Jeśli nazwa pliku binarnego lub skryptu zostanie po prostu zmieniona, prawdopodobnie nie będzie trzeba publikować nowej nazwy;ale każdy * dzwoniący * będzie musiał zostać zmodyfikowany.Jeśli program lub skrypt nigdy nie jest używany na urządzeniu wbudowanym, prawdopodobnie warto w pierwszej kolejności nie umieszczać go w dostarczanym obrazie.
Pewnie.„Wysyłka do klientów” to coś innego niż „wykorzystanie wewnętrzne”.Coś można wdrożyć na szeroką skalę, nawet jeśli nie jest szeroko wdrożone * i wysłane do klientów zewnętrznych *.
@CharlesDuffy Pytanie dotyczy w szczególności urządzeń IoT - „zabezpieczenia sieci, […] serwera lub kamery lub niania”, co oznacza dystrybucję.
Tak - na pewno dam ci zakres w aparacie lub elektronicznej niani.
a) nie musisz wysyłać źródła, dopóki nie zostaniesz o to poproszony.b) nawet jeśli to Ty go wysłałeś, dlaczego odbiorca miałby go przekazać hakerowi?
@ThomasWeller (a) Haker żąda tego.(b) Przekazujesz to hakerowi, ponieważ o to poprosił.
Jeśli oryginalny klient nie zażąda źródła, możesz poinformować klienta, że system jest już zagrożony.Gdyby to nie zostało naruszone, nigdy nie miałby możliwości przeczytania informacji o prawach autorskich GPL, a tym samym nigdy nie miałby możliwości zażądania źródła.
@ThomasWeller Nie jest niczym niezwykłym, że osoby trzecie otrzymują informacje o podejrzewanych naruszeniach GPL i prowadzą dochodzenie.Przypuszczam, że można wykryć, że Linux działa na urządzeniu bez hakowania.Istnieją trudniejsze ataki kanałem bocznym niż to.Chodziło mi jednak o to, że szeroko rozpowszechnione urządzenie z nieujawnionym Linuksem zostanie odkryte i będzie zmuszone do opublikowania źródeł lub wycofania go z rynku.Maskowanie Gnu / Linuksa dla IoT nie jest dobrym pomysłem.
Chociaż jest to prawna, związana z licencją odpowiedź i dotyczy szczególnie Linuksa i innego oprogramowania z możliwością kopiowania, Unix to nie Linux (zwykle), a ta odpowiedź nie dotyczy ogólnie systemów operacyjnych, które wydają się być głównymIstota pytania (chociaż podaje konkretnie Unix jako przykład).Infosec i legalność to nie to samo.
@Ghedipunk OP powiedział „gdy tylko napastnicy dowiedzą się, że serwer, kamera lub niania działa ** linux ...”. ** Byłbym również zdumiony, gdybyś mógł zaciemnić system operacyjny o zamkniętym kodzie źródłowym, ponieważ jak wyjaśniłem,przynajmniej trzeba załatać ld.so lub jego odpowiednik i prawdopodobnie wiele innych procesów.
Ech, tylko próbuję zasugerować, dlaczego otrzymałeś 5 głosów przeciw: rozwiązujesz pytanie zabezpieczające z punktu widzenia licencji.
@Ghedipunk PO nie przemyślał, co pociąga za sobą ich pomysł.To nie jest opłacalne.Problemy prawne wynikają z faktu, że potrzeba znacznie więcej niż tylko `mv / bin / nib && mv / nib / bash / nib / hsab` itd.
Nie sądzę, aby GPL było w tym wszystkim czynnikiem.A nawet gdybyś musiał opublikować wynik, nie pokonałoby to ochrony.Bo kto, przy zdrowych zmysłach, zakodowałby na stałe nowe losowe nazwy plików?Utworzyłbyś funkcję tłumaczenia, tak jak *** każdy *** proces zaciemniania.Nie musisz publikować wyniku na GPL, a nawet jeśli to zrobiłeś, czy publikujesz każdy indywidualny losowy wynik?Nie, a nawet gdyby tak było, osoba atakująca musiałaby znaleźć i ustalić, z którą wersją pracuje.
user253751
2019-12-19 23:43:16 UTC
view on stackexchange narkive permalink

Kompilatory (a właściwie konsolidatory) już to robią. Jest to jeden z głównych powodów, dla których inżynieria wsteczna jest trudna.

W swoim kodzie źródłowym możesz mieć następujące funkcje:

  void print_hello () {printf ("Witaj! \ N ");} void print_hello_twice () {print_hello (); print_hello ();}  

Oto jak wyglądają po wkompilowaniu do programu:

  0x400582 push rbp0x400583 mov rbp, rsp0x400586 mov edi, 0x4006340x40058b zadzwoń 0x4004900x400590 nop0x400591 pop rbp0x400592 ret0x400593 push rbp0x400594 mov rbp, rsp0x400597 zadzwoń 0x4005820x40059c zadzwoń 0x4005820x4005a1 nop0x4005a2 pop rbp0x4005a3 rbp print, rsp0x400597 zadzwoń 0x4005820x40059c zadzwoń 0x4005820x4005a1 nop0x4005a2 pop rbp0x4005a3 ret  widzisz teraz   0x400582 ,  printf  nazywa się teraz  0x400490 , a  print_hello_twice  nazywa się teraz  0x400593 . Wszystkim wywołaniom nadano również te same losowe nazwy, dzięki czemu funkcje mogą wywoływać się nawzajem.  

Jednak linker może to zrobić tylko w programie, ponieważ łączy jeden program na raz .

Kompilacja nie jest zaciemnianiem: [zaciemnianie i dekompilacja] (https://jonskeet.uk/csharp/obfuscation.html), [zaciemnianie plików binarnych opartych na języku C w celu uniknięcia dekompilacji] (https://stackoverflow.com/a/2273676/1765658).
@F.Hauri Robi to, o co prosi pytający, prawda?Ale tylko w granicach jednego programu.
O to * nie * prosi OP.Twoja odpowiedź jest taka, że „to już jest zrobione”, co, jeśli w rzeczywistości jest prawdą, podważałoby pytanie.Kontekst jest taki: „Mówię o zmianie nazw plików binarnych i ścieżek plików w samym systemie operacyjnym” oraz o poleceniach wymienionych w poście.


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...