capítulo 2 estado del arte

21
14 Capítulo 2 Estado del arte En este capítulo se mencionan las tecnologías que fueron necesarias para llevar a cabo la resolución del problema planteado, además de otras posibles soluciones para el mismo propósito 2.1 Optimización de código La optimización de código es muy importante ya que hace que el código sea más eficiente ahorrando desde el tiempo en el que se ejecuta hasta la cantidad de memoria que puede llegar a utilizar. La importancia de la optimización de código radica principalmente en la manera en la que el programa funciona y en la que se utilizan los recursos. Hay dos condiciones que se deben tomar en cuenta principalmente al momento de optimizar código: - El código optimizado se ha de comportar igual que el código de partida excepto por ser más rápido u ocupar menos espacio. - Hay que buscar transformaciones que no modifiquen el comportamiento del código según el comportamiento definido para el lenguaje de programación. Las ventajas de optimizar código son las siguientes: - Permite generar un código fuente estructurado y ordenado. - Permite lograr una mayor legibilidad de tu código fuente. - Permite crear sitios web y/o aplicaciones más rápidas. - Facilita el proceso de identificación y depuración de errores. - Simplifica el trabajo en equipo. - Facilita las tareas de revisión y mantenimiento. - Agiliza el proceso de desarrollo o extensión de la plataforma. El proceso de optimización puede llegar a ser muy tardado, dependiendo del número de líneas de código que se tengan. A continuación se hablara de la forma en que empresas de gran dimensión llevan a cabo sus optimizaciones, e incluso automatizan el proceso de optimización.

Upload: others

Post on 11-Nov-2021

4 views

Category:

Documents


0 download

TRANSCRIPT

14

Capítulo 2 – Estado del arte

En este capítulo se mencionan las tecnologías que fueron necesarias para llevar a

cabo la resolución del problema planteado, además de otras posibles soluciones para

el mismo propósito

2.1 Optimización de código

La optimización de código es muy importante ya que hace que el código sea más

eficiente ahorrando desde el tiempo en el que se ejecuta hasta la cantidad de

memoria que puede llegar a utilizar. La importancia de la optimización de código

radica principalmente en la manera en la que el programa funciona y en la que se

utilizan los recursos.

Hay dos condiciones que se deben tomar en cuenta principalmente al momento de

optimizar código:

- El código optimizado se ha de comportar igual que el código de partida excepto

por ser más rápido u ocupar menos espacio.

- Hay que buscar transformaciones que no modifiquen el comportamiento del

código según el comportamiento definido para el lenguaje de programación.

Las ventajas de optimizar código son las siguientes:

- Permite generar un código fuente estructurado y ordenado.

- Permite lograr una mayor legibilidad de tu código fuente.

- Permite crear sitios web y/o aplicaciones más rápidas.

- Facilita el proceso de identificación y depuración de errores.

- Simplifica el trabajo en equipo.

- Facilita las tareas de revisión y mantenimiento.

- Agiliza el proceso de desarrollo o extensión de la plataforma.

El proceso de optimización puede llegar a ser muy tardado, dependiendo del número

de líneas de código que se tengan. A continuación se hablara de la forma en que

empresas de gran dimensión llevan a cabo sus optimizaciones, e incluso automatizan

el proceso de optimización.

15

Tipos de optimización de código

Existen diversas formas de optimización de código puede llevarse a cabo. En este

apartado se hablaran de dos tipos: locales y globales.

Locales

La optimización local se realiza sobre módulos del programa. En la mayoría de las

ocasiones a través de funciones, métodos, procedimientos, clases, etc. Las

características de las optimizaciones locales es que solo se ven reflejados en dichas

secciones. La optimización local sirve cuando un bloque de programa o sección es

crítico (la entrada y salida, la concurrencia, la rapidez y confiabilidad de un conjunto

de instrucciones).

Existen técnicas para poder llevar a cabo la optimización de código local. Las

mencionadas a continuación son algunas de ellas:

- Folding

- Propagación de constantes

- Reducción de potencia

- Reducción de sub expresiones comunes

Folding (Ensambla miento)

El ensambla miento es remplazar las expresiones por su resultado cuando se pueden

evaluar en tiempo de compilación (resultado constante). Ejemplo:

A=2+3+A+C -> A=5+A+C

Estas optimizaciones permiten que el programador utilice cálculos entre constantes

representados explícitamente sin introducir ineficiencias.

Propagación de Constantes

Desde que se asigna a una variable un valor constante hasta la siguiente asignación,

se considera a la variable equivalente a la constante. PI y G2R se consideran

constantes hasta la próxima asignación.

Estas optimizaciones permiten que el programador utilice variables como constantes

16

sin introducir ineficiencias.

Reducción de Potencia

Se busca sustituir operaciones costosas por otras más simples.

Ejemplo:

– Sustituir productos por sumas.

a=2*a

a=a+a

2.2.1.2 Globales

El tipo de Optimización Global consiste en las mejoras pero refiriéndose al código del

programa en general.

Grafo del flujo de ejecución

– Antes de realizar una optimización global es necesario crear el grafo de flujo de

ejecución.

– El grafo de flujo de ejecución representa todos los caminos posibles de ejecución

del programa.

– La información contenida en el grafo es útil para el programador y el optimizador.

2.2 Lenguaje Bash

El lenguaje usado por Bash está definido por su propio intérprete y combina la sintaxis

de otros Shells, como el Korn Shell (ksh) o el C Shell (csh). Muchos de los comandos

que usualmente se usan en la consola también pueden usarse en los scripts, salvo

aquellos que pertenecen estrictamente a una distribución en particular.

Como se mencionó anteriormente, un script es un archivo que contiene código escrito

en determinado lenguaje de programación que el sistema usa para determinada

tarea. No es necesario que tenga una entrada externa ni interfaz gráfica, pero sí que

provoque una salida de datos procesados (por más de que el usuario no los vea).

Estructura de un Script

Para empezar debemos contar con un editor de texto y ganas de programar. Los

archivos que guardamos con extensión .sh podrán ser ejecutados (o interpretados)

17

por la consola, siempre y cuando la primera línea sea la siguiente:

#!/bin/bash

Esto le dice al sistema que deberá usar la consola para ejecutar el archivo. Además,

el carácter # permite escribir comentarios.

Características únicas de Bash

La mayoría de los Shell scripts Bourne pueden ejecutarse por Bash sin ningún

cambio.

La sintaxis de órdenes de Bash incluye ideas tomadas desde el Korn Shell (ksh) y el

C Shell (csh), como la edición de la línea de órdenes, el historial de órdenes, la pila

de directorios, las variables $RANDOM y $PPID, y la sintaxis de substitución de

órdenes POSIX: $(...).

Otra de las características que Bash proporciona es el hecho de ser un intérprete de

órdenes interactivo, ya que proporciona autocompletado de nombres de programas,

nombres de archivos, nombres de variables, etc, cuando el usuario pulsa la

tecla TAB.

Los scripts de bash reciben los parámetros que le pasa la Shell como $1, $2,..., $n.

Podemos saber cuántos hemos recibido con el símbolo $#.

Ejemplo de uso

Por ejemplo, si nuestro script necesita dos parámetros pondremos:

if [ $# -lt 2 ]; then

echo "Necesitas pasar dos parámetros"

fi

18

Los comandos más usuales

Tabla 2.1

2.3 Build

En el contexto de programación, un build es una versión de un programa. Como una

regla, un build es una versión de pre-lanzamiento y como tal, es identificada por un

número de lanzamiento. Builds repetitivos son una parte importante del proceso de

desarrollo. A través del desarrollo, los componentes de la aplicación son conectados

y repetidamente compilados para propósitos de pruebas, para asegurar la

confiabilidad del producto final. Las herramientas de buildeo así como make o ant, le

permiten a los desarrolladores automatizar algunas tareas de programación.

Como un verbo, buildear puede interpretarse como escribir código o poner

19

componentes de código individual de un programa.

Hay muchas cosas que un “build” puede contener:

Compilación de archivos de código (para lenguajes/entornos que soporten un paso

de compilación separado/explicito)

Enlazando un código de objeto (para lenguajes/entornos que soporten pasos de

enlace separados/explícitos)

Paquetes de distribución de producción, también llamados “instaladores”.

Generación de documentación que esta incrustada sin importar los archivos de

código fuente (Doxygen, Javadoc)

Ejecución de pruebas automatizadas como unit tests, pruebas de análisis estático,

prueba de rendimiento

Generación de reportes que le indican al equipo de desarrollo como ocurren muchas

advertencias y errores durante un build

Despliegue de paquetes de distribución. Por ejemplo, el build puede

automáticamente desplegar/publicar una nueva versión de una aplicación web

(asumiendo que el build se ejecutó correctamente)

El “build” puede llevarse a cabo “a mano” o puede ser automatizado, o alguna forma

hibrida entre ambas formas. Un build manual que requiere comandos de buildeo

como compiladores para ser ejecutados uno por uno. Un build automatizado

empaqueta todas las herramientas de buildeo en un solo build de mayor magnitud.

Este programa puede (idealmente) ejecutado en un solo paso.

2.4 Herramientas para llevar a cabo un build

2.4.1 GNU build system

El GNU build system conocido también como Autotools es un conjunto de herramientas

producido por el proyecto GNU. Estas herramientas están diseñadas para ayudar a

crear paquetes de fuente portable a varios sistemas Unix. El GNU build system forma

parte de GNU toolchain y se usa mucho para desarrollar software libre. Aunque las

herramientas que contiene el GNU build system son GPL no existe ninguna restricción

para crear software portable no libre con él.

20

Herramientas incluidas con GNU build system

El GNU build system comprende los programas de

utilidad GNU Autoconf, Automake y Libtool. Otras herramientas usadas frecuentemente

son el programa GNU make, GNU gettext, pkg-config y la GNU Compiler

Collection (GCC).

GNU Autoconf

Autoconf procesa los archivos configure.in o configure.ac (aunque se recomienda

usar configure.ac1 ). Cuando ejecuta el script de configuración también puede procesar

otros archivos como Makefile.in para producir como salida un archivo Makefile.

Autoconf se usa para intentar salvar las diferencias que existen entre distintos tipos

de Unix. Por ejemplo, algunos sistemas Unix pueden tener funcionalidades que no

existen o no funcionan en otros sistemas. Autoconf puede detectar ese problema y busca

la forma de solucionarlo. La salida de Autoconf es un script denominado configure.

Autoconf incluye la herramienta Autoheader que se usa para manejar los archivos de

cabecera de C.

GNU Automake

Automake ayuda a crear archivos Makefile portables. Estos son procesados después por

la herramienta make . Toma como entrada un archivo Makefile.am y lo transforma en

un Makefile.in . Este, a su vez, es utilizado por Autoconf para generar el

archivo Makefile final.

GNU Libtool

21

Libtool ayuda a crear bibliotecas estáticas y dinámicas para varios sistemas

operativos Unix. Libtool abstrae el proceso de creación de las bibliotecas ocultando las

diferencias entre los distintos sistemas (entre GNU/Linux y Solaris por ejemplo).

Ventajas de GNU build system

El GNU build system provee de un entorno de programación que permite escribir código

portable. Al menos entre distintos tipos de Unix. También logra que el proceso de

construcción sea más fácil para el usuario. Logrando que el usuario tan solo necesite un

pequeño número de comandos para construir e instalar el programa.

Las utilidades usadas por el GNU build system son necesarias exclusivamente en la

máquina de desarrollo. Los usuarios no necesitan Autoconf , Automake o Libtool para

construir o instalar el software. Esto hace que el GNU build system sea auto contenido.

Tan solo hacen falta herramientas estándares de Unix para construirlo. Esto se consigue

usando scripts que ayudan a configurar el software para el sistema operativo de un

determinado usuario.

Las utilidades disponibles en el GNU build system pueden ser usadas juntas o separadas.

Un proyecto puede usar una de ellas sin necesidad de utilizar el resto.

Desventajas de GNU build system

El GNU build system usa scripts compatibles con la shell Bourne para ayudar al usuario

en la configuración y en el proceso de construcción. Sin embargo hay algunos sistemas

operativos (como la familia de Microsoft Windows) que no pueden ejecutar los scripts de

la shell Bourne por sí mismos. Esto hace más difícil construir software en los Sistemas

Operativos Windows que en un sistema Unix. De todas formas se puede instalar el

sistema MinGW en Windows para proveer de una capa de compatibilidad (y

opcionalmente Cygwin para añadir compatibilidad con POSIX). De esta forma se

dispondría de un entorno con todas las herramientas propias de Unix.

22

Los proyectos que usan el GNU build system pueden disponer, o no, de un

archivo configure. Si no dispone de él se puede generar siguiendo estos pasos:

$aclocal

$autoheader

$automake

$ autoconf

No todos los comandos son necesarios. Dependiendo del uso que haga el proyecto del

GNU build system puede que tengamos que utilizar uno o más de estos pasos.

2.4.2 ANT

Apache Ant es una herramienta usada en programación para la realización de tareas

mecánicas y repetitivas, normalmente durante la fase de compilación y construcción

(build). Es similar a Make pero desarrollado en lenguaje Java y requiere la plataforma

Java.

Esta herramienta, hecha en el lenguaje de programación Java, tiene la ventaja de no

depender de las órdenes del shell de cada sistema operativo, sino que se basa en

archivos de configuración XML y clases Java para la realización de las distintas tareas,

siendo idónea como solución multi-plataforma.

Algunas consideraciones a tener en cuenta

Al ser una herramienta basada en XML, los archivos Ant deben ser escritos en XML.

La mayoría de las antiguas herramientas — las que se usan todos los días, como <javac>,

<exec> y <java> — tienen malas configuraciones por defecto, valores para opciones que

no son coherentes con las tareas más recientes.

Cuando se expanden las propiedades en una cadena o un elemento de texto, las

propiedades no definidas no son planteadas como error, sino que se dejan como una

referencia sin expandir (ej.: ${unassigned.property}).

23

No es un lenguaje para un flujo de trabajo general, y no debería ser usado como tal.

Ejecución de ANT

Para ejecutar ANT basta con escribir ant en la línea de comandos. Si se ha especificado

la ejecución de un objetivo por defecto en la cabecera del proyecto del fichero build.xml

no es necesario el uso de ningún parámetro ya que, como se acaba de ver en el ejemplo

anterior, se ejecutara este por defecto. Para utilizar un buildfile diferente de build.xml hay

que añadir el parámetro -buildfile nombre_fichero, donde nombre_fichero es el buildfile

que se quiere utilizar:

ant -buildfile buildfile_alt.xml

Si se desea ejecutar uno o varios objetivos concretos, se debe añadir el nombre de este

o estos objetivos en la línea de comandos vv:

ant clean

En este caso se ignorará el objetivo indicado en la cabecera del proyecto.

Configuración

Una vez obtenida la anterior distribución de ANT, se deben seguir los siguientes pasos:

- Añadir el directorio "bin" al path. - Asignar a la variable de entorno "ANT_HOME" la ruta

donde se ha instalado ANT. - Opcionalmente, asignar a la variable de entorno

"JAVA_HOME" la ruta donde se ha instalado el JDK.

Dependiendo del sistema operativo en el que se encuentre se tiene configuración distinta.

A continuación se muestran unos ejemplos:

24

Windows y OS/2

(Suponiendo que se ha instalado ANT en c:\ant\)

set ANT_HOME=c:\ant

set JAVA_HOME=c:\jdk1.2.2

set PATH=%PATH%;%ANT_HOME%\bin

Unix (bash)

(Suponiendo que se ha instalado ANT en /usr/local/ant)

export ANT_HOME=/usr/local/ant

export JAVA_HOME=/usr/local/jdk-1.2.2

export PATH=${PATH}:${ANT_HOME}/bin

Unix (csh)

setenv ANT_HOME /usr/local/ant

setenv JAVA_HOME /usr/local/jdk-1.2.2

set path=( $path $ANT_HOME/bin )

2.5 Herramientas de análisis de código

Son herramientas diseñadas para analizar código fuente y/ o compilar la versión de un

código para encontrar errores en la seguridad idealmente, estas herramientas

encontraran automáticamente los errores en la seguridad de alto grado.

Algunas herramientas están comenzando a migrar al IDE. Por los tipos de problemas

que pueden ser detectados durante el desarrollo de software en su misma fase, esta es

una fase con mucho remarque en el ciclo de desarrollo puesto que es el momento

25

perfecto para emplear dichas herramientas, al mismo tiempo que nos proveen de

retroalimentación (al desarrollador) acerca de incidencias que pueden estar presentes

en el código fuente por sí mismo. Esta retroalimentación inmediata es muy útil,

especialmente cuando es comparada a encontrar vulnerabilidades mucho tiempo

después del ciclo de desarrollo.

Fortalezas

- Escalabilidad: puede ser ejecutada en muchos software repetitivamente.

- Útil para las cosas que tales herramientas pueden encontrar de forma automática

con alta confianza, tales como desbordamientos de búfer, fallas de inyección SQL,

etc.

- El output es bueno para los desarrolladores: realza la localización precisa de los

archivos de código, líneas de código e incluso las subsecciones de líneas que están

siendo afectadas.

Debilidades

- Muchos tipos de seguridad son muy difíciles de encontrar automáticamente así

como problemas de autentificación, defectos en el control de acceso, uso inseguro

de criptografía, etc. Aunque este tipo de herramientas están mejorando.

- Números grandes de falsos positivos.

- Frecuentemente no se pueden encontrar problemas en la configuración, ya que

estos no están presentes en el código.

- Difícil de “probar” que un problema en la seguridad de identidad es una verdadera

vulnerabilidad.

- Muchas de estas herramientas tienen dificultad al analizar código que no puede ser

compilado. Los analistas frecuentemente no pueden compilar código porque no

tienen las librerías correctas, todas las instrucciones de compilación, todo el código,

etc.

26

Criterios de selección importantes

- Requerimientos: deben tener soporte para tu idioma, aunque no siempre suele ser

un factor clave.

- Tipos de vulnerabilidades que puede detectar.

- ¿Requiere un ambiente de construcción de código completo?

- ¿Puede ejecutar binarios en vez de código?

- ¿Puede integrarse al IDE del usuario?

- El costo de licencia de la herramienta.

2.5 Error de software

Un error de software, comúnmente conocido como bug es un error o fallo en un programa

de computador o sistema de software que desencadena un resultado indeseado. Los

programas que ayudan a la detección y eliminación de errores de programación de

software son denominados depuradores (debuggers).

Defectos de diseño de programa

Diseños con colores inapropiados para las personas que padecen daltonismo

Diseños que usan textos con tipografías de difícil lectura por su tamaño o diseño

Diseños que fuerzan el uso del ratón o mouse sin dejar alternativas de teclado para

personas con disfunciones motrices

Diseños con implicaciones culturales, por ejemplo usando partes del cuerpo que en una

determinada cultura sean objeto de vergüenza o burla o símbolos con características de

identidad cultural o religiosa

Estimar que el equipo donde se instalará tiene determinadas características (como la

resolución de la pantalla, la velocidad del procesador, la cantidad de memoria o

conectividad a internet) propias de un equipo de gama alta, en vez de diseñar el software

para su ejecución en equipos normales.

Errores de programación comunes

27

División por cero

Ciclo infinito

Problemas aritméticos como desbordamientos (overflow) o subdesbordamientos

(underflow).

Exceder el tamaño del array

Utilizar una variable no inicializada

Acceder a memoria no permitida (Violación de acceso)

Pérdida de memoria (memory leak)

Desbordamiento o subdesbordamiento de la pila (estructura de datos)

Desbordamiento de búfer (buffer overflow)

Bloqueo mutuo (deadlock)

Indizado inadecuado de tablas en bases de datos.

Desbordamiento de la pila de recursión, cuando se dejan demasiadas llamadas en

espera.

Defectos de instalación o programación

Eliminación o sustitución de bibliotecas comunes a más de un programa o del sistema

(DLC Hell).

Reiniciar arbitrariamente la sesión de un usuario para que la instalación tenga efecto.

Suponer que el usuario tiene una conexión permanente a internet.

Utilizar como fuente enlaces simbólicos a ficheros que pueden cambiar de ubicación.

Códigos de errores de lenguajes de programación

La mayor parte de los lenguajes de programación presentan al menos dos tipos de errores

que permiten a los programadores manejar las fallas de los programas de una manera

eficiente y que no resulte agresiva con el usuario final. Dichos errores son

de compilación y errores en tiempo de ejecución.

Los errores de compilación normalmente inhiben que el código fuente derive en un

programa ejecutable, mientras que los errores en tiempo de ejecución son situaciones

28

específicas en las que un evento externo al programa impide su ejecución. Regularmente

un programador eficiente debe intentar imaginar cómo debe responder ante esos eventos

de manera que sea el programa y no el usuario o el sistema operativo los que resuelvan

el problema. Así por ejemplo un bloque de error no manejado podría hacer lo siguiente:

Abre el archivo "miarchivo" para escritura

Comienza a escribir datos en mi archivo

Cierra el archivo

Si "miarchivo" no existe (el programa o el usuario no tienen privilegios suficientes para

abrirlo), el sistema operativo regresará un error que el programa no atrapará y tendremos

un mensaje como "El archivo "miarchivo" no puede ser abierto para escritura" y botones

para reintentar, cancelar y abortar (en el sistema operativo Windows), que no tendrán otra

acción que repetirse indefinidamente sin posibilidad de salir de ese ciclo como no sea

dando por terminado violentamente el programa. Un código que permitiese atrapar el

error en tiempo de ejecución sería:

Abre el archivo "miarchivo" para escritura

Si el sistema operativo lo permite

Comienza a escribir datos en "miarchivo"

Si no lo permitió

Informa al usuario de lo que sucede

Regresa al usuario a un punto donde no haya conflicto (el menú

principal, por ejemplo)

Continúa operando normalmente

Los diferentes lenguajes de programación permiten diferentes construcciones lógicas a

los programadores para atrapar y resolver errores en tiempo de ejecución, como pueden

ser las sentencias assert, try y on error en diferentes lenguajes de programación.

2.6 Ejemplos de algunas herramientas de análisis estático de código

2.6.1 Pitbull SCC

29

Es una aplicación de software innovadora diseñada para resolver eficientemente la

aplicación del control de código con una compilación aplicada usando la integridad para

asegurarse que la producción no se vea afectada. Provee un valor agregado, ya que

permite que el análisis del código identifique si hay algún malware que afecte el

funcionamiento normal de la aplicación. Controla la importación de código y los archivos

compilados juntos con la exportación de archivos binarios. Tiene un rastreo riguroso

permitiéndole al auditor identificar que los archivos compilados sean colocados en la

producción y analizados correctamente.

Además de su funcionalidad, promueve la conformidad con las leyes y estándares de

regulación a cambio de procedimientos de control.

Beneficios

- Optimización de procesos: Automatiza el proceso de verificación de consistencia del

código fuente de la aplicación con archivos compilados para .NET, Java, php y cobol

usando la base de datos Microsoft SQL Server. Lineamientos con las mejores prácticas

para cambiar los procesos de control.

- Flexibilidad: habilidad para identificar datos sensibles, tablas clave, funciones críticas y

comandos sensibles entre otros para evaluar su uso en cada aplicación y para identificar

posibles códigos maliciosos. Importación, análisis y exportación de archivos que van

directo al entorno de producción. El almacenamiento de código fuente y los archivos

compilados para permitir un análisis y exportación en cualquier momento.

- Seguridad mejorada: reduce el riesgo descontrolado de cambios en la producción. La

autentificación de usuarios con Active Directory, DUO u OVD. La segregación de

funciones y permisos dentro de la aplicación para garantizar una gestión adecuada. Los

diferentes roles para usuarios responsables de aplicaciones, administradores, auditores,

configuradores, control de cambios, etc.

2.6.2 Source Patrol

Source Patrol es una herramienta estática para aplicaciones Java, es una herramienta

llamada Análisis de Pruebas de Seguridad (SAST), diseñadas por Pentest limitado a

30

proporcionar a los desarrolladores un medio intuitivo y sencillo para evaluar la seguridad

de las aplicaciones web. Se diferencia de la mayoría de las herramientas SAST porque

reside en el equipo de desarrollo, por lo que se integra en la fase más temprana del ciclo

de vida de desarrollo de sistemas (SDLC). Source Patrol pone el equipo de desarrollo de

vuelta en el asiento del conductor, proporcionando codificadores con retroalimentación

inmediata, sin necesidad de auditoría interna o especialistas en seguridad. La intención

es que los desarrolladores aprendan rápidamente a evitar los errores comunes de

seguridad que nosotros vemos como una empresa con demasiada frecuencia, educar y

capacitar al equipo lo que reduce tanto el número de vulnerabilidades de seguridad y los

costos de desarrollo.

Según la experiencia de Pentest como especialista en seguridad de aplicaciones es una

práctica común para participar en una evaluación de seguridad al final del proceso de

desarrollo. Esta evaluación es comúnmente el primer contacto con las pruebas de

seguridad de cualquier tipo y con frecuencia tiene como resultado vulnerabilidades de

seguridad significativos.

Cuando los desarrolladores comienzan a producir su código se enfrentan a un dilema

con respecto a las vulnerabilidades: dejar las vulnerabilidades sin atenderse con el riesgo

de que alguna persona pueda explotarlas y por lo tanto causar una perdida tanto en la

información que se maneja tanto como en su reputación como desarrollador o lidiar con

estas vulnerabilidades aunque esto afecte el tiempo de entrega de la aplicación.

Source Patrol se ha desarrollado en respuesta a la experiencia de Pentest con las

herramientas tradicionales de análisis de código estático. Estas herramientas han sido a

menudo soluciones complejas y costosas que han sido difíciles de instalar e

implementar, de acuerdo con las necesidades específicas de una compañía y, a menudo

producen despachos difíciles de manejar. En muchos casos, estas herramientas no se

despliegan regularmente como parte del ciclo de vida del desarrollo de sistemas, ya que

no están diseñados para su uso únicamente por el equipo de desarrollo.

31

Desarrollado específicamente para las aplicaciones Java y destinado a ser utilizado por

el equipo de desarrollo de aplicaciones. Source Patrol es como una solución fácil de

instalar, la entrega de informes se centraron con el fin de proporcionar información que

el equipo de desarrollo puede entender y actuar en consecuencia.

Source Patrol ha sido diseñado para ser utilizado como una parte integral del ciclo de

vida de desarrollo de sistemas para identificar las vulnerabilidades de seguridad y

dirección a través de las aplicaciones que entregan ciclo de vida de desarrollo de

sistemas que son los costos de desarrollo más seguros y reductores.

Ventajas de la Source Patrol:

- Identifica los riesgos de seguridad más temprano en el ciclo de desarrollo

- Diseñado para ser utilizado como puerta de entrada a la calidad en todo el

SDL

- Diseñado para su uso por y para los desarrolladores

- Produce informes inmediatos para la presentación de la información que un

desarrollador puede entender

- Identifica las acciones de remediación

2.6.3 Rogue Wave Software

Es una aplicación que ofrece rapidez en la solución de incidencias y técnicas de

código abierto para dar soporte, consultar y educar al equipo de desarrollo a lo largo

del ciclo de vida

Rogue Ware Software incluye:

- Acuerdos de servicio de nivel garantizados (SLAs) con todos los contactos de

soporte

- Soporte con cobertura de 24 horas.

- Acceso a técnicos de código abierto dedicados a CentOS.

- La confianza necesaria para solucionar los problemas de producción, optimizar el

rendimiento, y las actualizaciones de sistema completas.

- La experiencia para evaluar proyectos en cuanto a arquitectura y seguridad.

32

Soporte disponible para CentOS Linux con un equipo de desarrollo dedicado a

proveer parches y revisiones alojado en nuestro propio repositorio de CentOS.

Un arquitecto de código abierto es más que un simple desarrollador ellos tienen un

pensamiento influyente de líder capaz de diagnosticar, resolver y explicar incidencias

de dificultad técnica mientras proveen un cambio positivo a la organización. Ellos

logran esto entendiendo que muchas incidencias no son simplemente técnicas, estas

pueden estar envueltas en procesos y retos de política lo que significa que los

ambientes deben ser entendidos, las conversaciones deben ser guiadas y los

esfuerzos dirigidos hacia un área de progreso para evitar una parálisis en el desarrollo

del software.

2.6.4 Coverity Code Advisor

Coverity es una marca de productos de desarrollo de software de Synopsys que

consiste principalmente en el análisis de código estático o análisis de código

dinámico. Las herramientas le permiten a los ingenieros encontrar defectos de

seguridad y vulnerabilidades en el código escrito en C, C++, Java, C# y JavaScript.

La solución Coverity Code Advisor incluye un asesor de calidad y un asesor de

seguridad. Esta solución muestra los defectos en la calidad y en la seguridad en el

flujo de trabajo del desarrollador con una guía de como remediarlos basada en

técnicas patentadas de desarrollo.

Le da a los desarrolladores la información que necesitan para arreglar defectos

críticos de manera rápida y eficiente. Construye calidad y seguridad en desarrollo

para reducir el costo de rehacer y retrasar el lanzamiento del software al mercado.

Reduce el riesgo de fallos de software costoso y perjudicial para la marca y brechas

de seguridad en el campo o en la producción.

Esta solución utiliza un análisis sofisticado de código fuente para encontrar los

33

defectos más críticos.

2.6.5 Parasoft

Parasoft simplifica la complejidad del proceso de prueba de software que es vital para

una API.

- Esta diseñado desde cero para simplificar la prueba de APIs que no contengan

GUI.

- Generan pruebas extensivas, reusables, y fáciles de mantener con una cobertura

de 100%

- Diseñan pruebas sofisticadas sin necesidad de scripts o codificación

- Automatiza la regresión continua con sofisticadas validaciones

Parasoft también crea un ambiente de prueba simulado que provee acceso donde

sea a la hora que sea al comportamiento de recursos dependientes que no están

disponibles, que tienen un difícil acceso o que son difíciles de configurar para las

pruebas de desarrollo.

2.6.6 Klocwork

Klocwork es una herramienta que permite la entrega de código seguro y confiable.

Klocwork está pensado en resolver la problemática en la que se encuentran los

desarrolladores en la actualidad. Los estándares de desarrollo son más estrictos de

lo que eran antes y cada vez se vuelve más difícil encontrar bugs y arreglar defectos

de seguridad. Esta herramienta es la respuesta a las preguntas:

¿Cómo evitar que las ramas de datos y aplicaciones fallen antes de que sean llevadas

al cliente?

¿Cómo encontrar todos estos desperfectos de forma más temprana en el proceso de

manera que el desarrollador invierta más su tiempo en crear contenido de real valor

para el cliente en vez de perderlo buscando bugs y arreglándolos?

Comienza en el escritorio del desarrollador. Ahí es donde el código es escrito, creado

revisado y escrito de nuevo. Encontrar problemas aquí lo más rápido posible antes

de la construcción del proyecto se traduce a menos pruebas posteriores, lo que

impacta en un menor costo y tiempo invertido.

34

Klocwork Static Code Analysis es una interfaz web para la gestión del proyecto,

reportes, gestión de incidentes y gestión de usuarios.

Reportes y métricas

Klocwork Static Code Analysis permite a los gerentes acceder a reportes y métricas

que representan la productividad de su equipo y ayudar a las zonas con problemas

potenciales. Muchos reportes son generados automáticamente y se pueden crear

reportes personalizados para enfocarse en las cosas en las que se tiene mayor

interés.

Investigación y citar incidentes

Esta herramienta permite revisar la lista de incidentes, investigar la causa y

arreglarlos o citar las incidencias como mejor le parezca.

Revisión de código

La revisión de código se puede utilizar para:

- Crear revisiones de código desde su IDE (Visual Studio, Netbeans, Eclipse) o

desde la línea de comandos.

- Actualizar revisiones de código existentes con nuevas revisiones.

- Crear un feed personalizado por los usuarios, términos o componentes.

2.7 Sumario

La optimización de código permite mejorar el funcionamiento del software realizado.

Utilizarla en proyectos con miles líneas de código es muy importante, ya que permite

que el código que se desarrolla sea más claro, limpio y fácil de mantener.

Hay dos tipos de optimización de código: local y global. La optimización local se da

a solo un bloque de código o una función. Por otro lado, la optimización global afecta

a todo el programa en general.

La seguridad en el software desde siempre ha sido uno de los factores más

importantes al momento de desarrollar.