desarrollo de aplicaciones seguras con.net david carmona [email protected] división de...
TRANSCRIPT
Desarrollo de aplicaciones seguras con .NET
David Carmona
División de Desarrolladores y Plataforma
Microsoft Ibérica
¿Qué vamos a ver?Preguntas sobre Preguntas sobre
seguridadseguridadPreguntas sobre Preguntas sobre
seguridadseguridad
Análisis Análisis amenazasamenazasAnálisis Análisis
amenazasamenazas
Criterios Criterios aceptación aceptación seguridadseguridad
Criterios Criterios aceptación aceptación seguridadseguridad
Revisión de Revisión de seguridad del seguridad del
diseñodiseño
Revisión de Revisión de seguridad del seguridad del
diseñodiseño
Mejores Mejores prácticas de prácticas de desarrollodesarrollo
Mejores Mejores prácticas de prácticas de desarrollodesarrollo
Pruebas Pruebas seguridadseguridadPruebas Pruebas
seguridadseguridad
Pruebas mínimo Pruebas mínimo privilegioprivilegio
Pruebas mínimo Pruebas mínimo privilegioprivilegio
Security PushSecurity PushSecurity PushSecurity Push
Instalación y Instalación y operacionesoperacionesInstalación y Instalación y operacionesoperaciones
Aprender y Aprender y redefinirredefinir
Aprender y Aprender y redefinirredefinir
Revisiones de Revisiones de códigocódigo
Revisiones de Revisiones de códigocódigo
Pruebas mínima Pruebas mínima exposiciónexposición
Pruebas mínima Pruebas mínima exposiciónexposición
Errores más comunes
Fuente @Stake The Security of ApplicationsFuente @Stake The Security of Applications
Porcentaje de aplicacionesPorcentaje de aplicaciones
Cifrado débilCifrado débil2424%%
Autenticación falseableAutenticación falseable 6262%%
Validación de entrada vulnerableValidación de entrada vulnerable 7171%%
Algún error de seguridadAlgún error de seguridad 100100%%
Validación de la entrada Identificar posibles entradas
Campos HTML, controles WinForms Servicios Web / Remoting / DCOM QueryString, Cookies, Viewstate
¡¡ Nunca confiar en su contenido !! Validar en servidor
Buffer overruns Inyección SQL Cross-site scripting (XSS)
PUSH 0x00001234PUSH 0x00001234PUSH [0x0A2EF4D9]PUSH [0x0A2EF4D9]CALL 0x0A3BA78CCALL 0x0A3BA78C
Validación de la entradaBuffer overruns
void UnSafe (const char* datoSinValidar)
{
int otraVariableLocal;
strcpy (variableLocal, datoSinValidar);
}
char variableLocal[4];
Stack
char[4]
int
Return address
0x01 0x01 0x01 0x010x01 0x01 0x01 0x010x01 0x01 0x01 0x010x01 0x01 0x01 0x010x0A 0x3B 0xA4 0x290x0A 0x3B 0xA4 0x290x00 0x14 0x5B 0xB10x00 0x14 0x5B 0xB10xDA 0xC1 0x42 ... 0xDA 0xC1 0x42 ...
datoSinValidar
0x01010101
0x01010101
0x0A3BA429
Validación de la entradaBuffer overruns Causas más comunes
Copia de cadenas Arrays Reserva de memoria insuficiente
Defensas Utilizar código manejado
Vigilar P/Invoke, código unsafe
Usar con cuidado strcpy, memcpy Mejor equivalentes en strsafe.h
Habilitar switch /GS
Validación de la entrada Inyección SQL Control del criterio de una sentencia SQL
desde algún parámetro de entrada
SqlConnection conn= new SqlConnection(“server=localhost;Database=Northwind” + “user id=sa;password=pass*word;");
string sqlString="SELECT * FROM Orders WHERE “ + “CustomerID='" + idCliente + "'";
SqlCommand cmd = new SqlCommand(sqlString, conn);conn.Open();SqlDataReader reader = cmd.ExecuteReader();
// ...
Validación de la entrada Inyección SQL
SELECT * FROM Orders WHERE CustomerID=‘VINET'
La gente buena introduce La gente buena introduce VINETVINET
SELECT * FROM Orders WHERE CustomerID=‘VINET‘OR 1=1 --’
Los malos Los malos VINET’ OR 1=1 --VINET’ OR 1=1 --
SELECT * FROM Orders WHERE CustomerID=‘VINET‘; DROP TABLE ORDERS --’
Los malísimos Los malísimos VINET’; DROP TABLE ORDERS --VINET’; DROP TABLE ORDERS --
SELECT * FROM Orders WHERE CustomerID=‘VINET‘;exec xp_cmdshell ‘format C:’
Los @*^#Los @*^# VINET’;exec xp_cmdshell ‘format C:VINET’;exec xp_cmdshell ‘format C:
Validación de la entradaInyección SQL Utilizar comandos parametrizables
Al menos minimizarlo Validar entrada en servidor Usar cuentas SQL restringidas No volcar mensajes de error
string sqlString="SELECT * FROM Orders WHERE CustomerID=@custID";
SqlCommand cmd = new SqlCommand(sqlString, conn);cmd.Parameters.Add("@custID", idCliente);
Validación de la entradaCross-site scripting Agujeros que permiten al hacker ejecutar
código script en un cliente web Dos entradas principales
Contempladas (foros, emails, librerías…) Ocultas (querystring, campos HTML…)
Efectos habituales Modificación del contenido Envío de información Robo de sesión
Validación de la entradaCross-site scripting Validar y limpiar cualquier entrada
Vigilar <script>, <object>… Especialmente la que es mostrada después
Utilizar HttpOnly en IE6.1 Aprovechar ASP.NET
HTMLEncode para limpiar ValidateRequest para validar todas las entradas
Autenticación falseableRobos de passwords Nunca enviar por canales inseguros
Cuidado con RPC, Remoting
Proteger su almacenamiento Establecer políticas Utilizar hash con salt
PasswordPassword
SHA1CryptoServiceProvider.ComputeHash
SaltSalt
HashHash
Autenticación falseableModificación de ticket
ASP.NET utiliza tickets en forma de URL o cookie
Robo de cookie Cuidado con XSS Usar RequireSSL y !Persistent
Modificación de cookie Si contiene información del usuario Utilizar MAC
Cifrado débilDefensas Mejor sin secretos
Utilizar hash Usar autenticación integrada
Si los hay mejor en servidor No almacenar en querystring, campos
ocultos, viewstate, …
En cualquier caso usar siempre cifrado ¡Nunca uno propio!
Cifrado débilAlgoritmos de cifrado
El punto débil está en la clave Para no trastear con ella…
Cifrar con certificado digital Acceso controlado por Windows
Usar DPAPI Clave controlada por Windows
Dispositivos hardware
Sumario La gran mayoría de las aplicaciones tienen
agujeros de seguridad ¿Y la tuya?
La regla del 20 / 80 Validación de entrada Autenticación Cifrado
El 100% está en el resto del ciclo de vida
Para saber más Seminarios de seguridad TechNet Security Day
Barcelona 5 febrero Madrid 12 febrero
Guías de arquitectura (PAGs) http://msdn.microsoft.com/architecture/application/default.aspx
Ms Press Writing Secure Code