Bezpieczeństwo aplikacji .NET Michał Poliszkiewicz Microsoft Professional Developer Days 2004
Bezpieczeństwo Bezpieczeństwo jest terminem złożonym Projektowanie, programowanie, wdrażanie Zabezpieczenia sieci, serwerów, bezpieczne aplikacje Konsekwencje złych zabezpieczeń Kradzieże informacji poufnych Kradzież własności intelektualnej „downtime” systemów Strata reputacji firmy / twórców systemów Straty finansowe – reputacja, usuwanie szkód
Bezpieczeństwo – punkty ataku Secure by Default Błędna konfiguracja systemów Wady systemów Złe zarządzanie pamięcią Błędy arytmetyczne „cross-site scripting” XSS „SQL injection” Błędy w walidacji Słabości kryptografii … Brak polityki unowocześniania systemów Secure by Design Secure in Deployment
.NET Framework Kod zarządzany – CLR nasz Wielki Brat Zarządzanie pamięcią Walidacja assembly Weryfikacja „type safe” Zarządzanie wykonaniem Gotowa infrastruktura Nowe modele zabezpieczeń Gotowe klasy PKI, szyfrowanie Walidacja System.Security ASP.NET Windows Authentication Forms Authentication Passport
Bezpieczeństwo tematy Kryptografia Bezpieczna komunikacja Autentykacja Autoryzacja Walidacja Obsługa błędów Zapory Firewall Audyt kodu Monitorowanie działania aplikacji Poprawki Service Packs, fixes … ….
Bezpieczeństwo – tematy na dzisiaj CAS – Code Access Security Idea Policy Sprawdzanie uprawnień ASP.NET 1.1 Kryptografia Powtórka z kryptografii Niebezpieczeństwa Przechowywanie informacji sekretnych Ukrywanie kodu
AGENDA CAS – Code Access Security Kryptografia Ukrywanie kodu Idea Policy Sprawdzanie uprawnień ASP.NET 1.1 Kryptografia Powtórka z kryptografii Niebezpieczeństwa Przechowywanie informacji sekretnych Ukrywanie kodu
Bezpieczeństwo – CAS, RBS Dwa nowe mechanizmy zabezpieczeń - Code Access Security - Role Based Security Dwa sposoby konfiguracji - Deklaratywny (atrybuty) - Programowy CAS Policy Grupowanie uprawnień „Permission Sets” Grupowanie assemblies „Code Groups” Warunek członkowstwa Referencja do PermissionSet 1 3 System.Security.Permissions Przydzielane do assembly podczas jego wgrywania Określają m.in. uprawnienia do: - Dostępu do systemu plików - Dostępu do zmiennych systemowych - Wywoływania kodu natywnego - Dostępu do Isolated Storage - Dostępu do zasobów sieciowych - … Wypadkowy zbiór uprawnień jest sumą wszystkich uprawnień wynikających z członkostwa w poszczególnych grupach 2 4
Policy – definiowanie zasad All Code Nothing PermissionSets Zone: My Computer Nothing Full Trust SN: e1334ad4bd3rc113 Intranet Full Trust Zone: Intranet Same Site Access Intranet Full Trust All Code Same Site Access Evidence URL: //search Full Trust Nothing http://sales/abc.dll SN: b2690aecbd60c3ac StrongName: b2690aecbd60c3ac FullTrust
Konfiguracja CAS – definiowanie Policy
Sprawdzanie przydzielonych uprawnień Call Stack Demand Mechanizm wymagania uprawnień do wykonania kodu Stack Walk Sprawdzanie łańcucha odwołań Assert Zapewnienie dostępu do zasobów dla funkcji wołającej Jakieś Assembly Grant: ReadFile Call CzytajPlik() Moje Assembly Grant: ReadFile Call ReadFile() ReadFile Demand .NET Framework Assembly Unmanaged Asset Win32 API Grant: Unmanaged
Wymaganie uprawnień - programowo FileIOPermission filePerm = new FileIOPermission( FileIOPermissionAccess.Read, "C:\\temp.txt"); try { filePerm.Demand(); // Code to access file goes here } Catch (SecurityException e) // if demand fails, this code is executed Wymaganie uprawnia czytania z pliku C:\\temp.txt „Stack walk” – jeżeli uprawnienia zabraknie, zostanie wyrzucony wyjątek
Wymaganie uprawnień - deklaratywnie Użycie atrybutów Informacja zawarta w metadata Jak łapać wyjątek SecurityException Tylko poziom metody i całego assembly [FileIOPermission(SecurityAction.Demand, Read= "C:\\temp.txt")] public string ReadTempFile() { // Code to read file goes here }
ASP.NET 1.1 nie musi równać się FullTrust <location allowOverride="true"> <system.web> <securityPolicy> <trustLevel name="Full" policyFile="internal"/> <trustLevel name="High" policyFile="web_hightrust.config"/> <trustLevel name="Medium" policyFile="web_mediumtrust.config"/> <trustLevel name="Low" policyFile="web_lowtrust.config"/> <trustLevel name="Minimal" policyFile="web_minimaltrust.config"/> </securityPolicy> <!-- level="[Full|High|Medium|Low|Minimal]" --> <trust level=“Full" originUrl=""/> </system.web> </location> Machine.config
Sandboxing w aplikacjach ASP.NET Uprzywilejowany kod opakowany w „Wrapper Assemble” Assert na wybranych uprawnieniach „Wrapper assembly” umieszczone w GACu Atrybut AllowPartiallyTrustedCallersAttribute <trust level_”Medium” originUri_--/> Demand i Assert Dostęp do zasobu „Wrapper Assemble” (Strong Name, GAC) Aplikacja ASP.NET Chroniony zasób Sandboxed Code
AGENDA CAS – Code Access Security Kryptografia Ukrywanie kodu Idea Policy Sprawdzanie uprawnień ASP.NET 1.1 Kryptografia Powtórka z kryptografii Niebezpieczeństwa Przechowywanie informacji sekretnych Ukrywanie kodu
Powtórka z kryptografii Kryptografia – dziedzina wiedzy Cele: Poufność: Ochrona przed dostępem do danych przez osoby / procesy nieupoważnione. Integralność danych: Ochrona przed zmianą danych przez osoby /procesy nieupoważnione. Uwierzytelnienie: Weryfikacja pochodzenia danych
Powtórka z kryptografii Zadania Opis Szyfrowanie Symetryczne Szyfrowanie kluczem symetrycznym Szyfrowanie asymetryczne Szyfrowanie kluczem publicznym / prywatnym „Hashing” Kodowanie mieszające Mapowanie długich łańcuchów danych na krótkie łańcuchy, o ustalonej długości – tzw. „hash’e” Podpis cyfrowy „Hashing” danych i szyfrowanie kluczem prywatnym .NET Framework - System.Security.Cryptography
Szyfrowanie symetryczne Szybkie i wydajne średnio ~1000x w porównaniu do asymetrycznego Problem z bezpieczną wymianą kluczy DES, Triple DES, AES (Rijndael), IDEA, RC2, RC4 Dane Szyfrowanie Deszyfrowanie Klucz prywatny jest znany nadawcy i odbiorcy
Algorytm symetryczny Generacja klucza Salt Generacja losowego łańcucha szumu – „Salt” Stworzenie klucza na podstawie wygenerowanego łańcucha i hasła dostarczonego przez użytkownika Szyfrowanie algorytmem symetrycznym przy wykorzystaniu wygenerowanego klucza Niezaszyfrowany łańcuch „salt” i IV w wyjściowym strumieniu danych Odszyfrowywanie algorytmem symetrycznym przy wykorzystaniu tego samego klucza Regeneracja klucza na podstawie łańcucha „salt” Wykorzystanie wektora IV Salt Initialization Vector Encrypted Data
DEMO Szyfrowanie symetryczne - Rijndael
Szyfrowanie asymetryczne Szyf. – kl. publiczny Szyf. – kl. prywatny Bezpieczne, ale wolne RSA, Diffie-Helman, DSA Deszyfr. – kl prywatny Deszyfr. – kl publiczny Szyfrowanie przez B – poufność informacji B Użytkownik B Użytkownik A Klucz prywatny Klucz publiczny Klucz publiczny Szyfrowanie przez A – potwierdzenie tożsamości A
Algorytm asymetryczny Klasy implementujące algorytmy: RSACryptoServiceProvider DSACryptoServiceProvider RSACryptoServiceProvider rsaAlgorithm = new RSACryptoServiceProvider(); Dostarczenie parametrów RSAParameters rsaKeyInfo = new RSAParameters(); rsaKeyInfo.Modulus = PublicKey; rsaKeyInfo.Exponent = Exponent; rsaAlgorithm.ImportParameters(rsaKeyInfo); Szyfrowanie / Deszyfrowanie
Niebezpieczeństwa Słabe punkty kryptografii Implementacja własny algorytm - nie! Implementacja znanego algorytmu – nie! Klucze Problem ograniczenia dostępności Czas życia Procedury awaryjne – klucz staje się dostępny Długie klucze – TAK TAK TAK! Nie wywarzajmy otwartych drzwi!!! CryptoAPI, CAPICOM, i System.Security.Cryptography - tak DPAPI do przechowywania wiadomości poufnych - tak SSL/TLS - tak
Zarządzanie informacjami poufnymi 3 drogi Ukrywanie Prawa dostępu Szyfrowanie Łączmy rozwiązania ACL na zaszyfrowanych danych Ukryty klucz - OS LSA – nie LSAStorePrivateData, LSARetrievePrivateData DPAPI – tak CryptProtectData CryptUnprotectData .NET - P/Invoke 1 3 Unikajmy problemu Hashing WIS Smart card 2
AGENDA CAS – Code Access Security Kryptografia Ukrywanie kodu Idea Policy Sprawdzanie uprawnień ASP.NET 1.1 Kryptografia Powtórka z kryptografii Niebezpieczeństwa Przechowywanie informacji sekretnych Ukrywanie kodu
Ukrywanie kodu Dekompilacja /.NET i Java Niebezpieczeństwa dekompilacji Łatwe wyszukiwanie dziur w oprogramowaniu Wykradanie pomysłów i algorytmów Łamanie zabezpieczeń Obfuskowanie Zmiany nazw klas, metod i obiektów „overload induction” Usuwanie nieistotnych metadanych Szyfrowanie łańcuchów Zaciemnianie przebiegu programu Zmniejszanie wielkości programów
DEMO Ukrywanie kodu – VS NET 2003 i Dotfuscator
Więcej informacji Strony internetowe Patterns and Practices Guides http://msdn.microsoft.com/security http://msdn.microsoft.com/columns/secure.asp http://www.microsoft.com/poland/developer Patterns and Practices Guides Building Secure ASP.NET Applications http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetlpMSDN.asp Improving Web Application Security: Threats and Countermeasures http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/threatcounter.asp Książki Bezpieczny kod Michael Howard and David LeBlanc, published by Microsoft Press Tworzenie Bezpiecznych Aplikacji Microsoft ASP.NET J.D. Meier, Alex Mackman, Michael Dunner, and Srinath Vasireddy Grupy dyskusujne microsoft.public.dotnet.security microsoft.public.sqlserver.security