Table Of ContentUniversidad Carlos III de Madrid
Escuela Politécnica Superior
Departamento de Informática, Área de Arquitectura de Computadores (ARCOS)
PROYECTO FINAL DE CARRERA DE INGENIERÍA TÉCNICA INFORMÁTICA DE
GESTIÓN
fsniff: Análisis, diseño e implementación de
una suite software para captura y análisis de
E/S
Autor:
Javier López Gómez
Tutores:
Alejandro Calderón Mateos
Javier Fernández Muñoz
15 de octubre de 2015
ii
“A la vista de suficientes ojos, todos los errores resultan evidentes.”
—The Cathedral and the Bazaar, Eric S. Raymond (ley de Linus)
iii
iv
Índice general
Resumen xiii
Abstract xv
Agradecimientos xvii
1. Introducción 1
1.1. Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Problemática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4. Estructura del documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Estado de la cuestión 5
2.1. LTTng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1. Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2. Systemtap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.1. Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3. strace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3.1. Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4. Comparativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3. Análisis y diseño 9
3.1. Descripción del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.1. Características del usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.2. Entorno operacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2. Requisitos de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.1. Requisitos de capacidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.2. Requisitos de restricción . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3. Casos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4. Requisitos de software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4.1. Requisitos funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.4.2. Requisitos no funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.5. Arquitectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.5.1. Componentes incluidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.5.2. Componentes de terceros . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.6. Matrices de trazabilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.6.1. Trazabilidad SR-UR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
v
3.6.2. Trazabilidad SR-Componentes . . . . . . . . . . . . . . . . . . . . . . . . 50
4. Implementación 55
4.1. libfsni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.1.1. Cabeceras de mensaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.1.2. Orden de bytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.1.3. Seguridad en hilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.2. filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.3. fsni-src-fuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.3.1. Capa mirror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3.2. Capa log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3.3. Cuestiones de seguridad . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.4. fsni-src-pt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.4.1. Manteniendo el estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.4.2. Alternativa: LD_PRELOAD . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.5. fsni-src-klinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.5.1. Vista general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.5.2. Parcheo de llamadas a sistema . . . . . . . . . . . . . . . . . . . . . . . . 64
4.5.3. Diseño del módulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.6. fsni-sink-gui . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.6.1. Captura desde fsni-sink-gui . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.7. fsni-sink-gs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5. Pruebas y evaluación 69
5.1. Pruebas de verificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.1.1. Entorno de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.1.2. Criterio de aceptación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.1.3. Especificación de casos de prueba . . . . . . . . . . . . . . . . . . . . . . . 70
5.2. Evaluación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
6. Planificación 79
6.1. Tareas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6.2. Planificación temporal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7. Presupuesto 83
7.1. Desglose de tareas del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.2. Gasto en personal imputable al proyecto . . . . . . . . . . . . . . . . . . . . . . . 83
7.3. Recursos materiales empleados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.4. Amortizaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.5. Gastos indirectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.6. Resumen del presupuesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
8. Trabajos futuros 87
9. Conclusiones 89
9.1. Producto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.2. Proceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.3. Personales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
vi
9.4. Código abierto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
A. Referencia de libfsni 93
A.1. libfsni/libfsni.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
A.1.1. fsni_get_msghdr_src . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
A.1.2. fsni_get_msg_any . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
A.2. libfsni/libfsni_write.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
A.2.1. fsni_msghdr_init_group . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
A.2.2. fsni_msghdr_init. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
A.2.3. fsni_set_msg_any . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
A.2.4. fsni_set_msg_any_err . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
A.2.5. fsni_msghdr_setpayload_fn . . . . . . . . . . . . . . . . . . . . . . . . . 94
A.2.6. fsni_msghdr_setpayload. . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
A.2.7. fsni_write_msghdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
A.3. Funciones de bajo nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
A.4. libfsni/libfsni_read.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
A.4.1. fsni_open_channel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
A.4.2. fsni_read_hdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
A.4.3. fsni_read_msghdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
A.5. Referencia de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
B. Manual de usuario 101
B.1. Captura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
B.1.1. Captura desde consola . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
B.1.2. Captura desde GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
B.2. Volcar un log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
B.2.1. Volcar un log desde consola . . . . . . . . . . . . . . . . . . . . . . . . . . 103
B.2.2. Volcar un log desde GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
B.3. Manejo de streams de un log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
B.4. Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
B.4.1. Generar un grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
B.4.2. Grafo en tiempo real con Gephi . . . . . . . . . . . . . . . . . . . . . . . . 108
C. Manual de instalación 109
C.1. Dependencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
C.2. Compilación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
C.2.1. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
C.3. Administración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
C.3.1. Carga del módulo de kernel durante el arranque . . . . . . . . . . . . . . 110
C.3.2. Parámetros del módulo de kernel . . . . . . . . . . . . . . . . . . . . . . . 111
C.4. Cancelar traza de un usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
D. Código destacado 113
D.1. Organización del código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
D.2. include/src-klinux/rb_voidp.h. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
D.3. src/src-klinux/rb_voidp.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
D.4. include/src-klinux/tcache.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
D.5. src/src-klinux/tcache.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
vii
D.6. include/src-klinux/mcast.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
D.7. src/src-klinux/mcast.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
D.8. include/src-klinux/koh_mgmt.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
D.9. src/src-klinux/koh_mgmt.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
D.10.include/src-klinux/uapi_ioctl.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
D.11.include/src-klinux/param.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
D.12.include/src-klinux/chrdev.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
D.13.src/src-klinux/chrdev.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
D.14.include/src-klinux/sc_hook.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
D.15.include/src-klinux/sc_hook_x86_32.h . . . . . . . . . . . . . . . . . . . . . . . . 134
D.16.include/src-klinux/sc_hook_x86_64.h . . . . . . . . . . . . . . . . . . . . . . . . 134
D.17.include/src-klinux/hooks.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
D.18.src/src-klinux/hooks.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
E. Glosario 143
Licencias 145
E.1. The GNU General Public License . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
E.2. GNU Free Documentation License . . . . . . . . . . . . . . . . . . . . . . . . . . 151
viii
Índice de figuras
1.1. Wireshark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
3.1. Plantilla de requisitos de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2. Diagrama UML de casos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3. Plantilla de casos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4. Plantilla de requisitos software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.5. Plantilla de componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6. Arquitectura de capas del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1. Rol de libfsni en el proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.2. Llamadas a libfsni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.3. Espacio circular de 32-bit de seq . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.4. Orden de llamadas en fsni-src-fuse . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.5. Camino de una ejecución de fsni-src-fuse . . . . . . . . . . . . . . . . . . . . . . . 59
4.6. Camino de una ejecución de fsni-src-pt . . . . . . . . . . . . . . . . . . . . . . . . 61
4.7. Tabla de descriptores de fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.8. pt_syscall_fdvma::munmap() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.9. Lista de grupos multicast activos (__mcast_list) . . . . . . . . . . . . . . . . . . 65
4.10.Buffer circular usado en fsni-src-klinux . . . . . . . . . . . . . . . . . . . . . . . . 65
4.11.Camino de ejecución para fsni-src-klinux . . . . . . . . . . . . . . . . . . . . . . . 66
4.12.GTK+/X11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.13.fsni-sink-gui durante una captura . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.14.Conectando a Gephi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.1. Plantilla de casos de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.2. Comparación de tiempos de ejecución . . . . . . . . . . . . . . . . . . . . . . . . 78
6.1. Diagrama Gantt del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
B.1. Uso de fsni-src-pt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
B.2. Ejemplo de captura desde consola . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
B.3. Captura nueva en fsni-sink-gui . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
B.4. Captura corriendo en fsni-sink-gui . . . . . . . . . . . . . . . . . . . . . . . . . . 105
B.5. Salida de fsni-sink-dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
B.6. Lista de ficheros accedidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
B.7. Extraer un stream con fsni-sink-streams . . . . . . . . . . . . . . . . . . . . . . . 106
B.8. Imágen generada con fsni-sink-graph + Gephi . . . . . . . . . . . . . . . . . . . . 107
C.1. Lista de tareas de la instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
ix
x
Description:0 access("/etc/ld.so.nohwcap", F_OK). = -1 ENOENT (No such file or directory) open("/usr/lib/arm-linux-gnueabihf/libtasn1.so.3", O_RDONLY). = 15 fstat64(15 .. RE-UR-14. Descripción: Ningún SRC debe comprometer la seguridad de los procesos de otros usuarios. Necesidad: Esencial. Prioridad: Alta.