Co każdy programista powinien wiedzieć o bezpieczeństwie? [Zamknięte]

427

Jestem studentem informatyki i jestem teraz na trzecim roku studiów. Do tej pory studiowaliśmy wiele przedmiotów związanych z komputerami w ogóle (programowanie, algorytmy, architektura komputerów, matematyka itp.).

Jestem pewien, że nikt nie może dowiedzieć się wszystkiego na temat bezpieczeństwa, ale jestem pewien, że istnieje „minimalna” wiedza, którą powinien wiedzieć każdy programista lub student informatyki, a moje pytanie brzmi: co to za minimalna wiedza?

Czy możesz zasugerować jakieś e-książki lub kursy, czy coś może pomóc w rozpoczęciu tej drogi?

MH
źródło
6
Całkiem podobny do stackoverflow.com/questions/325862/...
Thomas
118
Zasada 1: Nigdy nie ufaj wkładowi użytkownika. Nawet jeśli to twoja Babcia
Anthony Forloney
2
.. i ten wątek ma również świetne informacje - stackoverflow.com/questions/72394/…
Sripathi Krishnan
moje pytanie dotyczy nie tylko programistów i ich błędów, ale także studentów informatyki i informatyki
Mohamad Alhamoud
1
Obserwuj swoje komunikaty o błędach. Chociaż chcesz być przyjazny dla użytkownika, różnica między „To konto nie istnieje” a „Hasło jest nieprawidłowe” może być niebezpieczna w niektórych przypadkach.
Michael Mior

Odpowiedzi:

551

Zasady, o których należy pamiętać, jeśli chcesz, aby aplikacje były bezpieczne:

Istnieje kilka doskonałych książek i artykułów online na temat bezpieczeństwa aplikacji:

Naucz swoich programistów najlepszych praktyk w zakresie bezpieczeństwa aplikacji

Kodowanie (płatne)

Bezpieczeństwo innowacji (płatne)

Kompas bezpieczeństwa (płatny)

OWASP WebGoat (bezpłatny)

bignum
źródło
+1 „wykorzystywanie oprogramowania: jak złamać kod” to świetna książka, jednak pokaz slajdów, do którego linkujesz, jest okropny.
wieża
7
Niestety, prawie niemożliwe jest utworzenie zasady najmniejszych uprawnień w każdym nowoczesnym systemie. Na przykład jądro Linuksa (źródło, którego obecnie używam) zawiera ponad 9,4 miliona wierszy kodu C i ponad 400 tysięcy wierszy asemblera, z których wszystkie działają w nieograniczonym kontekście. Prosta błędna kalkulacja (być może celowa) w jednej z tych milionów linii zagraża całemu systemowi. Być może w następnym stuleciu lub dwóch pojawi się rozwiązanie, być może nie, ponieważ nikt tak naprawdę nie dba o tworzenie bezpiecznego systemu operacyjnego / języków / frameworków.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
1
Do tej listy dodałbym „Podręcznik hakera aplikacji internetowych”.
pokonany
34
Zamień „Nigdy nie ufaj wejściom użytkownika!” na „Nigdy nie ufaj żadnym wejściom!”. Dane wejściowe pochodzące z innego oprogramowania należy traktować tak samo, jak dane wejściowe użytkownika - na przykład podczas rejestrowania witryny większość osób nie uważa pola User-Agent / przeglądarki za „dane wejściowe użytkownika”, ale może równie łatwo zawierać np. Wstrzyknięcie SQL.
Peteris,
2
@ L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ Cóż, istnieje eksperymentalny system operacyjny Microsoft Research (Singularity) zbudowany na platformie .NET, którego głównym celem było bezpieczeństwo (brak przepełnienia bufora, tak!). Bez współużytkowania pamięci procesowej, bez samodzielnej modyfikacji kodu, nawet sterowniki urządzeń to po prostu kolejny proces izolowany programowo w .NET. Całkiem ciekawa koncepcja, ale bardzo trudno byłoby przekazać ją ludziom (co najważniejsze, prawie nie można zrobić wstecznej kompatybilności z istniejącym oprogramowaniem lub nawet sterownikami; trochę jak pierwsze 10 lat Linuksa: D).
Luaan
102

Zasada nr 1 bezpieczeństwa dla programistów: nie rzucaj własną

O ile nie jesteś ekspertem w dziedzinie bezpieczeństwa i / lub kryptografem, zawsze używaj dobrze zaprojektowanej, dobrze przetestowanej i dojrzałej platformy bezpieczeństwa, frameworku lub biblioteki, aby wykonać pracę za Ciebie. Te rzeczy spędziły lata na przemyślaniu, załataniu, aktualizacji i badaniu przez ekspertów i hakerów. Chcesz zyskać te zalety, a nie odrzucić je, próbując wynaleźć koło na nowo.

Nie oznacza to, że nie musisz uczyć się niczego na temat bezpieczeństwa. Z pewnością musisz wiedzieć wystarczająco dużo, aby zrozumieć, co robisz i upewnić się, że używasz narzędzi poprawnie. Jeśli jednak kiedykolwiek zaczniesz pisać własny algorytm kryptograficzny, system uwierzytelniania, dezynfekcję danych wejściowych itp., Przestań, cofnij się i pamiętaj o regule nr 1.

Tyler McHenry
źródło
10
To jest, moim zdaniem, zła zasada. Możesz być w zasadzie celem tylko ze względu na wybraną platformę, a nie z prawdziwego zainteresowania twoimi aktywami. Pomyśl o wszystkich lukach w zabezpieczeniach, które można znaleźć na platformach firm trzecich, oraz o wszystkich produktach, które są natychmiast narażone na atak tylko dlatego, że z nich korzystają. Nie byłbym tak szybki, aby zaufać mojemu bezpieczeństwu stronie trzeciej.
Fosco,
9
Myślę, że to dobra zasada dla Crypto - kręcenie własnego szyfrowania to przepis na katastrofę. Jednak, jak zauważa Fosco, uruchomienie własnego silnika blogów może być bezpieczniejsze - jeśli rzucisz własny, istnieje mniejsze prawdopodobieństwo, że zaatakują Cię automatyczne ataki, z którymi muszą sobie radzić instalacje wordpress.
James P. McGrath,
5
Jeśli chodzi o krypto, ta zasada jest absolutnie poprawna. Nie pisz własnego krypto, kropka. Jeśli chodzi o korzystanie z platform stron trzecich, to zależy. Niektóre platformy są z natury bardziej bezpieczne, niektóre platformy są z natury mniej bezpieczne, a większość platform prawdopodobnie zapewnia pewne funkcje bezpieczeństwa, ale także niektóre znane wektory ataków. Weźmy ostatnią lukę w zabezpieczeniach Rails, która spowodowała lukę w zabezpieczeniach w github . Niewątpliwie Railsy zapewniają wiele wielu funkcji bezpieczeństwa, ale mają także pewne zaawansowane funkcje z niepewnymi ustawieniami domyślnymi.
Michael Kopinsky,
7
Jeśli chodzi o krypto, nie rzucaj własnym - ale zrozum, czego używasz. Jeśli nie rozumiesz, dlaczego używanie tego samego klucza szyfrowania dla RC4 dla dwóch wiadomości jest okropnym pomysłem, przeczytaj na przykład przed użyciem jakiegokolwiek szyfru strumieniowego.
Christopher Creutzig
3
Nawet po błędzie HeartBleed jest oczywiste, że jest to dobra zasada. Wyobraź sobie, jak trudno byłoby znaleźć podobnego do przegrzanego błędu w niestandardowym lub zastrzeżonym projekcie. Jeśli wyrzucisz własny, ukrywasz się za zasłoną i nie wiesz, jakie błędy można wykorzystać.
Sqeaky
71

Każdy programista powinien wiedzieć, jak pisać kod exploita.

Nie wiedząc, w jaki sposób wykorzystywane są systemy, przypadkowo zatrzymujesz luki w zabezpieczeniach. Umiejętność łatania kodu jest absolutnie bez znaczenia, chyba że wiesz, jak przetestować łatki. Bezpieczeństwo to nie tylko kilka eksperymentów myślowych, musisz być naukowy i przetestować swoje eksperymenty.

wieża
źródło
10
Twierdziłbym, że wcale nie jest to konieczne. Po prostu zastosuj się do zasady: jeśli atakujący może spowodować jakiekolwiek uszkodzenie pamięci, uważaj się za swojego właściciela. Nie musisz wchodzić w szczegóły dotyczące pisania (działających) exploitów.
newgre
6
@newgre nie każda luka jest przepełnieniem bufora. Istnieje kilka tysięcy luk w zabezpieczeniach objętych systemem powszechnego wyliczania słabości. Programista musi zrozumieć umysł atakującego, w przeciwnym razie nieświadomie popełni błędy.
wieża
1
Wiem, że nie każdy z nich jest przepełnieniem bufora, ale wszystko, co zwykle określa się jako „exploit”, opiera się na pewnym rodzaju uszkodzenia pamięci: przepełnienie bufora, podwójne zwolnienia, przepełnienie sterty, przepełnienia związane z liczbami całkowitymi, ciągi formatujące itp. Oczywiście są też inne rzeczy, takie jak błędy logiczne, ale nie był to temat tej odpowiedzi na początek.
newgre
5
@newgre Jest to jeden z rodzajów exploitów, ale dziś napisano więcej exploitów, aby wykorzystać wady aplikacji internetowych niż problemy z uszkodzeniem pamięci. Exploity są zapisywane z wykorzystaniem SQL Injection, Local File include, CSRF i XSS, są to typowe problemy. (Źródło: exploit-db.com )
wieża
1
Zgadzam się na to, jeśli sam potrafisz pisać exploity, możesz zrozumieć, co może pójść maksymalnie do umysłu hakerów!
linuxeasy
42

Bezpieczeństwo to proces, a nie produkt.

Wielu zdaje się zapominać o tej oczywistej sprawie.

ericteubert
źródło
23

Sugeruję przejrzenie 25 najbardziej niebezpiecznych błędów programistycznych CWE / SANS TOP . Został zaktualizowany na 2010 rok z obietnicą regularnych aktualizacji w przyszłości. Wersja 2009 jest również dostępna.

Od http://cwe.mitre.org/top25/index.html

25 najniebezpieczniejszych błędów programistycznych w 2010 r. CWE / SANS to lista najbardziej rozpowszechnionych i krytycznych błędów programistycznych, które mogą prowadzić do poważnych luk w zabezpieczeniach oprogramowania. Często są łatwe do znalezienia i łatwe do wykorzystania. Są niebezpieczne, ponieważ często pozwalają atakującym całkowicie przejąć oprogramowanie, ukraść dane lub całkowicie uniemożliwić działanie oprogramowania.

Lista Top 25 jest narzędziem edukacyjnym i uświadamiającym, które pomaga programistom w zapobieganiu rodzajom luk w branży oprogramowania, identyfikując i unikając zbyt powszechnych błędów, które występują jeszcze przed dostarczeniem oprogramowania. Klienci oprogramowania mogą korzystać z tej samej listy, aby pomóc im poprosić o bezpieczniejsze oprogramowanie. Naukowcy zajmujący się bezpieczeństwem oprogramowania mogą wykorzystać Top 25, aby skoncentrować się na wąskim, ale ważnym podzbiorze wszystkich znanych słabości bezpieczeństwa. Wreszcie, menedżerowie oprogramowania i CIO mogą wykorzystać listę 25 najlepszych jako miernik postępu w swoich wysiłkach na rzecz zabezpieczenia swojego oprogramowania.

jschmier
źródło
1
Zauważ, że 4 pierwsze błędy na tej liście (i kilka innych) są tymi samymi danymi wejściowymi, ufnymi.
Chris Dodd
13

Dobrym początkowym kursem może być kurs MIT z zakresu sieci komputerowych i bezpieczeństwa . Jedną rzeczą, którą zasugerowałbym, to nie zapomnieć o prywatności. W pewnym sensie prywatność jest naprawdę fundamentem bezpieczeństwa i nie jest często przedmiotem technicznych kursów bezpieczeństwa. W tym kursie na temat etyki i prawa, który dotyczy internetu, możesz znaleźć trochę materiałów na temat prywatności .

tvanfosson
źródło
Link do kursu MIT nie działa
AntonioCS
1
Linki naprawione (na razie). Dzięki.
tvanfosson
10

Zespół Web Security w Mozilli opracował świetny przewodnik , którego przestrzegamy przy opracowywaniu naszych witryn i usług.

Potch
źródło
8

Znaczenie bezpiecznych ustawień domyślnych w ramach i interfejsach API:

  • Wiele wczesnych frameworków internetowych domyślnie nie opuszczało HTML w szablonach i miało z tego powodu problemy z XSS
  • Wiele wczesnych struktur sieciowych ułatwiło konkatenację SQL niż tworzenie sparametryzowanych zapytań prowadzących do wielu błędów związanych z iniekcją SQL.
  • Niektóre wersje Erlang (R13B, może inne) domyślnie nie weryfikują certyfikatów równorzędnych ssl i prawdopodobnie istnieje wiele kodów erlang, które są podatne na ataki SSL MITM
  • Transformator XSLT Java domyślnie zezwala na wykonanie dowolnego kodu Java. Powstało wiele poważnych błędów bezpieczeństwa.
  • Interfejsy API analizowania XML w Javie domyślnie pozwalają parsowanemu dokumentowi na odczyt dowolnych plików w systemie plików. Więcej zabawy :)
benmmurphy
źródło
5

Powinieneś wiedzieć o trzech A. Uwierzytelnianie, autoryzacja, audyt. Klasycznym błędem jest uwierzytelnienie użytkownika, bez sprawdzania, czy użytkownik jest upoważniony do wykonania jakiejś czynności, aby użytkownik mógł spojrzeć na prywatne zdjęcia innych użytkowników, tak jak zrobił to Diaspora. Wiele, wiele innych osób zapomina o Audycie, potrzebujesz w bezpiecznym systemie, aby móc powiedzieć, kto i co zrobił.

rapadura
źródło
1
Nie wszystkie autoryzacje wymagają uwierzytelnienia. „Od ABAC do ZBAC” kontrastuje kontrolę dostępu NBAC (opartą na uwierzytelnianiu) z rozwiązaniami, które nie wymagają uwierzytelnienia. „IBAC, RBAC, ABAC, a nawet CBAC - Kontrola dostępu oparta na oświadczeniach opiera się na uwierzytelnianiu ... Dla uproszczenia ten dokument traktuje je jako pojedyncze rozwiązanie i ignoruje te wersje, które mają zaimplementowane aspekty architektury ZBAC. Są one łącznie nazywane uwierzytelnianiem Oparta na kontroli dostępu (NBAC). ”
Mike Samuel
4
  • Pamiętaj, że ty (programista) musisz zabezpieczyć wszystkie części, ale atakujący musi tylko znaleźć jeden supeł w swojej zbroi.
  • Bezpieczeństwo to przykład „nieznanych niewiadomych”. Czasami nie będziesz wiedział, jakie są możliwe wady bezpieczeństwa (do tego czasu).
  • Różnica między błędem a luką bezpieczeństwa zależy od inteligencji atakującego.
Rory
źródło
4

Dodałbym następujące:

  • Jak działają podpisy cyfrowe i certyfikaty cyfrowe
  • Co to jest piaskownica

Zrozum, jak działają różne wektory ataku:

  • Przepełnienia bufora / niedopełnienia / etc w natywnym kodzie
  • Inżynieria społeczna
  • Fałszowanie DNS
  • Człowiek w środku
  • CSRF / XSS i in
  • Wstrzyknięcie SQL
  • Ataki kryptograficzne (np. Wykorzystujące słabe algorytmy kryptograficzne, takie jak DES)
  • Błędy programu / frameworka (np .: najnowsza luka w zabezpieczeniach github )

Możesz łatwo google dla tego wszystkiego. To da ci dobry fundament. Jeśli chcesz zobaczyć luki w zabezpieczeniach aplikacji internetowych, istnieje projekt o nazwie Google Gruyere, który pokazuje, jak wykorzystać działającą aplikację internetową.

Miguel Ping
źródło
4

gdy budujesz jakieś przedsiębiorstwo lub własne oprogramowanie, powinieneś po prostu myśleć jak haker. wiemy, że hakerzy również nie są ekspertami we wszystkich rzeczach, ale kiedy znajdą jakąś lukę, zaczynają się w nie zagłębiać, zbierając informacje o wszystkich rzeczy i wreszcie atak na nasze oprogramowanie. więc aby zapobiec takim atakom, powinniśmy przestrzegać kilku dobrze znanych zasad, takich jak:

  • zawsze staraj się łamać swoje kody (użyj cheatów i google, aby uzyskać więcej informacji).
  • być aktualizowanym pod kątem wad bezpieczeństwa w dziedzinie programowania.
  • i jak wspomniano powyżej, nigdy nie ufaj żadnym rodzajom danych wejściowych użytkownika ani automatycznych.
  • używaj aplikacji typu open source (ich większość wad bezpieczeństwa jest znana i rozwiązana).

więcej zasobów bezpieczeństwa można znaleźć pod następującymi linkami:

aby uzyskać więcej informacji google na temat przepływów bezpieczeństwa dostawcy aplikacji.

rahul_pratap
źródło
3
  1. Dlaczego to jest ważne.
  2. Chodzi o kompromisy.
  3. Kryptografia w dużej mierze odwraca uwagę od bezpieczeństwa.
Richard
źródło
3

W celu uzyskania ogólnych informacji na temat bezpieczeństwa gorąco polecam przeczytanie Bruce'a Schneiera . Ma stronę internetową, biuletyn kryptogramowy , kilka książek i przeprowadził wiele wywiadów .

Zapoznałem się również z inżynierią społeczną (i Kevinem Mitnickiem ).

Dla dobrej (i całkiem zabawnej) książki o tym, jak bezpieczeństwo gra się w prawdziwym świecie, poleciłbym doskonałą (choć nieco przestarzałą) „Jajko kukułki” autorstwa Cliffa Stolla.

Dan Esparza
źródło
3

Koniecznie sprawdź też listę 10 najlepszych OWASP aby podzielić wszystkie główne wektory / podatności na ataki.

Te rzeczy są fascynujące do przeczytania. Nauka myślenia jak atakujący nauczy Cię myśleć o tym, pisząc własny kod.

Michael Kopinsky
źródło
2

Sól i mieszaj hasła użytkowników. Nigdy nie zapisuj ich w postaci zwykłego tekstu w swojej bazie danych.

Abdull
źródło