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 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.
Este comentario ha sido eliminado por un administrador del blog.
ResponderEliminar