rats, auditando código fuente

rats es una de esas utilidades que no se suelen emplear y que puedan dar muy buenos resultados en poco tiempo a la hora de programar. La verdad es que yo no conocía este tipo de herramientas (debe ser por la falta de costumbre de programar), pero son muy útiles, ya que permiten detectar fallos triviales en el código, de forma automática. Los típicos con las variables no inicializadas, cast's entre tipos de datos diferentes sin límites, etc.
rats tiene soporte para 5 lenguajes de programación, c, perl, ruby, python y php, con una amplia base de datos de fallos comunes, especialmente c, con 334 entradas. La forma de funcionar típica, es indicarle el tipo de lenguaje de programación (sino lo autodetecta) y los ficheros de entrada. También se le puede decir que saque la salida en formato xml o html. Por defecto, los fallos si no se indica nada, los saca desde la consola.
Al termina de analizar, ofrece unos resultados y el tiempo que tardó en procesar todos los ficheros. Los resultados los agrupo por el tipo de vulnerabilidad que tiene (alta, medio o baja), indicando las líneas en las que se encuentra el fallo, así como información de mismo.
Un ejemplo de ejecución puede ser el que sigue, con sus correspondientes resultados.
shell> rats --language c --input *.c --html > salida.html
Y los resultados obtenidos (copiado del formato html),
------------
Entries in perl database: 33
Entries in ruby database: 46
Entries in python database: 62
Entries in c database: 334
Entries in php database: 55

Analyzing checks_agent.c
Analyzing checks_aggregate.c
Analyzing checks_calculated.c
Analyzing checks_db.c
Analyzing checks_external.c
Analyzing checks_internal.c
Analyzing checks_ipmi.c
Analyzing checks_simple.c
Analyzing checks_snmp.c
Analyzing checks_ssh.c
Analyzing checks_telnet.c
Analyzing poller.c

RATS results

Severity: High
Issue: fixed size global buffer
Extra care should be taken to ensure that character arrays that are allocated on the stack are used safely. They are prime targets for buffer overflow attacks.
    File: checks_agent.c
    Lines: 49
    File: checks_aggregate.c
    Lines: 297
    File: checks_calculated.c
    Lines: 311
    File: checks_internal.c
    Lines: 46 47
    File: checks_ipmi.c
    Lines: 772 862
    File: checks_simple.c
    Lines: 28 29 30 31
    File: checks_snmp.c
    Lines: 248 468 838 839 840 841 842 843
    File: checks_ssh.c
    Lines: 86 343
    File: checks_telnet.c
    Lines: 319 394 516
    File: poller.c
    Lines: 347 447
Severity: Medium
Issue: read
Check buffer boundaries if calling this function in a loop and make sure you are not in danger of writing past the allocated space.
    File: checks_telnet.c
    Lines: 72

Inputs detected at the following points

Total lines analyzed: 5449
Total time 0.007437 seconds
732687 lines per second
------------
La verdad es que es una herramienta interesante si el lenguaje de programación está soportado para controlar los tipos de fallos más comúnmente conocidos y poder corregirlos. Sin duda, ayudará a mejorar la seguridad del código final. Por supuesto, al ser código libre, las bases de datos de vulnerabilidades se pueden seguir mejorando, así como emplear otras conocidas y compatibles (opción --database).


3 comentarios :

  1. Muy interesante. He vencido mi escepticismo y lo he probado con un proyecto nuestro. Solo nos ha dado un aviso en la llamada a la función mail():

    "_______: High: mail
    Arguments 1, 2, 4 and 5 of this function may be passed to an external
    program. (Usually sendmail). Under Windows, they will be passed to a
    remote email server. If these values are derived from user input, make
    sure they are properly formatted and contain no unexpected characters or
    extra data.
    "

    Menos mal que en este caso los parámetros no proceden de entradas del usuario. Pero está bien que alguien te recuerde estas cosas!

    ResponderEliminar
  2. Resulta muy útil para casos de variables sin inicializar, cast's, conversión de string's sin límite, etc.
    Siempre se sabe que no se puede hacer, pero que alguien te lo recuerde de forma amable, está bien ;-)

    ResponderEliminar
  3. Todos esos casos que comentas no me los ha señalado, pero no es de extrañar que nuestro código no los tenga :-D

    Pero me parece bastante interesante para cosas como la que comenté, porque a veces te toca usar alguna función third-party (como mail()) y no siempre piensas en todas las implicaciones de seguridad cuando la usas.

    ResponderEliminar

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios