domingo, 27 de septiembre de 2015

Pruebas de Software

Para poder hablar de las "Pruebas de Software", primero es necesario conocer el proceso mediante el cual son desarrollados los softwares, a este proceso que no solo incluye su periodo de desarrollo, sino también su implementación y manutención, se le llama "Ciclo de Vida del Software" y puede resumirse en la siguiente ilustración:


Pruebas.

Ya una vez conociendo en qué momento de la vida del software se llevan a cabo las pruebas, se puede hablar de que las pruebas pueden entenderse como actividades que se planean con anticipación y se llevan a cabo de forma sistemática, pero al aplicarse al software, necesitan de un plan de pruebas de software, Éstos son procesos en el que se ejecuta un programa con la intención de encontrar un error que aún  o se descubre.


Verificación y Validación.

Cuando se está desarrollando un software y se van aplicando las pruebas, algo que nunca debe perderse de vista es que constantemente debe de llevarse a cabo validaciones y verificaciones, pero ¿Qué significan estos dos conceptos?
  • Validación: En el ámbito del software, la validación es el proceso de revisión al que se somente un programa para comprobar que cumple con sus especificaciones. Esto se realiza con la intención de confirmar que el programa permita llevar a cabo las tareas que sus potenciales usuarios esperan de ella. Éste concepto puede sintetizarse con la pregunta: ¿Se está construyendo el producto correcto?
  • Verificación: Tiene su raíz en el latin "Veriticare" que está compuesto por dos partes: "veritas" (verdadero), y "facere" (hacer). Con esto se entiende que verificación es la acción de verificar, que es comprobar o examinar la verdad de algo, y suele ser un proceso que se realiza para revisar si una determinada cosa está cumpliendo con los requisitos y normas previstos, se puede sintetizar con la siguiente pregunta: ¿Se está construyendo correctamente el producto?

Tipos de Pruebas:
  • Pruebas de Unidad:
    • Son pruebas que lo que hacen es probar una unidad estructural de un código y tienen las siguientes características:
      • Unitarias: Prueban únicamente pequeñas cantidades del código.
      • Independiente: No debe depender ni afectar a otras pruebas unitarias.
      • Prueba métodos públicos: De otra manera la prueba sería frágil a cambios en la implementación y no se podría utilizar en pruebas de regresión.
      • Automatizable: La prueba no debería requerir intervención manual.
      • Repetición y Predecible: No debe incidir el orden y las veces que se repita la prueba, el resultado debe ser siempre el mismo.
      • Profesionales: Deben tener la misma importancia y cuidado que el mismo código.
  • Pruebas de Integración:
    • Su propósito es probar grupos de unidades relacionadas para verificar su operación conjunta, por lo que su énfasis está en la interacción de las partes, no en cada parte individual, gracias a esto son capaces de identificar problemas de interfaces entre unidades y la falta de coherencia entre lo que se espera de una unidad y lo que se ofrece.
  • Pruebas de Validación:
    • Como su nombre lo indica, son pruebas cuyo objetivo es validar lo que se está haciendo, en este caso el software o proyecto, y esta validación debe de llevarse a cabo con la persona que quiere ese software, es decir el cliente para que éste confirme o desmienta que el software en desarrollo cumpla con sus requerimientos y especificaciones.
  • Pruebas de Sistema:
    • Como dice su nombre, el propósito de este tipo de pruebas es poner a prueba el sistema ya en su totalidad, con todas las partes que deben de intervenir en él, tanto la parte de codificación y funcionamiento de cada uno de sus módulos, pasando por la integración de éstos para que funcionen como uno solo, hasta la parte de la interacción de los usuarios con el sistema, podría decirse que lo se hace es probar al sistema en su "ambiente natural".

domingo, 20 de septiembre de 2015

Servicios, Mecanismos y Ataques a la seguridad

Cuando hablamos de seguridad, lo que se da a entender es que nos estamos defendiendo de algo, pero ¿qué es ese algo?, aplicando esta idea a lo que es la seguridad web, tenemos que es necesario que antes de hablar de hablar de mecanismos y servicios de seguridad, se debe de hablar de los ataques a la seguridad y los tipos que existen.

¿Qué es un Ataque?

Para comprender qué es un ataque se debe tener presente el concepto de amenaza, que en términos simples es una vulnerabilidad que se da en el sistema debido a diversas causas y circunstancias, que se podría explotar para generar un ataque.

Con la idea de lo anterior, podemos decir que un ataque es un asalto a la seguridad de un sistema causado por una amenaza previa que fue explotada para así evadir o violar los protocolos de seguridad del sistema y acceder a él con algún propósito.

Tipos de Ataques:
  • Pasivos: Este tipo de ataques se caracterizan porque no alteran la información que se encuentra dentro de un sistema, sino que simplemente se "escucha" u "observa" de manera no autorizada una transmisión de datos, esto normalmente con el objetivo de solamente obtener la información. De este tipo de ataques existen 2 variedades: La obtención de contenido de mensajes y el análisis de tráfico.
    • Obtención de contenido de mensajes: La mayor parte se explica por sí sólo, como su nombre lo dice, se refiere a la obtención de transmisiones que se hacen desde correos electrónicos, llamadas telefónicas, envíos de archivos, etc. En las que se obtiene acceso al contenido enviado en cuestión pero sin alterarlo de alguna forma.
    • Análisis de Tráfico: Es un poco más difícil de explicar pero significa exactamente como suena, se refiere a que cuando se está llevando a cabo una transmisión de datos, se "observa" de dónde está saliendo ese mensaje, el destino de éste, toda la ruta por la cual pasa y la longitud del mismo (sin ver nunca su contenido), esto con diversas finalidades.
  • Activos: Este tipo de ataques implican ya algún tipo de modificación en el flujo de datos, la creación de un flujo falso o incluso la anulación de. Estos ataques se dividen en 4 categorías:
    • Suplantación de Identidad: Como su nombre lo dice, se da cuando una entidad finge ser otra con alguna finalidad.
    • Repetición: Se refiere a la captura de forma pasiva de una unidad de datos para luego retransmitirla y así producir un efecto no autorizado.
    • Modificación de mensajes: Como su nombre lo dice, se refiere a que una parte del mensaje original es alterado de alguna forma para producir un efecto no autorizado.
    • Interrupción del servicio: Impide el uso o la gestión normal de las utilidades de comunicación.
¿Cómo nos defendemos de los ataques?

Una vez conociendo los tipos de ataques que existen, ya se puede hablar de mecanismos y servicios de seguridad para contrarrestar los posibles ataques que se pueden sufrir.

Mecanismos de Seguridad.

Un mecanismo de seguridad como su nombre indica es un mecanismo, pero es uno que está diseñado para detectar un ataque a la seguridad, prevenirlo o restablecerse de él. Existen 7 principales mecanismos:
  1. Firma digital: Son datos añadidos a o una transformación criptográfica de una unidad de datos que permite al receptor verificar la fuente e integridad de datos, y así protegerla de la falsificación.
  2. Control de acceso: Serie de mecanismos que refuerzan los derechos de acceso a los recursos.
  3. Integridad de datos: Verifica la integridad de la unidad de datos o el flujo de unidad de datos.
  4. Intercambio de autenticación: Es un mecanismo diseñado para comprobar  la identidad de una entidad por medio del intercambio de información.
  5. Relleno de tráfico: Se refiere a insertar bits en espacios de un flujo de datos para frustrar los intentos de análisis de datos.
  6. Control de enrutamiento: Permite la selección de rutas físicamente seguras para determinados datos, y permite los cambios de enrutamiento cuando se sospecha de una brecha de seguridad.
  7. Notarización: Es el uso de una tercera parte confiable para asegurar propiedades de un intercambio de datos.
Como puede observarse, los mecanismos de seguridad son medidas que se utilizan para combatir ataques en particular, pero por lo mismo un mecanismo sólo te va a proteger de uno de los varios tipos de ataque que existen, es debido a esto que cuando se implementan medidas de seguridad en un sistema, lo que se utiliza son los servicios de seguridad.

Servicios de Seguridad.

Un servicio de seguridad podría definirse de manera sencilla como un conjunto de uno o más mecanismos (existen mecanismos que al mismo tiempo son servicios) que son utilizados para contrarrestar los ataques y así proporcionar el servicio de seguridad, algunos servicios son los siguientes:
  • Autentificación de Entidades.
  • Autentificación del origen de los datos.
  • Control de acceso.
  • Confidencialidad.
  • Confidencialidad del flujo de tráfico.
  • Integridad de los datos.
  • No repudio.
  • Disponibilidad.
Los siguientes son unos cuadros para representar de manera gráfica los servicios vs ataques, servicios vs mecanismos y mecanismos vs ataques:














































domingo, 13 de septiembre de 2015

Set de Pruebas para un programa que multiplique dos números enteros.

Se llevó a cabo un set de 100 pruebas para, como el nombre sugiere, probar un programa cuya función es multiplicar dos números enteros, el programa en cuestión es el siguiente:















El programa es bastante sencillo, y el código que se va a utilizar para ponerlo a prueba es el siguiente:


















Como se puede notar, la forma en la que se va a probar el programa, es intentando enviarle como parámetros para la ejecución diversos tipos de datos, no únicamente de tipo int como espera recibir el programa, de esta forma se espera que se den errores y para ello se utilizaron los comandos try-catch para imprimir el error en cuestión y que la ejecución no se detenga.

Cada uno de los tipos de datos primitivos de java, que son 8 van a ser probados alrededor de 12 veces utilizando el comando for, el resultado va a ser impreso y así se podrá ver con qué tipos de dato el programa no pudo ejecutarse correctamente. Los resultados de las pruebas son los siguientes:




















Tras ver la ejecución de estas pruebas, puede notarse que únicamente con aquellos datos que eran enteros a pesar de no ser int, el programa funcionó correctamente, mientras que con aquellos datos que eran decimales o aquellos que ni siquiera eran números, el programa falló y se imprimió el error en cuestión, la excepción a esto fueron las pruebas con datos del tipo char, y esto se debe a que en el momento que se creaban los datos, se multiplicaban con un numero entero para que tomara el valor de un carácter del código ASCII, sin embargo al momento de castearlo, el valor que envió fue el numérico del carácter en el código ASCII, no el carácter en sí, es por esto que el programa funcionó a pesar de que teóricamente no debería de haberlo hecho.

Llevar a cabo sets de pruebas es una herramienta muy util, porque con ella podemos de ver que tipo de errores o vulnerabilidades tiene el programa y así durante su construcción corregirlos para que una vez que se lleguen a sus etapas finales de desarrollo, la cantidad de vulnerabilidades que tenga sea mínima y por lo tanto, más seguro.

domingo, 6 de septiembre de 2015

Seguridad Web, Amenazas y Ataques


Introducción: ¿Qué es la seguridad?

Cuando se piensa en la palabra seguridad, vienen a la mente dos principales ideas: prevenir un daño y evitar tener una debilidad. El concepto de seguridad se remota a la misma existencia de nuestra especie, pues desde nuestros antepasados, se veían a los árboles como objetos que nos brindaban seguridad, al impedir que los depredadores nos alcanzaran si es que estábamos en la cima de ellos, las cuevas se veían como lugares que brindaban protección frente a las amenazas del clima, el fuego como defensa para ahuyentar a los depredadores que se acercaran, en suma y de diferentes formas, todos esos objetos brindaban seguridad.

Con base en lo anterior, se puede decir que la seguridad es aquello (ya sea un objeto, reglas, plan, etc.) que evita sufrir un ataque de algo y minimizar las posibilidades de que algo se convierta en una potencial amenaza que pueda derivar en un ataque. Ahora, ¿Cómo podría aplicarse esto a lo que es el internet?

Desarrollo: La seguridad web.

Conforme han pasado los años, la web ha ido creciendo exponencialmente hasta tal punto de convertirse en el banco de información más grande del mundo, albergando información de todo tipo, la cual está disponible para todo aquel que tenga una computadora y conexión a internet.

Sin embargo, todo este sistema que es la web tiene un diseño detrás que define cómo es que está construido y cómo funciona. Por esto mismo es posible hacer lo que se conoce como "ataques" al sistema para violar sus protocolos con algún fin, ya sea extraer información, tirarlo de la web, destruirlo, etc. Es por esto que tanto en el desarrollo de un sistema como en su manutención, es necesario aplicar la seguridad para evitar que este tipo de cosas sucedan, sobre todo porque ya es muy común que empresas manejen grandes sumas de dinero a través de internet, además de información personal, laboral, planes de empresa, etc.

De esta forma, al aplicar el concepto de seguridad a la web, podría decirse que son aquellas medidas utilizadas para evitar un ataque a un sistema web y que por medio de este quede en las manos del atacante, además de evitar desde la construcción del sistema la existencia de vulnerabilidades dentro del mismo que podrían ser explotadas para generar un ataque.

La principal razón por la que se dan problemas en la seguridad web es porque el programador del sistema descuida los siguientes aspectos:

  • Entradas al sistema.
  • Salidas del sistema.
Esto se refiere a que se descuidan los métodos mediante los cuales el usuario y los datos ganan acceso al sistema, son procesados y posteriormente salen del mismo, al estar descuidados, existen lagunas en las que un atacante es capaz de extraer o leer la información que está entrando y saliendo del sistema, y a través de ésta ganar un acceso que no debería de tener.

Con esto como base, se tiene la convención de que los requerimientos de seguridad de un sistema son:
  • Autenticación.
  • Autorización.
  • Confidencialidad.
  • Integridad.
  • No repudiación.
  • Alta disponibilidad.

Para lidiar con este tipo de complicaciones, existen métodos de seguridad básicos para incrementar la protección de un sistema, algunos de estos son:
  • Balancear riesgo y usabilidad: Se refiere a que si se exceden las medidas de seguridad para combatir a los usuarios ilegales dentro del sistema, se corre el riesgo de ser demasiado restrictivo con los usuarios legales, por lo que la mejor medida es balancear las cosas y utilizar métodos de seguridad que sean transparentes para los usuarios.
  • Rastrear el paso de datos: Como su nombre lo dice, trata acerca de saber de dónde vienen los datos que están entrando al sistema y saber hacia dónde van, para saber si de la fuente de la que provienen es válida o no.
  • Filtrar entradas: En esencia se refiere al proceso mediante el cual se validan los datos que están siendo enviados o recibidos para así evitar datos "contaminados" que pongan en riesgo al sistema.
  • Escapar salidas: Se refiere al proceso para codificar o decodificar información que está saliendo del sistema de tal forma que su significado original se preserve.
Todo esto es algo muy importante para poder implementar un buen nivel de seguridad en un sistema, sin embargo también es importante saber con qué tipo de amenazas y ataques se están lidiando, dado que por pura lógica, no te puedes defender de algo si no sabes cuál es la amenaza.

Algunos tipos de amenazas son las siguientes:
  • Spyware: Se le conoce como software espía y como su nombre dice es un software que se enfoca en estar "espiando" el sistema en cuestión y así recopilar información mientras pasa desapercibido, por sí mismo no es algo peligroso (como con todas las amenazas) dado que sólo recopila información, el problema viene cuando el que recibe la información decide utilizarla con algún fin.
  • Adware: Tipo de spyware que recolecta información sobre el usuario algunas veces para mostrar anuncios publicitarios de acuerdo al perfil del mismo.
  • Malware: Es una categoría de código malicioso que incluye virus, gusanos y caballos de Troya, su propósito es de carácter destructivo, es decir acceder a la información del usuario y mediante algún método robarla o eliminarla.
  • Virus: Programa o archivo que al ejecutarse corre un código que infecta el equipo, es decir, altera el funcionamiento normal de la computadora. Como los virus humanos los de computadora varían por el nivel de infección desde los simples que son fáciles de limpiar hasta los que su daño puede ser mayor que inclusive deje inservible el sistema operativo debido a que atacan archivos importantes como los BIOS. La mayoría de los virus se propagan de computadora en computadora, los gusanos y caballos de troja son un tipo de ellos.
  • Correo Spam: Correo electrónico basura no solicitado también llamado "junk mail", generalmente enviado en forma masiva y conteniendo publicidad o ataques de robo de identidad (phishing).
  • Phishing: Proceso fraudulento que se da cuando un estafador envía mensajes de correo electrónico de tipo spam o mensajes del tipo pop-up para atraer con engaño a los usuarios y obtener información  sensible como cuentas de usuario, contraseñas, números de tarjetas de crédito, datos de cuentas, así como cualquier información personal.
Los ataques más comunes en sistemas web son los siguientes:
  • Ataques URL de tipo semántico:
    • Este tipo de ataques involucran a un usuario modificando la URL a modo de descubrir acciones a realizar originalmente no planeadas para él.
  • Ataques al subir archivos:
    • Existen ataques que aprovechan la posibilidad de la aplicación de subir archivos al servidor. la forma en la que funciona que funcionan es que generalmente PHP almacena los archivos subidos en un carpeta temporal, pero es común en las aplicaciones cambiar la localización del archivo subido a una carpeta permanente y leerlo en la memoria. Al hacer este tipo de procedimientos se debe revisar el parámetro al que va a hacer referencia al nombre del archivo, ya que puede ser truqueado de tal forma que apunte a archivos de configuración del sistema.
  • Ataques de Cross-Site Scripting:
    • XSS es un tipo de vulnerabilidad de seguridad informática normalmente encontrada en aplicaciones web que permiten la inyección de código por usuarios maliciosos en páginas web vistas por otros usuarios, los atacantes típicamente se valen de código HTML y de scripts ejecutados en el cliente, pueden ser vistas como técnicas de evasión de las políticas de protección. Encontrando formas ingeniosas de inyectar códigos maliciosos en las páginas servidas por otros dominios, de esta forma se puede ganar privilegios a datos sensibles, cookies de sesión y otros objetos.
      • Vulnerabilidad XSS tipo 0: Conocido como basado en el DOM o Local, con este tipo de vulnerabilidad, el problema existe en el script del lado del cliente.Si un código de JavaScript accede a una URL como un parámetro de una petición al servidor y utiliza esta información para escribir HTML en la misma página sin ser codificada empleando entidades HTML, existe un agujero XSS, dado que estos datos escritos serán interpretados por los navegadores como código HTML que puede incluir en si código adicional del lado del cliente.
      • Vulnerabilidad XSS tipo 1: A este tipo de agujero XSS se le conoce también como no persistente o reflejado. Estos agujeros aparecen cuando los datos provistos por un cliente web son usados inmediatamente en el lado del servidor para generar una página de resultados para el usuario. Si los datos no validados por el usuario son incluidos en la página resultante sin codificación HTML, se le permite al cliente inyectar código en la página dinámica.
  • Cross-Site Request Forgeries:
    • Este tipo de ataque permite al atacante enviar peticiones HTTP a voluntad desde la máquina de la víctima. Por su naturaleza, es complicado determinar cuando una petición HTML se ha originado por un ataque de este tipo.Cuando se conoce el formato que debe tener una URL para lograr la ejecución de una acción en el sistema, se logra encontrar la posibilidad de explotar este tipo de ataques. Ahora lo único que se necesita es simplemente hacer que una víctima visite la URL.
  • Envío de formas falsificadas:
    • En el fondo, el envío de una forma emplea el mismo mecanismo que una URL, la petición HTTP enviada por el navegador al servidor. El formato con el que va a contar la petición se encuentra predeterminado por la forma y algunos de los datos enviados en la petición son dados por el usuario.Un atacante podría copiar el código fuente de una página, salvarla en su equipo, y modificar el atributo de la acción que realizará la forma incluyendo ahora la ruta absoluta de la página originalmente deseada. Así se pueden quitar restricciones originales que se hubieran ejecutado en el cliente, como el tamaño máximo de un archivo adjunto, desactivar la validación de datos en el lado del cliente, alterar los elementos ocultos o los tipos de datos de los elementos de la forma. Trabajando de esta forma se pueden enviar datos arbitrarios al servidor, de una manera sencilla y sin el uso de herramientas sofisticadas.
  • Peticiones HTTP falsificadas:
    • Un ataque más sofisticado que el anterior es enviar peticiones falsas empleando herramientas especiales para este propósito. La existencia de este tipo de ataques es una prueba determinante de que los datos enviados por los usuarios no son dignos de ninguna confianza, el proceso para llevar a cabo esto es simple, empleando una herramienta de línea de comandos presente en la mayoría de las plataformas se posibilita la comunicación directa con un servidor remoto, conectándonos en el puerto en el cual el servidor escucha.
Conclusión:

La seguridad es un tema de mucha relevancia sobre todo en esta época donde el internet y los sistemas web son de un uso tan común que manejan información de empresas multimillonarias, bancos, transacciones, etc. Además de la información personal de muchas personas. Gracias a esto, ahora existen una gran cantidad de métodos para la seguridad web, al igual que información respecto a los tipos de amenaza con las que uno puede enfrentarse y cómo lidiar con ellas, porque si tenemos que adaptarnos a un mundo informático, es necesario informarnos de los peligros que conllevan para así poder evitarlos.

Romero A. (2009). Aspectos Básicos de la Seguridad en Aplicaciones Web. septiembre 06, 2015, de UNAM Sitio web: http://www.seguridad.unam.mx/documento/?id=17#ataques

Ruiz G. (2011). Tipos de Amenazas. septiembre 06, 2015, de Universidad Iberoamericana Sitio web: http://www.iberotijuana.edu.mx/sisinfo/index.php/documentacin-mainmenu-58/22-seguridad/101-definiciones

González B. (2004). Seguridad en Servicios Web. septiembre 06, 2015, de desarrolloweb.com Sitio web: http://www.desarrolloweb.com/articulos/1640.php