5 Security-Todsünden in der Softwareentwicklung Dirk Primbs Developer Evangelist Microsoft Deutschland GmbH dirkp@microsoft.com http://blogs.msdn.com/dirkpr
Agenda 5 Sünden Demos Fazit
Richtlinien, Verfahren und Bewusstsein IT-Sicherheit Richtlinien, Verfahren und Bewusstsein Physische Sicherheit Daten ACL, Verschlüsselung Anwendungshärtung, Antivirussoftware Anwendung Betriebssystemhärtung, Authentifizierung, Patchverwaltung, HIDS Host Internes Netzwerk Netzwerksegmente, IPSec, NIDS Perimeter Firewalls, VPN-Quarantäne Sicherheitskräfte, Schlösser, Überwachungsgeräte Benutzerschulung
Port 135 (Z.B. aus dem Internet) Spot the security bug Port 135 (Z.B. aus dem Internet) error_status_t _RemoteActivation(WCHAR *pwszObjectName, ... ) { *phr = GetServerPath(pwszObjectName, &pwszObjectName); … } HRESULT GetServerPath(WCHAR *pwszPath, WCHAR **pwszServerPath ){ WCHAR * pwszFinalPath = pwszPath; WCHAR wszMachineName[MAX_COMPUTERNAME_LENGTH_FQDN + 1]; hr = GetMachineName(pwszPath, wszMachineName); *pwszServerPath = pwszFinalPath; } HRESULT GetMachineName( WCHAR * pwszPath, WCHAR wszMachineName[MAX_COMPUTERNAME_LENGTH_FQDN + 1]) { pwszServerName = wszMachineName; LPWSTR pwszTemp = pwszPath + 2; while ( *pwszTemp != L'\\' ) *pwszServerName++ = *pwszTemp++; !!!
Sünde #1: Der Buffer Overrun
Buffer Overrun: Das Prinzip [1] void main() { char myLongBuffer[256]; myFunction(myBuffer); } void myFunction(char *myString) { char myShortBuffer[16]; strcpy(myShortBuffer, myString); Was passiert, wenn der übergebene String größer als 16 Zeichen ist?
Buffer Overrun: Das Prinzip [2] Stack void main() { char myLongBuffer[256]; myFunction(myLongBuffer); } Strings MyShortBuffer Gehackte Adresse MyShortBuffer 16 MyShortBuffer 16 256 void myFunction(char *myString) { char myShortBuffer[16]; strcpy(myShortBuffer, myString); } Sonstige Daten Virus ausführen Rücksprungadresse 256 MyLongBuffer Daten sind zu lang ! Rücksprung an gehackte Adresse… (bisheriger Stackinhalt) Stack Gehackte Adresse Viruscode „Böser“ Inhalt von MyShortBuffer:
Ein erprobter Ansatz Bergarbeiter mit Kanarienvogel (Welsh Miner‘s Canary) Prinzip: Vogel tot = zuviel Methangas Quelle: West Virginia Office of Miners’ Health, Safety and Training
Maßnahmen gegen BOs Bestimmte C/C++ Kommandos sind besonders anfällig strcpy, gets, scanf, sprintf, strcat, … BOs werden in Managed Code durch Laufzeitchecks verhindert. Compilerswitch /GS aktiviert in Visual C/C++ verbessertes Stackhandling Static Analysis mit Prefast
(bisheriger Stackinhalt) Compilerswitch /GS Stack void myFunction(char *myString) { char myShortBuffer[16]; strcpy(myShortBuffer, myString); } MyShortBuffer Strings MyShortBuffer 16 Security Cookie Prolog: Alloziiert Speicher auf dem Stack für lokale Variablen und speichert Zufallswert für Security Cookie (Canary) ab sub esp,24h mov eax,dword ptr [___security_cookie (408040h)] xor eax,dword ptr [esp+24h] mov dword ptr [esp+20h],eax Prolog: Alloziiert Speicher auf dem Stack für lokale Variablen sub esp,20h Rücksprungadresse 256 MyLongBuffer (bisheriger Stackinhalt) Stack Epilog: Prüft den Security Cookie (Canary) und führt anchließend Rücksprung durch mov ecx,dword ptr [esp+20h] xor ecx,dword ptr [esp+24h] add esp,24h jmp __security_check_cookie (4010B2h) Epilog: Führt Rücksprung durch add esp,20h ret
Spot the security bug void LookupPath(string computer, string path) { const int max_size = 63; byte len = (byte)(computer.Length + path.Length); if (len > max_size) throw new SecurityException("Pfad zu lang!"); // irgendwas sinnvolles }
Sünde #2: Integer Overflow
Das Prinzip [1] Implizite und explizite Casts können Werte unerwartet verändern In jeder gebräuchlichen Programmiersprache finden sich derartige Überläufe vorzeichenbehaftete Datentypen sind hauptsächlich anfällig
Das Prinzip [2] Vorzeichenbehaftete Datentypen nutzen das erste Bit als Vorzeichen Beim Cast von unsignierte auf signierte Datentypen ändert sich so die Bedeutung des Datums Beim Upcast wird das oberste Bit um ein Vorzeichenbit erweitert
Demo: Arithmetic Overflows
Spot the security bug CREATE PROCEDURE dbo.doQuery(@id nvarchar(128)) AS DECLARE @query nchar(256) SELECT @query=‚select ccnum from cust where id=‘‘‘ + @id + ‘‘‘‘ EXEC @query RETURN
Sünde #3: Command Injection
Das Prinzip Durch geschickte Wahl von Benutzereingaben den Sinn damit arbeitender Operationen verändern Prominente Vertreter: SQL Injection Format String Probleme Cross Site Scripting
Demo: Command Injection
Spot the security Bug string status = "No"; string sqlstring = ""; try { // SQL Zugriffscode } catch (SqlException se) { Status = sqlstring + " failed\r\n"; foreach (SqlError e in se.Errors) Status += e.Message + "\r\n"; } if (Status.CompareTo("No") != 0) { Response.WriteLine(Status);
Sünde #4: Information Leakage
Lösung... try { // SQL Zugriffscode } catch (SqlException se) { Status = sqlstring + " failed\r\n"; foreach (SqlError e in se.Errors) Status += e.Message + "\r\n"; WindowsIdentity user = WindowsIdentity.GetCurrent(); WindowsPrincipal prin = new WindowsPrincipal(user); if (prin.IsInRole(WindowsBuiltInRole.Administrator)) Response.WriteLine(Status); else { Response.Write("An error occurred, please bug your admin"); EventLog.WriteEntry("SqlApp", Status, EventLogEntryType.Error); }
Das Problem Dem Nutzer wird zu viel Information präsentiert Versehentlich => z.B. Fehlermeldungen Absichtlich => Nutzerdaten Warum ist das problematisch? Hacker können zusätzliche Informationen erlangen die Angriffe erleichtern! Datenschutz!
<Vortragstitel> An electronics manufacturer owns some very expensive testing equipment that is used in production. Because the equipment is valuable, the security department decides that these assets will be most secured if access is limited to a few people. Smart cards and costly locks are used to protect the equipment room. Only one person per shift, a senior manager, is given a key. Ten other people on each shift need access to the room to perform their daily duties. They are not issued keys and must be escorted to the equipment room by a key holder. Initially policy is followed, but managers soon tire of escort duties. Productivity suffers when managers are unavailable to open the door. The security department resisted manager requests for more keys, so managers arranged with the people needing access to leave the key in an unmarked desk drawer. One day, while a manager and her employees are in a meeting, equipment was stolen from the room. The key was also taken. The security department investigated, but failed to find the thief. There was debate over whether to discipline the manager, who was the only person issued the key. The managers recoiled because they felt the policy negatively impacted productivity, and because they had followed the key-sharing practice. TechNet Roadshow zum Windows Server System: Migration, Deployment und Sicherheit
TMI – Too Much Information Benutzername oder Paßwort falsch? Versionsinformationen verwendeter Software IP-Adressen, MAC-Adressen, etc... Pfade Genaue Fehlermeldungen
Abhilfe? Informationen zur Fehlersuche an vertrauenswürdiger Stelle ablegen EventLog Ggf. Geeignet abgesichertes Logfile Informationen nur an Administratoren ausgeben
Spot the security bug
Sünde #5: Schlechte Bedienbarkeit
Spot the security bug Salopp übersetzt: Klick‘ „Ja“, und alles geht, klick‘ „Nein“ und Du hast nur Ärger mit der Seite
Zusammenfassung Viele Sicherheitsprobleme lassen sich einfach verhindern Kein Vertrauen in Eingabedaten! Schon während der Planung mögliche Angriffsszenarien berücksichtigen Das Gesamtsystem ist immer so sicher wie sein schwächstes Glied
Weitere Informationen 19 Deadly Sins Of Software Security ISBN 0-07-226085-8 Microsoft Security Developer Center http://msdn.microsoft.com/security/
Fragen?
<Vortragstitel> TechNet Roadshow zum Windows Server System: Migration, Deployment und Sicherheit