Twitter en Android (1)

Engancharse a Twitter es menos doloroso que quedarse atrapado por Farmville o por el cotilleo barato de Facebook —barato sólo si tu tiempo vale poco, recuerda. Al menos tiene mejor prensa: parece más cosa de guruses del dospuntocerismo. Por eso, puede que la aplicación que más uso en mi teléfono Android sea, precisamente, un cliente de Twitter. Y con el uso viene el perfeccionismo. Porque ¿qué cliente es mejor? He estado un tiempo sin poderme quitar esa pregunta de la cabeza, hasta que me he dado cuenta de que no tiene sentido. El “mejor” depende de lo que estés buscando, de tus requisitos, como decimos los que nos dedicamos profesionalmente a la informática. El problema surgió cuando me di cuenta de que tenía el mismo defecto que mis clientes, es decir, ¡que no sé cuáles son mis requisitos! “Mejor me enseñas lo que puedes hacer y yo ya voy decidiendo.” Estoy seguro de que eso ha salido en alguna tira de Dilbert.

Hay un método que nunca falla —apenas una de cada tres veces, según una estadística que me acabo de inventar. Consiste en hacer una lista con lo que no te gusta de una serie de alternativas. Funciona porque suele estar más claro lo que quieres que lo que no. Así que, después de un tiempo probando los principales clientes de Twitter para Android, aquí están mis resultados. No esperéis una comparativa exhaustiva, porque no tengo ni el tiempo ni las ganas: me limitaré a hacer exactamente lo que he dicho. Una lista de lo que no me gusta de cada cliente, aunque si algo me gusta mucho, también lo anotaré. Para listas interminables de características tenéis a los profesionales del ramo, excelentes chicos. ¡Empezamos!

Twitter for Android

Cliente oficial: esto podría dar confianza, pero también disparar algunas alarmas. Está bien porque Google lo está adoptando como solución de referencia en Android. Está mal porque si algo no te gusta en la filosofía básica del programa, es obvio que así se va a quedar. De momento, mi ROM cocinada (¿no os lo imaginábais?) lleva este cliente a fuego. Puede borrarse, claro, ya lo haré cuando necesite el espacio, gracias. El caso es que es difícil encontrar un programa traducido con más salero: ¿que el texto original en inglés ocupa tantos píxeles? Pues en español lo mismo. Ya os podéis imag la pint qu tien. Por lo menos no le pasa como a Twidroyd (ex-Twidroid), pero se hace molesto.

¿Algún problema más? Claro. ¿Cómo hacer un RT tradicional de Casa Tarradellas? Bueno, o no he descubierto un método mejor, o la única manera es pulsar en Compart (o así) en vez de en Retuitear, seleccionar el propio Twitter for Android y recortar salvajemente el florido texto que sale para enviar un retuit que se acerque algo a los 140 caracteres. Increíble y cansado.

Sí, el programa tiene una virtud. Una muy gorda: es el único que se integra en la gestión de cuentas y sincronización del sistema operativo. Por tanto, si usamos el widget Control de Energía (o Tasker, o Locale) para cancelar las sincronizaciones de correo y ahorrar batería, Twitter for Android también descansa. Que yo sepa, esto no lo hace nadie más. Por favor, decidme que estoy equivocado y me alegraré. Mucho.

Por último: es gratis y tiene un widget muy decentillo, si te gustan blancos, claro. Veredicto: paso.

TweetCaster

Vaya por delante que esta aplicación sorprende. He estado en dos ocasiones a punto de pagar los cinco pavos que cuesta la versión pro, y eso que la única diferencia con la gratuita es que no lleva anuncios. Sin embargo, tiene un defecto bestial que, en el tiempo que lleva en el Market, no han corregido —y por lo que veo no corregirán. Y es que ¡tiene una pantalla de inicio! Ningún problema, pensaréis. Si os digo que puede estar ahí, mostrándoos la mascota de la aplicación —pajarito azul desaliñado con micrófono antiguo— durante un mínimo de cinco largos segundos, muchos ni siquiera torceréis el gesto. Si, además, os cuento que cuenta como “inicio” cada vez que el programa tiene que recargarse en memoria… Ya es otra cosa. Si creéis que no molesta probadlo. En cuestión de características está al nivel de los mejores, y la apariencia gráfica, aunque no es de mi gusto, está muy trabajada.

Además, es el único que se refresca agitando el teléfono. Hay que tener el programa en primer plano para que funcione eso, lo que le quita algo de encanto, pero la idea es buena. En cualquier caso… Fuera.

Twidroyd

¿Por qué cambió de nombre este programa? Seguramente los motorolos habrán registrado cualquier cosa que acabe en -droid para proteger su inversión en la plataforma. En fin. El caso es que Twidroyd, ex-Twidroid, se presenta como el programa que más características tiene. Si las vendieran al peso sería muy, pero que muy caro. La versión gratuita tiene un número de features que se acerca bastante al infinito numerable; la de pago ya es la potencia del continuo. (¡Reíd, es un chiste matemático!)

Sin embargo, falta algo que a mí se me hace imprescindible. No al nivel de las necesidades básicas tipo comer y descomer, claro. Vale, casi imprescindible, entonces. Es imposible decidir si se incluye geolocalización tuit a tuit. El ajuste sólo está disponible globalmente, y eso a una profundidad tal de la estructura de los menús de configuración que no se ve ya la luz del sol. Apuntad también una traducción tremebunda que, en el caso del diálogo para componer un tuit, hace que al menos un botón se salga de la pantalla (mira, eso a Twitter for Android no le pasaba).

Es el único cliente que permite hacer previsualizaciones de las páginas a las que apuntan los enlaces citados en los tuits (esta característica se llama LivePreview, y sólo funciona con el teléfono en orientación apaisada). Soporta plugins ¡además!, pero sólo he visto uno que permite ver los tuits geolocalizados en un mapa; ya podían haber puesto el LivePreview —y otras doscientas cosas más— en un plugin. Sus widgets sólo están disponibles en la versión de pago, así que no he podido disfrutarlos. Por último: no se trata de la aplicación más ágil del mundo si tu teléfono no lleva un chip de dos cores. Veredicto: paso.

¿Un descansito? Pasado mañana seguimos con el resto.

Twitter: XSS para Dummies

No es que se caracterice por su solidez —todos sus usuarios conocemos a nuestra vieja amiga la Twitter Whale—. Pero esta vez alguien (¿@judofyr?) ha estado haciendo unas pruebas contra la rutina que linkifica los mensajes y se ha dado cuenta de que estaba mal escrita. Así, en plan amiguete, todos reconocemos una dirección en la web como algo que empieza por las letras http://, aunque no sepamos muy bien qué es eso. Pues bien: una dirección, o más formalmente un o identificador de recurso universal es algo que tiene un formato muy estricto, descrito en el estándar RFC2396 (Uniform Resource Identifiers: Generic Syntax). Un linkificador añade lo necesario para que http://www.example.com/ se transforme en http://www.example.com/, siguiendo (en teoría, al menos) las reglas del estándar. El proceso de linkificado consiste en tomar el texto entre http: y la última barra —ambos incluidos— y colocarlo dentro de algo así:

<a href="[TEXTO_DEL_ENLACE]">[TEXTO_DEL_ENLACE]</a>

… Sustituyendo donde dice [TEXTO_DEL_ENLACE]. En la rutina usada por Twitter, el problema aparece en algo tan sencillo como el uso de un separador (en este caso, las comillas dobles) dentro de una dirección en un mensaje:

http://x.xx/@"[CÓDIGO_MALICIOSO]/

Cada usuario de Twitter al que le llegue un mensaje que contenga ese texto lo verá en la web como un enlace. El código que genera el linkificador y se sirve a los navegadores tiene esta apariencia:

<a href="http://x.xx/@"[CÓDIGO_MALICIOSO]/">http://x.xx/@"[CÓDIGO_MALICIOSO]/</a>

Aquí se ve claramente un problema. La comilla doble ha sido insertada tal cual en el código HTML de la página, y es interpretada por los navegadores como el final del argumento href de una marca de enlace a. La parte marcada como [CÓDIGO_MALICIOSO] puede contener cualquier texto que quepa dentro del límite de 140 caracteres de Twitter, y si no contiene ningún carácter prohibido en el código , será interpretado y ejecutado por el navegador sin más preguntas. En la primera versión del hack (todavía no era un ataque) se usaba el fallo para inyectar una directriz de estilo :

style="background:#000;color:#000;

El efecto, gracioso, era que el enlace dentro del mensaje aparecía como un rectángulo negro, casi como en un rasca y gana. El siguiente paso, ya más peligroso, fue añadir un atributo onmouseover. El atributo onmouseover ejecuta su valor, una rutina en Javascript, cuando el puntero de ratón pasa por encima del contenido de la marca que lo lleva. Suele usarse, atentando contra el buen gusto, para iniciar animaciones al pasar con el ratón encima de algún elemento activo. Haber logrado inyectar un atributo onmouseover en un enlace servido por Twitter tenía que provocar que algunos engranajes empezaran a girar en ciertas mentes.

El tercer paso consistió en aprovechar que Twitter utiliza, para sus efectos dinámicos en su web, la conocida biblioteca de funciones . Ésta permite a los desarrolladores producir un código muy conciso, abstraído de las diferentes implementaciones de Javascript de los distintos navegadores. La inyección de código escrito con llamadas a JQuery garantiza, a la vez, que la cadena de texto resultante será extremadamente corta (ideal para su difusión en Twitter) y que funcionará en todas las plataformas. A partir de este punto, ya fue sencillo añadir una función que pulsara automáticamente el botón Retwittear, garantizando la propagación inmediata del gusano.

Durante dos horas de media tarde en el huso centroeuropeo han circulado gran cantidad de variantes del virus. Las más peligrosas se dedicaban a inyectar en el código de la página referencias a otros scripts externos, y al menos en teoría se han podido robar contraseñas del servicio o aprovechar otras vulnerabilidades para instalar virus más tradicionales. Una de las más ingeniosas disponía un elemento invisible por encima de todos los demás de la página, ocupando toda su extensión y con un onmouseover que ejecutaba más código. Así, ni siquiera era necesario pasar el ratón sobre los mensajes afectados para que se efectuara la propagación: bastaba con tener un mensaje infectado en el timeline.

Lo que ha ocurrido en Twitter ha sido un ataque de manual. ¿Cómo ha podido llegar a suceder? Observemos el formato de los enlaces maliciosos: contienen una secuencia de un caracter reservado, la arroba @ y un delimitador prohibido, la comilla doble ". Al parecer, el linkificador de Twitter fallaba (al menos) con esa secuencia de caracteres. El estándar RFC2396 antes citado, en su apartado 2.4, especifica qué hacer cuando se procesa una dirección que contiene caracteres potencialmente problemáticos: se codifican mediante secuencias de escape. Dicho de otro modo, cada caracter prohibido o problemático según el apartado 2.4.2 se sustituye por una secuencia especial que está compuesta por un caracter prohibido, el signo de porcentaje % y dos dígitos en hexadecimal. Este proceso permite introducir en una dirección caracteres no permitidos a priori: habréis visto secuencias del tipo http%3A%2F%2F, que es lo que aparece casi siempre que se embebe una dirección dentro de otra (significa http://).

Pero (y ahora viene lo bueno) cualquier lenguaje de programación para la web incluye alguna función para codificar y decodificar cadenas de caracteres de acuerdo con la norma. Os haré una demo en Javascript aquí mismo:

 

Observaréis que si cortáis y pegáis el enlace que lo originó todo, los caracteres problemáticos aparecen codificados. Pero quizá los chicos de Twitter no se conformaron con la función elemental de su lenguaje (), sino que decidieron rehacerla por algún motivo. Hay que repetir la pregunta: ¿cómo ha podido llegar a suceder? Bueno, decía , el creador del famoso lenguaje de ordenador de sólo escritura , que las tres virtudes cardinales de un programador han de ser:

Pereza, impaciencia y soberbia

¿Qué combinación de estos tres maravillosos elementos ha sobrado en Twitter?