Joven hacker sonriendo

Disculpe, hice este software, y no sé cómo probarlo

En un mundo globalizado que está en constante expansión, surge la necesidad de transmitir y tratar todo tipo de información de manera constante, ágil y segura. Teniendo en cuenta esa dinámica de globalización y expansionismo, y para suplir la necesidad anteriormente descrita, se crearon los equipos de cómputo y con la respectiva revolución tecnológica que ellos trajeron, aparecieron múltiples aplicaciones informáticas o software tan diversos y enfocados a tantas áreas del conocimiento que concebir el día a día sin éstas, resulta imposible.

A partir de ese punto floreció una nueva exigencia, procurar que cada producto de software desarrollado cumpla con unos requisitos mínimos en cuanto a la misma construcción, implementación, cumplimiento y medidas de seguridad pertinentes para proteger la información tratada por él. En ese orden de ideas, surgieron las pruebas de software o testing.

Las pruebas de software son un conjunto, como su nombre lo dice, de pruebas que verifican el comportamiento de un programa con el fin de comprobar si éste realiza o no lo que se esperado.

En cuanto a la seguridad informática, estas pruebas son fundamentales puesto que permiten encontrar posibles vulnerabilidades que, de ser explotadas, comprometerían el buen funcionamiento del software, y eso sin mencionar que podría verse comprometida toda la información utilizada por el programa para su desempeño.

concolic
Figura 1. Concolic Execution: tomado de kaist.edu

Una de esas pruebas se conoce como Concolic Execution o Concolic Testing, esta prueba de verificación de software analiza el funcionamiento de los programas tratando a las variables como variables simbólicas a lo largo de una ejecución concreta. En sí, esto quiere decir que Concolic combina dos tipos de testing; concrete execution o ejecución concreta y symbolic execution o ejecución simbólica.

Las pruebas de ejecución concreta son aquellas que toman una sola ruta determinada para los valores de entrada, es decir, a las variables de inicio de un programa les asigna un único valor y la prueba la realiza siguiendo el camino que el software toma a partir de los valores dado.

Veamos un ejemplo. Tomemos el siguiente fragmento de código java.

ejemplo
Figura 2. Código de ejemplo

En él, se tienen tres variables X, Y y Z cuyo valor es la multiplicación de Y por 2. Además, hay dos condiciones, pero como se ve, en la segunda existe un error que podría afectar el buen funcionamiento del programa.

Cuando se realiza una prueba concreta esa le asigna un valor aleatorio a las variables que así lo requieran, en este caso X y Y. Bien, supongamos que los valores asignados son X=2 y Y=3, por tanto Z será igual a 6.

La primera condición requiere que X sea igual a Z, como 2 no es igual a 6, la condición no se cumple y por tanto la ejecución del programa termina. Entonces, la prueba de ejecución concreta termina y como nunca llegó al bloque de código que genera el error, esa concluye que el software trabaja normalmente.

Por otra parte, las pruebas de ejecución simbólica determinan los posibles valores que pueden tomar las variables de inicio de un programa asignándole un valor simbólico a cada una de ellas.

Tomando el código del ejemplo anterior, las dos variables toman un valor simbólico, en este caso X=A, Y=B y por tanto Z=2B. Cuando llega a la condición, y como los valores son simbólicos, el test toma los dos caminos posibles para continuar, es decir X!=Z o X=Z, y los evalúa. Como el software no realiza ninguna acción con X!=Z, este camino es descartado y procede a examinar X=Z que, en el código, lleva a otra condición. En este punto, la prueba vuelve a tomar los dos posibles caminos de la condición que X⇐ Y+5 o X>Y+5. Y nuevamente, como la primera opción no lleva a ninguna parte la descarta, y continúa examinando las instrucciones derivadas de la segunda opción que, en este caso, llevan al error que tiene el programa.

Si bien, la ejecución simbólica es una de las pruebas de software más competentes y acertadas que hay, debido a que examina todos los posibles caminos de ejecución de un programa, el uso de este método para evaluar software demasiado grandes resulta en una sobre carga de rutas, es decir, la ejecución del programa genera demasiadas rutas que al final, la evaluación de todas resulta demasiado complicado. Además, en caso de que el programa caiga en un ciclo infinito, la prueba de verificación nunca terminaría.

Así que, como la ejecución concreta y la ejecución simbólica tienen varios problemas, Concolic Execution surge como la fusión de las dos, con el fin de eliminar los problemas subyacentes en ambas y tomar lo mejor de cada una a la hora de realizar testing.

Entonces, tomando el código ya propuesto para explicar el funcionamiento de Concolic empezaríamos por decir que la prueba comienza asignándole un valor determinado a cada variable. Al igual que lo explicado en la ejecución concreta, diremos que X=2, Y=3 y Z=6. El recorrido del programa inicia mientras que Concolic realiza un seguimiento del camino tomado por la prueba. Cuando se llega a la condición y debido a que esta no se cumple, se fuerza una ejecución simbólica, es decir, a las variables se les asigna valores simbólicos (X=A, Y=B, Z=2B) y ésta es forzada a tomar el camino trazado por el test anterior, además, a medida que avanza analiza todas las condiciones que deben cumplir las variables para poder continuar con el programa. Y una vez tiene todas estas restricciones, Concolic Execution genera los valores reales que deben tomar las variables.

En pocas palabras, cuando la ejecución simbólica llega a la primera condición, Concolic sabe que para que X=Z, X puede ser 2 y Y=1, de esta forma Z=2 y la condición se cumple, por tanto, el programa puede pasar a evaluar la siguiente condición.

Cuando los valores son generados, se vuelve a realizar una prueba de ejecución concreta con los valores previamente generados. Y así, los pasos anteriores se repiten hasta que todas las instrucciones del programa son evaluadas o se encuentra algún error en el mismo.

Para terminar el ejemplo, la ejecución concreta encuentra que los valores asignados no cumplen la segunda condición, por tanto, se realiza una ejecución simbólica para analizar las restricciones y que Concolic pueda determinar que los valores adecuados para continuar con el programa y, en este caso, hallar el error, son X=12 y Y=6.

Para concluir, la creciente demanda en la producción de software y la complejidad cada vez más elevada de éstos, hacen de Concolic Execution una herramienta óptima a la hora de probar la calidad y seguridad de un software. Sin embargo, es necesario destacar que para comprenderlo de una manera óptima, es necesario aprender los fundamentos básicos requeridos en el área de desarrollo de software, puesto que lo expuesto en el presente artículo es tan sólo una pequeña aproximación a la magnitud y complejidad de este tipo de pruebas.


Foto del autor

Jhony Arbey Villa Peña

Ingeniero en Sistemas.

Apasionado por las redes la música y la seguridad.


Relacionado





Haz un comentario