title | author_1 | author_2 |
---|---|---|
Analisis de código estático |
Héctor Toral Pallás (798095) |
Darío Marcos Casalé (795306) |
El análisis de código estático es una técnica de análisis de software que se realiza sobre el código fuente sin necesidad de ejecutarlo. El objetivo de este análisis es encontrar errores en el código fuente, como por ejemplo, errores de sintaxis, errores de lógica, errores de seguridad, etc.
Vulnerabilidades | Código | CWE | Clang | CodeChecker | frama-c |
---|---|---|---|---|---|
Division by zero | Líneas 7, 9 | CWE-369 | ✅ | ✅ | ✅ |
Undefined or garbage value returned to caller | Líneas 11 | CWE-232 | ✅ | ✅ | ✅ |
unused parameter (argc) | Líneas 15 | CWE-563 | ❌ | ✅ | ❌ |
'atoi' is unsafe | Líneas 17 | CWE-190 | ❌ | ✅ | ❌ |
Out of bounds read | Línea 17 | CWE-129 | ❌ | ❌ | ✅ |
Vulnerabilidades | Código | CWE | Clang | CodeChecker | frama-c |
---|---|---|---|---|---|
garbage value due to array index out of bounds | Línea 5 | CWE-129 | ✅ | ✅ | ⌛ |
Either the condition 'x==10' is redundant or the array 'data[2]' is accessed at index 10, which is out of bounds. | Línea 6 | CWE-129 | ❌ | ✅ | ⌛ |
unused parameter (argc) | Línea 11 | CWE-563 | ❌ | ✅ | ⌛ |
'atoi' used to convert a string to an integer value, but function will not report conversion errors; consider using 'strtol' instead | Línea 13 | CWE-190 | ❌ | ✅ | ⌛ |
Este código tiene una fuga de memoria, pero sólo cuando c es 0.
Vulnerabilidades | Código | CWE | Clang | CodeChecker | frama-c |
---|---|---|---|---|---|
Potential leak of memory | Línea 20 | CWE-401 | ✅ | ✅ | ❌ |
unused parameter | Línea 23 | CWE-563 | ❌ | ✅ | ❌ |
'atoi' used to convert a string to an integer value, but function will not report conversion errors; consider using 'strtol' instead | Línea 25 | CWE-190 | ❌ | ✅ | ❌ |
Array index out of bounds (si argc < 1) | Línea 25 | CWE-129 | ❌ | ❌ | ✅ |
En el programa 4 hay una vulnerabilidad de división por 0, ya que la función foo devuelve siempre 0, por tanto 3 / foo()
es un error de división por 0.
Vulnerabilidades | Código | CWE | Clang | CodeChecker | frama-c |
---|---|---|---|---|---|
Division by zero | Línea 8 | CWE-369 | ❌ | ❌ | ✅ |
Vulnerabilidades | Código | CWE | Clang | CodeChecker | frama-c |
---|---|---|---|---|---|
the value returned by this function should be used | Línea 43, 46,118 | CWE-252 | ❌ | ✅ | ❌ |
'scanf' used to convert a string to an unsigned integer value | Línea 46 | CWE-134 | ❌ | ✅ | ❌ |
narrowing conversion from 'unsigned int' to signed type 'char' is implementation-defined | Línea 74 | CWE-196 | ❌ | ✅ | ❌ |
unused variable | Línea 112 | CWE-563 | ❌ | ✅ | ❌ |
scanf() without field width limits can crash with huge input data. | Línea 118 | CWE-120 | ❌ | ✅ | ❌ |
'atoi' used to convert a string to an integer value | Línea 120 | CWE-190 | ❌ | ✅ | ❌ |
index out of bounds | Línea 73, 121 | CWE-129 | ❌ | ❌ | ✅ |
Uninitialized left value | Línea 57, 58, 70, 73, 74, 87, 92 | cwe-457 | ❌ | ❌ | ✅ |
Se ha observado lo siguiente:
scanf()
devuelve un valor entero, por lo que Codechecker ha detectado una posible vulnerabilidad en la que no se comprueba el valor devuelto por ella.
Vulnerabilidades | Código | CWE | Clang | CodeChecker | frama-c |
---|---|---|---|---|---|
unused variable 'snake_vtable' | Línea 19 | cwe-457 | ❌ | ✅ | ❌ |
the value returned by this function should be used | Línea 26 | CWE-252 | ❌ | ✅ | ❌ |
Array 'cobre.name[6]' accessed at index 16, which is out of bounds. | Línea 28 | CWE-129 | ❌ | ✅ | ✅ |
Uninitialized left value | Línea 28 | cwe-457 | ❌ | ❌ | ✅ |
Se ha observado que Frama-C ha generado un falso positivo, ya que ha detectado un acceso fuera de límites y lo ha considerado también como un valor sin inicializar.
Vulnerabilidades | Código | CWE | Clang | CodeChecker | frama-c |
---|---|---|---|---|---|
format string is not a string literal (potentially insecure) | Línea 11, 18 | CWE-134 | ❌ | ✅ | ✅ |
the value returned by this function should be used | Línea 13 | CWE-252 | ❌ | ✅ | ❌ |
narrowing conversion from 'unsigned long' to signed type 'int' is implementation-defined | Línea 16 | CWE-196 | ❌ | ✅ | ❌ |
Signed overflow | Línea 13 | CWE-190 | ❌ | ❌ | ✅ |
Out of bounds read | Línea 13 | CWE-129 | ❌ | ❌ | ✅ |
En la línea 11 se ha detectado un falso positivo, ya que la cadena a imprimir no ha sido introducida por el usuario:
char msg[] = "Bienvenido!\n";
...
printf(msg);
Por otro lado, en el caso de la línea 18 la vulnerabilidad detectada está presente ya que la cadena buf
es el resultado de concatenar los argumentos introducidos por el terminal.
También, en el caso de la línea 13, como inicialmente argc >= 0
aunque sea de tipo entero con signo, nunca se llegará a desbordar dicha variable ya que el bucle acaba cuando argc = 0
. Como consecuencia de ello, la vulnerabilidad de acceso fuera de límites detectada por Frama-C también es un falso positivo
Vulnerabilidades | Código | CWE | Clang | CodeChecker | frama-c |
---|---|---|---|---|---|
unused variable | Línea 8 | CWE-563 | ❌ | ✅ | ❌ |
the value returned by this function should be used | Líneas 19 y 24 | CWE-252 | ❌ | ✅ | ❌ |
Incorrect type | Línea 12, 13 | CWE-704 | ❌ | ❌ | ✅ |
Uninitialized left value | Línea 12 | cwe-457 | ❌ | ❌ | ✅ |
Vulnerabilidades | Código | CWE | Clang | CodeChecker | frama-c |
---|---|---|---|---|---|
Uninitialized variable: resp | Línea 20 | CWE-665 | ✅ | ✅ | ⌛ |
variable 'resp' is used uninitialized whenever function 'main' is called | Línea 18 y 20 | cwe-457 | ❌ | ✅ | ⌛ |
CodeChecker detecta también el uso de la directiva using namespace std;
como un problema, pero no lo detecta como vulnerabilidad, si no como una mala práctica de estilo.
Vulnerabilidades | Código | CWE | Clang | CodeChecker | frama-c |
---|---|---|---|---|---|
destructor of 'CommandExecutor' is public and non-virtual | Línea 8 | CWE-1087 | ❌ | ✅ | ⌛ |
calling 'system' uses a command processor | Línea 12 | CWE-78 | ❌ | ✅ | ⌛ |
destructor of 'Greeter' is public and non-virtual | Línea 16 | CWE-1087 | ❌ | ✅ | ⌛ |
unused parameter | Línea 27 y 57 | CWE-563 | ❌ | ✅ | ⌛ |
scanf() without field width limits can crash with huge input data. | Línea 35 | CWE-120 | ❌ | ✅ | ⌛ |
the value returned by this function should be used | Linea 35 y 48 | CWE-252 | ❌ | ✅ | ⌛ |
De nuevo, CodeChecker detecta también el uso de la directiva using namespace std;
como un problema, pero no lo detecta como vulnerabilidad, si no como una mala práctica de estilo.
Para la bola extra se ha utilizado una calculadora de números racionales desarrollada en la asignatura de tecnología de la programación. El código de la calculadora se puede encontrar en el siguiente enlace.
compile_commands.json
[
{
"directory": "/home/kali/Desktop/tprog-ej-1",
"command": "clang++ -c foo.cpp -o foo.o",
"file": "Rational.cpp"
},
{
"directory": "/home/kali/Desktop/tprog-ej-1",
"command": "clang++ -c main.cpp -o main.o",
"file": "Calculadora.cpp"
}
]
Se ha utilizado codechecker para analizar el código de la calculadora de números racionales ya que permite la automatización de análisis CTU(Cross Translation Unit).
Para ello se ha utilizado el siguiente comando:
CodeChecker analyze --ctu compile_commands.json -o reports
tree reports
Ahora procedemos a exportar los resultados a formato HTML
CodeChecker parse -e html -o html_out reports
Si preferimos los resultados en linea de comandos:
CodeChecker parse reports
Tras haber completado la practica, podemos concluir que los resultados obtenidos por los diferentes analizadores no son muy similares, es por eso que la combinación de varios suele ser una buena práctica para el desarrollo de software seguro. Sin embargo, cabe destacar que CodeChecker es el único que permite la automatización de análisis CTU(Cross Translation Unit).