La CWE (Common Weakness Enumeration) es una lista elaborada por las comunidades de desarrolladores y profesionales que enumera las debilidades de software y hardware más habituales relacionadas con la ciberseguridad. Hablar de debilidades implica todos aquellos fallos, errores y/o vulnerabilidades existentes en la implementación, el código, el diseño o la arquitectura del software o hardware y que, en caso de no solucionarse, pueden dar lugar a que un sistema o red sea vulnerable a un ataque.
Esta lista CWE se editó por primera vez 2006 e inicialmente se centraba solo en problemas de software. Tres años después, se lanzó el top 25 de vulnerabilidades enumerando las respuestas obtenidas tras sondear a desarrolladores, analistas de seguridad, investigadores y proveedores. Pero es a partir de 2019 cuando se emprende un nuevo enfoque basado en datos objetivos, para llegar a la versión 2020 actual que usa datos de la BBDD Nacional de Vulnerabilidades (NVD) norteamericana, en la que se combina la frecuencia y una puntuación promedio para determinar un orden de clasificación.
A continuación, resumimos las 25 vulnerabilidades 2020 más importantes:
- Neutralización inadecuada del input durante la generación de la página web (Scripting entre sites XSS). El software no neutraliza (o lo hace incorrectamente) el input del usuario, y un atacante es capaz de inyectar un script en el output de una aplicación web de forma que se ejecuta en el navegador del cliente.
- Escritura fuera de límites. El software escribe datos antes o después del búfer previsto, lo que puede llevar a la corrupción de los datos o a un bloqueo o ejecución de un código.
- Validación de entrada incorrecta. La aplicación recibe entradas o datos, pero no es capaz de validarlos o lo hace de modo incorrecto. Esta validación de entrada se usa como verificación de entradas potencialmente peligrosas para garantizar que éstas se procesen de forma segura dentro del código o al comunicarse con otros componentes.
- Lectura fuera de límites. El software lee datos antes o después del búfer previsto. Esto puede permitir que los delincuentes lean información confidencial en memoria o provoquen un bloqueo.
- Restricción incorrecta de operaciones dentro de los límites de un búfer de memoria. Habitualmente, el software realiza operaciones en un búfer de memoria, pero puede pasar que se lean o escriban en una ubicación que esté fuera del límite previsto del búfer, por lo que puede haber operaciones de lectura o escritura en ubicaciones de memoria asociadas con otras variables, estructuras de datos o datos internos del programa.
- Neutralización incorrecta de elementos especiales
utilizados en un comando SQL (Inyección SQL). Se trata de un tipo de ataque a
una aplicación web que permite insertar sentencias maliciosas SQL en la
aplicación web, permitiendo acceso a datos sensibles en la base de datos o
destruyendo directamente estos datos. La inyección SQL se ha convertido en un
problema común en los sitios web basados en BBDD, y el fallo se detecta
fácilmente pero también es fácil de explotar.
- Exposición de información confidencial a un usuario no autorizado.
La gravedad de este error es variable y depende del contexto en el que opera la
aplicación, del tipo de información confidencial expuesta y de los beneficios
que puede proporcionar a un atacante.
- Uso de memoria liberada (use after free). Hacer referencia
a la memoria liberada puede conseguir que un programa se bloquee, que utilice
valores inesperados o que ejecute un código. Las consecuencias van desde la
corrupción de datos válidos, hasta la ejecución de código arbitrario.
- Falsificación de solicitud entre sitios (CSRF). Cuando un
servidor web está diseñado para recibir la solicitud de un cliente pero no
tiene mecanismos para verificar que fue enviada intencionalmente, un atacante puede
engañar a dicho cliente para que haga una solicitud al servidor web a través
de una URL, una carga de imágenes, XML... que será tratada como una petición
auténtica.
- Neutralización incorrecta de elementos especiales utilizados
en un comando del sistema operativo (Inyección de comando del SO). Un atacante podría
ejecutar comandos peligrosos directamente en el SO. Además, si la
vulnerabilidad se da en un programa con privilegios, podría permitir que se especificaran
comandos que no son accesibles o llamar a comandos alternativos con privilegios
que el atacante no tiene.
- Desbordamiento de enteros (Wraparound). Cuando un valor
entero se incrementa a un valor que es demasiado grande para almacenarlo en la
representación asociada, se produce un desbordamiento de enteros que puede
resultar crítico para la seguridad cuando se usa para controlar un bucle, para tomar
una decisión de seguridad o para determinar el desplazamiento o el tamaño en
comportamientos como la asignación de memoria, la copia, la concatenación, etc.
- Limitación incorrecta de un nombre de ruta a un directorio
restringido (Ruta transversal). El software implicado utiliza una entrada
externa para construir un nombre de ruta destinado a identificar un archivo o
directorio que se encuentra debajo de un directorio principal restringido, pero
el software no neutraliza adecuadamente los elementos especiales dentro del
nombre de ruta. Así, un atacante puede escapar de la ubicación restringida para
acceder a archivos o directorios que se encuentran en otras partes del sistema.
- Desreferenciar el puntero nulo (NULL). Ocurre cuando una aplicación elimina la
referencia de un puntero que se espera que sea válido, pero es nulo, lo que
causa un bloqueo o una salida. Estos problemas pueden ocurrir por una simple
omisión de programación.
- Autenticación incorrecta. Cuando un usuario afirma tener una
identidad determinada y el software asociado no prueba, o prueba de manera
insuficiente, que esta afirmación es correcta.
- Carga de archivos peligrosos sin restricciones. El software
permite al atacante que se cargue o se transfieran archivos peligrosos que
pueden procesarse automáticamente dentro del entorno del producto.
- Asignación incorrecta de permisos para recursos críticos. El
software en cuestión especifica permisos para un recurso crítico de seguridad
de una forma que permite a terceras personas leer o modificar ese recurso;
exponiendo información confidencial o que ese recurso se modifique en zonas no
deseadas. Algo muy peligroso cuando el recurso está relacionado con la
configuración, la ejecución o el uso de datos confidenciales del usuario.
- Control inadecuado de la generación de código (Inyección de
código). El software construye código de un componente ascendente utilizando
entradas controladas externamente, pero no neutraliza elementos que podrían
modificar la sintaxis o el comportamiento del segmento de código previsto. Hay
que tener en cuenta que la ejecución del proceso puede alterarse enviando
código a través de canales legítimos de datos, sin utilizar ningún otro
mecanismo.
- Credenciales protegidas de forma insuficiente. La aplicación
transmite o almacena credenciales de autenticación, pero utiliza un método poco
seguro y susceptible de ser interceptadas por usuarios no autorizados.
- Restricción incorrecta de la referencia XML. Al enviar un archivo
XML, que pueda contener entidades XML con URI, un atacante puede hacer que la
aplicación de procesamiento lea el contenido de un archivo local, lo que puede obligar
a la aplicación a realizar solicitudes salientes a servidores a los que el
atacante no puede acceder directamente y que pueden usarse para eludir las
restricciones del firewall o para ocultar la fuente de los ataques.
- Uso de credenciales codificadas. El fallo de credenciales codificadas
en un software puede crear una entrada que permita al atacante eludir la
autenticación que ha sido configurada por el administrador del software.
- Deserialización de datos no confiables. La aplicación
deserializa los datos que no son de confianza sin verificar suficientemente que
los datos resultantes son válidos. Éstos se pueden modificar si no se utiliza la
criptografía como modo de protección.
- Gestión inadecuada de privilegios. El software no asigna,
modifica, rastrea ni verifica correctamente los privilegios de un usuario, lo
que crea un ámbito que está fuera de control de ese usuario.
- Consumo incontrolado de recursos. El software implicado no
controla adecuadamente la asignación y mantenimiento de un recurso limitado, lo
que permite que se pueda influir en la cantidad de recursos consumidos, lo que
finalmente conduce al agotamiento de los disponibles.
- Ausencia de autenticación para función crítica. El programa
no realiza ninguna autenticación para las funcionalidades que requieren una
identidad de usuario demostrable, o consume una cantidad significativa de
recursos.
- Autorización desaparecida. El software no realiza las
verificaciones de autorización cuando un usuario intenta acceder a un recurso o
realizar una acción, facilitando el acceso a datos o a acciones que no se les
debería permitir realizar, con los consiguientes problemas de exposición de
información, denegación de servicio y ejecución de código arbitrario.
Un top 25 muy valioso para los profesionales del sector de la ciberseguridad
Si bien la lista CWE incluye más de 700 posibles errores, de ésta se desprende que solo ocho de ellos realmente llevan a consecuencias peligrosas. Es decir, si hay un fallo que se manifiesta de manera que pueda ser aprovechado para realizar un ataque exitoso, uno de estos ocho errores estará presente:
- Leer datos.
- Modificar datos.
- Denegación de servicio (DOS). Ejecución poco confiable.
- Denegación de servicio (DOS). Consumo de recursos.
- Ejecutar códigos o comandos no autorizados.
- Obtener privilegios y/o asumir identidades.
- Mecanismos de protección de bypass.
- Ocultación de actividades.
En definitiva, las empresas de desarrollo de software y hardware, así como los profesionales de seguridad, utilizan hoy CWE como herramienta para detectar, eliminar o mitigar las vulnerabilidades. La lista CWE es un recurso gratuito que identifica los errores de programación más generalizados que pueden provocar un ataque exterior, unos fallos que generalmente son fáciles de encontrar pero que también son sencillos para ser aprovechados por los cibercriminales.