Universidad Piloto de Colombia.
Pinilla Castañeda Julian Alejandro Buenas Prácticas para el Desarrollo de Código 1
Seguro
.
Buenas Prácticas para el Desarrollo de
Código Seguro
Pinilla Castañeda Julian Alejandro
Julianpinilla88@[Link]
Universidad Piloto de Colombia
Abstract— Today is increasing the need for companies to parte se presenta desde el momento de codificar el
provide security in their products, they are opting to implement
the techniques or methodologies that generate secure software software porque el desarrollador no es consciente de
development. Because the portfolio of services offered los riesgos de seguridad a los que pueden estar
software companies creates greater dependence on applications expuestas las aplicaciones. Además de esto la
for normal operation. It is because of this that these techniques mayoría no cuenta con técnicas o habilidades que les
generate secure software must be used in each life cycle
software (requirements, analysis, design, development and permitan desarrollar códigos seguro, por esto, que
testing), that is, is to identify, analyze and evaluate earliest las entidades deben adoptar políticas y metodologías
form possible vulnerabilities, risks or threats that create future que permitan cumplir con las exigencias de
problems in applications. seguridad que sean pertinentes.
Resumen— En la actualidad es cada vez mayor la necesidad
que tienen las empresas de brindar seguridad en sus productos,
El ciclo de vida de un software se puede definir
que están optando por implementar técnicas o metodologías como un proceso interactivo e incremental. Esto
que generen desarrollo de software seguro. Debido a que el quiere decir, que se encuentra en constante
portafolio de servicios de software que brindan las compañías evolución y cuenta con varias etapas del modelo de
genera una mayor dependencia de aplicaciones para su normal
operación, es por ello que estas técnicas de generación de
cascada el cual cuenta con 5 fases del ciclo de vida
software seguro deben estar aplicadas en cada ciclo de vida del del software.,
software (requisito, análisis, diseño, desarrollo y pruebas), es
decir, se busca identificar, analizar y evaluar de forma más
temprana posibles vulnerabilidades, riesgos o amenazas que
generen problemas futuros en las aplicaciones.
Índice de Términos—ciclo de software, desarrollo, Fig. 1. Ciclo de vida del software. Fuente: Ingeniería de
Software un Enfoque Práctico
software, aplicativo, seguridad, riesgos, ataque
I. INTRODUCCIÓN Además de este modelo de vida de software que se
considera el modelo clásico, existen una variedad de
modelos como CMMI (Modelo de Madurez de la
En la actualidad tanto las personas como las
Capacidad Integrado) que es un conjunto de buenas
organizaciones en el desarrollo normal de sus
prácticas para el desarrollo de software, esta
actividades diarias ejecutan millones de líneas de
metodología en si está enfocada más hacia la calidad
códigos debido a la gran cantidad de información
del producto y por esto realiza cubrimiento del ciclo
que circula a través de diferentes plataformas,
de vida del software desde su concepción hasta la
aplicativos, contenidos web, y muchos otros, que
entrega y mantenimiento; esta metodología no
la seguridad en los sistemas, se ha convertido en un
contempla la seguridad como parte de su entorno y
tema de vital importancia y hoy, no basta con
por eso deben implementarse procesos alternos de
asegurar la calidad en los productos si no que
seguridad.
también se hace necesario contar con la seguridad,
de los mismos ya que cada vez es mayor el riesgo de
sufrir un ataque informático. Esta situación, en
buena
Finalmente se puede definir un producto seguro clientes, y la integridad y disponibilidad de los
como “un producto que protege la confidencialidad, recursos de procesamiento, bajo el control de
integridad y disponibilidad de la información de los propietario o administrador del sistema”1 . Esta es
Universidad Piloto de Colombia. Pinilla Castañeda Julian Alejandro Buenas Prácticas para el Desarrollo de Código 2
Seguro
.
una definición importante debido a que la seguridad cuales deben traducir estos errores a un lenguaje
no debe quedar relegada a un segundo plano y debe comprensible para el usuario. En ninguno de los
estar presente desde la concepción misma del casos se debe arrojar la línea del código ni tampoco
desarrollo, también debe estar enfocada a proteger se deben notar la clase, evento o método ya que esto
los activos críticos. Los cuales salen a partir de un puede dar indicios al presunto atacante sobre las
correcto análisis de vulnerabilidades y los tecnologías implementadas.
desarrollos generados debe contemplar la
perspectiva del agresor. Este artículo estará
enfocado en entender en que consiste el desarrollo B. Sentencias SQL.
de código seguro y su aplicación a lenguajes de
programación como JAVA. Cuando las consultas se construyen directamente
con los datos del usuario entre líneas o concatenan
directamente con el texto de la consulta, en lugar de
II. . DIRECTRICES DE PROGRAMACIÓN SEGURA utilizar los parámetros de vinculación de tipo
seguro, esto puede permitir al atacante realizar un
Existen numerosas directrices y consejos que un ataque de inyeccion de sql y consiste en una
programador puede implementar para ayudar en la debilidad de programación en que la aplicación
prevención de los errores de seguridad comunes en construye dinámicamente consultas SQL utilizando
las aplicaciones. Muchos de estos pueden ser la concatenación de cadenas de datos, esto puede
aplicados a cualquier lenguaje de programación, y permitir que el atacante pueda modificar consultas
otros pueden estar generados especificamente para como por ejemplo para saltarse el proceso de
un lenguaje de programacion como por ejemplo autenticación de usuario, un ejemplo de cómo
java,php,perl entre otros. Es por esto, que en este deberían ejecutar consultas sql para evitar esto sería
cápitulo se desprenden una serie de directrices que el siguiente:
deberian ser tomadas en cuenta por los
desarrolladores a la hora de iniciar a codificar una
aplicacion:
A. Validaciones de entrada
Los datos de entrada de una aplicación se puede Fig. 2. Ejecución de sentencias SQL de forma segura. Fuente:
definir como el conjunto de parámetros que van OWASP
hacer digitados y posteriormente capturados para ser
manipulados en codificación y para esto, en C. Código Comentado
términos de implementación, validación de entrada
se debe definir un conjunto de caracteres válidos los Todo código comentado dentro de la aplicación debe
cuales deben ser validado cada caracter de entrada y ser eliminado antes de ser lanzado en producción
si no se encuentra un cáracter dentro de esta debido a que el código comentado puede generar el
seleccion de caracteres validos se debe generar un uso accidental en producción que puede alterar el
error o ser manejado por medio de excepciones, las correcto funcionamiento de la aplicación, como
también puede llegar a contar con código quemado.
Es por esto que por ningún motivo puede salir a
producción, en la vida real es un proceso muy
común encontrar código comentado, debido a que
muchas veces en el proceso de desarrollo se usa
para la
1
Writing Secure Code Second Edition Michael Howard and David Leblanc
generación de pruebas pero casi nunca se eliminan
en el momento de liberar el código.
D. Mensajes de Error
Todos los mensajes de error que lleguen al usuario
final no deben contener información confidencial
como sistema operativo, red, lenguaje de
programación, línea del error, motor de base de
datos, estos errores deben darse tratamiento y ser
estandarizados de forma genérica y comprensible
para el desarrollador pero que sea entendible para el Fig. 3. Hardco de Fuente: stackOverflow
usuario como por ejemplo “Se presentó el error
1281 no se pudo registrar el usuario, póngase en Este es un ejemplo muy diciente del riesgo de
contacto con el proveedor de servicio.” seguridad al que se puede ver expuesto una
aplicación si no se controla debidamente este error,
E. Contenido URL es por esto que las buenas prácticas de software
están enfocadas a la no utilización de código
En el contenido url nunca se debe mostrar quemado y se recomienda usar unas clases de
información sobre la url como passwords, nombre constantes en las que se definan y se almacenen
de servidores, direcciones ip, lenguaje de estos valores. Usar constantes además permite
programación o las rutas del sistema de archivos que mejorar la calidad del código generado por la
revelan la estructura de los directorios del servidor organización.
web, ya que para un atacante esto se convierte en
información valiosa ya que le da una visión sobre G. Cifrado de Contraseñas.
objetivo.
Las Contraseñas que sean utilizadas en la
F. Valores Quemados codificación de software deben estar cifradas ya sea
en Sha1, MD5 el algoritmo de cifrado que la
En muchas ocasiones los desarrolladores de organización considere conveniente ya que de no
software tienden a utilizar HARDCODE (Código implementar una política de contraseñas, estas
Quemado) que consiste en dejar variables definidas pueden viajar en texto plano y puede ser capturada y
por defecto en el código, esto puede configurar un explotada por un atacante.
problema de seguridad ya que algunas de estos
valores preestablecidos como puede ser un usuario, H. Menor Privilegio
contraseña, dirección ip entre muchas otras, pueden
salir a un ambiente de producción y un atacante Este es un principio fundamental de seguridad ya
puede aprovechar esta vulnerabilidad en el código que para las aplicaciones desarrolladas se debe
para conocer el entorno y explotar fallas de garantizar que la información sea visible solamente
seguridad como por ejemplo. para los que la requieren y para esto la organización
debe implementar una política de roles y privilegios
ya que todos los usuarios del sistema no requieren la
misma información
III. JAVA
En la actualidad JAVA es uno de los lenguajes de
programación más populares, debido a que Java
funciona con las principales plataformas de Fig. 5. Java Virtual Machine. Fuente: Microsoft
hardware y sistemas operativos. Entre las
características más relevantes se encuentran: Que El problema de esta práctica es que en la mayoría
es simple, orientado a objetos, robusto y la de las ocasiones se omite eliminar estos mensajes y
característica que más nos interesa en este artículo es salen al ambiente de producción y pueden ser de
que es seguro. La máquina virtual de java (JVM) es gran ayuda a un atacante por que puede dar nombres
capaz de interpreter y ejecutar instrucciones de clases, métodos, la tecnología usada, consultas a
expresadas en un código binario especialmente la base de datos entre algunas otras, es
desarrollado por java el cual se denomina recomendable como buena práctica realizar una
(bytecode), este verifica todo El código Java pasara inspección de código por parte de un líder o un par
evitar errores en la compilación de la aplicación, que permita detectar esta falla antes de liberar a
esta funcionalidad permite detectar fragmentos de producción un desarrollo.
código ilegal -código que falsea punteros, viola
derechos de acceso sobre objetos o intenta cambiar B. Encapsulación
el tipo o clase de un objeto.
En JAVA si se declara una clase, método o campo
sin un modificador de acceso (privado, público y
protegido) luego estos paquetes por defecto tienen
acceso a ninguna clase dentro del mismo paquete, se
debe tener en cuenta que si bien esto proporciona
encapsulación para el paquete, esto sólo sucede si
cada trozo de código que se carga en el paquete es
controlado por persona (s) autorizada. Un usuario
malintencionado puede insertar sus propias clases y
tener pleno acceso a todas las clases, métodos y
campos en el paquete.
La idea de usar correctamente la encapsulación es
poder ocultar detalles de implementación tales como
variables internas que mantienen el estado de un
objeto y los mecanismos internos como son
Fig. 4. Java Virtual Machine. Fuente: javapapers algoritmos entre otros.
A continuación se mencionan buenas practicas a la
hora de codificar en este lenguaje de programación: C. Manejo de Excepciones
A. Impresión de mensajes de salida El manejo de excepciones es fundamental para
lograr un correcto desarrollo seguro de código ya
La impresión de mensajes de consola es que cuando un código java viola restricciones
ampliamente utilizada en el proceso de codificación semánticas del lenguaje se produce un error que es
de software debido a que le permite al desarrollador lanzado por la máquina virtual de java, existen
realizar seguimiento a funcionalidades y navegar por muchas clases de errores que generan excepciones y
métodos, clases dejando simplemente mensajes nos dan a entender fallos como desbordamiento de
alrededor del código como por ejemplo: búfer, desbordamiento de memoria, intentar acceder
a un vector fuera de sus límites, entre otras. Y si no
se capturan adecuadamente le puede dar indicios a
un
atacante sobre fallos en el código, nombre de la clase o método que genera el problema y le puede
dar las bases para un futuro ataque. Es por esto que Reportar Hallazgos: estas herramientas
las buenas prácticas solicitan que estas excepciones deben reportar los errores encontrados en el
sean capturadas adecuadamente y lanzadas al cliente escaneo de código fuente para permitir dar
con mensajes como por ejemplo “consulta no solución a estos problemas
exitosa” o “no se pudo procesar la solicitud “
A continuación se mencionan algunas herramientas
analizadoras de código fuente:
IV. HERRAMIENTAS DE ANÁLISIS DE CÓDIGO
1. ConQAT: es un motor de análisis altamente
El uso de un analizador de código fuente es configurable calidad del software. ConQAT
considerado como una buena práctica en el se basa en una arquitectura de tuberías y
desarrollo de código seguro ya que tiene como filtros que permiten realizar configuraciones
objetivo principal garantizar que el código fuente complejas de análisis de una manera muy
cumpla con un cierto nivel de seguridad establecido apligable debido a su entorno grafico. Esta
por una serie de reglas establecidas por las herramienta esta soportada para los lenguajes
necesidades del negocio. Existen varias formas de de programacion Java, C#, C++, JavaScript
realizar esta actividad, se puede realizar una entre otros.
inspección de código manual realizada por un par
del proceso de desarrollo que puede ser el líder de 2. Parasoft: es una herramienta bastante
desarrollo el cual debe verificar si el código cumple poderosa en la prevencion de defectos de
con las reglas establecidas por la organización, el desarrollo, se encuenta soportada para los
problema que tiene este proceso es que se pueden lenguajes de programacion c,c++ y .net
pasar por alto algunos errores no evidentes. Estos
errores pueden conducir a errores de seguridad
Finalmente existe una herramienta que he podido
significativos en las aplicaciones, es por esto que es
comprobar la funcionalidad y su versatilidad y se
bueno automatizar estos procesos por medio de
trata de SONAR que es una plataforma para
herramientas analizadoras de código automáticas.
gestionar la calidad del código y como tal abarca 7
Las cuales deben contar con algunos de los
ejes de la calidad del código.
siguientes atributos:
Flexibilidad: las herramientas de inspección
de código debe contar con varias opciones
para ejecutar esta actividad entre las cuales
sobresalen: análisis estatice de código fuente
como checkstyle, pmd y findbugs entre otros.
Precisión: el objetivo de estas herramientas
es poder encontrar el máximo de errores que
permitan depurar y otorgar calidad y
confianza sobre el código fuente que se va a Fig. 6. Estructura Sonar. Fuente: SONAR
liberar.
Facilidad de uso: debido a la utilidad que Una de sus mayores ventajas es la de ser una
brinda esta clase de herramientas en el ciclo herramienta de código libre que permite configurar
de vida del software debe ser fácil de usar e una gran cantidad de reglas de codificación como
intuitiva debido a que no solo personal de
están las mencionadas anteriormente en este ensayo,
T.I. pueda operarlas
impresiones en consolas, métodos mal definidos,
clases sin modificadores de acceso entre muchos
otros. Y su funcionalidad se basa en cargar
previamente el proyecto a desarrollar y una vez este
se encuentra arriba, el desarrollador procede a
realizar la codificación requerida y finalizado este se catalogándola como alta, media, baja y bloqueante
corre nuevamente el proyecto arrojando esta vez el entre otras. Posteriormente a este análisis el
número de errores inyectados al código, su criticidad desarrollador tiene las herramientas necesarias para
mejorar la calidad de sus entregables. [3] Ingeniería del Software. Un Enfoque Práctico 7
Edición Roger Pressman
[4] [Link]
V. CONCLUSIONES [5] [Link]
[Link].
[6] [Link]
La seguridad debe están implícita en cada
fase del desarrollo de software ya que esto
genera una mayor robustez sobre el código
desarrollado.
Se debe buscar una mayor comprensión de
los desarrolladores sobre los riesgos de
seguridad que se pueden encontrar en la
codificación del software ya que existe un
gran desconocimiento sobre ellos debido a
que en la mayoría de casos prima la solución
generada sin importar el cómo se logra.
Una correcta estrategia para generar código
seguro debe contar con un apoyo
incondicional por parte de la gerencia ya que
para lograr estos objetivos es necesario
tiempo, dinero y constante capacitación del
personal ya que el mundo de la seguridad es
muy dinámico y lo que hoy puede generar
una solución quizás mañana no.
Para una correcta generación de código
seguro se debe realizar un análisis minucioso
por parte de la gerencia de T.I para definir
las reglas de codificación o las buenas
prácticas aplican a las reglas de negocio de
la organización ya que esto es fundamental
para el éxito de la implementación.
REFERENCIAS
[1] [Link]
p_Ten_Project#tab=OWASP_Top_10_for_2013
[2] Writing secure code Second Edition (Michel Howard
y and David )