22 de octubre de 2009

Secure Survey

En los últimos días me vino a la cabeza un interrogante sobre las numerosas encuestas que circulan por Internet, ¿cuan fiables son estas encuestas? Siempre acabo dando con la misma respuesta, “depende”. Pero nunca le había dado un par de vueltas, nunca hasta hoy. De todas formas parece que soy el único que se hace este tipo de preguntas (será el trabajo, que se yo), por que la práctica totalidad de medios de televisión y prensa del mundo despliegan estas encuestas incorporándolas a la versión escrita de sus periódicos, programas de radio y televisión. Esto puede ser un gran problema de credibilidad ya que aparecen al lado de otras en teoría “más fiables” como las que realiza el CIS dando lugar a la errónea suposición de que ambas tienen resultados con la misma confianza (cualquiera que sea esta).

Tras un pequeño vistazo a algunos medios digitales he podido encontrarme las siguientes cosas, corresponden al código con que se realizan las peticiones y se almacenan los votos:

onsubmit="javascript:{if ( hasCookie('haVotado') ) {alert('Tu voto ya ha sido registrado'); return false;} 
else {return true};}"
En este caso si el método ‘has cookie’ devuelve “true” votas, sino no. Delega el voto en un control sobre la cookie. En este otro caso:
OAS_version = 10;

OAS_rn = '001234567890'; OAS_rns = '1234567890';
OAS_rn = new String (Math.random()); OAS_rns = OAS_rn.substring (2, 11);
function OAS_NORMAL(pos) {
document.write('
 '!' + pos + OAS_query + '" TARGET=_top>'); 

Se hace la petición al servidor de aplicaciones (OAS = Oracle Application Server) a partir de una cadena que se almacena en la Cookie, en la misma se “ofusca” incrustando un valor aleatorio de semilla conocida a la petición. La construcción de esa cadena es perfectamente visible en el código javascript, luego todo es pasado en el GET y algunos atributos quedan ocultos en el POST que lee los valores de la Cookie:

Luego parece que esta encuesta también es manipulable, conociendo el mecanismo que genera las peticiones y con un http Fuzzer (como el que incorpora Acunetix) podemos generar votos automáticamente.

Indagando un poco más he encontrado encuestas que incluían CAPTCHA, pero este mecanismo tampoco es infalible como vimos aquí, luego, ¿Qué nos queda? Incluso para dar un servicio de apariencia tan sencilla como este es necesario un conjunto de medidas de seguridad donde por sí sola ninguna nos puede proporcionar confianza de que el voto no ha sido manipulado / generado automáticamente, no obstante en conjunto el riesgo se “mitiga”. Algunas de las que a mí se me ocurren son:

- No incluir en código JavaScript los métodos de comprobación de origen, es visible.

- No verificar el origen a partir de información depositada en el cliente, esta información puede ser manipulada.

- Incluir CAPTCHA.

- Incluir un mecanismo para verificar el origen por token (secreto) + IP + credenciales que identifiquen al equipo, para garantizar la integridad del origen de la petición (podemos utilizar hash también). Estas comprobaciones se harán en el servidor.

Bueno, en un entorno ideal se podría utilizar incluso la firma digital de los usuarios (¿DNI electrónico?) para realizar una encuesta. Claro está que para saber que opina la gente con respecto al partidazo del Atleti no aplica, pero para un referendum,,, quizás si.

Esto es todo por hoy, cuidado donde votáis y cual es el origen de vuestras encuestas :)

Salu2!

0 comentarios: