lunes, 14 de enero de 2019

Arquitectura tor: Circuitos y Cifrado Onion

Los usuarios que desean usar Tor enrutan su tráfico a través de un proxy onion (OP), el cual maneja transparentemente la creación y cifrado del circuito. El objetivo de Tor es el anonimato. Tor no provee cifrado extremo-a-extremo porque no puede cifrar el paso entre el router de salida y el servidor al que el cliente se está conectando. Para hacer eso requeriría la cooperación de el servidor, lo que significa que Tor no sería un proxy transparente. Tor, por lo tanto, no es un reemplazo para otras tecnologías de cifrado. Sin embargo, Tor usa cifrado por capas internamente, lo cual logra dos efectos. Primero, asegura que cada router onion (OR) conoce sólo a los nodos adyacentes del circuito. Segundo, previene que los atacantes puedan directamente comparar el tráfico en cualquier conjunto de dos puntos del circuito, debido a que el tráfico es cifrado de forma diferente (Por tanto se ve diferente) en cada punto. El proxy onion (OP) hace este cifrado negociando una clave simétrica con cada uno de los routers en el circuito y cifrando cada mensaje con cada llave simétrica, como se describe a continuación.

Células de Tor


TOR se comunica sobre TCP para asegurar la entrega en orden. Toda la comunicación entre proxies y routers TOR se da en un protocolo a nivel de aplicación usando mensajes llamados Tor Cells (células TOR). El protocolo está especificado en el documento principal de las especificaciones de Tor, tor-spec.txt. Hay dos versiones del protocolo. A día de hoy todos los procesos de TOR usan siempre la versión 2 de la especificación, y eso es lo que discutiremos aquí.


Las células TOR son de 512 bytes. El formato es el presentado en la Figura 1.1. El campo Command define el tipo y propósito de la célula. Los valores comunes para Command incluyen:
  • CREATE
  • CREATED
  • RELAY
  • RELAY_EARLY
  • DESTROY
Las células CREATE son usadas para iniciar una conexión entre dos procesos Tor. Son enviadas por los proxies onion para crear el primer tramo en un circuito y también por los routers onion para extender el circuito un tramo. Las células CREATED son la respuesta a un CREATE exitoso. Las células RELAY y RELAY_EARLY son empaquetadores que contiene cada mensaje enviado sobre un circuito establecido. Serán discutidas en detalle en un momento. Las células DESTROY son enviadas a nodos adyacentes para destruir un circuito. El campo PAYLOAD es la parte de la célula que es cifrada.


Las células RELAY tienen una cabecera relay adicional incluida en su payload. El formato del payload de una célula RELAY se ilustra en la Figura 1.2. En el campo Relay command se define el propósito de la célula. Las células con relay command BEGIN, END, y CONNECTED son usadas para levantar y tumbar flujos TCP en un circuito. Con DATA son usadas para enviar datos a través de un flujo TCP. EXTEND y EXTENDED son usadas para construir un nuevo circuito y TRUNCATE y TRUNCATED son usadas para tumbar un circuito. Otros tipos de célula tratan con la comunicación del servidor directorio, DNS lookup, y control de congestión.
Los campos ‘Recognized’ y Digest en la cabecera le permiten a un router determinar si la célula está o no completamente descifrada. Una célula es considerada completamente descifrada si el campo Recognized está en cero y Digest es los primeros cuatro bytes, del digest que está corriendo, de todos los destinados u originados en este tramo del circuito. Si la célula no se considera completamente descifrada es pasada al siguiente tramo del circuito. El campo StreamID es establecido por el OP y le permite tanto al OP como al router de salida distinguir entre múltiples flujos en un circuito. El campo "Length" es el número de bytes del campo "Data" que contienen información real. (La información restante es NUL-padded [revisar http://en.wikipedia.org/wiki/ Padding_(cryptography)#Hash_functions Sección Zero padding]). 
Las células RELAY_EARLY son un tipo especial de célula RELAY usada para creación de circuitos. Los clientes que se comunican con la versión 2 del protocolo de enlace envían células relay de tipo EXTENDED en vez de células RELAY_EARLY. Un OR que recibe más de 8 células RELAY_EARLY cierra el circuito. Esto limita el tamaño máximo de cada circuito, lo cual ayuda a protegerse contra ciertos tipos de ataques, tal como el ataque de spinning packets (paquetes insertados en un router que aumentan tanto el flujo que el router deja de ser un nodo de entrada o salida funcional) de Pappas et al.

Creación de un Circuito


En la Figura 1.3, presentamos un esquema para la creación del circuito. En este diagrama Alice ejecuta un OP y crea el circuito. (Con las claves simétricas , y negociadas durante la creación del circuito.)

Servidores de directorios

Tor no es un servidor completamente distribuido. Un pequeño número de servidores de directorios llevan una lista -llamada documento de censo- de todos los routers en la red. Cada hora los servidores de directorios combinan su información y votan para crear un documento de censo actualizado. Los clientes y routers que corren en la red extraen un censo actualizado de un servidor de directorio una vez cada hora. El documento de censo -junto con los descriptores de routers publicados por cada router- proveen información suficiente para que los clientes se conecten y verifiquen la identidad de los routers en la red.

por
Sam DeFabbia-Kane

No hay comentarios.: