Desarrollo De Software Seguro
Es un error de software que se produce cuando un programa no controla adecuadamente la cantidad de datos que se copian sobre un área de memoria reservada a tal efecto (buffer), de forma que si dicha cantidad es superior a la capacidad pre-asignada los bytes sobrantes se almacenan en zonas de memoria adyacentes, sobrescribiendo su contenido original.
Lenguajes afectados
Loslenguajes que más vulnerabilidades presentan a causa del buffer overflow son los de bajo y medio nivel, siendo los más representativos Lenguaje Ensamblador, C y C++. En menor medida también afectan a Java, C# y .NET.
¿Cómo prevenirlo?
* Remplace funciones peligrosas de manejo de cadenas.
* Audite asignaciones.
* Verifique bucles y accesos a matrices.
* Remplace buffers de cadenade C con cadenas de C++.
* Remplace matrices estáticas con contenedores de STL.
Ejemplo
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char buffer[10];
if (argc < 2)
{
fprintf(stderr, "MODO DE USO: %s string\n", argv[0]);
return 1;
}
strcpy(buffer, argv[1]);
return 0;
}
Heap Overflow
El heap overflow es untipo de buffer overflow que se produce en un área de memoria denominada heap. La memoria heap se reserva dinámicamente con funciones como por ejemplo malloc() y puede ser sobrescrita de forma similar a la que se produce en los buffer overflow, es decir, en situaciones en las que el programador no verifica correctamente el tamaño de los datos que copia.
Lenguajes afectados
De manera análoga aldesbordamiento de buffer, el heap overflow se presenta en los mismos lenguajes que se mencionan en el punto anterior, y las técnicas para prevenirlo son, por tanto, similares.
Ejemplo
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
main(int argc, char *argv[]){
char *user=malloc(64);
char *password=malloc(64);
int *login_ok=malloc(sizeof(int));*login_ok=0;
strncpy(user,argv[1],strlen(argv[1]));
strncpy(password,argv[2],strlen(argv[2]));
printf("Usuario: %s\n",user);
printf("Contrasena: %s\n",password);
printf("Login: %d\n",*login_ok);
if(*login_ok)
printf("Acceso autorizado\n");
else
printf("Acceso denegado\n");
}
Formato de cadena
El formateo de datos para despliegue o almacenamiento representa una tareadifícil; por tanto, en muchos lenguajes se incluyen rutinas para reformatear datos con facilidad. En casi todos los lenguajes la información de formato se describe a través de un tipo de cadena, denominada cadena de formato.
Muchos desarrolladores cometen un sencillo error: utilizan datos de usuarios no confiables como cadena de formato; el resultado es que los atacantes pueden escribir cadenas quecausan muchos problemas.
El diseño de C y C++ dificulta la detección de problemas de cadena de formato. La principal causa de los errores de cadena de formato es aceptar sin validar la entrada proporcionada por el usuario.
Lenguajes afectados
Los lenguajes más afectados por este problema son C y C++ porque es posible utilizar errores de cadena de formato para escribir en ubicaciones dememoria arbitrarias.
¿Cómo prevenirlo?
1. Usando herramientas Scanner de código fuente
a. PSCAN
b. RATS
c. FlawFinder
2. Herramientas de respuesta que se integran en la compilación
d. FormatGuard
3. No pasar directamente las entradas del usuario a una función de formateo.
4. No usar la función printf, sino std::cout
5. Usar lenguajes dealto nivel menos vulnerables.
Ejemplo
#include<stdio.h>
#include<string.h>
main(int argc, char *argv[]){
if(argc>1)
printf(argv[1]);
printf("\n");
}
Exploit
Exploit es el nombre con el que se identifica un programa informático malicioso, o parte del programa, que trata de forzar alguna deficiencia o vulnerabilidad de otro programa. El fin puede ser la destrucción...
Regístrate para leer el documento completo.