10
Feb
2011

Principios de la seguridad en el desarrollo de aplicaciones

A continuación resumo los principios de la seguridad basados en el libro Writing Secure Code de Howard and LeBlanc’s y recogidos en la OWASP 2.0.1:

  • Minimizar la superficie de ataque – cuantas más funciones tenga una aplicación y más usuarios puedan acceder a ellas, mayores son los riesgos de introducir vulnerabilidades. Lo ideal es limitar la funcionalidad al mínimo necesario y restringir el acceso. Por ejemplo, no permitir que usuarios deslogueados puedan utilizar el formulario de búsqueda dentro de un sitio web;
  • Opciones seguras por defecto – las opciones que vienen configuradas por defecto en la aplicación deberían permitir una operación suficientemente segura. Es responsabilidad del usuario si desea asumir riesgos extra;
  • Principio del menor privilegio – los usuarios deberían tener los menores privilegios posibles que le habiliten a realizar las tareas que deben realizar;
  • Principio de defensa en profundidad – la seguridad debería lograrse con la suma de múltiples capas o controles que contemplen diferentes enfoques del riesgo;
  • Fallar seguramente – ante la posibilidad de un fallo del programa, deben tomarse precauciones para quedar en un estado consistente desde la perspectiva de la seguridad y no revelar información que pueda servir a un atacante;


Leer el resto del artículo »

9
Feb
2011

Seguridad en aplicaciones: STRIDE y DREAD

La selección de controles en el desarrollo de software deberían basarse en un enfoque de riesgos.

El método STRIDE sugiere evaluar los siguientes aspectos en la aplicación:

  • Spoofing identity – los usuarios no deberían en ningún momento ingresar como otro usuario o pasar por ellos luego;
  • Tampering of data – los usuarios pueden modificar los datos que le son enviados a través de los parámetros GET, POST, HTTP Headers, etc. Deben tomarse precauciones con los datos recibidos para verificar si son aplicables y evitar la validación por el lado del cliente;
  • Repudiation – deben generarse suficiente información de auditoría para trazar las acciones de los usuarios de manera que no puedan repudiarlas y asuman plena responsabilidad sobre ellas;
  • Information disclousure – deben protegerse a nivel de aplicación las posibles fugas de información, por ejemplo por navegadores que no aceptan las directivas de no-caché en los HTTP Headers;
  • Denial of service – las aplicaciones deben protegerse contra denegaciones de servicio causadas por ejemplo por el envío de archivos de gran tamaño o múltiples consultas a los servicios que proveen;
  • Escalation of privileges – las aplicaciones deben asegurarse que los usuarios no puedan elevar el nivel de permisos que tienen asignado conviertiéndose por ejemplo en administradores.


Leer el resto del artículo »

7
Feb
2011

Evitar modificaciones al archivo /etc/resolv.conf

resolv.conf
El archivo /etc/resolv.conf en Linux guarda la información sobre los servidores recursivos que se utilizarán para resolver las consultas de DNS. El software Network Manager modifica automáticamente ese archivo, por ejemplo con información obtenida de un servidor de DHCP. En algunos casos nos interesa que no se modifiquen estos servidores, porque queremos utilizar alguno específico o porque, como me estaba sucediendo a mí, se está grabando el archivo sin información.

Si modificamos manualmente el archivo, en el próximo reinicio Network Manager hará de las suyas.

El workarround que encontré es aprovechar una característica de Linux para setear atributos en los archivos y, en este caso, hacerlo inmodificable. Ni siquera como root podremos modificarlo.

Para setear el atributo de inmutabilidad:

chattr +i /etc/resolv.conf


Leer el resto del artículo »

5
Feb
2011

Principios y criterios para los Servicios de Confianza

Foundation for Trust Services—Trust Services Principles and Criteria

.10 The following principles and related criteria have been developed by the AICPA and the Canadian Institute of Chartered Accountants (CICA) for use by practitioners in the performance of trust services engagements:4

  • Security. The system is protected against unauthorized access (both physical and logical).
  • Availability. The system is available for operation and use as committed or agreed.
  • Processing integrity. System processing is complete, accurate, timely, and authorized.
  • Confidentiality. Information designated as confidential is protected as committed or agreed.
  • Privacy. Personal information5 is collected, used, retained, disclosed, and destroyed in conformity with the commitments in the entity’s privacy notice and with criteria set forth in generally accepted privacy principles (GAPP) issued by the AICPA and CICA (found in appendix D [paragraph .48]).


Leer el resto del artículo »

2
Feb
2011

Debug de memoria en C con mcheck() y mprobe()

Comparto aquí un código con el que estuve haciendo algunas pruebas para debuguear memoria en C. Lo que hace es forzar errores escribiendo memoria no reservada y utilizar las funciones mcheck() y mprobe() de la librería GNU Libc para obtener información del error.

#include <stdio .h>
#include <stdlib .h>
#include <string .h>
#include <mcheck .h>
#include <malloc .h>
 
void error_memoria (enum mcheck_status estado_mcheck);
 
void error_memoria(enum mcheck_status estado_mcheck){
	printf("Llamada ocasional de mcheck() a error_memoria()\n");
}
 
main()
{
	//Chequeos de memoria ocasionales con mcheck
	int r = mcheck(error_memoria);
	if(r == 0)
		printf("Llamada a mcheck() ok\n");
	else if(r == -1)
		printf("Llamada a mcheck() tardía\n");
 
	//Reservar memoria y setearla en NULL para un array de chars de 6 lugares
	char* array_chars = (char*)malloc(sizeof(char)*6);
	memset(array_chars, '\0', 6);
 
	//Cargar esos lugares con el string "hola"
	strcpy(array_chars, "hola");
 
	//Iterar para obtener las direcciones de memoria y sus valores del array + 5 lugares fuera del array
	int i;
	for(i=0; i < sizeof(array_chars) + 5; i++){
		printf("Direccion %c: %x\n", array_chars[i], (int)&array_chars[i]);
 
		//Escribir fuera del array con valores NULL
		if(i >= sizeof(array_chars)){
			//Comentar esta línea para evitar este tipo de error
			array_chars[i] = '\0';
		}
	}
 
	//Obtener la direccion de memoria anterior al array y cargarle el valor NULL
	int mem0 = ((int)&array_chars[0]) - 1;
        char* ptr = (char*)mem0;
	//Descomentar esta línea para forzar la escritura anterior al bloque.
        //*ptr = '\0';
 
	//Descomentar esta línea para forzar un error del tipo 'memoria ya liberada'	
        //free(array_chars);
 
	//Realizar una comprobación de memoria con mprobe() al array de chars
	enum mcheck_status estado = mprobe(array_chars);
	switch (estado){
		case MCHECK_DISABLED:
			printf("Estado disabled: mcheck no fue llamado al principio. No se puede hacer una comprobación coherente de memoria.\n");
			break;
		case MCHECK_OK:
			printf("Estado ok: no hay inconsistencias detectadas\n");
			break;
		case MCHECK_HEAD:
			printf("Estado head: los datos inmediatamente anteriores al bloque reservado fueron modificados.\n");
			break;
		case MCHECK_TAIL:
			printf("Estado tail: los datos inmediatamente posteriores al bloque fueron modificados.\n");
			break;
		case MCHECK_FREE:
			printf("Estado free: el bloque ya fue liberado\n");
			break;
		default:
			break;
	}
}
</malloc></mcheck></string></stdlib></stdio>


Leer el resto del artículo »

29
Jan
2011

SetUID y SetGID en Linux

El esquema de permisos de UNIX permite definir qué usuarios pueden ejecutar un binario: el propietario, el grupo al que pertenece el propietario o el resto de los usuarios. Cada binario se ejecuta con los permisos que tenga asignados el usuario que lo está invocando. Ese esquema básico no es suficiente para realizar tareas normalmente requeridas por el usuarios. SetUID y SetGID son bits que le permiten a la aplicación ejecutarse con los permisos de su propietario. En caso de que el propietario sea root -caso general- la aplicación ejecuta con permisos administrativos por más que la invoque un usuario de permisos limitados. No cualquier usuario puede setearle estos bits a una aplicación, solamente su propietario/grupo y el usuario root.

¿Para qué se usa?

Supongamos que un usuario desea cambiar su contraseña. ¿Le daríamos permisos de modificar el archivo /etc/shadow? No. Lo que podríamos hacer es que la modificación de este archivo se haga a través de la aplicación passwd. Esta aplicación sí requiere permisos sobre el archivo. La diferencia es que la aplicación modifica el archivo con sus propias restricciones y no le brinda al usuario información que no debería saber.


Leer el resto del artículo »

27
Jan
2011

Proteger SWAP files en OS X Server

En la memoria RAM se almacenan las contraseñas -sin cifrar- utilizadas por las aplicaciones durante su operativa normal. Cuando el equipo es apagado, esta memoria volátil se borra. Si bien existen ataques de recuperación en frío, debido a su complejidad y costo puede asumirse que son improbables en la mayoría de los escenarios.

El problema se da cuando la memoria RAM es insuficiente y con técnicas de swapping el sistema operativo comienza a grabar en disco esta información para hacer lugar a otras aplicaciones. Al grabar la información en disco sin proteger, estamos aceptando una exposición grande de datos eventualmente confidenciales.

Un segundo problema es la hibernación. Durante este proceso, el sistema operativo hace una copia de la memoria RAM en disco, que recupera al despertarse.


Leer el resto del artículo »

26
Jan
2011

Alta disponibilidad en Red Hat Enterprise Linux

Imaginemos un servidor de datos críticos con requerimientos de alta disponibilidad y el riesgo identificado de que falle la tarjeta de red. Una medida, de bajo costo, para mitigar este riesgo sería instalarle dos tarjetas de red y en caso de que una falle, continuar operando automáticamente con la otra.

A nivel lógico esto es posible en Red Hat Enterprise Linux mediante las bonding interfaces. Se trata de un módulo del kernel que permite asignar a dos interfaces de red la misma dirección IP y utilizarlas como si fueran una sola. En situaciones normales, se distribuye la carga entre ambas. En la situación de que una falle, actúa la restante como contingencia.

Para configurarlas, agregamos en la carpeta /etc/sysconfig/network-scripts/ un archivo llamado ifcfg-bond<N>, siendo N un número como por ejemplo 0.

Ese archivo podría tener por ejemplo las siguientes líneas:

DEVICE=bond<N>
IPADDR=192.168.42.131
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=none
USERCTL=no


Leer el resto del artículo »

21
Jan
2011

Levanta tu propio servidor DNS Recursivo

Normalmente en Uruguay los servidores de DNS Recursivos utilizados para transformar un FQDN (Fully Qualified Domain Name) en una dirección IPv4 son los de Antel (200.40.30.245 y 200.40.220.245). En ámbitos corporativos pueden utilizarse servidores DNS propios para aprovechar las ventajas de guardar nombres resueltos en memoria cache y minimizar el tráfico a Internet.

Levantar nuestro propio servidor de DNS Recursivo es fácil. Tenemos en este caso dos Linux: un servidor de DNS (192.168.56.100 o ubuntu-server) y una workstation desde las que haremos las consultas (192.168.56.101 o martin-VirtualBox). Luego de seguir los pasos mencionados en el artículo anterior, agregamos los siguientes parámetros al archivo de configuración /etc/bind/named.conf dentro del bloque options:

recursion yes;
allow-recursion { 192.168.56.101; };
allow-query { 192.168.56.101;  };
allow-query-cache { 192.168.56.101;  };
max-cache-size 256M;

Cambiamos los valores a nuestras IPs.


Leer el resto del artículo »

21
Jan
2011

Servidor de DNS Bind en Linux y OS X Server

Levantar servidores de DNS -con configuración básica- en Linux y OS X es relativamente sencillo. Utilizamos el servidor de DNS Bind para las pruebas.

OS X Server

Ingresamos a Server Admin -> Settings -> Services -> DNS.

Luego, en el servicio DNS seleccionamos Start DNS.

Para agregar zonas, ingresamos a Zones y seleccionamos Add zone configurando los datos que correspondan.

Ubuntu Server


En el caso de Ubuntu, ejecutamos el siguiente comando para instalar Bind:

apt-get install bind9


Leer el resto del artículo »