Beruflich Dokumente
Kultur Dokumente
ÍNDICE
INTRODUCCIÓN...................................................................................................................... 3
DESARROLLO.......................................................................................................................... 4
LA SEGURIDAD INFORMÁTICA...........................................................................................4
FALLOS DE SEGURIDAD:....................................................................................................6
CONDICIONES DE CARRERA.............................................................................................6
SEGURIDAD EN LAS APLICACIONES QUE GENERAN CÓDIGO DINÁMICO:..................7
MEDIDAS PARA EVITAR PERMISOS PELIGROSOS EN BASE A DIRECTIVAS DE
SEGURIDAD:........................................................................................................................ 8
EJECUCIÓN DE CÓDIGO EN UN ENTORNO DE SEGURIDAD RESTRINGIDO..............10
CONCLUSIONES....................................................................................................................12
BIBLIOGRAFÍA....................................................................................................................... 13
2
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
INTRODUCCIÓN
3
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
DESARROLLO
LA SEGURIDAD INFORMÁTICA
La seguridad y la programación segura como parte de ella, son actividades del tipo
multidisciplinarias dentro del desarrollo del software. En ambas tendrán injerencia tanto la
programación propiamente dicha, las redes, los servicios de redes y hasta la seguridad física
de un data center, entre un sinfín de aspectos relacionados con esta. Es tan amplio el marco
de la seguridad informática como desconocido por la mayoría.
"El único sistema seguro es aquel que está apagado, desconectado, dentro de una
caja fuerte de titanio, enterrado en un bunker de concreto, rodeado de gas tóxico y vigilado
por guardias armados y muy bien pagados. Y aun así, no apostaría mi vida a que es seguro"1
En base a esta última definición podemos ver que la seguridad informática va tomando
forma de un conjunto tanto de reglas como de técnicas que buscan conseguir el objetivo
anteriormente detallado a fin de asegurar los recursos informáticos y físicos de cualquier tipo
de peligro originado en el ámbito informático.
1
Eugene Howard Spafford (nacido en 1956), es un profesor estadounidense e informática en la
Universidad de Purdue y un destacado experto en seguridad informática.
2
KernelpanikLabs, Desarrollo Seguro de Aplicaciones. 2005. Pág. 4
3
KernelpanikLabs, Desarrollo Seguro de Aplicaciones. 2005. Pág. 5
4
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
Junto con estos conceptos nace el concepto de políticas de seguridad, las cuales
serán todas aquellas medidas destinadas a la protección de los recursos informáticos, sean
de tipo físicas, procedimentales o de tipo lógicas a la hora de desarrollar el software.
En general podemos decir que los tres objetivos fundamentales que buscan las
políticas de seguridad serán:
5
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
FALLOS DE SEGURIDAD:
Un fallo de seguridad, será aquel error de cuya explotación un atacante obtenga una
elevación de privilegios en el sistema atacado. El fallo de seguridad, como veremos más
adelante no sólo es un error en la codificación del software, bien puede ser un error lógico en
la implementación, en el diseño, o incluso en el propio concepto a desarrollar.4
Analizaremos a continuación una serie de fallos de seguridad muy comunes dentro del
proceso de desarrollo de software y que resultan importantísimos de tener en cuenta al
momento de desarrollar aplicaciones, puntualmente de escritorio.
CONDICIONES DE CARRERA.
Uno de los fallos de seguridad muy frecuentes en los diferentes sistemas el conocido
como condición de carrera. “Una condición de carrera se puede definir como aquel
comportamiento anómalo producido por la interacción concurrente de varios procesos dentro
de un flujo lógico de ejecución.” 5. dicho de una forma más reducida y puntual, es el acceso
simultaneo a un recurso y su posible modificación.
Imaginemos que una carrera de caballos, todos los jinetes intentan cabalgar por el
carril más interno. El carril más interno de la pista de carreras es un recurso compartido,
puesto que puede ser ocupado por cualquiera de los jinetes en un momento dado. Pero el
uso de este carril, implica que al ser uno solo, los jinetes compitan por ocuparlo y esa
competencia tiene que tener determinada sincronización. Una vez ocupado este carril,
puedes correr a toda velocidad si no tienes ningún caballo delante, o correr teniendo en
cuenta la velocidad del o los caballos que tengas delante en el mismo carril.
4
KernelpanikLabs, Desarrollo Seguro de Aplicaciones. 2005. Pág. 11
5
KernelpanikLabs, Desarrollo Seguro de Aplicaciones. 2005. Pág. 31
6
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
Otro problema es que dos caballos no pueden ocupar el mismo carril a la vez en la
misma posición porque se produciría una colisión que podría traer como consecuencia la
caída de caballos y jinetes. La única solución que tiene un jinete en una carrera de caballos
para utilizar este carril es la sincronización:
Si está vacío, puedes ocuparlo a toda velocidad y correr mientras no tengas nadie
delante
Si está ocupado, tienes que ir a una velocidad inferior a la de los caballos que tengas
delante
Si vas a entrar o a salir del carril, tienes que cuidar que no haya colisión con otros
caballos6
Si bien el anterior ejemplo deja muy en claro lo que sucede en este fallo de seguridad,
las cuestiones donde impacta dicho fallo no termina de ser algo de vital importancia. Pero si
trasladamos este fallo a procesos en los que se maneje dinero como finalidad del sistema, la
importancia será otra. Veamos el siguiente ejemplo.
Supongamos que dos clientes de un banco realizan cada uno una operación en
cajeros diferentes al mismo tiempo. El usuario A quiere hacer un depósito. El B un retiro. El
usuario A comienza la transacción y lee su saldo que es 1000. En ese momento pierde su
turno de ejecución (y su saldo queda como 1000) y el usuario B inicia el retiro: lee el saldo
que es 1000, retira 200 y almacena el nuevo saldo que es 800 y termina. El turno de
ejecución regresa al usuario A el cual hace su depósito de 100, quedando saldo = saldo + 100
= 1000 + 100 = 1100. Como se ve, el retiro se perdió y eso le encanta al usuario A y B, pero al
banquero no le convino esta transacción. El error pudo ser al revés, quedando el saldo final
en 800.7
Para evitar estas condiciones de carrera estos tipos de procesos deben tener dos
facilidades implementadas, a saber:
7
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
generalmente permisos para leer y escribir el código fuente y el código temporal que fue
creando.
¿Cómo se logra esto? El ejemplo más común es una página web, en donde esta tiene
publicidad u otros componentes que dependen de la información del consumidor. Por
ejemplo, cuando entramos a YouTube este nos muestra videos que pueden llegar a
interesarnos, para saber que videos sugerirnos YouTube usa nuestras búsquedas recientes, o
más frecuentes que hayamos hecho antes. Con esta información cambia los videos
sugeridos. Un atacante puede sacar provecho de estas páginas web de muchas maneras,
nosotros analizaremos algunas, la mayoría de ellas tienen como objetivo acceder al código
cache para modificarlo y así insertar algún virus, spyware, etc.8
Para evitar estos fallos de seguridad siempre es conveniente que cuando se compile el
código, se compruebe si hay alguna posibilidad de que lo pueda modificar algún programa
malintencionado. De ser así, se debe proteger el directorio que contiene estos archivos
mediante la seguridad de acceso al código o con una lista de control de acceso en el sistema
de archivos.
Cabe destacar que, si algún llamador de una función puede influir en el código
generado en forma de que pueda provocar un error en el compilador, es posible que allí exista
una vulnerabilidad importante en la seguridad.
Hay que tener en cuenta que cualquier permiso que posea una aplicación mal
administrado puede resultar en una aplicación peligrosa en la cual se han alterado archivos
privados o importantes para el administrador. Es por ello que siempre hay que estar atento al
desarrollo y administración de permisos para las aplicaciones. Justamente por estas
cuestiones es que nacen las directivas de seguridad. Las directivas de configuración de
seguridad son reglas que puede configurar en un equipo o varios equipos, con el fin de
proteger los recursos de un equipo o red.9
8
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
La pertenencia a un grupo.
Varias son las operaciones en las que se proporcionan permisos que puedan burlar el
sistema de seguridad. Estos peligrosos permisos se los se deben conceder a códigos de
confianza plena y únicamente en los momentos en que sea necesario.
Con el tiempo se han ido incorporando nuevas maneras de administrar las diferentes
directivas de seguridad, incluyendo así nuevas características y la adición de unas
configuraciones. Veamos algunas herramientas o características que nos permitirán una
administración más eficiente de dicha configuración de las directivas de seguridad.
Junto con estas medidas existen un sin número de forma de poder administrar estas
directivas de seguridad.
Veamos ahora una serie de peligros a los que puede exponerse nuestro código con el
riesgo potencial que acarrea. 10
10
Microsoft Developer Network. Permisos peligrosos y administración de directivas.
https://msdn.microsoft.com/es-es/library/wybyf7a0(v=vs.100).aspx
9
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
Muchas veces al realizar una reutilización del software utilizar librerías o componentes
que nosotros no codificamos nos exponemos a que éstas puedan contener malware. Con la
finalidad de probar la seguridad de estos componentes es que uno puede utilizar estos
entornos seguros. En estos casos es en los que se crea un recito ejecutable don el código es
testeado limitando sus permisos.
El AppDomain también incluye un array que se utiliza para identificar los componentes
que se van a cargar como plena confianza. Esto permite al creador iniciar un nuevo dominio
en espacio aislado que permite que determinados componentes auxiliares sean también de
plena confianza,
Se puede utilizar este dominio para especificar el conjunto de permisos para las
aplicaciones que se ejecutan dentro del entorno seguro. Este proceso permite especificar el
nivel exacto de seguridad de acceso del código que se desea.
Es interesante analizar en esta materia a un lenguaje que es muy utilizado hoy en día
como es el de Java. Desde su creación, este entorno ha tenido muy presentes los problemas
de seguridad y ha definido modelos para poder controlar y limitar el acceso a todos los
recursos por parte de las aplicaciones. Este modelo ha ido mejorando constantemente en las
diferentes versiones de su JDK, llegando a un entorno muy complejo y flexible como es el
JDK 1.2.
Java fue diseñado para ofrecer medidas de seguridad básicas, integrando un sistema
de control de permisos para los programas, definiendo un mecanismo (denominado
mecanismo del cajón de arena) que permite controlar que se le permite hacer a un programa
y la manera en que este accede a los recursos del mismo. Además, Java incorpora la
10
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
11
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
CONCLUSIONES
Pero muchas veces estos fallos no se dan por ataques externos que busquen
ocasionar daños a nuestro código. En ciertas ocasiones, las vulnerabilidades de nuestro
software vendrán de la mano del mismo programador. Las condiciones de carrera son un
claro ejemplo de un error de programación, pero por sobre todo de un error en la planificación
del software.
12
TECNICAS DE PROGRAMACIÓN
Tópicos para codificación segura de aplicaciones de escritorio
BIBLIOGRAFÍA
13