Implementación de Open SSL en PalmOS

Anuncio
1
Implementación de Open SSL en PalmOS
Roberto Gómez, Member, IEEE1
[email protected]
Abstract-- El papel que están jugando los dispositivos PDAs en
las empresas completamente conectadas esta creciendo. De la
misma forma los requerimientos de las aplicaciones que corren en
estos dispositivos son cada vez más complejos y uno de los factores
más solicitados es el de seguridad. Uno de los principales
requerimientos de seguridad es el de confidencialidad, y uno de
los protocolos más usados es SSL. El presente trabajo presenta
una implementación de SSL en dichos dispositivos.
Index Terms-- Seguridad, PalmOS, SSL
I.
INTRODUCCIÓN
En el ámbito de la vida diaria los humanos, la comunicación
es la herramienta esencial para desarrollar todas las tareas que
realizamos cuando estas deben hacerse en paquetes, la
comunicación es la base para la subsistencia en nuestros
tiempos, ya que la mayoría de las acciones que hacemos todos
los días requieren de la interacción con nuestros semejantes.
Esta comunicación puede tener información relevante o
importante, que se necesita que sea conocida sólo por un grupo
de personas, y la única manera de comunicarse es cuando se
usa un canal no seguro. Para lograr la seguridad que deseamos
en la comunicación, debemos recurrir a la criptología y otras
mecanismos de seguridad.
En la actualidad contamos con medios de comunicación
mucho más sofisticados como lo son las redes de
computadoras, las cuales por medio de cables o antenas hacen
posible la comunicación a distancia. Con ellas podemos contar
con comunicación con otra entidad a distancias enormes, se
puede contactar a una persona o máquina aunque se encuentre
del otro lado del hemisferio en tan sólo segundos, con la ayuda
de la tecnología actual como lo es la Internet.
De la misma forma que la tecnología avanza, también se
incrementa el número de individuos sin escrúpulos que desean
aprovechar la tecnología con fines propios, usan los avances
para realizar actos dañinos e incluso criminales a otras
personas, por lo que se deben implantar esquemas de
seguridad a niveles en los que un atacante experto tenga
dificultad y le sea menos posible romper estos esquemas.
ROC&C’2004 – CP-17 PONENCIA RECOMENDADA
POR EL CAPÍTULO DE COMPUTACIÓN
DEL IEEE SECCIÓN MÉXICO Y
PRESENTADA EN LA REUNIÓN DE OTOÑO, ROC&C’2004,
ACAPULCO, GRO., DEL 23 AL 28 DE NOVIEMBRE DE 2004.
Este trabajo se llevo a cabo con el apoyo de la Cátedra de la Seguridad en
Redes.
Claro que realizar estos esquemas requiere de un gran
esfuerzo. Por eso, se deben implementar esquemas que no sólo
sean seguros, sino que sean posibles, es decir que la mayoría
de las personas puedan implementar y aprender, pero que no
puedan romper.
De los principales requerimientos que buscan los usuarios
en materia de seguridad es el confidencialidad y autenticidad.
Un usuario debe confiar en que el sitio del que esta
descargando información no es el sitio original y que la
información extraída de este sitio solo la conoce él.
El protocolo más usado en las transacciones vía web es
SSL. Este protocolo proporciona confidencialidad,
autenticidad e integridad de la información que circula por el.
Muchas servicios proporcionados a través de páginas Web
proporcionan la opción del uso de este protocolo y para otros
es obligatorio. Lo anterior nos lleva a la necesidad de que los
clientes de dichos servicios cuenten con la versión cliente de
este protocolo. El objetivo de este trabajo es proporcionar una
implementación del lado cliente de este protocolo.
El trabajo esta dividido de la siguiente forma: En la sección
dos se explica las características principales del protocolo
SSL. La sección tres abarca todo lo relacionado con desarrollo
de aplicaciones en PDAs. Los puntos importantes de la
implementación se toca en la sección cuatro y por último se
dan a conocer las conclusiones y trabajo a futuro.
II. EL PROTOCOLO SSL (SECURE SOCKET LAYER)
SSL es el protocolo de comunicación segura más conocido
y usado actualmente, SSL actúa en la capa de comunicación y
es como un túnel que protege todas la información enviada y
recibida. SSL es usado en gran cantidad de aplicaciones que
requieren proteger la comunicación, siendo más usado para
transacción a través del Web.
SSL
proporciona
confidencialidad,
integridad
y
autenticidad. La confidencialidad se da a través del uso de
algoritmos de encripción, garantizando que los datos enviados
y recibidos no podrán ser interpretados por ninguna otra
persona que no sea ni el emisor ni el receptor. La integridad
garantiza que los datos recibidos son exactamente iguales a los
datos enviados, pero no se impide que al receptor la
posibilidad de modificar estos datos una vez recibidos. Por
último la autentificación garantiza que el cliente esta
accediendo al sitio que en realidad desea, se usa un Certificado
Digital emitido por una empresa llamada Autoridad
Certificadora, este documento es totalmente infalsificable y
garantiza que el servidor es quien dice ser.
SSL v1 nunca se ha utilizado públicamente, pero Netscape
2
introdujo SSL v2 con la versión 1 de Netscape Navigator. SSL
v3 representa el estándar SSL más actual en uso (ver [1]). El
protocolo Transport Layer Security (TLS), desarrollado por el
IETF amplía el protocolo v3 de SSL con mejoras en lo que se
refiere a los aspectos de autenticación del algoritmo SSL ([2]).
El proctocolo Wireless Transport Layer Security, como su
nombre indica, constituye una versión de TLS utilizada en las
comunicaciones sin cable.
El comportamiento de SSL v3 sigue los pasos que se
describirá a continuación. Antes de que se establezca SSL, se
debe hacer una solicitud. Típicamente esto implica un cliente
haciéndo una solicitud de un URL a un servidor que soporte
SSL. SSL acepta solicitudes por un puerto diferente al
utilizado normalmente para ese servicio.
Una vez se ha hecho la solicitud, el cliente y el servidor
empiezan a negociar la conexión SSL, es decir, hacen el SSL
Handshake.
Durante el hanshake se cumplen varios
propósitos. Se hace autenticación del servidor y opcionalmente
del cliente, se determina que algoritmos de criptografía serán
utilizados y se genera una llave secreta para ser utilizada
durante el intercambio de mensajes subsiguientes durante la
comunicación SSL.
Los pasos que se siguen se pueden resumir en, client hello,
(saludo del cliente), server hello, aprobación del cliente y
verificación (ver figura 1).
cliente
servidor
client-hello
server-hello
aprobación
verificación
transmisión segura
Fig. 1. Protocolo SSL
El client hello tiene por objetivo informar al servidor que
algoritmos de criptografía puede utilizar y solicita una
verificación de la identidad del servidor. El cliente envía el
conjunto de algoritmos de criptografía y compresión que
soporta y un número aleatorio. El propósito del número
aleatorio es para que en caso de que el servidor no posea un
certificado para comprobar su identidad, aún se pueda
establecer una comunicación segura utilizando un conjunto
distinto de algoritmos. Dentro de los protocolos de criptografía
hay un protocolo de intercambio de llave que define como
cliente y servidor van a intercambiar la información, los
algoritmos de llave secreta que definen que métodos pueden
utilizar y un algoritmo de hash de una sola vía. Hasta ahora no
se ha intercambiado información secreta, solo una lista de
opciones.
Durante el server hello, el servidor responde enviando un
certificado digital el cual incluye su llave pública, el conjunto
de algoritmos criptográficos y de compresión y otro número
aleatorio. La decisión de que algorítmos serán utilizados está
basada en el más fuerte que tanto cliente como servidor
soporten. En algunas situaciones el servidor también puede
solicitar al cliente que se identifique solicitando un
identificador digital.
En la aprobación del cliente, el cliente verifica la validez
del certificado enviado por el servidor. Esto se lleva a cabo
desencriptando el certificado utilizando la llave pública del
emisor y determinando si este proviene de una entidad
certificadora de confianza. Después se hace una serie de
verificaciones sobre el certificado, tales como fecha, URL del
servidor, etc. Una vez se ha verificado la autenticidad de la
identidad del servidor. El cliente genera una llave aleatoria y la
encripta utilizando la llave pública del servidor y el algorítmo
criptográfico y de compresión seleccionado anteriormente.
Esta llave se le envía al servidor y en caso de que el handshake
tenga éxito será utilizada en el envío de futuros mensajes
durante la sesión.
En la verificación ambas partes conocen la llave secreta, el
cliente por que la generó y el servidor por que le fué enviada
utilizando su llave pública, siendo la única forma posible de
desencriptarla utilizando la llave privada del servidor. Se hace
una última verificación para comprobar si la información
transmitida hasta el momento no ha sido alterada. Ambas
partes se envían una copia de las anteriores transacciones
encriptada con la llave secreta. Si ambas partes confirman la
validez de las transacciones, el handshake se completa, de otra
forma se reinicia el proceso.
Ahora ambas partes están listas para intercambiar
información de manera segura utilizando la llave secreta
acordada y los algoritmos criptográficos y de compresión. El
handshake se realiza solo una vez y se utiliza una llave secreta
por sesión.
Una vez que se ha establecido un canal de transmisión
seguro SSL, es posible el intercambio de datos. Cuando el
servidor o el cliente desea enviar un mensaje al otro, se genera
un digest (utilizando un algoritmo de hash de una vía acordado
durante el handshake), encriptan el mensaje y el digest y se
envía, cada mensaje es verificado utilizando el digest.
Cuando el cliente deja una sesión SSL, generalmente la
aplicación presenta un mensaje advirtiendo que la
comunicación no es segura y confirma que el cliente
efectiva,mente desea abandonar la sesión SSL.
III.
PROGRAMACIÓN DE APLICACIONES EN SISTEMAS PALMOS
Es posible crear aplicaciones para dispositivo Palm usando
como plataforma de desarrollo los sistemas operativos
Windows, Mac OS, UNIX e, incluso, el propio Palm OS. Se
cuenta con la misma flexibilidad para podemos elegir el
lenguaje, desde C y C++ hasta BASIC en diferentes versiones,
pasando por Java y lenguajes menos habituales como Forth.
3
Para desarrollar cualquier aplicación en Palm OS se
necesitan varios recursos, como el Software Development Kit,
el ambiente de compilación, el generador de los recursos y
otras herramientas más, todas estas herramientas están
disponibles en Internet [3] y toda la documentación puede
encontrarse en [4]. El SDK está disponible para Windows,
Mac OS y Linux. Es decir, se puede usar cualquiera de estos
sistemas operativos como una plataforma anfitrión para el
desarrollo de aplicaciones que, posteriormente, se transferirían
y ejecutarían sobre Palm OS. Existen versiones específicas del
paquete de desarrollo para ciertas herramientas, como
CodeWarrior y PRC-Tools
Las aplicaciones desarrolladas en Palm OS estan basadas en
eventos, es decir en lo que pase en la Palm,. Los eventos son
de diferentes tipos como entrada al usuarios, notificación del
sistema, etc, por lo que se tiene que tener un control de estos y
contar con un “plan de acción” para cada uno de ellos. Se debe
tomar en cuenta todos los eventos que pueden ocurrir, por
ejemplo, puede ser que en medio de una comunicación el
usuario apriete el botón de apagado en la Palm, por lo que el
sistema se suspenderá más no se apagará, por eso es necesario
conocer como resguardar el estado de la Palm ( ver [6,7] ), o
incluso destruir toda la información.
El sistema de archivos se encuentra muy limitado, ya que se
debe limitar a usarse solo cuando el almacenaje de la
información sea mayor a 64 kbs, si no deben usarse las
implementaciones de base de datos o internas o directamente
los “chunks” en memoria.
Aunque el sistema soporta multi-hilos y procesos, el uso
interactua con un programa a la vez.
Las aplicaciones ejecutables para Palm OS se alojan en
archivos con extensión PRC. Estos archivos pueden ser
completamente autónomos o bien necesitar de alguna librería o
módulo de apoyo para su funcionamiento. Todo el proceso de
desarrollo y depuración suele efectuarse mediante un
emulador, instalando la aplicación en el dispositivo real al
final. Además de aplicaciones propiamente dichas, es posible
desarrollar conductos (conduits) para facilitar la conversión de
formatos y sincronización entre un Palm y otra plataforma,
como pueda ser Windows o Mac OS.
Se deben tomar en cuenta tres prioridades en la
programación de Palm: el espacio en el heap, la velocidad, y el
tamaño del código. Hay que considerar el tamaño de la
variables a utilizar; si es posible, manejar apuntadores y
cerrarlos, o manejar “chucks” de memoria en sus diferentes
tipos y después liberarlos.
Cada aplicación cuenta con una función PilotMan() que es
equivalente al main de los programas en C. Para lanzar una
aplicación, el sistema manda llamar PilotMain() y le envia un
código de lanzamiento. Este código especifica si la aplicación
se activará y desplegará una interfaz de usuario, o si
simplemente realizará una tarea sin desplegar nada.
En Palm OS no se pueden usar las mismas librerías que en
ANSI C, aunque en la mayoría de los casos se pueden realizar
las mismas funciones usando llamada al API de Plam OS; con
esto se supone una inversión grande de tiempo en aprender un
nuevo API o en buscar la función correcta.
IV. IMPLEMENTACIÓN SSL EN PALMOS
La implementación se desarrollo en lenguaje C y se uso el
API de Palm Os para llamar a las funciones correctamente.
Lo primero que se hizo fue la definición de todos los tipos,
así como la de todas las estructuras a usar. Estas se encuentras
especificadas en [1]. Por ejemplo para definir la estructura
ClientHello se procede de la siguiente forma:
Struct {
ProtocolVersion client_versión;
Random random;
...
} ClientHello
Como se puede apreciar, las estructuras son declaradas
exactamente igual que como se haría en C, sólo hay que cuidar
que los tipos correspondan a los deseados.
Para la conexión al servidor seguro se usaron las funciones
definidas dentro de las bibliotecas de sockets de Unix. A
manera de ejemplo en la figura 2, se encuentra el código del
envío del primer mensaje del protocolo.
Static Uint32 make connection(Char *service, Uint32 type,
Char *netaddress)
{
/* convertir servicio de string a numero */
UInt32 port = -1;
struct in_addr *addr;
UInt32 sock, connected;
struct sockaddr_in address;
if (type == SOCK_STREAM) port = atoport(service,
“tcp”);
if (type == SOCK_DGRAM) port = atoport(service,
“udp”);
if (port == -1) {
(*gErrorFunc)(“make_connection: Invalid socket type.
\n”,NULL);
return –1;
}
if (addr == NULL) {
(*gErrorFunc)(“make_connection: Invalid network
address. \n”,NULL);
return –1;
}
MemSet((Char *)&address, 0, sizeof(address));
address.sin_family= AF_INET;
address.sin_port= (port);
address.sin_addr.s_addr = addr->s_addr;
sock = socket(AF_INET, type, 0);
if (type = SCOK_STREAM) {
4
connected = connect(sock, (struct sockaddr *) & address,
sizeof(address));
if (connected < 0 ) ) {
(*gErrorFunc)(“connect \n”,NULL);
return –1;
}
return sock;
}
if ( bind( sock, (struct sockaddr *) & address, sizeof(address))
<0){
(*gErrorFunc)(“bind \n”,NULL);
return –1;
}
return sock;
UInt32 fd;
struct ClientHello hello protocol; // hacemos referencia a la
estructura
helloProtocol.client_versión = {0x01, 0x02, 0x03, ... } ; //
suponemos que alguna función lo llena
fd=make
if (write(fd, helloProtocol, sizeof(struct ClientHello)) > 0)
exito = true;
else
exito = false;
Fig. 2. Código envío primer mensaje
Como podemos ver, la implementación de la comunicación
en redes es muy parecida a la que se usa en Unix, por lo que
no represento una gran dificultad el armar el resto del
protocolo. Se uso el API de PalmOS para llamar a las
funciones correctamente, con lo que optimiza la aplicación. A
notar que, a excepción de la llamada a las librerías de Red, las
demás funciones si realizan la llamada correspondiente, por
ejemplo, memset que fija rangos de memoria en el heap
dinámico se llama en su manera correcta MemSet (como se
puede ver, la sintaxis es sensible a mayúsculas/minúsculas).
En lo que respecta a los algoritmos de cifrado se prefirió
usar las funciones de implementación definidad en GNU [8].
En [9] se presenta un análisis del desempeño de las funciones
de cifrado proporcionadas por Palm OS. Se tuvó que adaptar
el código para poder ser implementado en la Palm. La
biblioteca de encripción es una adaptación de BlowFish, hecha
por Eric. A. Young.
Se tuvo que tomar en cuenta que cuando se pasa un
apuntador a una función y luego se desea hacer copias de él en
otra función, se recurre a la memoria baja (en donde esta l
vector de interrupciones, vital para la Palm), el código con el
que se provoca el error es el siguiente:
char * texto;
Texto = FldGetTextPtr(campotexto);
Funcion Errónea(texto);
static void funcionErronea (Char *texto) {
Char *error;
StrCopy(error, texto);
}
La solución es no acceder a esta memoria, en lugar de
manipular estos apuntadores directamente creamos nuevos
“chunks” de memoria y ahí los manipulamos. El código
corregido es el siguiente:
La solución es no acceder a esta memoria, en lugar de
manipular estos apuntadores directamente creamos nuevos
“chunks” de memoria y ahí los manipulamos. El código
corregido es el siguiente:
char * texto;
Texto = FldGetTextPtr(campotexto);
Funcion Errónea(texto);
static void funcionerronea (Char *texto) {
MemHandle sinError = new MemHandle(32);
StrCopy(MemHandleLock(sinError), texto);
MemHandleUnlock(sinError);
MemHandleFree(sinError); // liberar el chunk usado
}
V. CONCLUSIONES
Se presentó una implementación del protocolo SSL para
ambientes Palm OS. A pesar de que ya existen algunas
aplicaciones que ofrecen este servicio, este es un primer paso
para la implementación de otros tipos de protocolos que
permitan la comunicación entre una Palm y un servidor.
El dearrollo de una aplicación basada en socketes es muy
similar a la usada en cualquier máquina de ambiente Unix. Lo
anterior facilitó la implementación. Sin embargo la no
compatibilidad al 100% de los tipos de variables complicó el
uso de funciones criptográficas disponibles.
El siguiente reto es poder implementar un emulador de SSH
para poder ejecutar ciertos comandos básicos desde una Palm
en un servidor tipo Unix.
REFERENCIAS
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
SSL protocol versión 3.0, Internet dratf 302, 1996
The TLS Protocol Versiob 1.0 RFC 2246, 1999
http://www.palmos.com/dev/tech/
http://www.palmoscom/dev/tech/docs
Desarrollos para Palm. Francisco Charte, Informática móvil (VI),
Pcworld, No. 175. pp. 236
Palmist: a tool to log Palm system activity, Gannamaraju, R.; Chandra,
S.; Workload Characterization,
2001. WWC-4. 2001 IEEE
International Workshop on , 2 Dec. 2001 pp.111 – 119
A checkpointing tool for Palm operating system Chi-Yi Lin; Sy-Yen
Kuo; Yennun Huang; Dependable Systems and Networks, 2001.
Proeedings. The International Conference on , 1-4 July 2001 pp:71 – 76
http://www.gnu.org
The performance measurement of cryptographic primitives on palm
devices Wong, D.S.; Fuentes, H.H.; Chan, A.H.; Computer Security
5
Applications Conference, 2001. ACSAC 2001. Proceedings 17th
Annual , 10-14 Dec. 2001 pp 92 - 101
Gomez Roberto (M’96) En 1987 recibe el título de Ingeniero en Sistemas
Electrónicos por el ITESM-CEM, Maestría en Ciencias Computacionales por
el ITESM-CEM en 1990. La Universidad Paris 8 le otorga el doctorado por su
trabajo desarrollado en el laboratorio INRIS. Es profesor investigador del
departamento de ciencias computacionales del ITESM-CEM desde 1995. Sus
áreas de interés son la seguridad informática, los sistemas distribuidos y la
criptología.
Descargar