lunes, 10 de junio de 2013





SEGURIDAD EN INGENIERÍA DE SOFTWARE


La  seguridad  de  software  aplica  los  principios  de  la  seguridad  de  información  al  desarrollo  de  software. Information security (La seguridad de información) se refiere a la seguridad de información comúnmente como  la  protección  de  sistemas  de  información  contra  el  acceso  desautorizado  o  la  modificación  de información, si está en una fase de almacenamiento, procesamiento o tránsito. 

También la protege contra la negación  de  servicios  a  usuarios  desautorizados  y  la  provisión  de  servicio  a  usuarios  desautorizados, incluyendo las medidas necesarias para detectar, documentar, y contrarear tales amenazas.

Muchas preguntas con respecto a la seguridad, son relacionadas al ciclo vital de software. En particular, la  seguridad del código y el proceso de software; deben de ser considerados durante  la  fase del diseño y  desarrollo. Además,  la  seguridad  debe  de  ser  preservada  durante  la  operación  y  el mantenimiento  para  asegurar la integridad de una parte (pedazo) de software.

Una  gran  cantidad  de  seguridad  usada  en  los  Sistemas  de  Redes  de  hoy,  nos  pueden  engañar  en  la creencia  que  nuestros  trabajos  como  diseñadores  de  sistema  de  seguridad  ya  han  sido  realizados.  Sin embargo,  las cadenas y computadoras son  increíblemente  inseguras. La  falta de seguridad se origina en dos  problemas  fundamentales:  Los  sistemas  que  son  teóricamente  seguros  pueden  ser  inseguros  en  la práctica,  Además  los  sistemas  son  cada  vez  más  complejos.  La  complejidad  proporciona  más oportunidades para los ataques. Es mucho más fácil probar que un sistema es inseguro que demostrar que uno  es  seguro  probar  la  inseguridad,  simplemente  una  toma  ventaja  de  ciertas  vulnerabilidades  del sistema.



4.1 SEGURIDAD DE SOFTWARE


El concepto de la seguridad en los sistemas de software es un área de investigación que ha pasado a ser vital dentro de la Ingeniería de Software. Con el crecimiento de Internet, y otras aplicaciones sobre redes, como el comercio electrónico, correo electrónico, etc., la posibilidad de ataques se ha incrementado notablemente, como también lo han hecho las consecuencias negativas de estos ataques.


En la actualidad prácticamente todo sistema debe incorporar cuestiones de seguridad para defenderse de ataques maliciosos. El desarrollador ya no sólo debe concentrarse únicamente en los usuarios y sus requerimientos, sino también en los posibles atacantes. 


Esto ha motivado cambios importantes en el proceso de diseño y desarrollo de software para incorporar a la seguridad dentro de los requerimientos críticos del sistema.


Estos cambios son los primeros pasos en la concientización  de los ingenieros de software acerca de la importancia de obtener un software seguro. Como todo gran cambio, no se logra de un día para otro, sino que es un proceso gradual que requiere tiempo y maduración. Todavía la Ingeniería de Software no ha dado una respuesta eficaz, coherente y aplicable que satisfaga plenamente a la comunidad informática, sino que las aproximaciones actuales están plagadas de fallas y debilidades fruto de que todavía es un proceso que se encuentra en su infancia.


Siempre que utilicemos un sistema informático, sin importar cuál sea la razón, es importante que tengamos como prioridad la instalación de un software de seguridad, teniendo en cuenta la cantidad de riesgos que corremos con un sistema informático sin protección.

 
Justamente por la importancia acerca de lo que es un software de seguridad para cualquier usuario, la mayoría de los sistemas operativos con los que podemos trabajar suelen traer incorporado en ellos un software de seguridad básico, pero es importante que sepamos ante todo qué es un software de seguridad y la diferencia entre éste software y uno que es especialmente desarrollado para prevenir problemas en el funcionamiento del sistema, es que el mismo, simplemente nos advierte cuando estamos frente a algún riesgo.


·        Tipos de software de seguridad

 Sin duda, el tipo de software de seguridad más conocido son los programas antivirus, que se encargan de detectar y eliminar virus informáticos. Un buen programa antivirus dispone de un archivo de firmas de virus que se actualiza automáticamente y detecta virus nuevos. Este tipo de actualización se realiza periódicamente, varias veces al día. 


El software de seguridad suele venderse en las denominadas suites. Son paquetes compuestos de:

·        Programa antivirus
·        Cortafuegos
·        Filtro antispam
·        Software para filtrar contenidos
·        Software contra publicidad no deseada
·        Control de sitios web


Actualmente, la seguridad es un concepto que todo sistema debe incorporar.  La Ingeniería del Software todavía no es capaz de brindar un mecanismo para  implementar adecuadamente la seguridad: los lenguajes tienen primitivas inseguras, el código relativo a la seguridad es siempre un código confuso y complejo debido a técnicas de abstracción insuficientes, etc.





4.2 SEGURIDAD EN EL CICLO DE DESARROLLO DEL SOFTWARE



La mayor parte de las organizaciones desarrolla o contrata el  desarrollo de aplicaciones propias para su gestión de negocio. Como todo software, estas aplicaciones pueden contener fallas de seguridad y a diferencia del software comercial, no se dispone de actualizaciones o parches liberados en forma periódica por el fabricante. El tratamiento de las vulnerabilidades en aplicaciones propias corre por parte de la organización que las desarrolla.


Lamentablemente es una práctica habitual en muchas organizaciones la “puesta en producción” de sistemas sin la participación del sector de Seguridad de la Información. 


Muchas otras veces, el sector de Seguridad se entera demasiado tarde, y no tiene suficiente margen de acción para el análisis de seguridad de la aplicación desarrollada.
Por lo general, en el mejor de los casos, se coordina un testeo de seguridad una vez que la aplicación ya está desarrollada. Aquí muchas veces se encuentran errores que requieren el rediseño de parte de la aplicación, lo cual implica un costo adicional en tiempo y esfuerzo.



·        Seguridad en el análisis de requerimientos


En esta etapa, se deben identificar aquellos requerimientos funcionales que tendrán impacto en  los aspectos de seguridad de  la aplicación. Algunos de ellos son: requerimientos de compliance con normativas locales o internacionales (ej: PCI, SOX, “A” 4609, etc.), tipo de información que se transmitirá o procesará (ej: Información pública o confidencial, datos personales, datos financieros, contraseñas, datos de pago electrónico, etc.) y requerimientos de registros de auditoría (ej: Qué debe registrar la aplicación en sus Logs).



·        Seguridad en el diseño


Antes de comenzar a escribir líneas de código, hay numerosos  aspectos de seguridad que deben ser tenidos en cuenta durante el diseño de la aplicación. 

Algunos de ellos son: diseño de autorización
(ej: Defnir los roles, permisos y privilegios de la aplicación), diseño de autenticación (aquí se debe diseñar el modo en el que los usuarios se van a autenticar, contemplando aspectos tales como los mecanismos o factores de autenticación con contraseñas, tokens, certifcados, etc. posibilidades de integrar la autenticación con servicios externos como LDAP, Radius o Active Directory y los mecanismos que tendrá la aplicación para evitar ataques de diccionario o de fuerza bruta (ej: bloqueo de cuentas, implementación de “captchas”, etc.), diseño de los mensajes de error y advertencia, para evitar que los mismos brinden demasiada información y que ésta sea utilizada por atacantes y diseño de los mecanismos de protección de datos (aquí se debe contemplar el modo en el que se protegerá la información sensible en tránsito o almacenada; según el caso, se puede definir la implementación de encriptación, hashes o truncamiento de la información).


Una vez que se cuenta con el diseño detallado de la aplicación, una práctica interesante es la de realizar sobre el mismo un análisis de riesgo orientado a software. Existen técnicas documentadas al respecto, tales como Threat Modeling. Estas técnicas permiten definir un marco para identificar debilidades de seguridad en el software, antes de la etapa de codificación. Como valor agregado, del análisis de riesgo orientado a software se pueden obtener casos de prueba para ser utilizados en la etapa de Testing/QA.


·        Seguridad en la codificación

Una vez concluido el diseño, le toca a los desarrolladores el turno de codificar los distintos componentes de la aplicación. Es en este punto en donde suelen incorporarse, por error u omisión, distintos tipos de vulnerabilidades. Estas vulnerabilidades podríamos dividirlas en dos grandes grupos a saber: vulnerabilidades clásicas y vulnerabilidades funcionales. Las primeras son bien conocidas y categorizadas. 


Ejemplo de estas vulnerabilidades son las presentes en el “OWASP
Top 10” (Vulnerabilidades de inyección, Cross Site Scripting, errores en manejo de sesiones, etc.) como así también otras vulnerabilidades no ligadas directamente con las aplicaciones WEB, como desbordamiento de buffer,  denegación de servicio, etc. Los ‘Frameworks’ de desarrollo de aplicaciones son una buena ayuda en este punto, ya que ofician de intermediario entre el programador y el código, y permiten prevenir la mayoría de las vulnerabilidades conocidas. Ejemplos de estos frameworks son Struts, Ruby on Rails y Zope.

Vulnerabilidades funcionales son aquellas ligadas específicamente a la funcionalidad de negocio que posee la aplicación, por lo que no están previamente categorizadas. 


Algunos ejemplos ilustrativos de este tipo de vulnerabilidad son los siguientes: una aplicación de banca electrónica que permite realizar transferencias con valores negativos, un sistema de subastas que permite ver  los valores de otros oferentes, un sistema de venta de entradas para espectáculos que no impone límites adecuados a la cantidad de reservas que un usuario puede hacer.


En la etapa de codificación, una de las reglas de oro es verificar todos los valores de entrada y de salida. Esto es, asumir siempre que el valor pudo haber sido manipulado o ingresado maliciosamente antes de ser procesado. 




4.3 CONFIABILIDAD DEL SOFTWARE



La  confiabilidad  de  software  significa  que  un  programa  particular  debe  de  seguir  funcionando  en  la presencia  de  errores.  Los  errores  pueden  ser  relacionados  al  diseño,  a  la  implementación,  a  la programación, o el uso de errores.


Así como los sistemas llegan a ser cada vez más complejos, aumenta la probabilidad  de  errores. 


Como  mencionamos,  es increíblemente  difícil  demonstrar  que  un  sistema  sea seguro.  Ross  Anderson  dice  que  la  seguridad  de  computación  es  como  programar  la  computadora  del Satán.  Software  seguro  debe  de  funcionar  abajo  de  un  ataque. 


Aunque  casi  todos  los  software  tengan errores,  la mayoría de  los errores nunca serán  revelados debajo de circunstancias normales. Un atacante busca esta debilidad para atacar un sistema.


Las organizaciones que desarrollan productos basados en software requieren de prácticas efectivas que permitan mejorar la calidad del producto. La Ingeniería de la Confiabilidad de Software es una práctica cuantitativa que puede ser implementada en organizaciones de cualquier tamaño bajo distintos modelos de desarrollo.


Las organizaciones desarrolladoras de productos basados en software destinan grandes cantidades de recursos para mejorar la calidad de sus productos. Una parte de dichos recursos se utiliza para la adopción de mejores prácticas. Sin embargo, la dificultad de la adopción de dichas prácticas no sólo reside en el costo y el tiempo requerido para institucionalizarlas, sino en cómo medir su impacto en la calidad del software, así como demostrar el retorno de dicha inversión.


La calidad, las fallas y la confiabilidad de Software
La calidad es un atributo percibido por los usuarios o clientes de cualquier producto o servicio. En el caso de productos basados en software, la percepción de la calidad está en función de las fallas que el cliente percibe del mismo durante su operación.


La confiabilidad es un atributo que mide el grado en que un producto opera sin fallas bajo condiciones establecidas por un periodo de tiempo determinado. La confiabilidad es un atributo cuantitativo que ha sido ampliamente analizado, estudiado y usado en otras industrias para caracterizar la calidad de los productos o servicios. 


En su concepción más general, la confiabilidad es un atributo que mide el grado en que un producto opera sin fallas bajo condiciones establecidas por un periodo de tiempo determinado.

Una falla es la manifestación percibida por el cliente de que algo no funciona correctamente e impacta su percepción de la calidad. Un defecto es el problema en el producto de software que genera una falla.


·        Se dice que un Software es confiable si realiza lo que el usuario desea, cuando así lo requiera

·        No es confiable si así no lo hiciera.  A nuestros fines un Software no es Confiable cuando falla.


·        Las fallas se deben a errores en el Software.  Si corregimos estos errores sin introducir nuevos, mejoramos la Confiabilidad del Software.


Históricamente, una forma de aumentar la Confiabilidad de un Software era correrlo y probarlo extensivamente antes de liberarlo. No es efectivo probar la Confiabilidad en el producto sino hacerla, es decir fabricarla en el mismo. La Confiabilidad deberá ser diseñada en el producto.





4.4 INGENIERÍA DE SEGURIDAD


La Ingeniería de la seguridad es una rama de la ingeniería, que usa todo tipo de ciencias para desarrollar los procesos y diseños en cuanto a las características de seguridad, controles y sistemas de seguridad. La principal motivación de esta ingeniería ha de ser el dar soporte de tal manera que impidan comportamientos malintencionados.


El campo de esta ingeniería puede ser muy amplio, podría desarrollarse en muchas técnicas:

  • Equipos: Como el diseño de cerraduras, cámaras, sensores,...

  • Procesos: políticas de control, procedimientos de acceso,... 
  • Informático: control de passwords, criptografía,...

Tradicionalmente el tema de la seguridad en sistemas computarizados se ha asociado a la criptografía y sus técnicas. La inmensa complejidad que caracteriza a los sistemas modernos hace que esta aproximación sea insuficiente. 


Hoy en día la seguridad está asociada a la interacción de una multiplicidad de sistemas. La seguridad de un sistema en particular está directamente relacionada a la seguridad de la más débil de sus partes.


Un sistema puede tener mecanismos criptográficos que sean considerados completamente seguros pero puede adolecer de debilidades que hagan que sea innecesario atacar al sistema criptográfico.


Ejemplos de esto son:


Sistemas que fallan debido a problemas en el código, como en la mayoría de los ataques conocidos como de “buffer overflow”, en los cuales el no considerar aspectos de excepción asociados a los sistemas pueden representar que un atacante suficientemente hábil pueda asumir funciones del administrador. Si en un determinado sistema alguien asume las funciones del administrador puede tener muy fácil acceso a claves y sistemas criptográficos haciendo inútil la fortaleza del sistema criptográfico que lo protege.


Algunos ataques aprovechan fallas de diseño en los sistema. Si una determinada aplicación ejecuta sin evaluar un determinado comando, los atacantes del sistema pueden conseguir información vital sin necesidad de romper las claves criptográficas que lo protegen.


La existencia de sistemas de comunicación móvil, basados en transmisión inalámbrica facilita actividades de fisgoneo en la señal.


Algunas veces lo que se conoce como ataques de ingeniería social pueden resultar muy efectivos a la hora de atacar sistema supuestamente seguros.


La poca comprensión que algunos implementadores de sistemas tienen sobre los mecanismos de seguridad implícitos también ocasiona que ciertos sistemas sean más vulnerables. Un ejemplo clásico es la forma en que se implementan algunos sistemas de contabilidad.


El sistema de doble registro, ancestralmente usado para proteger sistemas de seguridad se ve violentado por sistemas “que obligan” al cuadre entre cuentas lo cual facilita el ataque a sistemas de esta naturaleza.



1 comentario: