lunes, 21 de marzo de 2016

getline y getdelim: alternativas a gets o fgets

Quiero leer archivos de texto linea a linea, desconozco el largo de la linea. Esto es útil tenerlo encapsulado en una función para procesar archivos de log u otros archivos con lineas de largo variable, usuales en sistemas que intercambian información mediante archivos de texto.

La función gets(3), deprecada por largo tiempo, no es una buena opción. Si la linea es mas larga que el buffer, esta función permite leer mas allá del final del buffer que recibe como parámetro. Esto se explotado para romper la seguridad de una computadora, en ataques de desbordamiento de buffers

La función fgets(3), es un remplazo "seguro" de gets. Esta función lee hasta que el buffer se llene o encuentre el fin de linea. Si la linea es más larga que el buffer, va a ser necesario otra lectura. Y no tenemos certeza de saber si la función terminó por llegar al final de la linea o por que se llenó el buffer.

Buscando mejores alternativas encontré las funciones de biblioteca getline(3) y getdelim(3). Originalmente ambas funciones eran extensiones del proyecto GNU a la glibc. Fueron integradas al standard POSIX a partir de la revisión POSIX.1-2008. Reciben como parámetros un puntero a un buffer, puntero al tamaño inicial del mismo y un puntero FILE al archivo que se quiere leer. Adicionalmente getdelim recibe un carácter que se utilizará como fin de lectura (en vez de '\n'). Si el buffer no resulta suficiente para completar la lectura, la función lo agranda llamando a realloc(3), actualizando el valor del tamaño del mismo.

Estas funciones son una buena opción para leer archivos con lineas de largo variable o desconocido. Incluso, con algo de cuidado, se pueden leer archivos creados en otros sistemas operativos (Windows/MS-DOS). En la manpage hay un ejemplo de uso.

sábado, 19 de marzo de 2016

Punteros a Cadenas en C

Estoy escribiendo una biblioteca en C para levantar archivos de texto. Mirando la documentación de getline(3) me entraron dudas sobre punteros. He trabajado poco en C, buen momento para repasar.

Esta discusión me refresco las diferencias entre char * y char**. Esta pagina es bastante didáctica, con muchos ejemplos. Y esta discusión cubre Arrays de cadenas.

viernes, 11 de marzo de 2016

Backdoor SSH en Fortigate 4.x hasta 5.0.7

Juniper tenia (¿tiene?) una puerta trasera (backdoor) en sus firewalls, conocida hace años. A esto se sumó que de acuerdo a la propia Juniper, estarían utilizando el algoritmo de encriptación DUAL_EC_DBRG. Este algoritmo tendría debilidades explotables por sus creadores. Le llegó el turno a equipos fortigate, con una vulnerabilidad explotable en aquellos equipos que tienen habilitada la administración via SSH.

A fines de Enero, un colega me pasó un mensaje de una lista. Allí hay un script en Python para explotar esta vulnerabilidad. Lo bajé y lo corrí, previa instalación de algunos paquetes extra de Python. Una vez que habilité el acceso (temporalmente) vía SSH a un equipo fortigate, entré sin necesidad de contraseña.  Fortinet publicó una recomendación y una entrada en el blog. Se recomienda actualizar los productos de acuerdo a las directivas de Fortinet a versiones que no presenten esta vulnerabilidad o deshabilitar el acceso vía SSH a los dispositivos afectados.