Słyszałem o firmach ochroniarskich, które konsultują się w zakresie bezpieczeństwa systemów klienta. Wszyscy ludzie, których znam w tej dziedzinie, są inżynierami sieci, ale wiem, że programiści również angażują się w bezpieczeństwo. Co faktycznie robią programiści zajmujący się bezpieczeństwem, którzy przeprowadzają audyty / konsultacje? Czy dosłownie przeglądają bazę kodów, szukając każdej luki w starszych systemach? Zawsze zakładałem, że tak właśnie zrobili, ale wydaje się, że byłoby to wysoce niewiarygodne i nie robiłoby nic poza zapewnianiem fałszywego poczucia bezpieczeństwa. Uwaga: nie mówię o programistach, którzy piszą algorytmy szyfrowania itp., Tylko o programach audytowych / konsultingowych w zakresie bezpieczeństwa oprogramowania.
źródło
Odpowiedzi:
Szczerze mówiąc, staramy się nie przechodzić przez twoją bazę kodu, staramy się pisać narzędzia, aby to dla nas zrobić.
Po pierwsze teoria. Bezpieczeństwo jest wymogiem systemu oprogramowania, więc podobnie jak inne wymagania (funkcjonalność, użyteczność, dostępność, wydajność itp.) Należy je rozpatrywać na każdym etapie przepływu pracy inżynierii oprogramowania, od gromadzenia wymagań po wdrożenie i utrzymanie. Rzeczywiście jest to możliwe i istnieją wskazówki, które mogą pomóc zespołom projektowym w tym zakresie. Mimo że pracuję głównie z programistami iOS, mój ulubiony opis „bezpiecznego cyklu życia programowania” pochodzi od Microsoft Press .
W tym modelu bezpieczeństwo aplikacji rozpoczyna się, gdy próbujemy uzyskać wymagania od naszych użytkowników. Musimy odkryć ich obawy dotyczące bezpieczeństwa i prywatności, co nie jest łatwe, ponieważ jesteśmy ekspertami, a nie użytkownikami, a jeśli rozumieją swoje wymagania bezpieczeństwa, może im być trudno je wyrazić. Musimy także dowiedzieć się, na jakie ryzyko narażone będzie oprogramowanie podczas wdrażania i jaki poziom ryzyka jest akceptowalny.
Projektujemy naszą aplikację z myślą o spełnieniu tych wymagań. Piszemy kod z myślą o spełnieniu tych wymagań i uniknięciu dodatkowego ryzyka związanego z błędami bezpieczeństwa na poziomie kodu. Testujemy oprogramowanie, aby upewnić się, że nasz model jego bezpieczeństwa jest zgodny z tym, co naprawdę zbudowaliśmy, a następnie wdrażamy oprogramowanie w sposób zgodny z założeniami dotyczącymi środowiska, które zaprojektowaliśmy. Wreszcie zapewniamy wsparcie i konserwację, które pomagają użytkownikowi obsługiwać oprogramowanie w sposób zgodny z ich wymogami bezpieczeństwa i które pozwalają im (i nam) reagować na nowe zmiany w prezentowanym ryzyku.
Ok, tyle dla teorii. W praktyce , z powodów, które są bardzo dobrze wyjaśnione (choć nietechnicznie) w geekonomii i które są głównie spowodowane motywacją firm programistycznych, większość powyższych rzeczy się nie zdarza. Zamiast tego otrzymujemy to. Programiści:
Więc tak naprawdę większość osób zajmujących się bezpieczeństwem aplikacji , tak jak mówisz, znajduje błędy. To naprawdę świetny przegląd kodu, ale jest to wysoce skoncentrowany przegląd kodu przeprowadzany przez ludzi, którzy są ekspertami w rodzaju błędów, których szuka ta recenzja, więc nadal jest cenna pomoc zewnętrzna. Jest to oczywiście ogólna zasada: zawsze poproś kogoś o sprawdzenie, kto nie był zaangażowany w zrobienie tego.
Jeśli zaakceptujemy powyższe jako prawdziwe, oznacza to, że osoby podejmujące decyzje zakupowe mogą zrównać „zdolnego ochroniarza” z „znajdowaniem wielu błędów”. Ci, którzy zmuszą komputery do pracy za nich, znajdą więcej błędów niż ci, którzy tego nie robią, więc oczywiście polegają w dużej mierze na narzędziach do analizy statycznej i będą starali się spędzać więcej czasu na rozszerzaniu narzędzi niż na kodowaniu konkretnych problemów dla konkretnych klientów. Następnie dochodzimy do wniosku, że osoby zajmujące się bezpieczeństwem aplikacji częściej piszą narzędzia do odczytu kodu niż do odczytu kodu.
** Ostrzeżenie: pozostaje tylko opinia i spekulacja **
Rzeczywistość jest zepsuta. Zauważysz, że teoria bezpieczeństwa oprogramowania polegała na identyfikacji i reagowaniu na ryzyko polegania na systemie oprogramowania, podczas gdy praktyka polegała na znalezieniu jak największej liczby błędów. Pewnie, że to jeszcze zmniejszy ryzyko, ale tylko jako efekt uboczny. Punkt gry stał się mniej ważny niż „wygrana”, więc zasady zostały zmienione, aby ułatwić wygraną.
Co możesz zrobić jako programista? Zagraj w grę według jej oryginalnych zasad. Znajdź kogoś w swoim zespole (najlepiej faktycznie w swoim zespole, a nie kontrahenta, aby zmotywowani do zapewnienia długoterminowych rezultatów zamiast szybkiej wygranej), który rozumie znaczenie bezpieczeństwa i wyszkoli z nich bejeezus. Powierz tej osobie odpowiedzialność za kierowanie zespołem w zapewnianiu kompleksowego bezpieczeństwa opisanego na początku mojej odpowiedzi.
Również dać tej osobie uprawnienia do realizowania . Jeśli projekt nie wyraża wymagań bezpieczeństwa, należy go zmienić. Jeśli implementacja nie spełnia wymagań bezpieczeństwa, nie można jej zwolnić . Twój pracownik ochrony może wykonać wyrok, ale należy mu zezwolić na działanie w oparciu o ten wyrok. Zdaję sobie sprawę, że może to zabrzmieć jak ochroniarz, mówiąc: „Bezpieczeństwo OMFG jest najważniejsze”, ale nie o to mi chodzi. Jeśli twój produkt również nie spełnia wymagań funkcjonalności, użyteczności lub wydajności, nie powinieneś również wypuszczać tego produktu.
Dlaczego chcesz to zrobić? Powinno być taniej: wszyscy widzieliśmy (i prawdopodobnie cytowaliśmy za tanie +10 powtórzeń) tabelę Code Complete, w której defekty stają się droższe, im później je naprawisz, prawda? Wady bezpieczeństwa są również wadami. Zgodnie z rzeczywistymi zasadami gry większość z nich to problemy z wymaganiami, które są ustalone w zakresie konserwacji. Czy to jest tanie?
Ok, co teraz może ja jako broń bezpieczeństwa dla niemowlęcia z tym zrobić? Okazuje się, że mogę również odmówić gry według zmienionych zasad. Mogę powiedzieć programistom, że chodzi przede wszystkim o zmniejszenie ryzyka, że można to zrobić na każdym etapie, a następnie mogę im pomóc.
źródło
Od 15 lat prowadzenia programów zapewniających bezpieczeństwo przeciwko małym i bardzo dużym aplikacjom, środowiskom, systemom itp. Powiedziałbym, że wszystkiego jest po trochu. W moich zespołach zawsze miałem kilku, którzy są hardkorowymi programistami.
Na poziomie szczegółowym niektóre z nich sprowadzają się do bardzo dogłębnej weryfikacji kodu - na przykład pracuję obecnie nad wielomilionową bazą kodu, używając narzędzi do zawężania możliwych problemów, a następnie przyglądając się każdemu kategoryzować.
(Trzeba przyznać, że następnie przekazuję programistom rozwiązanie lub wyjaśnienie, dlaczego problem nie stanowi ryzyka)
Jest to jednak szczególne zaangażowanie, dla którego profil ryzyka ma sens do wykonywania tego rodzaju pracochłonnych prac.
O wiele bardziej standardowy i znacznie bardziej opłacalny jest próba zrozumienia profilu ryzyka organizacji i skoncentrowanie się na ryzyku odgórnym, np .:
Strona programistyczna naprawdę wchodzi tylko w dwa ostatnie, z przeglądem kodu i niestandardowymi testami penetracji. Dla niektórych organizacji ma to bardzo małe znaczenie, na przykład, jeśli masz warstwowe mechanizmy kontroli bezpieczeństwa, które zostały już dokładnie sprawdzone (różne typy szyfrowania, powiedzmy), wtedy, gdy możesz sprawdzić swoją implementację, zwykle nie zamierzasz ponownie sprawdzać wszystkich kod taki jak wcześniej.
źródło
Nigdy nie spotkałem się z żadnymi, które wykraczałyby daleko poza omawianie architektury / najlepszych praktyk w sposób niejasny podczas projektowania i / lub uruchamiania pakietów testowania ataku / łamania / wyjątków przeciwko ukończonym projektom.
W prawie wszystkich przypadkach mogę nawet powiedzieć, jakich narzędzi używają wektory ataku, których próbują, oraz sposób przeprowadzenia ataku po przejściu jednego z audytów w istniejącym systemie.
Wyobrażam sobie, że jest kilka takich, które faktycznie poświęcają czas na sprawdzenie kodu i wykonanie testów / testów whitebox, ale nie spotkałem ich jeszcze w prawdziwym życiu.
źródło