domingo, 13 de noviembre de 2016

Voto encadenado

El voto encadenado es un viejo y eficaz método de fraude de baja incidencia. No es que me preocupe mucho, pero se usa como argumento a favor del voto electrónico/boleta electrónica diciendo que estos lo evitan. Como ya he dicho [1], no pienso que los argumentos técnicos sean los más importantes en el método de elección.


Sin embargo, por una perversión que los que ordenan sus libros por colores o formas o no pisan las rayas de las baldosas pueden perfectamente comprender, pudiendo atar este cabo suelto, lo intentaré. Esto va dentro del espíritu que me transmite la frase de Herzog: "conquistador de lo inútil".

Nota desde el futuro: al terminar de escribir todo esto me dí cuenta que hay una solución MUCHO MÁS SENCILLA, así que todo lo que sigue, más que una propuesta es la historia de la evolución de un pensamiento.


Voto encadenado


El ataque consiste en conseguir un sobre firmado. El Atacante le promete a su Mulita una recompensa si introduce en la urna el sobre cerrado que el Atacante le entregue. Luego la Mulita le trae el sobre abierto que recibió y así se encadena con la siguiente Mulita.



Este ataque se basa en un mecanismo de protección existente que sirve para evitar que se introduzcan votos

Mitigación al voto encadenado


El esquema que se me ha ocurrido y no he hallado en Internet tras buscar unos minutos, lo que no quita que:

  • esté reinventando la rueda
  • esté reinventando una rueda pinchada
  • esté inventando una rueda pinchada

consiste en lo siguiente:

El Elector NO recibe el sobre para votar, si no un sobre sin marcas identificatorias. En el cuarto hay más sobres equivalentes. Pone su voto en este sobre, sale y lo cierra en presencia de la Mesa.

El Elector toma uno entre varios sobres firmados que la Mesa le ofrece, introduce allí su sobre anónimo y vota.

La clave de esta mitigación es que el Atacante no recibe prueba del voto, no puede comprobar que ha hecho la Mulita, pues el ataque original se basa en la dificultad de conseguir sobres firmados abiertos por fuera del circuito y los sobres anónimos son tan fácil de obtener como las boletas electorales.

¡Quitemos los sobres firmados! No, por que los sobres firmados mitigan la aparición de votos extra.


Contraataque al voto encadenado


Para realizar este ataque es necesaria una gran confianza entre los participantes y tener a la mayor parte de la mesa asociada. No me parece que sea ilegal, pero igual preferiría no participar, el Atacante podría ofenderse y tomar represalias ilegales.

La Mesa le entrega a cada Mulita dos sobres firmados, uno para que vote lo que quiera (o lo del partido que organiza el contraataque, en este caso sin duda es ilegal) y otro para que le dé al Atacante, cobre su dinero y lo reparta con la banda contraatacante.

Se destruye el sobre fraudulento, nos hacemos unos pesos, no hay fraude, el que roba a ladrón tiene cien años de perdón, decían...


Boleta Única



Este esquema, el de mitigación no el de contraataque,  se podría adaptar a Boleta Única, pero me parece que no vale la pena. En conversación con HacKan Iván él dudó por un momento si BU era susceptible al voto encadenado, pero no lo es, ya que conseguir boletas en blanco debería ser algo permitido, de modo tal que el Atacante no pueda obtener prueba la prueba indirecta del voto.



Solución MUCHO MÁS SENCILLA


El Elector está obligado a ingresar al cuarto oscuro y permanecer más de un tiempo prefijado, como pueden ser 30 segundos. Esto le da tiempo a hacer lo que quiera. El tiempo mínimo es para que el Atacante no le pueda exigir que entre y salga sin oportunidad de cambiar la boleta que le pueda haber dado al Atacante.

El Elector DEBE cerrar el sobre firmado en presencia de la Mesa, mostrándolo de modo tal que se vea que está abierto pero sin exponer su interior, para proteger el secreto del voto en blanco, vacío o el de los que ponen papeles que no son boletas.

El ataque encadenado no es posible, pues el Atacante no tiene garantías de que la Mulita no haya cambiado la boleta.

Si se hallara una boleta pegada a un sobre, el voto debería impugnarse, pues es el mecanismo restante del Atacante para evitar el cambio de boleta.

De todos modos, insisto, quien quiera hacer fraude lo va a lograr por el simple método de cambiar los votos durante el momento del recuento. O amenazar con tomar represalias contra los electores de las mesas donde no gane. O hacer una campaña electoral engañosa. Todo esto es un ejercicio intelectual, divertido y vano.


[1] https://seguridad-agile.blogspot.com/2016/10/voto-electronico-no.html








Ekoparty 2016

Por motivos logísticos tanto laborales como familiares, en esta edición sólo pude asistir al training y casi nada a la conferencia.

El training, ingenieria inversa aplicada al analisis de malware [1][2],
dictado por Luciano Martins y Gabriela Nicolao, me encantó, me hizo sentir que me he equivocado en la vida por el camino que tomé. Recién el sábado recordé los dos hechos que me desviaron de ese camino:

El libro de assembler del 8086 [3] que salia 100. No sé que eran esos 100, pero era mucho. Mi familia me dijo "te lo compramos, pero es muy caro, ¿estás seguro?" y yo, un tanto tímido ante tamaña responsabilidad, juiciosamente dije que no, grave error.

El segundo fué que yo usaba el debug de D.O.S. para escribir programitas muy chiquitos en assembler e intentar comprender lo que hacían los ejecutables ajenos, no sabía nada de disassemblers, compiladores, estructuras internas de ejecutables y no me crucé con nadie que me diera una guía, era un camino muy difícil y desistí.


El curso estuvo muy, muy bueno, muy atrapante, con una única crítica que ya repetiré cuando me llegue el mail de encuesta. No soy muy partidario de la nivelación curricular sino de la on-demand, o sea, vamos explicando el tema y si hace falta nivelamos. Es método elegido fué nivelamos primero y vemos el tema despues.

No ha sido el caso, pero he asistido a cursos que han fallado por esto.

El otro inconveniente, ajeno al curso es que en el trabajo necesitaría dedicar el 80% de mi tiempo durante tres meses para poder adquirir y fijar los conocimientos para poder análisis rudimentarios y esto nunca va a ocurrir.



Tan mal quedé, que como no quería reescribir en minúscula en título para ponerlo acá y repudiando mi php, escribí en C un programa para convertirlo:


#include <ctype.h>
#include <stdio.h>

unsigned char buffer[] = "INGENIERIA INVERSA APLICADA AL ANALISIS DE MALWARE";

int main(int argc, char* argv[]) {
   for (int i=0; i < sizeof(buffer); i++) {
      buffer[i]=tolower(buffer[i]);

   }

   printf("%s\n", buffer);
   return 0;
}


Por supuesto, me equivoqué en un tipo, char * buffer en lugar de char buffer[] y aproveché para practicar con ddd (frontend gdb)

Pero esto es de blandengue y no tiene mucho que ver con el curso y de algún modo tengo que justificar estar escribiendo esto, así que lo volví a escribir pero en assembler:

[mainAS.c]

#include <stdio.h>

unsigned char buffer[] = "INGENIERIA INVERSA APLICADA AL ANALISIS DE MALWARE";

void tolowerAs(unsigned char * buffer, int size);

int main(int argc, char* argv[]) {
   printf("%s\n", buffer);
   tolowerAs(buffer,sizeof(buffer));
   printf("%s\n", buffer);
   return 0;
}


Yo soy un eterno principiante de assembler pues no lo puedo practicar y terminar de asimilarlo, así que a lo script kiddie me busqué un ejemplo de algo parecido y por supuesto no funcionó. Estaba sacando los parámetros del stack, pero con gdb ví que estaban en dos registros.




 Quise comprobarlo con objdump:


mainAS.o:     file format elf64-x86-64
Disassembly of section .text:

0000000000000000 <main>:
   0:    55                       push   %rbp
   1:    48 89 e5                 mov    %rsp,%rbp
   4:    48 83 ec 10              sub    $0x10,%rsp
   8:    89 7d fc                 mov    %edi,-0x4(%rbp)
   b:    48 89 75 f0              mov    %rsi,-0x10(%rbp)
   f:    be 33 00 00 00           mov    $0x33,%esi
  14:    bf 00 00 00 00           mov    $0x0,%edi

  19:    e8 00 00 00 00           callq  1e <main+0x1e>
  1e:    bf 00 00 00 00           mov    $0x0,%edi
  23:    e8 00 00 00 00           callq  28 <main+0x28>
  28:    b8 00 00 00 00           mov    $0x0,%eax
  2d:    c9                       leaveq
  2e:    c3                       retq 


Me imagino que donde dice mov $0x0, %edi al hacer el linkeo se pone el valor de donde realmente está el buffer. Lo mismo con los callq.

Entonces escribí esto:


[tolower.s]
.globl tolowerAs

# esi has the size
# edi has a pointer to the buffer

.text
tolowerAs:
   push %rax           # we will use %rax
   xor %rax,%rax

start_loop:            # start loop
  dec %esi               # point to last unprocessed position in buffer
  mov (%rsi,%rdi),%rax   # load that position
  cmp $32,%al            # skip if it is an space
  jz continue
  add $32,%rax           # convert to lower case
  movb %al,(%esi,%edi)   # put it in the buffer
continue:
  cmp $0,%esi            # finished?
  jz loop_exit
  jmp start_loop         # keep going

loop_exit:
  pop %rax
  ret



$  gcc -ggdb -std=c99 mainAS.c tolower.s -o tolower && ./tolower
INGENIERIA INVERSA APLICADA AL ANALISIS DE MALWARE
ingenieria inversa aplicada al analisis de malware


Magia, funciona. Ya sé que tendría que controlar que estuviera en el rango de las mayúsculas más que solamente el espacio, pero es una POC.


A la conferencia asistí una hora, una hora y tres horas. Sólo vi las charlas "Multiple vulnerabilities in Schneider Electric PLC", que sirve para mejorar mis conocimientos básicos para el proyecto CIAA y "Look Mom, I don't use  Shellcode: Browser Exploitation Case Study for IE 11" que sirve para apreciar cuanto hay por aprender.

Nos vemos la próxima, espero poder asistir a toda la conferencia.




[1] https://www.ekoparty.org/ingenieria-inv-malware.php
[2] cuando sigas leyendo verás por qué está sin acentos
[3] http://compusaurios.blogspot.com.ar/2012/10/libro-disco-para-pc-ensamblador-8088.html

sábado, 29 de octubre de 2016

Voto electrónico, no


No estoy en contra del voto electrónico por los negociados...


...que puedan haber. Bien puede haberlos, aunque sin duda de mayor magnitud que con boleta de papel. No hace mucha diferencia.

No estoy en contra del voto electrónico por las vulnerabilidades...


...que se detectan y se intentan reportar desde ya hace un año. Respeto, aprecio y respaldo el esfuerzo de tantos por mostrarlas frente al olímpico desprecio de los actores involucrados...

...ni por motivos técnicos o del proceso de desarrollo...


...pues existe la posibilidad teórica de implementar un sistema suficientemente robusto, abierto, auditado y corregido por gente muy capaz.


No estoy en contra del voto electrónico por el fraude...


...que pueda impedir o facilitar. En última instancia, si un sector importante decide hacer fraude, lo va a lograr independientemente de la tecnología usada. Cuando no habían computadoras, había fraude contable, ahora que hay computadoras, hay fraude contable. No hace mucha diferencia.

No estoy en contra del voto electrónico por que no lo audite yo...


...pues no tengo el conocimiento necesario.

No estoy en contra del voto electrónico por el secreto de voto...


...pues es parte de la resolución técnica del problema.

...entonces, ¿por qué no?


Aunque esté correcta y transparentemente implementado, eso es sólo ante nuestros ojos, la gente técnica, los que con mayor o menor medida contamos con el conocimiento y los medios para poder comprender los mecanismos involucrados.

El 99.99% de la población en condiciones de votar puede comprender que si lleva una boleta en el bolsillo desde su casa, la pone en el sobre en el cuarto oscuro y se queda un rato para comprobar que nadie abra la urna, puede estar bastante seguro de que su voto fué secreto.


Yo estoy dentro del 1% que a grandes rasgos podría comprender como se lograría un efecto similar con computadoras.

Estoy fuera del 0.1% que realmente comprende.

Y mi conocimiento e instinto me dicta que no existe la manera de lograr el voto secreto electrónico fuera de un laboratorio.

PD: me olvidé que...


...no estoy a favor de enunciar los requerimientos como hizo SADIO [1] pues ¿qué hacemos si se cumplen?

...y que digo "voto electrónico" pero vale para "boleta electrónica".


[1] http://www.sadio.org.ar/inicio/aportes-al-debate-sobre-voto-electronico/


domingo, 16 de octubre de 2016

CIAA + Erlang

Este es más o menos el material presentado en [1] para proponer el uso de Erlang en el proyecto CIAA [2]

La introducción al proyecto CIAA corresponde a lo mismo expuesto en CAFELUG, asi que no voy a copiar y pegar, sólo agregar acá lo de Erlang

Hubo un streaming de todo el evento en [3], que estuve revisando para volcar algunos datos acá y es aburridísimo, al menos la parte mía. Sirve verlo para quien quiera hacer una presentación de la CIAA no cometa los mismos errores. La parte de CIAA+Erlang comienza cerca de 1 hora 40.


CIAA + Erlang



La propuesta me nace de tener muchos pies puestos en muchos lugares, siendo dos de ellos el proyecto CIAA y erlang. En este último más que pisar acaricio con el pié, pues aunque he tenido alguna experiencia[4], no he llegado a superar la barrera de entrada, la que te permite retomar en cualquier momento sin tener que mirar ningún manual. En este momento soy incapaz de escribir un hello world, como para ser claro.

La presentación agrega estas preguntas/reflexiones a la presentación de CIAA:


  • plc y micropython están orientados a facilitar la programación de cara al humano.
  • esta iniciativa está orientada a la alta disponibilidad de erlang, no la facilidad.
  • aportaría el hot upgrade soportado por erlang (*)
  • ¿para que querríamos el microErlang si podemos ejectuarlo en la ciaa-full con linux?
  • A nivel industrial no tendría sentido con ciaa-nxp
  • Pero si con una nueva placa industrial reducida, como picociaa
  • Y fundamentalmente para estudiantes con la edu-ciaa
  • Como lidiar con el garbage collector, java (HVM) lo ha hecho
  • Asi como web fue de servidor con aplicación a servidor con cliente rico con javascript y luego javascript ha ido al servidor,
    pensamos en erlang como el servidor de IoT, pero los dispositivos son cada vez más power. Si es suficientemente power y tiene linux, le ponemos cualquier cosa, pero si no es tan power, eh?
  • Podemos al menos enviar los mensajes en formato nativo de Erlang, distribuir la carga de procesamiento y reducir la latencia del servidor.
(*) En la siguiente charla el "hot upgrade" fue correctamente contextualizado, quizás no cuente.

A lo cual agrego de conversaciones posteriores:
  • Erlang originalmente corrió en un switch telefónico, probablemente baremetal, quizas el alcance sea portar R2


Revisando el video, extraigo estos aportes de la concurrencia:

En la algunas conferencias hubieron presentaciónes con estos interesantes títulos

Orlando 2016 [5]
Berín 2016 [6]


En el paquete de OTP existe Inteface, mencionó El Brujo, que permite que un programa en C o java se haga pasar por un nodo erlang, según entendí. Por ejemplo existe una implementación para java [7] de Inaka.

No me comprometo, pero quizás avance algo por ese lado. El problema es que supongo debe necesitar TCPIP y eso no está en baremetal o sAPI, al menos a mi alcance. Y aún no he llegado al RTOS, aviso cualquier novedad.

Muero por tener algo listo para presentar en la conferencia que mencionó El Brujo a realizar en marzo/abril del 2016 en BsAs. Es más, probablemente muera por ser incapaz de no intentarlo.

¿Qué me olvidé o decidí no mencionar?


Olvidé contar que en el proyecto CIAA hay gente muy capaz, docentes universitarios, personas que han colaborado en la construcción de los satélites argentinos, hay personas que trabajan con FPGA, arman la sAPI o diseñan las placas, que para mí son como Dumbledores o Gandalfs, según sea tu tara.

No tenía los links apropiados para los Cursos Abiertos de Programación de Sistemas Embebidos (CAPSE)[8].

Me dió como aversión al autobombo contar que mi colaboración con el proyecto también pasa por haber dado un curso de linux en el SASE 2016 y que en dos semanas probablemente dicte un curso de seguridad orientado a IoT [9].

¿Qué puedo aportar yo?


  • Estar hoy acá:
    O sea, invitar a comenzar.
  • Comenzar el año que viene:
    Mi vida es muy complicada ahora y tengo otras prioridades técnicas, que incluso son base para esta iniciativa, como estudiar RTOS.
  • Ahora puedo colaborar iniciando los contactos y traduciendo.
  • No participar:
    No tengo ningún orgullo ni territorio que defender, bien puede ocurrir que haya gente capacitada e interesada, yo no quiero ningún mérito si puedo ser un estorbo. Me encantaría poder decir "Charli hizo el trabajo de ...", pero me alcanza y sobra "Alguien hizo que Erlang quedara integrado a CIAA mediante ...".



[1] http://seguridad-agile.blogspot.com/2016/09/ciaa-cafelug.html
[2] http://www.proyecto-ciaa.com.ar/devwiki/doku.php?id=start
[3] https://www.youtube.com/watch?v=I7DAssZI_XM
[4] http://seguridad-agile.blogspot.com/2013/07/mutation-testing-framework.html
[5] http://www.elixirconf.com/#elx-speakers
[6] http://www.elixirconf.eu/
[7] https://github.com/inaka/jinterface_stdlib
[8] http://www.proyecto-ciaa.com.ar/devwiki/doku.php?id=educacion:cursos:cursos_programacion_ciaa
[9] https://groups.google.com/forum/?hl=en#!topic/embebidos32/6ohgy4E1D0E

martes, 27 de septiembre de 2016

Reporte i2 Summit

i2 Summit for a safer planet


Tuve la fortuna de pasar de estar prácticamente indocumentado a viajar a este importante evento[1], donde pude aprender y confirmar muchas cosas, que procedo a compartir. Si no aclaro, no es mi opinión de las cosas expuestas, sólo mi relato.

CFM (Counter Fraud Management)


En relación al robo a entidades, hubo un fuerte énfasis en Fraude, o sea, cuando es claramente ilegal, puede haber un falso reclamo.

Dije "claramente" para distinguir de Abuso. Un ejemplo es lo ocurrido con el ministro de energía y minería y sus arreglitos, donde ninguna ley fue violada, pero es evidente que no es muy bonito. En nuestros términos más cotidianos sería aprovechar un sistema mal configurado que permite sacar pasajes gratis.

El sistema para pago seguro, que bien puede procesar 4 mil transacciones por segundo y necesita sólo 512 GB de ram, permite alertar, bloquear, diferir o pasar a una cola de análisis para humanos


Procesamiento y almacenamiento de video.


Se está usando un concepto muy interesante, que permite ahorrar mucho espacio y acelerar sustancialmente las búsquedas en video. La idea consiste en que un agente AI reconozca elementos en el video y agregue metadata. Por ejemplo, un giro en U, marca de vehículo, velocidad, quizás la patente.

Lo nuevo es que se está llevando esa tecnología a cámara móviles, como las que llevan algunos policias en el pecho.

Pudimos apreciar una demo en el hotel, donde se le dió al sistema el feed de varias cámaras y una alerta para una mujer blanca con anteojos y la halló.

Tambien un simpático video de una cámara móvil, mostrando como se reconocian personas, no identificaban, eh, en la calle. Lo más parecido que he hallado es [2] y [3]


COPLINK


Es el programa/sistema que usa la policía para relacionar entidades. Tiene 15 mil millones de documentos indexados y es usado por 40 agencias, que supongo van aportando más documentos cada segundo. Pude probar en un workshop como a partir de tener una persona sospechosa y datos parciales de un auto, llegar a otra persona relacionada y hallar el auto.

Estan los campos que a nadie sorprendería y otros como apodos y descripciones de tatuajes, por lo cual si querías llamar la atención con el tuyo, lo lograste más allá de todo sueño.

Busqué cualquier video [4] y aunque parece un poco "armado", parece que más o menos funciona.


Cloud


La nube lleva a que haya que recolectar más logs, retenerlos por más tiempo y compartirlos más.

Un interesante criterio para usar cloud fue "nobody's running a dynamo in the basement". Mmmh, interesante, no está indexada esa frase.

IBM está en fuerte asociación con Microsoft, desplegando sistemas como COPLINK en Azure. Medio injusto que no hubiera ninguna mención a los pioneros de Amazon, pero bueno, así es la vida.


Cross Industry Panel


Aparte del moderador habia un NSA, un capitán de policia y un representante del sector privado.

Los dos últimos tenían una cierta actitud casi condescendiente con el NSA, tipo "ok lo del terrorismo, pero en nuestro día a día, tiene una prioridad bastante baja".

Una persona del público preguntó por Open Data, ya que el del sector privado había dicho algo como "siempre se ve al gobierno federal con desconfianza, pero ha llegado la hora de compartir información con nosotros". Como que el señor tenía un doble sombrero. Por supuesto respondió "no, gracias, no podemos compartir pues hay marcas y reputaciones que proteger". Dejo la interpretación correcta a quienes tengan clara la relación entre el sector público y privado en USA.


Sueltos


No sé si me entendió bien, pero el Mr al que le pregunté, me confirmó que si vas a comprar armas, drogas o niños a la deep web, a menos que tengas algún conocimiento es más probable que te roben tus bitcoins o termines preso que armado, drogado o pervirtiendo, ya que hay mucha estafa o honeypot.

Hay un sistema que no recuerdo cual era, tipo CFM ya mencionado, que procesa tanta información que no la puede almacenar, sólo sirve para que los analistas humanos puedan tener una idea de lo que está pasando.


Bonus


El bonus lo recibí de uno de mis compañeros de viaje, de alguna empresa de comunicaciones. El problema que tiene es que le roban los picos de bronce de las bocas de incendio y quiere poner un sistema de detección de ausencia, por decirle de algún modo. ¿No es más caro el sistema que reponer los picos? ingenuamente le pregunto. Si, pero no me importa, pues lo que está en juego es que si hay un incendio y no están los picos, estamos en el horno (chiste en la edición, no recuerdo exactamente cómo lo dijo), pueden haber muertos.



Extra ball


Estaba como expositor Frank Abangale, en cuya vida se basó la película "Catch me if you can"[5]. Nada voy a decir de su exposición, salvo que si no fuera por la fecha y que estoy seguro el fondo era distinto, este [6] es el video. Paso a revelar el motivo último y más importante por el cual soporté 24hs de avión, me dejé revisar como si fuera un criminal y resolví mi situación de indocumentación:



Por primera y espero última vez en mi vida, me acerqué a alguien y "excuse, I never do this, but..."

Fuí el segundo en llegar, jaja






[1] https://www-01.ibm.com/events/wwe/i2uc/i2uc16.nsf/Agenda_Day1.xsp?open
[2] https://www.youtube.com/watch?v=QcCjmWwEUgg
[3] https://www.youtube.com/watch?v=uQtaFaI54Ks#t=48
[4] https://www.youtube.com/watch?v=x-KSMcvL1sk
[5] http://www.imdb.com/title/tt0264464/
[6] https://www.youtube.com/watch?v=0X-LlwupIqc

sábado, 17 de septiembre de 2016

CIAA @ CAFELUG


El día sábado 2016-09-17 se realizó en el Ekospace el Bazar del CAFELUG.

Una de las charlas trató sobre el Proyecto CIAA y he aquí un extracto de la presentación. Se trata del punto de vista hobby, sin despreciar lo educativo y productivo.

Es un proyecto


  • Open Hardware
  • Open Software
  • Colaborativo
  • 32 bits
  • Multicore asimétrico
  • ARM/FSL/Intel/PIC

Comunidad sistemas embebidos


  • https://groups.google.com/forum/?hl=en#!forum/embebidos32
  • @ProyectoCIAA

Open Hardware

 

  • https://groups.google.com/forum/?hl=en#!forum/ciaa-hardware
  • https://github.com/ciaa/Hardware

 

Open Software


  • https://groups.google.com/forum/?hl=en#!forum/ciaa-firmware
  • https://github.com/ciaa/Firmware/


  • C
  • Java
  • Python
  • Ladder
  • Snap
  • Open Software
  • Baremetal (LPCOpen)
  • sAPI
  • RTOS
  • POSIX
  • HIS IO ???

Usos


  • Sistemas embebidos industriales hard real time
  • Módulos RT en linux (picociaa montada en otro hardware)

Comparación con otras plataformas


A esta tablita la iré completando en estos días, por favor avisarme por cualquier error



atmega
328
arduino Edu-
ciaa-
nxp
pico
ciaa
Ciaa-
nxp
rbpi 1 rbpi 2 rbpi 3
bits 8 8 32 32 32 32 32 64
cpu 1 1 1+1 [3] 1+1+1[4] 1+1 [3] 1 4 4
mhz 20 20 208 95 208


ram







eeprom







flash
















precio 76 150 805 1050 4408

1049
precio normalizado atmega328 1.00 1.97 10.59 13.82 58.00 0.00 0.00 13.80
precio normalizado edu-ciaa 0.09 0.19 1.00 1.30 5.48 0.00 0.00 1.30
ethernet no no no no si si si si









usb no No [1] si si si si si si
usb otg no
si no si











wifi no no no no no no no si









gpio







adc







dac







resolución dac







pwm







spi







i2c


































jtag no no si si si No[2] No[2] No[2]









rs232







rsxxx







relés no no no no 4 no no no
optoaisladores no no no no 4 no no no
rtc no no si
si ? ? ?
batería no no si no si no no no









botones no ? 4 no no no no no
leds no ? 6 (3 + RGB) RGB ? no no no


















baremetal si si si si si atrevete atrevete atrevete
libreria tipo sAPI ? si en construcción
en construcción ? ? ?
corre linux no no no no si si si si
firmata si si si ? si ? ? ?
rtos no no si en contrucción si ? ? ?


[1] hay un arduino teensy que si tiene
[2] pero se puede hacer un hack (link)
[3] tiene dos cores distintos (m4 + m0)
[4] tiene [3] mas otro micro (( m4 + m0) +m0)

Perspectivas


  • Puente entre escuela e industria
  • Se utilizará en escuelas secundarias técnicas


¿Cómo participar?


  • Página web
  • Documentación
  • RRPP (ver videos)
  • VM's
  • Probando manuales


Recursos


  • Hay cursos presenciales y remotos, para hobbystas, técnicos e ingenieros
  • http://www.proyecto-ciaa.com.ar/devwiki/doku.php?id=start

Próximos pasos


  • Terminar el Slither

    http://seguridad-agile.blogspot.com/2016/07/slither-1-intro.html
  • Proponer Erlang en CIAA
    http://www.meetup.com/ErlangBA/events/234531836/
    viernes 2016/10/14 19:00 a 22:00
    INAKA - Darwin 1154 sector C 1ro F
Lo que estaba antes,

http://www.meetup.com/ErlangBA/events/232750618/
miércoles 2016/09/28 19:00 a 22:00

se suspendió por falla en el suministro eléctrico.

sábado, 6 de agosto de 2016

Spammimic es analizador de tráfico?

El otro día participé de un CTF [1] (que nos fué relativamente mal) y una de las pruebas era descifrar un mensaje con esteganografía en spam. ¿Eh? ¿qué es eso?

Hace muchos años yo había pensado en usar spam como método para dificultar el análisis de tráfico, en el sentido de que si yo hago spam a decenas de miles de personas, quien monitorée no podrá saber a quien realmente le estoy enviando el mensaje. Si mi interlocutor además tiene varias cuentas, en cada "campaña" le envío a una o dos, no vaya a ser que el antispam me corte la comunicación y el adversario no hace unión de conjuntos y no sabe quien es mi interlocutor. Pero no le había prestado atención al mensaje en sí y por supuesto nada implementé, no tengo interlocutores secretos.

Spammimic [2] resuelve "a la spam" ese asunto. Se usa un mensaje de spam con nuestro mensaje adentro. Cualquier filtro de spam lo calificará indudablemente como spam y quien lo reciba no podrá recuperar el mensaje original sin la herramienta.


Por ejemplo:


Dear Business person , We know you are interested in
receiving cutting-edge intelligence . This is a one
time mailing there is no need to request removal if
you won't want any more . This mail is being sent in
compliance with Senate bill 2616 ; Title 4 ; Section
308 . This is not a get rich scheme . Why work for
somebody else when you can become rich in 78 WEEKS
. Have you ever noticed people are much more likely
to BUY with a credit card than cash plus nobody is
getting any younger . Well, now is your chance to capitalize
on this ! WE will help YOU sell more and deliver goods
right to the customer's doorstep . You are guaranteed
to succeed because we take all the risk ! But don't
believe us . Prof Anderson who resides in Virginia
tried us and says "My only problem now is where to
park all my cars" . This offer is 100% legal ! For
God's sake, order now . Sign up a friend and you'll
get a discount of 20% ! Thanks . Dear Salaryman , Especially
for you - this cutting-edge information ! We will comply
with all removal requests . This mail is being sent
in compliance with Senate bill 1618 ; Title 2 , Section
301 . This is not multi-level marketing ! Why work
for somebody else when you can become rich in 58 weeks
! Have you ever noticed people will do almost anything
to avoid mailing their bills plus most everyone has
a cellphone ! Well, now is your chance to capitalize
on this ! We will help you SELL MORE and increase customer
response by 170% ! You are guaranteed to succeed because
we take all the risk . But don't believe us . Mr Jones
of Georgia tried us and says "Now I'm rich many more
things are possible" ! This offer is 100% legal ! So
make yourself rich now by ordering immediately ! Sign
up a friend and you'll get a discount of 60% . Best
regards !


Tiene un simpático mensaje para quien lo lea, ni hace falta el decoder...


Lo que sigue puede ser injusto con los autores de spammimic, pero es sólo un ejercicio de maldad de mi parte, quizás sean honestos, no sé.

Sin haber entrado a la página, lo primero que se me ocurrió es que si yo no tengo el código fuente, el mensaje quizás no esté spammimicado. O sea, como servidor, tomo el mensaje que me dá el remitente, genero un spam único que almaceno en una base de datos junto con el mensaje original. Cuando el destinatario me dá el spam, busco el original y se lo doy. No hay algoritmo de esteganografía involucrado.

Leo entonces la FAQ y hallo que no sólo no proveen el código fuente si no que defienden no proveerlo, ni siquiera una aplicación de código cerrado a la cual aplicar ingeniería inversa. Además una actitud bastante "cool" (we seem to busy on other stuff these days), un poquito de FUD (you would still have to trust the plugin not to secretly send your message back to us!), un poquito de distracción (It would also be handier than the current cut'n'paste method), una mención a un libro con el código fuente para comprar pero 404 o ausencia de título. Leé vos:


What about a SpamMimic program I run on my computer

...or a mail client plugin. This would overcome the above two problems (or would it?). It would also be handier than the current cut'n'paste method. But you would still have to trust the plugin not to secretly send your message back to us! If it was really nasty it could even scan the disk of your PC looking for juicy info to send to us - wah ha ha ha. Of course, this trust problem is an issue for all closed-source software (including operating systems) you chose to run. Having said all that we might do a plugin - but we seem too busy on other stuff these days.

What about open-sourcing it - peer review is the only way crypto can be proven secure

If you buy the book mentioned in the credits you have the source for our mimic engine. We have improved it a bit and we're not going the release the grammar. We don't want to make it easy to have it built into firewalls. (Yes, we are trying to make enough money to pay for the hosting with the evil banner ads.)


Está claro que al no haber un secreto de por medio, teniendo el programa, no hay mensajes secretos, pero eso ya lo dijo Kerckhoff hace como 130 años... Igual no reclamo pues no dicen que sea secreto.

Lo que me molesta es que no hay mención al análisis de tráfico[3] y siguiendo mi linea de pensamiento es lo más importante, ya que al estar usando la herramienta online, el adversario (pues, si, lo considero adversario), conoce mi intención de no ser detectado, conoce el mensaje, conoce mi IP y la del destinatario. Esto bien podría ser una herramienta de inteligencia. En síntesis:


Somebody could observe the "secret" message as it's being sent to SpamMimic

Seems unlikely if you use SSL
Quizás "Somebody" sea SpamMimic...


Para seguir investigando, yo haría encoding del mismo mensaje desde distintas direcciones IP, si no dan lo mismo, tengo razón, se están identificando los mensajes para hacer el tracking de IP. Podría ser un poco menos diletante de lo normal y abrir un tails... listo... controlando que la IP no sea la misma, poniendo el mensaje, pegando en pastebin pues no puedo copiar y pegar desde la virtual, comparando con el spam original y... shit! dan lo mismo, quizas mis sospechas sean infundadas.

El siguiente paso es hacer la ingeniería inversa para detectar si el "spam" es sólo un identificador o realmente está el mensaje ahí.

Me da la impresión de que esté encodeado en los saltos de lineas y el agregado u omisión de algunas palabras. Por ejemplo, variando el mensaje anterior en la letra final y aplicando esto:

  $ sentenceA=$(cat spamA.txt )
  $ sentenceB=$(cat spamB.txt )
  $ for word in $sentenceA; do echo $word; done > wordsA.txt
  $ for word in $sentenceB; do echo $word; done > wordsB.txt
  $ diff wordsA.txt wordsB.txt

  190,191c190,191
  < Salaryman
  < ,
  ---
  > Friend
  > ;
  198c198
  < information
  ---
  > info



wordsX.txt tienen 350 palabras y el cambio está por el medio y en realidad habría que comenzar probando con "a", "b", "aa" y así, but we seem too busy on other stuff these days

De todos modos, spammimic sabe que IP manda a que IP.

[1] https://www.cyberex.es/international/

[2] http://www.spammimic.com/

Por las dudas...

https://web.archive.org/web/20160719095421/https://www.spammimic.com/feedback.shtml

https://web.archive.org/web/20160718231658/https://www.spammimic.com/credits.shtml

[3] http://seguridad-agile.blogspot.com/2014/02/medidas-contra-el-anonimato.html

martes, 26 de julio de 2016

Slither - 4 - usb mouse y encoder con edu-ciaa-nxp

Viene de  Slither - 3 - usb mouse con edu-ciaa-nxp

Ahora, hay que combinar el código del mouse [1] con el del encoder [2]. Esto está en [3].

La idea es que al llamar a Mouse_Tasks(), hay que avisarle que ha hecho el encoder.

Me imagino que la forma correcta de programarlo hubiese sido activar las interrupciones de los pines a donde conectemos el encoder y hacer la lógica correspondiente.

Sin embargo, a mi me parece que por como viene el ejemplo

   Mouse_Tasks();
   /* Sleep until next IRQ happens */
   __WFI();


lo que está ocurriendo es que se habilitó la interrupción de USB y cuando __WFI() lo detecta sigue con el bucle, o sea, no se está llamando a ninguna función por la interrupción.

O sea, yo tendría que habilitar las interrupciones sin darle un handler y poner algo como:

   Encoder_Tasks();
   Mouse_Tasks();
   /* Sleep until next IRQ happens */
   __WFI();


Probablemente tendría que agregar lógica en cada *_Tasks() para ver si me llamaron por mi interrupción o por otra.


Como no sé nada de interrupciones aún, voy a poner inline Encoder_Tasks() y mala suerte, ver como responde.

El código resultante es buena parte del encoder, pero tuve que modificar las firmas de Mouse_Tasks() y  Mouse_UpdateReport() para que reciban los valores del encoder.








[1] https://github.com/cpantel/ciaa/tree/master/slither.io/STANDALONE/usbDeviceHID_mouse

[2] https://github.com/cpantel/ciaa/tree/master/slither.io/encoder

[3] https://github.com/cpantel/ciaa/tree/master/slither.io/STANDALONE/usbDeviceHID_mouse_encoder

Slither - 3 - usb mouse con edu-ciaa-nxp

Viene de Slither - 2 - encoder con edu-ciaa-nxp


En clase recibí el trabajo de adaptación a CIAA de Pablo Ridolfi y la gente de la CIAA sobre los ejemplos de NXP para que la placa funcione como teclado[1]. Mirando fijo y buscando un poco en Internet, hallé el código necesario[2] para que funcione como mouse e hice la adaptación[3], que no hace más que decirle a la máquina "movete a la derecha un poco" cada tanto.

Hasta donde alcanzo a comprender no es un ejemplo bare metal y usa interrupciones, que no era lo que yo deseaba aún, pues me autoimpuesto terminar de agotar el recurso de NO usar interrupciones por cuestiones didácticas.

Para que no tengas que descubrirlo vos, te cuento que main() tiene un loop:

   Keyboard_Tasks();
   /* Sleep until next IRQ happens */
   __WFI();


y Keyboard_Tasks() llama a Keyboard_UpdateReport(), donde para cada tecla

if(!ciaaReadInput(#tecla#)) {
   HID_KEYBOARD_REPORT_SET_KEY_PRESS(g_keyBoard.report, 0x#letra#);


dependiendo de la #tecla# oprimida se agrega al reporte una #letra#

Para el mouse es casi igual,

   Mouse_Tasks();
   /* Sleep until next IRQ happens */
   __WFI();



y Mouse_Tasks() llama a Mouse_UpdateReport():

   setXYMouseReport(g_mouse.report, x, y);

con un x que se va incrementando, así que se va para la derecha cada vez más rápido.

Sigue en Slither - 4 - usb mouse y encoder con edu-ciaa-nxp

[1] https://github.com/cpantel/ciaa/tree/master/slither.io/STANDALONE/usbDeviceHID_keyboard

[2] https://github.com/micromint/LPCOpen-keil-lpc43xx/tree/master/applications/lpc18xx_43xx/examples/usbd_rom/usbd_rom_hid_mouse

[3] https://github.com/cpantel/ciaa/tree/master/slither.io/STANDALONE/usbDeviceHID_mouse

domingo, 17 de julio de 2016

Slither - 2 - encoder con edu-ciaa-nxp

Viene de  Slither - 1 - Intro

Tengo tres maneras...


El encoder no sirve para "producción", en una hora seguramente quedará destruido, hay que construir algo más sólido.

Mientras lo voy a usar pues es apropiado para el prototipo

La página del vendedor dice que 00 ->01 ->11 -> 10, pero la realidad es que a la vista prenden ambos y apagan ambos.



[1] dice "VERY SLOWLY rotate" y ahí se puede ver que si ocurre esa secuencia, ok, podemos seguir.

El problema que se me plantéa ahora es usar lo que ya sé en la edu-ciaa-nxp pero adaptando 5v a 3.3v o tener que aprender sobre un arduino. La ventaja del segundo camino es que el ejemplar final va a ser sobre arduino o atmega o attiny, pero el objetivo de este ejercicio es aprender y no necesariamente por el camino más corto.

El camino de edu-ciaa-nxp

Yo, electrónica 0.1, vivo en el stackoverflow del hardware, copio y pego, no entiendo casi nada.

Tengo dos cajitas con transistores. Una no sé que son y la otra 2n2222, busqué "2n2222 5v 3.3v" y hallé vía imágenes el circuito que necesitaba. Lo probé primero con una fuente de 5v y dos pilas AA, ok, le doy 5v por un lado sale 3.x por el otro.

Sería completamente irresponsable de mi parte compartir lo que hice pues no calculé las resistencia, nada, copié y medí con el tester.

Aún así, lo voy a poner, pero ya sabés:





El primer desafío fue como enterarme de si estaba siendo leido el encoder. El hecho de mostrar por el puerto serial afecta pues se pierden pasos.

Despues de varios intentos llegué a esta forma:

  • leer pines
  • resolver para que lado giró
  • reportar una vez cada tanto

de este modo, casi no se pierden pasos, solo al girarlo muy rápido que no me importa mucho. Además se parece mucho a lo que va a resultar: que no se va a reportar cada evento si no una acumulación de eventos en un período. Cuando no haya movimiento, nada se reportará. Cuando sea lento será un sólo evento. Cuando sea rápido, el resultado.

Pero el camino no está acolchado de pétalos de rosa. Aparecen movimientos en el sentido contrario espúreos.

Esta salida corresponde a  varios giros a la izquierda finalizando con uno a la derecha, con reportes cada un segundo aproximadamente:

left:    skip: 1 error:  right: 
left:    skip: 1 error:  right: 
left:    skip: 1 error:  right: 
left: 15 skip: 1 error:  right: 1
left: 9  skip: 1 error:  right: 1
left:    skip: 1 error:  right: 
left: 22 skip: 1 error:  right: 4
left:    skip: 1 error:  right: 
left:    skip: 1 error:  right: 
left: 59 skip: 1 error:  right: 5
left:    skip: 1 error:  right: 
left: 1  skip: 1 error:  right: 17


Este es el reporte con los estados actuales, futuros y la acción reportada de girar a velocidad intermedia, de una caso de los peores:

state: 1 nextState: 3 L  
state: 3 nextState: 2 L  
state: 2 nextState: 3 R  
state: 3 nextState: 2 L  
state: 2 nextState: 0 L  
state: 0 nextState: 1 L  
state: 1 nextState: 3 L  
state: 3 nextState: 2 L 

state: 2 nextState: 3 R  
state: 3 nextState: 2 L  
state: 2 nextState: 0 L  
state: 0 nextState: 2 R  
state: 2 nextState: 0 L  
state: 0 nextState: 1 L  
state: 1 nextState: 3 L  
state: 3 nextState: 1 R  


Siendo estas las transiciones:

         00 -> 10 -> 11 -> 01 -> 00 : Left

         00 -> 01 -> 11 -> 10 -> 00 : Right


Las transiciones parecen estar bien, el sampleo supongo que tambien, los eventos del encoder son unos pocos en 500000. Adivino que hay rebotes. Dado que lo estoy girando con la mano, suena razonable, más que no tengo un, no sé como se llama... ¿dial? ¿perilla?

El código está en [2] y debe ser copiado en un clone de [3] dentro de examples o donde más te guste, ajustando correctamente el Makefile.mine. Tambien debe estar la sapi_bm en modules.


¡¡¡¡Perdón por la globales!!!! Como dijo Trinity rescatando a Neo de las manos del Merovingo, I don't have time for this shit.

El próximo paso será, con la comunicación usb funcionando, acumular y reportar los movimientos como un desplazamiento en alguno de los ejes. Despues, el movimiento circular.

Sigue en Slither - 3 - usb mouse con edu-ciaa-nxp




[1] http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/keyes-ky-040-arduino-rotary-encoder-user-manual/

[2] https://github.com/cpantel/ciaa/tree/master/slither.io/encoder

[3] https://github.com/ciaa/Firmware/tree/release/1.0.x

Slither - 1 - Intro

Slither[1] es un simpático juego online tipo snake[2], es multiplayer y el gusanito se alimenta tanto de la comida que va creciendo en el tablero como de los otros gusanos al morir, lo que ocurre al chocar la cabeza contra el cuerpo de algún otro.

Se maneja mediante el mouse para apuntar hacia donde ir y el botón principal para acelerar. El gusano va hacia donde esté el cursor del mouse, lo cual no es muy amigable para hacer maniobras bruscas y más para mi que no soy muy diestro y al estar prestando atención a la ubicación de la comida y los demás gusanos, se me corre el puntero del mouse y eventualmente hago maniobras incorrectas.

Me imaginé que si tuviera un paddle[3] me iría mejor, así que decidí hacerme uno.

¿Por que mejor no te lo comprás? me podrías preguntar. Pues, por que no alcanza, hay que hacer algunas configuraciones para que el movimiento "circular" del paddle, en una sola dimensión, o sea, que gire para un lado u otro, se convierta en un movimiento de rotación alrededor de un punto del puntero en dos dimensiones.

No dije "el puntero del mouse", pues está claro que el puntero se puede mover con el mouse, el teclado o un joystick. Si tuviera un paddle debería escribir un programa y modificar alguna configuración para que se hiciera esa conversión en la máquina. Y probablemente tendría que configurar o iniciar algo cada vez que lo use.

Me parece mejor hacer un paddle que se haga pasar por un mouse y genere el movimiento de rotación por si mismo, que funcione igual en cualquier equipo que entienda un mouse.

La tarea entonces es hacer algo que gire, medirlo, transformarlo en dos desplazamientos en X e Y para finalmente pasarlo a la computadora como si fueran eventos de un mouse.

Necesito además tres botones:

  • El botón principal para acelerar.
  • Un botón para aumentar el radio.
  • Otro para disminuirlo.
Los dos últimos son "internos" al dispositivo, ajustan el radio de giro, la computadora no los conoce.

El escenario de uso es:
  • Posicionarse sobre el gusano
  • Conectar el paddle
  • Aumentar el radio, el puntero se desplazará hacia arriba
  • Usar
  • En cualquier momento, se puede cambiar el radio
Las actividades iniciales que hay que llevar a cabo son:
  • Inyectar eventos, ya sea como mouse usb o serial.
  • Leer un encoder rotativo.
  • Transformar un desplazamiento en una sola dimensión en un movimiento circular.
  • Construir un encoder rotativo resistente.
  • Interfasear componentes.

Los elementos de los que dispongo son:

  • Microcontroladores
    • edu-ciaa-nxp [4]
    • teensy [5]
    • attiny85
    • attiny85 con uart usb
    • atmega 328
  • Sensores
    • encoder rotativo tipo potenciómetro
    • encoder de un mouse de bolita
    • cámara sensora de un mouse óptico.


Esta es la idea más general:

   +----+   +------------+   +----------------+   +--------+
   | PC +---+ usb/serial +---+ transformación +---+ sensor +
   +----+   +------------+   +----------------+   +--------+


La edu-ciaa-nxp es la más potente de las opciones, la mejor para hacer debug, la que más dispositivos tiene y además tiene una importante comunidad [6] pero es overkill para producción. Probablemente se pueda registrar como un mouse serial con sencillez.

Teensy tiene el hardware y las librerías para registrase como mouse, teclado, joystick, midi y me parece que pendrive, pero tambien es overkill

Attiny85 serviría para algunas pruebas, pues sólo tiene 6 pines. El que tiene uart usb tiene 4, dos los usa en la uart.

Atmega 328 sería lo más económico, pero me obligaría a incursionar en conectarle la electrónica extra para comunicarse ya sea uart o usb.

Tengo un poquito de experiencia en todos salvo Attiny85. Atmega 328 incluso lo he programado con ISP y tengo una entrada casi lista para publicar.

El encoder tipo potenciómetro es apto para experimentar pero no para uso pesado.

El otro encoder me traería un desafío de tipo mecánico.

El sensor del mouse óptico vé en dos dimensiones, pero con que registre en una sola mirando alguna superficie del elemento giratorio, alcanzaría. El único problema es que no puedo hallar el USB que tenía, así que voy a usar un PS/2 con un adaptador a USB, es lo que hay...

Adicionalmente, en lugar de usar las partes del mouse, mejor se podría modificar al mouse.


                        +------------------------------------+
            |              mouse                 |
   +----+   | +-----+   +---------+   +--------+ |
   | PC +-----+ usb +---+  micro  +---+ sensor + |
   +----+   | +-----+   +-+-----+-+   +--------+ |
            |             |     |                |
            |     +-------+-+ +-+-------+        |
            |     | botón 1 | | botón 2 |        |
            |     +---------+ +---------+        |
            +------------------------------------+


El microcontrolador en el medio haría la conversión a (X,Y) e interpretaría a los botones, mmh, quizás alcance con 6 entradas/salidas. En ese caso el Attiny85 sería lo más sencillo y barato.


Apuntaré a esta última solución, pero aprovecharé la facilidad de uso de la edu-ciaa-nxp para los prototipos, quizás luego pase por teensy.



Voy a tener que seguir mi habitual método de planificación adaptativa, que es mucho más adaptativa que planificación y más o menos se parece a esto:


  • Inyectar eventos usb
    • Con teensy
    • Con edu-ciaa-nxp
  • Transformación
    • Con papel y lápiz
    • Con php en la pc
    • Con c en la pc
    • Con c en edu-ciaa-nxp
    • Con c en teensy/attiny/atmega
  • Lectura encoder
    • Encoder existente
    • Encoder construido
  • Construcción encoder
    • Con piezas giratorias de mouse mecánico
    • Con sensor óptico
  • Interfases
    • 5v a 3.3v para conectar encoder existente a edu-ciaa-nxp
    • modificar los mensajes del sensor óptico con edu-ciaa-nxp
    • con solución final
Como hay múltiples caminos posibles, no los hago explícitos, pero el éxito de algunos puntos produce que no haga falta transitar todos.

Sigue en Slither - 2 - encoder con edu-ciaa-nxp

[1] http://slither.io/

[2] https://en.wikipedia.org/wiki/Snake_%28video_game%29

[3] https://en.wikipedia.org/wiki/Game_controller#Paddle

[4]  http://proyecto-ciaa.com.ar/devwiki/doku.php?id=desarrollo:edu-ciaa:edu-ciaa-nxp

[5] https://www.pjrc.com/teensy/

[6] http://proyecto-ciaa.com.ar/ y sus varios foros
https://groups.google.com/forum/#!forum/ciaa-firmware
https://groups.google.com/forum/#!forum/ciaa-hardware
https://groups.google.com/forum/#!forum/ciaa-ide
https://groups.google.com/forum/#!forum/ciaa-linux