Proteja el código PHP con el análisis de código no seguro de Qodana

Este artículo del blog es gracias a Qodana, una plataforma de JetBrains sobre la calidad del código. Esta plataforma está diseñada para llevar el análisis estático del servidor a su herramienta de integración continua preferida. Con las mismas inspecciones de código y perfiles que PhpStorm y otros IDE de JetBrains, Qodana asegura controles coherentes de calidad del código tanto en el IDE como en el entorno de integración continua.

Un único usuario es capaz de explotar una vulnerabilidad en el proyecto y penetrar en el sistema. Así que, para evitar la entrada maliciosa de usuarios externos en los programas (conocida como «taints» o «código no seguro»), los equipos de desarrollo añaden la comprobación de código no seguro a las rutinas de análisis estático. 

En la primera versión de este año, el equipo de Qodana ha incluido el análisis de código no seguro para PHP en el EAP. Esta funcionalidad solo está disponible en Qodana para PHP 2023.1 (jetbrains/qodana-php:2023.1-eap). Qodana para PHP fue el primer linter que lanzamos, así que decidimos dejar que los desarrolladores de PHP fueran también los primeros en probar esta nueva funcionalidad de seguridad. Tenemos pensado añadir más lenguajes más adelante, en cuanto hayamos recogido suficientes comentarios.

Siga leyendo para obtener más información acerca de qué es el análisis de código no seguro y cómo funciona en Qodana. 

COMIENCE A USAR QODANA

¿Qué es el análisis de código no seguro?

El código no seguro es cualquier valor que pueda suponer un riesgo de seguridad cuando un usuario externo lo modifica. Si tiene código no seguro en el código y los datos externos no verificados pueden distribuirse a través del programa, los hackers pueden ejecutar estos fragmentos de código para provocar una inyección SQL, desbordamiento aritmético, complementos entre sitios o recorridos de ruta, entre otras cosas. Normalmente, explotan estas vulnerabilidades para destruir el sistema, secuestrar credenciales y otros datos, y cambiar el comportamiento del sistema.

Ejemplo de código no seguro. Los datos arbitrarios del parámetro GET se muestran en la pantalla. Por ejemplo, los usuarios maliciosos pueden aprovechar esta vulnerabilidad para manipular el diseño del programa.  

A modo de capa extra de defensa contra entradas maliciosas, los equipos de desarrollo ejecutan el análisis de código no seguro con una auditoría de seguridad en la superficie de ataque del programa. 

El análisis de código no seguro es el proceso de evaluar el flujo de entradas de usuarios no fiables a través del cuerpo de una función o un método. Su objetivo principal es determinar si esa entrada no anticipada puede afectar a la ejecución del programa de forma maliciosa. 

Las fuentes de código no seguro son lugares en los que un programa accede a datos potencialmente no seguros. Los puntos clave de un programa susceptibles de permitir entradas que contienen código no seguro se denominan receptores de código no seguro. Estos datos pueden propagarse a los receptores a través de llamadas a funciones o asignaciones.

Si ejecuta el análisis de código no seguro de forma manual, debe detectar todos los lugares en los que acepta datos de usuarios externos y seguir cada uno de los datos a través del sistema: los datos contaminados pueden utilizarse en muchos nodos. A continuación, para evitar la propagación del código no seguro, debe adoptar uno de los dos enfoques que se describen a continuación:

Limpiar los datos, es decir, transformarlos a un estado seguro. En el ejemplo siguiente, hemos eliminado las etiquetas para resolver el código no seguro. 

Validar los datos, es decir, comprobar que los datos añadidos se ajustan a un patrón requerido. En el ejemplo siguiente, activamos la validación para la variable $email. 

En otras palabras, la inspección del análisis de código no seguro rastrea los datos del usuario con código no seguro desde su origen hasta los receptores, y avisa si se está trabajando con esos datos sin haberlos limpiado o validado. 

Cómo funciona el análisis de código no seguro en Qodana

Qodana analiza el código no seguro para PHP a partir de la versión 2023.1 EAP. Esta funcionalidad incluye una inspección que escanea el código y resalta el código no seguro y la posible vulnerabilidad, la posibilidad de abrir el problema en PhpStorm para abordarlo en el momento, y un gráfico de flujo de datos que visualiza el flujo del código no seguro. 

Ejemplo n.º 1. Inyección SQL 

Veamos un ejemplo de inyección SQL y cómo Qodana la detecta:

Aquí, Qodana nos muestra el código no seguro en la función system_admin():

Marcadores 1-2: los datos de la entrada del formulario del usuario se recuperan del vector global $_POST sin ningún tipo de limpieza o validación y se asignan a la variable $edit. Esto es código no seguro.

Marcador 3: la variable no segura $edit se pasa a la función system_save_settings como un argumento sin ningún tipo de limpieza.

Marcador 4: ahora, los datos de la variable $edit se encuentran en el parámetro $edit.

Marcador 5: la variable $edit se pasa a foreach con la clave $filename y el valor $status. Ambas variables contienen los datos con código no seguro de la variable $edit concatenados con la cadena. La clave $filename se concatena con una cadena SQL con código no seguro y, después, propagará los datos con código no seguro a un argumento pasado a db_query.

Marcador 6: la clave $filename contiene los datos con código no seguro de la variable $edit concatenados con la cadena.

Marcador 7: la clave $filename está concatenada con una cadena SQL con código no seguro.

Marcador 8: la cadena SQL con código no seguro propagará los datos con código no seguro a un argumento pasado a la función db_query.

Veamos ahora la consulta db_query:

Marcador 9: la cadena con código no seguro se encontrará en el parámetro $query.

Marcador 10: este parámetro será un argumento de la función _db_query.

Pasemos a la función _db_query:

Marcador 11: los datos con código no seguro se encuentran en el primer parámetro $query de la función _db_query.

Marcador 12: los datos del parámetro se pasan a la función mysql_query, que es un receptor.

Todo el flujo de datos anterior ilustra cómo los datos se mueven desde $_POST[„edit“] a la función mysql_query($query) sin ningún tipo de limpieza o validación. Esto permite al atacante manipular la consulta SQL que se concatenó con una clave de $_POST[„edit“] y desencadenar la inyección SQL

Qodana detectará estos riesgos en el código base junto con todos los nodos donde se utilizan datos con código no seguro, para que pueda limpiar correctamente todos los datos con código no seguro. 

 

Abrir la incidencia en PhpStorm.

Ejemplo n.º 2. Problema de XSS

En la interfaz de usuario de Qodana, puede ver un gráfico que muestra todo el flujo del código no seguro. Así es como Qodana mostrará la vulnerabilidad de XSS, que contiene dos fuentes que se fusionarían en el marcador 5.

Fuente 1

Marcadores 1-2: se leerán los datos del archivo searchUpdate.pos y se asignarán los datos con código no seguro a la variable $start.

Fuente 2

Marcadores 3-4: se leerán los datos de los archivos cuya ruta se encuentre en $posFile y se asignarán los datos con código no seguro a la variable $start.

Marcador 5: un estado fusionado con código no seguro de todas las ramas condicionales en la variable $start se pasará como argumento al método doUpdateSearchIndex.

Veamos el interior del método doUpdateSearchIndex():

Marcadores 6-8: el parámetro $start contendrá datos con código no seguro en este fragmento del flujo de datos y, después, se pasarán dentro de una cadena concatenada como argumento al método output.

Veamos el interior del método output:

Marcador 9: los datos con código no seguro dentro de la cadena transmitida se ubicarán en el parámetro $out.

Marcador 10: los datos del parámetro $out se transferirán a la función print sin ningún tipo de limpieza. Esta función es un receptor y provoca una vulnerabilidad de XSS, que se puede explotar.

Para ello, un atacante puede, por ejemplo, cargar un script de shell en lugar de los archivos esperados en los marcadores 1 y 2, y poner cualquier tipo de información en la página web como resultado de una función print sin limpiar.

Qodana le avisará de esta vulnerabilidad y le dará una prioridad alta para que pueda resolverla lo antes posible y evitar el hackeo.  

Conclusión

El análisis de código no seguro ayuda a eliminar las superficies de ataque explotables, por lo que es un método eficaz para reducir el riesgo al que se expone el software. Para obtener más información sobre el análisis de código no seguro y Qodana, consulte la documentación de Qodana.

COMIENCE A USAR QODANA

¡Que tenga un desarrollo feliz y mantenga limpio su código!

Artículo original en inglés de:

Valerie Kuzmina

The PhpStorm Blog : The Lightning-Smart IDE for PHP Programming | The JetBrains Blog

Read More

Latest News

PHP-Releases

PHP 8.3.4 released!

PHP 8.2.17 released!

PHP 8.1.27 released!

Generated by Feedzy