Auditoria informatica Codigo fuente

 

www.onlinetis.com

Una auditoría de código fuente es un proceso de revisión exhaustiva del código de un programa informático para identificar errores, vulnerabilidades, ineficiencias o cualquier otro problema que pueda comprometer su funcionamiento, seguridad o rendimiento. El objetivo principal es asegurar que el código sea de alta calidad, robusto y confiable.


¿Por qué se realiza una auditoría de código fuente?

  • Seguridad: Es la razón más común. Se buscan vulnerabilidades de seguridad, como fallos de inyección SQL, desbordamientos de búfer, o fallos de validación de entradas que podrían ser explotados por atacantes.

  • Calidad del código: Se evalúa la legibilidad, mantenibilidad y la adherencia a los estándares de programación. Un código bien estructurado es más fácil de mantener y modificar en el futuro.

  • Rendimiento: Se identifican cuellos de botella o fragmentos de código ineficientes que ralentizan la aplicación, permitiendo optimizar el software.

  • Cumplimiento: En algunos sectores, se requiere auditar el código para cumplir con normativas específicas, como las relacionadas con la privacidad de los datos (GDPR) o estándares financieros.


Tipos de auditoría de código fuente

Existen dos enfoques principales para realizar una auditoría de código fuente:

  1. Análisis estático de código (SAST):

    • Se realiza sin ejecutar el código.

    • Se utilizan herramientas automatizadas que escanean el código para buscar patrones conocidos de vulnerabilidades o malas prácticas.

    • Es rápido y se puede integrar en el ciclo de desarrollo.

    • Ejemplo: Una herramienta SAST podría detectar una función que utiliza un método obsoleto y vulnerable para el hashing de contraseñas.

  2. Análisis dinámico de código (DAST):

    • Se ejecuta el programa y se observa su comportamiento en tiempo real.

    • Se simulan ataques y se monitorea cómo reacciona la aplicación para encontrar vulnerabilidades.

    • Es más efectivo para encontrar fallos que solo se manifiestan durante la ejecución.

    • Ejemplo: Un análisis DAST podría inyectar datos maliciosos en un formulario web para ver si la base de datos es vulnerable a la inyección SQL.


El proceso de una auditoría

Una auditoría de código fuente típicamente sigue estos pasos:

  1. Planificación: Se define el alcance, los objetivos y las herramientas a utilizar.

  2. Análisis: Se realiza el análisis estático y/o dinámico del código.

  3. Revisión manual: Expertos en seguridad revisan manualmente el código para detectar vulnerabilidades complejas que las herramientas automatizadas podrían pasar por alto.

  4. Informes: Se documentan todos los hallazgos, se clasifican por gravedad y se ofrecen recomendaciones para su corrección.

  5. Verificación: Se revisan las correcciones implementadas para asegurar que los problemas se hayan solucionado de manera efectiva.

     

    Aquí tienes algunos ejemplos concretos de lo que se busca en una auditoría de código fuente, organizados por las categorías más comunes.


    1. Ejemplos de Vulnerabilidades de Seguridad

    • Inyección SQL: Un auditor encuentra una función que construye una consulta a la base de datos concatenando directamente la entrada de un usuario, sin validación ni sanitización.

      • Código vulnerable (PHP): $query = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "';";

      • Problema: Un atacante puede introducir código SQL malicioso en el campo username para acceder o modificar datos.

    • Desbordamiento de búfer: En un programa escrito en C++, el auditor detecta una función que copia datos de una variable a otra de tamaño fijo sin verificar si los datos de origen son demasiado grandes.

      • Código vulnerable (C++): char buffer[100]; strcpy(buffer, input);

      • Problema: Si la entrada (input) es mayor de 100 caracteres, puede sobrescribir la memoria adyacente, lo que podría llevar a un fallo del programa o a la ejecución de código malicioso.

    • Mala gestión de contraseñas: El auditor revisa la función de registro de usuarios y descubre que las contraseñas se almacenan en texto plano o se cifran con un algoritmo débil (como MD5), en lugar de usar un algoritmo de hashing seguro y salting (como bcrypt).

      • Problema: Si la base de datos es comprometida, las contraseñas de todos los usuarios quedan expuestas.


    2. Ejemplos de Problemas de Calidad y Mantenibilidad

    • Código "Spaghetti": El auditor encuentra un módulo con funciones extremadamente largas, múltiples bucles for anidados y un uso excesivo de la sentencia goto, lo que hace que sea muy difícil de leer y entender.

      • Problema: Dificulta la depuración y la adición de nuevas funcionalidades, aumentando el riesgo de errores.

    • Código duplicado: Se identifican múltiples fragmentos de código idénticos que realizan la misma tarea en diferentes partes del programa.

      • Problema: Si se necesita corregir un error en esa lógica, hay que hacerlo en todos los lugares, aumentando la posibilidad de olvidar uno y reintroducir el error.

    • Falta de comentarios o documentación: El auditor nota que las funciones y variables tienen nombres poco claros (a, b, temp) y no hay comentarios que expliquen la lógica de negocio.

      • Problema: Un nuevo desarrollador tardará mucho más en entender el código, lo que aumenta el tiempo y el coste del mantenimiento.


    3. Ejemplos de Ineficiencias y Problemas de Rendimiento

    • Consultas de base de datos ineficientes: El auditor descubre que un bucle for realiza una consulta a la base de datos en cada iteración (SELECT dentro de un bucle).

      • Problema: Esto genera un gran número de consultas individuales (N+1) en lugar de una sola consulta optimizada, lo que ralentiza considerablemente la aplicación.

    • Uso excesivo de memoria: En una aplicación Java, se detecta que se crean objetos innecesariamente dentro de un bucle, lo que provoca una alta presión sobre el recolector de basura y un consumo excesivo de memoria.

      • Problema: Puede llevar a que la aplicación se congele o se vuelva inestable bajo carga.

    • Algoritmos ineficientes: Se identifica un algoritmo con una complejidad de tiempo O(n^2) para procesar una lista grande, cuando podría haberse utilizado un algoritmo O(n log n) más eficiente.

      • Problema: El rendimiento de la aplicación se degradará drásticamente a medida que el número de elementos a procesar aumente.

     

Entradas populares de este blog

Ciberseguridad y hacking con Whatweb

Como robar contraseñas haciendo un phishing web

Arsenal software hacking NFC