Pytanie:
Czy trzeba być dobrym programistą, aby przeprowadzić bezpieczną analizę kodu źródłowego?
Krishna Pandey
2015-11-25 00:15:00 UTC
view on stackexchange narkive permalink

Osoba ma dobrą wiedzę na temat ogólnych zagrożeń bezpieczeństwa, wie, jakie są 10 najczęstszych luk w zabezpieczeniach OWASP i posiada certyfikaty, takie jak CEH, CISSP, OSCP itp., które są bardziej testowane na czarnej skrzynce. Ponadto zapoznał się z Przewodnikiem po testowaniu OWASP, Przewodnikiem przeglądu kodu itp. Oraz ściągami. Czy będzie w stanie przeprowadzić bezpieczny przegląd kodu bez znajomości wielu języków programowania i opanowania ich?

Nie będzie w stanie przeprowadzić dokładnego przeglądu kodu zabezpieczającego, jeśli nie będzie wiedział, w jakich językach został napisany kod przeznaczony do przeglądu.
Proszę nie pisać w trzeciej osobie: P
Czy potrafisz wykryć i zrozumieć wszystkie exploity na http://www.underhanded-c.org/ (które są dość krótkie i szczegółowo wyjaśnione)? To jeden język.
@drewbenn - Ładna witryna, o której wspomniałeś. # NᴏᴠɪᴄᴇIɴDɪsɢᴜɪsᴇ :)
@drewbenn Kolejnym świetnym przykładem jest http://escape.alf.nu/ - niezwykle trudno jest zapobiec stosowaniu przez XSS oczyszczania. Większość zadań wymaga dokładnej znajomości sposobu działania i interakcji JavaScript i HTML.
„Aby zrozumieć kod kogoś innego, musisz być dwa razy lepszy niż przy pisaniu go od zera”.
Jeśli temat „przeglądu bezpiecznego kodu” nie obejmuje wielu języków programowania, osoba ta nie musi też opanować wielu języków programowania tylko po to, by je opanować. Znajomość języka (języków) użytego w aplikacji powinna wystarczyć.
Nawet bycie dobrym programistą prawdopodobnie nie wystarczy do przeprowadzenia dokładnej, bezpiecznej analizy kodu pod kątem kodu próbującego celowo coś zaciemnić. Trzeba być świetnym i cierpliwym programistą.
Czy kod, który ma zostać zbadany, jest prawdopodobnie napisany w Brainf * ck? W tym przypadku nie odważyłbym się rozpoznać poprawnej implementacji nawet silni
Należy wziąć pod uwagę, że znaczna część tej pracy jest niesamowicie żmudna i wielu „MŚP” trudno jest skupić uwagę na tych kwestiach. W tej dziedzinie jest wystarczająco dużo miejsca dla ludzi, którzy choć nie są Einsteinami, są metodyczni i bardzo szczegółowi w swojej pracy, być może pomagając koordynować pracę innych „ekspertów”.
Siedem odpowiedzi:
Cort Ammon
2015-11-25 03:11:04 UTC
view on stackexchange narkive permalink

Zależy to od tego, co rozumie się pod pojęciem „bezpieczna analiza kodu źródłowego”. Można zrobić wszystko, co mu się podoba. Przypuszczam, że problem polega na tym, że ktoś inny poprosił o coś, co nazywa się „bezpieczną analizą kodu źródłowego” i można się zastanawiać, dlaczego nie można się do tego kwalifikować.

W wielu przypadkach taką analizę musi przeprowadzić ekspert merytoryczny (SME). W końcowym produkcie MŚP dostarczy oświadczenie zasadniczo mówiące „Deklaruję ten kod jako bezpieczny”, ze zrozumieniem, które jest głębsze niż stwierdzenie „Szukałem kilku znanych wzorców i nie znalazłem żadnych problemów”.

Gdybyś był zainteresowany autentycznym tłumaczeniem chińskiej filozofii, czy zaufałbyś osobie, która dużo znała filozofię i miała kilka ściągawek do jej rozszyfrowania, ale tak naprawdę nie znała chińskiego ?

Świetnym przykładem, który przychodzi na myśl, jest błąd, który uderzył w silnik SQL. Wybaczcie, że nie mam nazwy silnika, ani wersji, żebyście mogli zweryfikować, od tego czasu mam problemy ze znalezieniem. Jednak błąd był przejmujący. Błąd był w kodzie, który wyglądał tak:

  int storeDataInCircularBuffer (Buffer * dest, const char * src, size_t length) {if (dest->putPtr + length < dest->putPtr) return ERROR ; // zapobiegaj przepełnieniu bufora spowodowanemu przepełnieniem if (dest->putPtr + length > dest->endPtr) {... // zapisz dane w dwóch częściach return OK; } else {... // zapisz dane w jednej części return OK; }}  

Ten kod miał być częścią bufora cyklicznego. W buforze kołowym po osiągnięciu końca bufora zawijasz się. Czasami zmusza to do podzielenia przychodzącej wiadomości na dwie części, co jest w porządku. Jednak w tym programie SQL byli zaniepokojeni przypadkiem, w którym length może być wystarczająco duży, aby spowodować przepełnienie dest->putPtr + length , stwarzając okazję do przepełnienia bufora ponieważ następne sprawdzenie nie zadziała prawidłowo. Dlatego wprowadzili test: if (dest->putPtr + length < dest->putPtr) . Ich logika była taka, że ​​jedynym sposobem, w jaki to stwierdzenie może kiedykolwiek być prawdziwe, jest wystąpienie przepełnienia, a więc wyłapujemy przepełnienie.

Stworzyło to lukę w zabezpieczeniach, która faktycznie została wykorzystana i musiała zostać załatana. Czemu? Cóż, bez wiedzy oryginalnego autora, specyfikacja C ++ deklaruje, że przepełnienie wskaźnika jest niezdefiniowanym zachowaniem, co oznacza, że ​​kompilator może zrobić wszystko, co chce. Tak się złożyło, że kiedy oryginalny autor testował to, gcc faktycznie wyemitował poprawny kod. Jednak kilka wersji później, gcc miał optymalizacje, aby to wykorzystać. Okazało się, że nie ma zdefiniowanego zachowania, w którym instrukcja if mogłaby przejść test i zoptymalizowała go!

Zatem dla W kilku wersjach ludzie mieli serwery SQL, które miały exploita, mimo że kod miał jawne kontrole, aby zapobiec temu exploitowi!

Zasadniczo języki programowania są bardzo potężnymi narzędziami, które mogą z łatwością gryźć programistę. Analiza, czy tak się stanie, wymaga solidnych podstaw w danym języku.

(Edycja: Greg Bacon był na tyle świetny, aby wykopać ostrzeżenie CERT dotyczące tego: Uwaga o luce w zabezpieczeniach VU # 162289 kompilatory C może po cichu odrzucić niektóre kontrole otaczające., a także ten powiązany. Dzięki Greg!)

Komentarze nie służą do rozszerzonej dyskusji; ta rozmowa została [przeniesiona do czatu] (http://chat.stackexchange.com/rooms/32179/discussion-on-answer-by-cort-ammon-does-one-need-to-be-a-good- programista do perf).
Tak. Powinienem zauważyć, że bez znajomości języka analityk może nawet nie wiedzieć, co robi programista (nie mówiąc już o znalezieniu wszystkich problemów związanych z bezpieczeństwem) lub dlaczego. Niektóre języki mają kilka bardzo interesujących funkcji, które nie są oczywiste, jeśli nie znasz dobrze języka. Miejmy nadzieję, że większość takich rzeczy miałaby komentarze dla analityka, ale nie liczyłbym całkowicie na komentarze, które cię poprowadzą.
Tego rodzaju zachowanie kompilatora zawsze mnie zastanawia: biorąc pod uwagę, że kompilator * wie *, że istnieje niezdefiniowane zachowanie i że w 100% niezdefiniowane zachowanie jest czymś, czego nie chcesz w swoim kodzie, kompilator nie mógłby ostrzec, robiąc coś takiego? Może to zapobiec mnóstwu błędów ...
@Bakuriu: W C ++ takie przypadki „nie mogą się zdarzyć” _rutynowo_ pojawiają się, bez żadnego błędu, podczas specjalizacji szablonów lub optymalizacji wbudowanych wywołań funkcji ze stałymi parametrami - iw takich przypadkach optymalizacja ich z dala od komputera może być absolutnie kluczowa dla wydajności. Byłoby dość trudno kompilatorowi rzetelnie rozróżnić między „programista napisał coś nieokreślonego” a „programista użył prawidłowej funkcji ogólnej w prawidłowy sposób, dla którego mogę wygenerować lepszy kod niż przypadek ogólny” i zgłosić ostrzeżenia tylko w pierwszym przypadku .
Mark Buffalo
2015-11-25 00:34:21 UTC
view on stackexchange narkive permalink

Myślę, że aby odnieść sukces, trzeba być dobrym programistą, więc polecam zostać nim. Może być wiele rzeczy, których brakuje w Twoim zestawie narzędzi / skanerze. Szczerze mówiąc, nie polecam polegać całkowicie na narzędziach skanujących twój kod, ponieważ exploity ciągle się zmieniają, a ktoś mógł zakodować w sposób, w którym skaner nie może wykryć luk.

Możliwość przechodzenia poprzez kod i zobaczenie, jak to działa, a jak nie powinno działać, jest fundamentem dla bezpiecznego tworzenia oprogramowania. Posiadanie wiedzy programisty o problemach z bezpieczeństwem jest dokładnie tym, czego chcesz, jeśli chodzi o stworzenie solidnego produktu, i dokładnie tym, czego potrzebujesz podczas przeglądu kodu.

Chociaż tak, możesz wskazać i kliknąć i sprawdzić luki w zabezpieczeniach z twoimi skanerami i zestawami narzędzi nie będzie to zbyt efektywne w ogólnym planie. Czy wiesz, o ile skuteczniejszy byłbyś, gdybyś sam mógł przyjrzeć się kodowi i określić, czy jest dobry, czy zły? Waaaay lepiej.

Nie próbuj przechodzić sprawdzania bezpiecznego kodu, jeśli nie wiesz, co robisz, ale nie rezygnuj od razu z pomysłu, jeśli uważasz, że nie znajdujesz się w punkcie, w którym możesz zrobić dobrą recenzję. Polecam spróbować się uczyć, tworząc własne makiety przeglądów bezpiecznego kodu i przeglądając go kilka razy, aby upewnić się, że wszystko jest w porządku.

Jednak zdecydowanie powinieneś nauczyć się nie tylko kodować, ale także dobrze kodować.

Należy również zauważyć, że skanery skanują tylko w poszukiwaniu znanych luk / wektorów ataków
John Deters
2015-11-25 00:34:41 UTC
view on stackexchange narkive permalink

Wątpliwe jest, aby ekspert ds. bezpieczeństwa był skuteczny w przeprowadzaniu analizy kodu źródłowego, nie będąc jednocześnie wykwalifikowanym programistą. Wiele luk jest wynikiem technicznych lub składniowych praktyk kodowania, które są nadużywane w jakiś drobny sposób. Brakujący średnik, znak równości zamiast podwójnego równości, granica tablicy, która jest podwójnie zdefiniowana pierwszego dnia, ale jedna wersja jest zmieniana w kolejnym wydaniu, brakujące nawiasy, wycieki pamięci - wszystko to prowadziło do luk w zabezpieczeniach. Doświadczony programista może je zobaczyć, ale początkujący prawdopodobnie nie.

To, co powinien robić Twój ekspert ds. Bezpieczeństwa, to zachęcanie inżynierów do korzystania z narzędzi do automatycznego skanowania, takich jak statyczne analizatory kodu, testery Fuzz i dynamiczne weryfikatory aplikacji . Pomóż zespołom inżynierów zrozumieć walidację danych wejściowych, ataki iniekcyjne, granice zaufania. Zbuduj świadomość, że defekty zabezpieczeń wymagają odpowiedniego uszeregowania pod względem ważności i szybkiego usunięcia. Zaplanuj i przeprowadź testy piórkowe. A co najważniejsze, poproś inżynierów o dokonanie przeglądu kodu pracy innych.

Tak, ekspert ds. Bezpieczeństwa powinien umieć odczytać kod, ale to nie znaczy, że ma kwalifikacje do pełnienia funkcji arbitra bezpieczeństwo kodu.

Steffen Ullrich
2015-11-25 01:30:12 UTC
view on stackexchange narkive permalink

To zależy od Twoich oczekiwań. Luki w zabezpieczeniach spowodowane problemami projektowymi (np. Brak ochrony CSRF, tylko podstawowa implementacja protokołu itp.) Można prawdopodobnie znaleźć, jeśli tester ma głęboką wiedzę na temat koncepcji bezpieczeństwa, nawet jeśli jest w stanie śledzić przepływ kodu tylko bez posiadanie głębszej znajomości konkretnego języka programowania.

Ale problemy z bezpieczeństwem specyficzne dla języka, takie jak przepełnienia bufora, błędy typu off-by-one, obsługa Unicode lub \ 0 , problemy spowodowane przez rozmiar typów danych oraz ze znakiem kontra bez znaku itp. nie zostanie znaleziony, jeśli tester nie ma głębszej wiedzy o języku, złych praktykach i typowych wzorcach braku bezpieczeństwa charakterystycznych dla tego języka. Weźmy na przykład historię luk w Javie, gdzie nawet programiści specjalizujący się w Javie nie zauważyli dziur, które wybili w piaskownicy języka, dodając refleksję do języka i tylko zewnętrzni eksperci z głębokim zrozumieniem język wewnętrzny wykrył wady.

Stone True
2015-11-25 09:04:12 UTC
view on stackexchange narkive permalink

Bezpieczne przeglądanie kodu wymaga nie tylko znajomości języka wysokiego poziomu, ale także opcji kompilatora i JAK KOD RZECZYWIŚĆ DZIAŁA NA PROCESORZE! Języki wysokiego poziomu są wydajne do pisania kodu, ponieważ ukrywają dużą złożoność. Ale wiele błędów i błędów kryje się w złożoności. Jak wskazano w innej odpowiedzi, kompilatory starają się postępować właściwie, ale naprawdę musisz zrozumieć, co się dzieje, demontując kod i rozwijając głębokie zrozumienie, jak to działa.

To zrozumienie jest również wymagane z językami skryptowymi, takimi jak JavaScript, które interpretują kod wysokiego poziomu na instrukcje procesora i alokację pamięci. Niestety ta recenzja byłaby zależna od platformy. Zobacz na przykład pod adresem https://en.m.wikipedia.org/wiki/Interpreted_language.

To jest prawdziwa odpowiedź. 15 lat temu eksperci ds. Bezpieczeństwa znaleźli błędy, napisali exploity, napisali artykuły o nowych technikach, itp. Teraz po prostu otrzymują „certyfikację”, rzucają kilka terminów, które mogą zrozumieć tylko na poziomie koncepcyjnym (np. Przepełnienie bufora, czy kiedykolwiek napisany?) i myślę, że są tacy sami jak pionierzy hakerów. Dwie całkowicie różne gry w piłkę. Przekazanie kontroli narzędzia to nie to samo, co bezpieczeństwo. Żaden z nich nie przeżyje fuzzera.
Nieprawda, jeśli koncentrujesz się na wielu współczesnych językach, takich jak Java i JavaScript.
@NeilSmithline W takich przypadkach jest _ nawet gorzej_, ponieważ to, jak będzie działać na procesorze, zależy teraz od _ na którym procesorze działa_ (oraz, w przypadku JavaScript, w którym interpreter jest uruchomiony).
@NeilSmithline - Uważam, że nadal potrzebujesz zrozumienia, w jaki sposób języki skryptowe, takie jak JavaScript, interpretują kod wysokiego poziomu na instrukcje procesora i alokację pamięci, aby móc z całą pewnością stwierdzić, że fragment kodu jest bezpieczny. Niestety ta recenzja byłaby zależna od platformy.
Hmm ... Nie wydaje mi się to w ten sposób, ale oczywiście inni się z tobą zgadzają.
@NeilSmithline - Edytowana odpowiedź w celu podania linku do obsługi języków interpretowanych / skryptowych.
@horsehair i 15 lat temu było w przenośni 3 ekspertów ds. Bezpieczeństwa spędzających miesiąc czasu ludzkiego nad jednym błędem, a teraz dziesiątki tysięcy znajdują dziesiątki błędów w ciągu kilku minut. Postęp w zakresie zautomatyzowanych narzędzi zbudowanych na poprzedniej pracy, które niewielu mogło wykonać, ale wielu może z nich korzystać i stojąc na ramionach gigantów. Niezwykle przydatne i bardzo poprawiające świat. Potrzebne jest odniesienie do twojego lekceważącego upokorzenia * i pomyśl, że to to samo, co pionierzy hakerów *. Kto w szczególności tak myśli i skąd wiesz?
@TessellatingHeckler - 15 lat temu było wielu więcej niż 3 ekspertów ds. Bezpieczeństwa, którzy przeglądali kod. Już w 1998 roku setki bardzo młodych programistów przeglądało kod i wymyślało takie rzeczy, jak przepełnienia całkowitych (w kontekście exploitów bezpieczeństwa), podczas gdy eksperci ds. Bezpieczeństwa korporacji w dużej mierze polegali (w tamtym czasie) na nieodpowiednich narzędziach. W młodości byłem związany z niektórymi z tych grup. Twój punkt widzenia dotyczący dziesiątek tysięcy ludzi znajdujących błędy jest teraz istotny. Współcześni łowcy błędów to programiści, a nie tylko „certyfikowani specjaliści ds. Bezpieczeństwa”, i wielu z nich spędza pełny czas na przeglądaniu kodu.
@TessellatingHeckler - Dodając do powyższego (i trochę odbiegając od trafności), w „dawnych czasach” ludzie kontrolowali kod, ponieważ byli tym zainteresowani (czasami z mniej niż uczciwych powodów). Słynna luka w przepełnieniu bufora została wyjaśniona przez alefa w swoim słynnym artykule w języku angielskim, choć wcześniej był znany „hakerom”. Różnica między wtedy a dniem dzisiejszym polega na tym, że wtedy ludzie interesowali się bezpieczeństwem, ponieważ je kochali (ogólnie). Teraz wiele osób patrzy na pensje, zdobywa certyfikaty, dostaje pracę ochroniarza. Nie ta sama motywacja ani poziom umiejętności. Istnieją wyjątki.
Jon Hanna
2015-11-25 17:58:54 UTC
view on stackexchange narkive permalink

Czy trzeba być dobrym programistą, aby przeprowadzać bezpieczną analizę kodu źródłowego?

Nie.

Czy będzie w stanie wykonać przeglądanie bezpiecznego kodu bez znajomości wielu języków programowania i opanowania ich?

Nie.

Programowanie to coś więcej niż wiedza o szczegółach działania różnych języków. To jedna z rzeczy, których potrzebujesz, aby być dobrym programistą, a także jedna z rzeczy, których potrzebujesz, aby móc analizować kod źródłowy z punktu widzenia bezpieczeństwa (lub jakiejkolwiek innej jakości).

Więc podczas nie musisz być dobrym programistą, potrzebujesz biegłości w obsłudze języków.

Więc według ciebie, biegłość w języku =?
@K.P. Przepraszam, nie śledzę cię.
Rozumiem, że opanowanie języka powinno uczynić kogoś dobrym programistą. nie jest tak?
Prawie wcale. Możesz znać każdy niuans języka i nie być dobry w projektowaniu, rozwiązywaniu problemów, wyborze algorytmu, niezmiennej definicji, tworzeniu testów lub większości debugowania. Znajomość języka jest z pewnością ważna, ale nie jest najważniejsza. Rzeczywiście, być może mniej w przypadku programowania niż analizy źródła (programista, który nie zna określonej funkcji, może zaatakować problem w inny sposób, ktoś analizujący program, który nie zna konkretnej funkcji, która była faktycznie używana, lepiej się tego nauczyć umieć przeanalizować konsekwencje).
Wiedza projektowa jest jednak prawdopodobnie potrzebna, ponieważ luki w zabezpieczeniach mogą czasami wynikać raczej z kiepskiego projektu niż z wadliwej implementacji.
@reirab Powiedziałbym, że wszystkie umiejętności programisty byłyby pomocne w analizie, ale gdy projekt jest w stanie wykryć błąd, wymaga innego poziomu umiejętności niż umiejętność decydowania o najlepszym projekcie (jak krytyka i produkcja sztuki) , ale możliwość zauważenia dziwactwa w zachowaniu językowym jest czymś ważniejszym dla analizy niż pisanie.
Dobry programista musi być w stanie połączyć wszystkie bity razem, aby stworzyć działającą aplikację. Nie potrzebujesz tego do analizy bezpieczeństwa. Na przykład nie musisz być w stanie zbudować samochodu, aby sprawdzić, czy można go bezpiecznie prowadzić. Możesz sprawdzić, czy aplikacja jest bezpieczna, nie będąc w stanie samodzielnie zbudować bezpiecznej aplikacji. Możesz być dobrym sędzią w konkursie piękności, sam będąc brzydkim.
@gnasher729 Z pewnością możesz sprawdzić, czy aplikacja jest bezpieczna, jeśli masz umiejętności niezbędne do zbudowania bezpiecznej aplikacji, która spełniałaby wiele innych kryteriów.
@JonHanna - Nie rozwiniesz opanowania języka bez spędzania dużo czasu na programowaniu w nim. Zdziwiłbym się, gdybym spotkał kogoś, kto był mistrzem w jakimś języku, ale nie był dobry w programowaniu w tym języku (choć oba terminy są niejednoznaczne).
-1
Całkowite opanowanie języka nie jest potrzebne, jeśli założymy, że coś zbyt skomplikowanego dla osoby sprawdzającej bezpieczeństwo jest automatycznie niepewne.
user92881
2015-11-25 16:48:20 UTC
view on stackexchange narkive permalink

Aby właściwie określić niebezpieczeństwo ataków typu side-channel, musisz znać sprzęt. Istnieją naprawdę brzydkie ataki kanału bocznego, takie jak uruchamianie nieuprzywilejowanego procesu na konfiguracji wieloprocesorowej równolegle z uprzywilejowanym wykonującym pewne zadanie szyfrowania / deszyfrowania i sondowanie, które współdzielone linie pamięci podręcznej są zabrudzone w jakim rodzaju czasowego wzorca lub przez czas dostarczenia poszczególnych sekwencji wzorców, które zostaną zaszyfrowane.

Ponieważ algorytmy szyfrowania są przedmiotem intensywnej analizy matematyków i innych teoretyków, ataki z kanału bocznego są coraz ważniejszym sposobem ponownego otwarcia gry. Wadą jest to, że muszą być przygotowane pod kątem określonej implementacji, kodu i sprzętu.

Tak naprawdę nie dotyczy umiejętności programowania, głównego punktu pytania.


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 3.0, w ramach której jest rozpowszechniana.
Loading...