2020/04/30

FSM vs SQL, algunas consideraciones de correlación de eventos


Hace como un año comencé a desplegar unas alarmas en el trabajo utilizando FSM para procesar los logs y obtener alertas tempranas ante ciertos incidentes.

Luego me dí cuenta que pude haberlo hecho utilizando consultas SQL, lo cual me llevó a reflexionar mucho sobre el tema, hacer algunas prueba y preparar una charla que dí en el trabajo de modo virtual pero no podré dar afuera por que todas las conferencias medio que están caidas.

Esto viene a ser un resumen de lo que pudiste haber visto en FLiSOL, H4CK3D, OWASP Latam Tour, LACNIC y no digo Ekoparty por que nunca me aceptan nada.

Voy a asumir que tenés una idea de los temas, que sólo te estoy aportando las relaciones entre las ideas. Además yo no soy ninguna autoridad de conocimiento, sólo estoy expresando opiniones más o menos bien sustentadas.



Voy a usar el siguiente vocabulario, los dos primeros corresponden al uso común y el último lo uso para manejarnos ahora.

Evento: cada cambio sin connotación positiva o negativa
Incidente: un cambio con connotación negativa
Caso: conjunto de eventos en análisis que conducen a un incidente.

Un caso simple


Partamos de un sencillo requerimiento atemporal, no hay tiempo ni información variable involucradas.


Si hay una conexión a la IP_perimetral en el puerto 8081 desde una IP_externa que no está en la red 211.10.10.0/24 y tiene cierto "DATO", quiero una alarma, evitarlo o incluso agredir.

Esta es un típica regla stateless, se puede resolver con lógica combinacional:

[grafico logico]

IP destino en IP_perimetral
   AND
puerto es 8081
   AND
IP origen NOT en red 211.10.10.0/24
   AND
mensaje contiene "DATO"

Tambien con una consulta SQL:

SELECT * FROM conexiones 
   WHERE
      ip_destino IN (SELECT  ip FROM red_perimetral)
   AND
     port_destino = 8081
   AND
     ip_origen NOT IN ( SELECT ip FROM red_externa)
   AND
     datos like “%DATO%”;


O con una FSM de un solo estado, que contendría la lógica combinacional previamente citada, en pseudo-C:

if ( 
  pertence( IP_destino , IP_perimetral) )
  & puerto == 8081
  & ! pertenece(IP_origen, 211.10.10.0.24)
  & strpos("DATO", mensaje) {
    generar_alerta();
}



Algunos atributos apropiados para nuestros ejemplos:
  • Origen
  • Destino
  • Tipo de mensaje
  • Contenido del mensaje
  • Longitud del mensaje
  • Horario

Un caso complejo



Si hay un scan desde una IP_externa y desde esa misma IP hay luego una conexión con un DATO y luego se ve ese DATO en una copia entre nodos internos de una IP_interna_origen a una IP_interna_destino y finalmente hay una conexión saliente de esa ip interna de destino con ese DATO, quiero una alarma, evitarlo o incluso agredir.

Que es difícil de leer, mejor no lo leas, leé esto:

Si se da la siguiente secuencia de eventos
  • Scan desde una IP_externa
  • Conexión desde esa IP_externa con un DATO
  • Copia de datos entre dos nodos con ese DATO desde una IP_interna_origen a una IP_interna_destino
  • Conexión saliente de la IP_interna_destino con ese DATO
 entonces quiero una alarma, evitarlo o incluso agredir

Fijate que las partes coloreadas no están predefinidas, son variables que deben
concidir entre las distintas partes de la reglas

A los atributos previamente mencionados se suma "Relación entre los mensajes".

Lógica combinacional


Este es el terreno de Boole, es prácticamente instántanea, corre a la velocidad máxima de propagación entre compuertas si está implementada en hardware, que es factible usando FPGA. Si corre en software, son pocas y simples instrucciones. Cuando se le agrega memoria, se llama secuencial, siendo un caso particular es la FSM.

FSM


Dice wikipedia que:

Un autómata finito (AF) o máquina de estado finito es un modelo computacional que realiza cómputos en forma automática sobre una entrada para producir una salida.

Que es lo mismo que hace cualquier proceso o programa, lo específico es que es un cierto modelo computacional, mirá los componentes de una FSM:


  • estados
  • entradas
  • salidas
  • función estado(estado,entrada)
  • función salida(estado,entrada)
  • estado inicial

Un proceso genérico no tiene necesariamente la función de estado, ni siquiera estados.

Las funciones de entrada y salida son combinacionales, quizás con efectos colaterales cuando hay más memoria que estado en sí.


Un ejemplo muy natural por decir de algún modo es un operating system scheduler que es su expresión más baja se reduce a esto:




Lo que está diciendo es que cuando se crea un nuevo proceso, va al estado "Ready To Run". Cuando el OSS decide que corra, Running, del cual puede salir cuando termina, cuando se le termina el tiempo asignado de ejecución y el OSS lo regresa a R2R o cuando pide una operación que implica largos tiempos de espera como acceso a un periférico. El sistema operativo detecta eso y elije mandarlo a dormir para liberar la CPU para otro proceso. Cuando la operación de entrada salida concluye, el proceso pasa nuevamente a R2R y así.


Como se implementa, puede ser como en mi demo con el estado atributo en la instancia, pero tambien puede estar el objeto (o estructura) en una tabla y una de sus columnas ser el estado. Tambien y me gusta más intuitivamente pues nunca implementé un OSS, en tablas o listas separadas, una para cada estado.

Consulta SQL


Asumo que sabés al menos que es un join sencillo.

En el contexto de lo que estamos analizando, estas son las principales características para comparar entre FSM y consulta SQL:

En la FSM el tiempo está implícito, hace falta que los eventos lleguen ordenados, falla si no. No hace falta guardar estos eventos, sí algún que otro dato para parametrizar las reglas y para el reporte final. Esos datos y el overhead de las instancias de cada caso genera un consumo creciente de memoria. Dado que da una respuesta de muy baja latencia, puede ser usada en situación de bloqueo, esto es que no sólo alerte sino impida la acción final del ataque. Es más difícil de programar pues es... programar, justo.

Las Consultas SQL por su lado necesitan el tiempo pero este está explícito en el timestamp del mensaje y necesita conservar los mensajes, de lo cual se encarga el DB Engine con todo sus ventajas de escalamiento. No lo veo mucho en situación de bloqueo, quizás si para un sistema transaccional pero no para algo donde la latencia sea crítica. Es más fácil de programar pues no es programar, es escribir SQL, lo cuál al comienzo es más difícil cuando es complejo, pero luego es más de lo mismo.


Una FSM puede alimentarse de un batch ordenado. O sea que tambien se puede usar para detectar en archivos históricos. Me imagino que no debe ser más eficiente que DB pues las DB estan diseñadas para ser eficientes en ese escenario.

Como machete, FSM vs Query SQL:



FSM
Query SQL
Tiempo
Implícito
Explícito
Orden de eventos
Indispensable
Indiferente
IO
Stream
Stream/batch
Almacenamiento
Descartable
Indispensable
Memoria
Creciente si no se purga
DB Engine (*)
Real Time
Hard (sniffer)
Soft
Modo
Detección y Bloqueo
Detección
Escalamiento
Provisto por S.O.
Provisto por DB
Conocimientos
Programación
SQL
Cambios lógica
Difícil
Fácil
Embebible
Si
Mmmh


Con embebible me refiero a que se podría tomar un microntrolador y/o FPGA y hacer un modulito que se conecte a la red y cumpla alguna función digna de mención, no tanto con una DB, para la cual hace falta un sistema operativo detras, mmmh, por eso, mmmh, no.

Características compartidas

  • Hay que tener en cuenta un "tiempo de vida", un "timeout", tras el cual un caso debe ser desestimado en el caso de FSM o una antigüedad de log ignorada en el de SQL. Esto reduce el tamaño de la DB/espacio en memoria.
  • Pueden haber alertas intermedias, en el caso de FSM simplemente emitir mensajes en estados previos al final, en el de SQL consultas que no incluyan las últimas condiciones, una especie de copiar->pegar->podar de la consulta.

Para SQL hay un optimización híbrida, en lugar de ejecutar siempre toda la consulta, buscar la condición del último evento, en nuestro ejemplo una conexión hacia el exterior, si existe, hacer la consulta completa. Quizás las optimizaciones que hacen los DB Engines hacen eso o se les puede sugerir, sé muy poco de DB.

Dicho de otra manera, cuando llega el último evento, me fijo si han ocurrido las condiciones para llegar hasta ahí.

Hice una demo que está en github, te cuento:

Modificá export.php y generás la base de datos para las Consultas SQL, que están en el archivo... consultas.sql.

SimpleFSM.java es una POC para casos no solapados, es para concentrarse en un ejemplo de FSM y en la lógica y cuestiones secundarias como leer de STDIN.

FSM.java es la implementación más correcta, donde una una colección de casos, de paso, las clases deberían llamarse CasoSimple y Caso, no el nombre de la implementación, pero cuando lo hice estaba mas concentrado en la FSM que en las recomendaciones de Domain Driven Design.

Fijate que al pasar de SimpleFSM a FSM el evento que lleva al primer estado es extraido de la  lógica común. Para entender bien mirá la evolución por el paso intermedio, FSM2, que debería llamarse FSM_fail, donde estoy haciendo dos cosas a la vez: la FSM y la gestión de la colección.

Lo correcto es hacer FSM y de ahí fijarse como optimizar para que los loops terminen antes si pueden y esas cositas.

2020/04/27

Time and vulnerabilities

This post is a dirty, quick and lazy translation from the original in spanish, es lo que hay.


While attending a vulnerability tracking and management tool demo, I found a concept that was lurking in my mind for a long time: aging affects a vulnerability score.


I have a lot of questions, not enough neither correct answers, but I share them

But first, recall what a vulnerability is and how to score it, from the manual:

An asset vulnerability is a glitch that can be exploited by an attacker in order to act upon this asset.

That action affects information Confidentiality, Integrity and Availability 
if we mind Information Security point of view.


Better yet, if we extend to  Dependability it also affects Safety. That is a better angle, where does Information Security fit when a 90mph vehicle blocks its breaks? May be we can recover the information but not the people inside.


Based upon impact over CIA we can score the vulnerability. Some earlier methods were DREAD and STRIDE, the first once gone and the second used still used in risk modelling, I've been told.


  • Damage – how bad would an attack be?
  • Reproducibility – how easy is it to reproduce the attack?
  • Exploitability – how much work is it to launch the attack?
  • Affected users – how many people will be impacted?
  • Discoverability – how easy is it to discover the threat?

Both methods are not fit to scientific purposes.

Threat Desired property
Spoofing Authenticity
Tampering Integrity
Repudiation Non-repudiability
Information disclosure Confidentiality
Denial of Service Availability
Elevation of Privilege Authorization


Take note that STRIDE considers the CIA Triad.

The current method is CVSS version 3.1  but I will use the 3.0 because I like it more, in particular another calculator from FIRST.



Now it is time to open both calculators and play with them, starting with the worst case:



https://www.first.org/cvss/calculator/3.0#CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H


The calculator has three zones, one of them is the base, it is abstract, isolated from context and time.




What does it mean? If the score is high but you do not have an affected asset, nevertheless it remains high, as soon as you install it, you have the vulnerability. If it is fixed but you do not apply the patch, it is still high.


Environmental zone is you, not only your system but each point of it. Two assests can have the same vulnerabilty, but different security requirements or been one in the perimeter and the other protected by a firewall, score changes.


A 10 point critical vulnerability in a device facing Internet drops to 7.6 high when disconnected from the network:






CIA lies at the heart of the scoring sisytem. Play with the parameters, if CIA impact is zero, score is zero.

Hover the mouse pointer over the buttons of the calculator and you will see the definitions.

CIA requirements allows you to adjust to what value has the information in this asset to you. CIA modifiers is what the impact is in this asset, perhaps you do not have any information. Can you tell the difference between "modifiers" and "requirements"?

In this particular device, you have read only storage, Integrity is safe, score lowers. But you have an extra requirement that there can not be changes, scores raises.


Any more?


I've been noticed that there are more dimensions, not explicitely considered:

Who is affected?


It is not the same a final user that the sysadmin.


Who must fix it?


It is not the same waiting for the patch of an external product that having to produce it for your own system. Neither if the failure is exploited in the browser, out of your control that in the db, yours.

Thing about XSS vs SQLi.

Where does the report come from?


It is not "Report Confidence". If a costumer reports it, you can have reputational impact if she is not happy with your solution.


More on another post in spanish.

Time



CVSS deal with tiem in this way:

Report Confidence (RC)


Given more time, from rumor to official declaration, it raises the score.

Remediation Level (RL)


It starts with a hack, ends with a new fixed and integrated version of the software, the score gets lower.

Exploit Code Maturity (E)


From a POC to a script kiddie too, score raises again.




My fourth dimension is aging, but which one?


  • from vulnerability existence
  • from being present in my system
  • from detection in my system
  • from the discovery in my system

It is not the last one, a vulnerability tracking system must use the detection timestamp.

From this point, it is only half cooked thinking.

Does it raise the score an eleven year old vulnerability discovered now in a ten year old legacy system? There has been plenty of time to be exploited, time attenuates.


If my system is installed right now, any day makes exposition worst

Another factor is CEO Happines: How can it be that we have this vulnerability going for so long? First thing you have to do is forensic analysis in order to tell if it has been exploited.


Graphically:

Time between vulnerability existence and detection is short


system =========================================
vulnerability    ===============================
report           ++=============================
                             grows grows shrinks
The same time is longer:

system  =========================================
vulnerability ===================================
report        ++++++++++++++ ====================
                                  shrinks shrinks

This grows and shrinks parametry only can be the result of a statistical analysis of what have happened in the reality, a good topic for research, do not forget to mention that you have read this post ;')


What must never happen to you:

system                =============================
vulnerability =====================================





2020/04/25

El tiempo y las vulnerabilidades

El otro día en una sesión de un producto de seguimiento y gestión de vulnerabilidades me hallé de modo explícito con un concepto que me estaba rondando por la mente hace un buen tiempo y no se había cristalizado aún: aging, con el tiempo aumenta (cambia) la criticidad de una vulnerabilidad.

Tengo muchas preguntas, no sé si suficientes respuestas ni si son correctas, pero las comparto para la reflexión.

Antes repasemos un poco que es una vulnerabilidad y cómo se calcula su criticidad. Dicen los manuales algo asi como:

Una vulnerabilidad sobre un activo es una falla que puede ser explotada por un atacante para ejecutar acciones sobre un equipo.

Estas afectan la Confidencialidad, Integridad y Disponibilidad de la información si lo vemos desde el punto de vista de la Seguridad de la Información.

Mejor aún si ampliamos a la visión de Dependability (ni idea de cómo traducir a algo lindo eso), tambien afecta a Safety, que es una visión mejor, pues dentro de la primera triada, ¿dónde entra que se bloquéen los frenos de un auto en la ruta a 120 kmph? Quizas la información del vehículo no se destruye aunque si sus ocupantes.

Ok, entonces, en términos de impacto sobre esas palabritas, se puede determinar la criticidad de una vulnerabilidad. Unos intentos pretéritos cercanos fueron DREAD y STRIDE, el primero ya abandonado y el segundo se sigue usando según entiendo para modelado de riesgos.

  • Damage – qué tan malo puede ser el ataque?
  • Reproducibility – qué tan fácil es de reproducir?
  • Exploitability – cuánto trabajo implica el ataque?
  • Affected users – a cuánta gente le pega?
  • Discoverability – qué tan fácil es descubrir que tenés esa vulnerabilidad?

Estas ambas metodologías no son muy precisas y no contemplan muchos, muchos factores y son bastante subjetivas.


Amenaza en spanish Se arregla con..
Spoofing hacerse pasar por... Autenticidad
Tampering Adulteración Integridad
Repudiation Yo no lo hice... No Repudio
Information disclosure Pérdida de información Confidencialidad
Denial of Service Denegación de servicio Disponibilidad
Elevation of Privilege Elevación de privilegios Autorization

Fijate que STRIDE ya contempla Confidencialidad, Integridad y Disponibilidad. De ahora en más, la llamaré "CIA".

Para remediar esas falencias, el estado actual metodológico se llama CVSS versión 3.1 pero voy a usar la 3.0 pues los valores actuales están más en esa y estoy más familiarizado. Y me gusta más la de FIRST, voy a ir alternando las capturas para molestarte un poquito.

Te recomiendo que abras una o dos pestañas con ambas calculadoras y vayas probando, partiendo de esta situación:

https://www.first.org/cvss/calculator/3.0#CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H


La calculadora tiene tres zonas de métrica, una de base que es la vulnerabilidad en abstracto, como es completamente aislada de las circunstancias y el tiempo.




¿Qué quiere decir esto? Que si la vulnerabilidad es altísima y es de un protocolo que no tenés no deja de ser altísima pues si instalaras ese protocolo la tendrías. Que si ya existe corrección, si no la aplicás, sigue siendo altísima.


La otra zona es la del entorno concreto que aplica en tus circunstancias. En ésta determinás como te pega a vos realmente, no sólo a tu sistema si no a cada punto. Podés tener dos equipos con la misma vulnerabilidad pero distintos requerimientos de seguridad, cambia la criticidad. O siendo iguales uno puede estar expuesto a Internet y el otro no, ahí cambia.

Supongamos una vulnerabilidad con 10 de puntaje, es explotable desde tal lejos como Internet. Pero si tu máquina está desconectada de la red, disminuye.




Recordá, para el puntaje de base no vale "ah, pero a mi...", no. Es en condiciones de laboratorio.

El núcleo de CVSS es el impacto CIA. Jugá con los parámetros y vas a ver que si el impacto en CIA es cero, la criticidad es cero. Eso tambien ocurre con el puntaje de entorno (Environmental), podés bajarla a cero si VOS no tenés impacto.

El detalle de cada elemento lo dejaré para otra oportunidad, quizás nunca, así no se hace tan largo esto, sin embargo voy a hacer unos mínimos comentarios por si el tema es nuevo para vos. Si pasás el cursor del mouse sobre los botones de las calculadoras te explica. Si no te alcanza, me preguntás y voy agregando detalle.


Attack Vector (AV)


Vector de ataque tiene que ver con las condiciones de acceso, va desde Internet a tener que ponerle las manos encima al equipo.

Attack Complexity (AC)


Complejidad de ataque, si hay condiciones fuera del control del atacante, si hay que ponerse en el camino de red por ejemplo.

Privileges Required (PR)


Privilegios requeridos, ¿hace falta ser admin? usuario normal, nada?

User Interaction (UI)


Interacción del usuario, puedo plantar un ejecutable en un servidor, pero luego tengo que hacer que un usuario lo ejecute, mediante una comunicación falsa que así lo solicite.

Scope (S)


Alcance, ¿el ataque afecta este componente o hace sapito? En caso de sapito lo que sigue se debe definir para el blanco final. Por ejemplo, si puedo hace que un componente haga denegación de servicio contra otro, cambia el alcance.

(Este es un punto que nunca me termina de cerrar, por que si en esta denegación de servicio el componente de entrada tambien es afectado ¿tambien es víctima...?)

Confidentiality (C) Integrity (I) Availability (A)


Son nuestras viejas conocidas.



En la zona de puntaje de entorno, es adaptar a tus circunstancias como ya expliqué. La diferencia es que la parte base por lo general la recibís, las otras tenés que ajustarlas vos.

Hay un grupito extra, los CIA requirements. Este sirve para hacer un ajuste extra que es este.

Primero tenemos que el impacto CIA es el abstracto de base, luego lo ajustamos con los Modified, que tiene que ver con que quizás no tengo información alcanzable por la explotación de esa vulnerabilidad. Finalmente, quizás tenga información alcanzable, pero NO ME IMPORTE.

¿Hay más?


Lo que he notado con el tiempo es que hay dimensiones que no han sido consideradas explícitamente, por ejemplo:


¿A quién afecta?


No es lo mismo a un operador final que a un administrador de sistemas.

¿Quién es el responsable?


No es lo mismo un producto externo que hay que esperar el parche a un producto interno que hay que elaborarlo, o si la falla se manifiesta en el browser completamente bajo el control del atacante o en la db, bajo nuestro control. Si está expresado en "Scope", es muy retorcido.

¿Quién reporta?


No es "Report Confidence", es si te la reportó un cliente quizás sea más importante resolverla antes que lo que viene por un EH, pues este cliente puede generar impacto reputacional si no está contento con la resolución.


Esto está más desarrolado en otras notas.


Y ahora, por fín, llego al tema que quería:


El tiempo



En CVSS el tiempo está contemplado de las siguientes maneras

Report Confidence (RC)


Confianza en el reporte, a medida que pasa el tiempo debería crecer, de un rumor a una comunicación oficial del owner del producto, aumenta el puntaje.

Remediation Level (RL)


Solución disponible, comienza con un hack, termina con una nueva versión bien corregida e integrada, disminuye el puntaje.

Exploit Code Maturity (E)


Madurez del ataque, va desde "es teóricamente posible" a un script que puede usar cualquiera, aumenta el puntaje.



Mi cuarto factor es el tiempo de vida de la vulnerabilidad, ¿pero cual?


  • desde que existe la vulnerabilidad
  • desde que está presente en mi sistema
  • desde que fue detectada
  • desde que fue incorporada al sistema de seguimiento


Evidentemente la última no es, el sistema de seguimiento debe tomar al menos la fecha de detección, pudo haber venido en un batch corrido hace un mes.

Y acá es donde llega el momento de pensar y que aún no me decido, veamos un ejemplo:

Detecto una vulnerabilidad en un sistema legacy que está instalado hace diez años y la vulnerabilidad tiene once, ponele.

¿Es crítica? ¿Tiene sentido que salga corriendo a corregirla si han habido diez años de oportunidad para explotarla? Esto haría que el tiempo atenúe la criticidad.

Si acabo de instalar el sistema SI es crítico que lo arregle ya. Esto es congruente con que ante una crítica de algo que ayer era un Zero Day, tengo que arreglarlo ya mismo.

Entonces me estaría quedando con que el tiempo es el de presencia, atenuante.


Por otro lado, a medida que pasa el tiempo aumentan la probabilidades de que sea explotada y fundamentalmente aumenta el nerviosismo de las altas esferas, ¿¿¿¿cómo puede ser que tengamos esa vulnerabilidad desde hace tanto tiempo??? Este había sido el motor de este aspecto en mis pensamientos precristalizados.


Quiza la forma es creciente durante un tiempo y luego atenuante.



Expresaré con grafiquitos lo dicho hasta ahora:

El tiempo pasado entre la existencia pública de la vulnerabilidad y la detección en el sistema, el reporte, es breve:

sistema =========================================
vulnerabilidad    ===============================
reporte           ++=============================
                              crece crece decrece

La vulnerabilidad está presente hace mucho en el sistema pero recién nos enteramos: sistema

sistema  =========================================
vulnerabilidad ===================================
reporte        +++++++++++++++====================
                                   decrece decrece


La parametrización de esos crecen y decrecen, para mi debe ser resultado de un estudio estadístico de qué ha ocurrido en la realidad, probablemente exista pero no me muero de ganas de buscarlo ahora (en realidad busqué y no apareció nada rápido). Si no existe, puede ser el tema de tu tesis, no te olvides de mencionar que yo te dí la idea.




De paso te digo que cuanto mayor haya sido el tiempo de exposición, mayor esfuerzo hay que dedicar a determinar si la vulnerabilidad ha sido explotada.


Y lo que nunca te puede pasar  esto:

sistema                =============================
vulnerabilidad =====================================


Versión en inglés precario

2020/04/24

Asshley Modison

(Nota del futuro 2020

En el marco de #quedateencasa me puse a revisar notas viejas no publicadas y no recuerdo bien por qué no lo había hecho con esta, así que el "Un poco tarde" de abajo, escrito en 2015, es más que apropiado)


Un poco tarde, noticia vieja, perdón por no estar en la cresta de la ola. Es que hacer esto me llevó un buen rato, tanto hacerlo en sí como hallarle un momento entre otras cosas.


Continuando con la decadencia de este blog, hoy miro un rato el dump de asshley modison. No avisés, ya sé que está mal escrito, lo que pasa es que no quiero aparecer en la primera página de ningún buscador, hay gente a la que le molesta que se haga leña del árbol caido.

Como de costumbre voy a repetir la recomendación de no repetir credenciales para evitar que al ser comprometido un sitio caigan todas tus cuentas en los otros sitios.

No voy a repetir la recomendación de vivir en el mundo real.

Como dice la publicidad, no uses el celular cuando estés conversando.


Como siempre, no uses los servicios online para verificar si estás en el dump, no tenés manera de saber si es buena gente o están recolectando mails para spam [adobe], si es de tu interés, busca el torrent y divertite.


Al grano

Complica el análisis que AM no verifique los mails.


En relación a la estafa que puede ser este sitio se menciona que en la proporción 30 a 5 de mujeres subscriptas declaradas, apuesto a que hay que ajustar a una inmensa cantidad de falsas cuentas femeninas.

En una nota [gizmodo] muestran como analizando el mail y la IP se descubren decenas de miles de cuentas falsas, pero no alcanzan para el 9 a 1 de la declaración de Impact Team[reddit]. Luego, analizando los campos mail_last_time, chat_last_time y reply_mail_last_time llega a que la relación es 1000 a 1.

Sin embargo, hay casos de mujeres que le avisan a la autora que si existen.

Para mi hay que analizar la fecha de alta del primer uso en relación a la fecha de not null de esos campos. Como desarrolladores bien sabemos que las bases de datos evolucionan y eso hace aparecer nules no significativos.

Lo mejor sería cargar en una base y hacer las consultas con sql, pero para qué tenemos grep si no lo usamos, ¿no?

tr "," "\n" < aminno_member_email.dump | grep "@" | grep -v " SET " | cut -d"@" -f 2 | sed -e "s/'//" > mails.txt

esto convierte cada coma en un salto de linea, toma cada linea con @ y quita cada linea con " SET ", parte cada linea en la arroba, toma el segundo campo, elimina la comilla y pone el resultado en mails.txt


Algunos números interesantes:



Hay una noticia cuyo título menciona a 150 argentinos [clarin]. En el cuerpo de la noticia dice que 148 y sólo de organismos .ar, pero a mi me da otra cosa...


grep -e "go[vb].ar'$" mails.txt  | sort | uniq | wc -l
144

quizas me faltan?

grep -e "mil.ar'$" mails.txt  | sort | uniq | wc -l
2


mmmh, la primera consulta sin el uniq me da

grep -e "go[vb].ar'$" mails.txt  | wc -l
156

¿Habrá sido esta la lista reportada tras borrar algunas direcciones?


No se puede confiar en las computadoras.


Los argentinos no importantes somos un poquito más, sin incluir gmail.com, yahoo.com y otros dominios que no son .ar:

grep -e ".ar'$" mails.txt  | sort | uniq | wc -l
69974


Me gustó un comentario en [reddit], aunque no representa mi visión:


I don't agree with your methods. Say we have 3 interested parties here. The company A..... M....., people cheating on their spouse (possibly hurting them) and people just looking for fun because sex is fun (not hurting anyone). I'm pretty sure you've hurt the most innocent people worst of all because now their names are on your list despite never hurting anyone. A.... M.... will move on. Cheaters will move on. You haven't really accomplished much of anything, besides maybe forcing me to explain to my girlfriend that I signed up before I met her.

(No estoy de acuerdo con vuestros métodos. Hay tres protagonistas aca. AM, los tramposos y los que se quieren divertir sin molestar. Han lastimado a los últimos pues AM va a seguir sus negocios, los tramposos seguirán trampeando y los que sólo nos queriamos divertir ahora tenemos que explicarle a nuestras novias que nuestra cuenta es anterior a ellas)





[boxeadores] http://seguridad-agile.blogspot.com/2015/07/boxeadores-en-la-cabina-de-un-avion.html


[adobe] http://seguridad-agile.blogspot.com/2013/11/leak-adobe.html

[clarin] http://www.clarin.com/sociedad/argentinos-escrachados-escandalo-Ashley-Madison_0_1415858680.html

[gizmodo] http://gizmodo.com/almost-none-of-the-women-in-the-ashley-madison-database-1725558944

[reddit] https://www.reddit.com/r/AnythingGoesNews/comments/3h71ar/we_are_the_impact_team_we_are_releasing_the/

2020/04/23

Métodos para identificar el pinout de puertos seriales de dispositivos embebidos

Nos hallamos ante un dispositivo, por ejemplo un router, al que queremos acceder por el puerto serial. El enfoque que voy a desarrollar parte de unos conocimientos muy limitados de electrónica en general y digital en particular.

¿Por qué el puerto serial? Quizás es la única puerta abierta.



Buscar en el manual


Claramente es la fuente más confiable, mejor comprobar que las versiones correspondan.

En el caso de computadoras y microcontroladores es relativamente sencillo, pues la UART es una opción explícita, por ejemplo en la raspberry, pero en otros dispositivos donde no está expuesta y suele estar como canal de diagnóstico.



Buscar en Internet


Suele ocurrir que alguien ya lo investigó, nuevamente, comprobar que corresponda al equipo que tenemos. Por ejemplo es lo que hice en el análisis del  router al que le cayó un rayo, hallé el pinout en un video Bricked TP-Link WDR4300 Router Recovery Using UART Serial Converter Part #1



En este caso, el modelo no correspondía exactamente pero por todos lados decía eran equivalentes y comprobé primero la continuidad con el tester de Vcc y GRD y luego aposté que Rx y Tx estaban identificados correctamente.

Identificar los componentes


Esto nos permite hallar datasheets que usaremos luego, además de verificar que realmente haya un puerto serial. Entiendo que podría estar implementado por GPIO y no por un circuito dedicado, ya sea un chip o como parte del SoC, pero me imagino que debe ser una rareza, sobre todo en equipos más modernos.

Tengo por ejemplo el caso fallido del firmware de SENAO - Long Range Multiclient Bridge, un dispositivo que me regalaron y que estoy seguro que aunque no funcionaba prendía, cosa que no ocurrió cuando quise hacer esta exploración.

Tiene varios componentes interesantes:




UBICOM IP2022 Wireless Network Processor

ATMEL 0441, no sé qué es, supongo que es memoria flash

Una placa PCMCIA con antenas. Si existiera y yo pudiera conseguir una placa PCMCIA a puerto paralelo o GPIO y si pudiera intervenir el firmware, tendría una excelente oportunidad de cambiar el propósito del dispositivo.

Hay tres conectores, uno de ellos parece ser rs232 pero le falta el chip.






La datasheet el UBICOM dice cuáles pines pueden ser los seriales:




Aplicando el siguiente método, continuidad, comprobé que desde los pines hay pistas hasta el chip ausente, sólo me faltó el empeño de suponer que chip es y si los pines serían los apropiados.




Al documentar esto saqué las fotos y he descubierto que me hubiese ayudado
mucho mirar la foto bien grande mientras seguía las pistas.



En este caso bien puede ocurrir que el firmware no esté usando la UART pues el chip ni está, pero hasta prenderlo, no sabés.


Inspección visual y continuidad


Con un tester o un led, rastrear entre el pin, el conector y los chips si hay pistas que conecten de modo consistente.





 

 

Señales

 

Hasta acá nos manejamos con el dispositivo apagado, llegó la hora de prenderlo y ver que hace. Puede hacer falta conectarle algo al puerto serial, por ejemplo la parallella afirma que si no hay nada conectado al arrancar, no se habilita. Esto no lo comprobé.

Niveles

Con el tester podemos comprobar que Vcc y GND lo sean. Luego, en Rx no debería haber nada y en Tx un nivel alto.

Si estuviera transmitiendo como una consola serial de un sistema operativo al arrancar, Tx estaría cambiando pero muy rápido como para verlo con un tester.



Analizador lógico

Si los niveles eléctricos corresponden, podemos conectarle un analizador lógico como este, mencionado en esta conversación.


Esa captura se hace con sigrok-cli y luego se puede ver y decodificar con pulseview.

Ejemplo de decoder con sigrok-cli:

sigrok-cli  -d fx2lafw --time 3000 \
    --config "samplerate=1 MHz" \
    --triggers 0=1 --wait-trigger \

    -P uart:baudrate=9600

Start bit
1
1
1
0
0
1
1
0
g
Stop bit
Start bit
0
0
1
0
1
1
1
0
t
Stop bit
Start bit
1
1
0
1
0
1
1
0
k
Stop bit
Start bit
1
1
1
0
1
1
1
0
w
Stop bit
Start bit
1
0
0
0
0
1
1
0
a
Stop bit
Start bit
0
1
1
0
1
1
1
0
v
Stop bit
Start bit
1
0
1
0
0
1
1
0
e
Stop bit


En verde el mensaje transmitido.



Si no corresponden los niveles se puede hacer una adaptación que prefiero delegar a alguien que sepa.


Osciloscopio

El más caro de los métodos, si tenés dos canales podés ver ambos sentidos y si además tiene decodificador, podés ver pasar las letritas, pero tenés que acertarle al baudrate. En el osciloscopio que tengo yo eso no es gran problema, pues el decoding se hace sobre lo que ya está capturado en memoria, no hace falta recapturar.







Finalmente, de un modo u otro, una vez que tenemos identificados los pines, a jugar.

En las serie de artículos Jugando con los rayos, muestro en particular el uso para explorar el firmware.

Acá hay un ejemplo de como pasar de la UART a RS-232, que no he probado. Consiste en agregarle un chip y un par de conectores.

Y acá hay un ejemplo de modding muy intersante, mucho más ambicioso, pero en linea con mi objetivo estratégico de aprendizaje.

Conexión directa


Un último recurso es, habiendo identificado los niveles, conectar el Tx del dispositivo al Rx de una compu o microcontrolador, considerando correctamente la adaptación eléctrica que pueda haber e ir probando los distintos baudrates.


2020/04/18

Adaptación de Los Microcontroladores AVR de ATMEL a ATmega328p


En el 2012 Felipe Santiago Espinosa escribió un muy buen libro del tema y en 2017 lo compartió para que todos podamos leerlo. Cubre los micros atmega8 y atmega16, que son muy similares al que yo uso, ATmega328p.




Quería leerlo en la kindle pero se rompia al convertirlo y en algún momento le ofrecí que me pasara el documento original para convertirlo correctamente y compartirlo pero él prefirió no hacerlo. Como no estaba en ese momento en condiciones de leer fuera del horario de viaje, kindle, olvidé el asunto.

Ahora que he tenido que lidiar bastante con el ATmega328p para leer y escribir una PROM, estoy en mejores condiciones de estudiar el libro y de paso agregar la adaptación a ATmega328p. Esta lectura tambien me ha servido para decidir aspectos del Cooler para Switch, de próxima publicación y espero me sirva para diagnosticar una falla de comunicación serial con edu-ciaa-nxp.

Comprenderás que mi conocimiento está muy alejado del de Felipe, ciertas comparaciones y adaptaciones no las podré hacer, otras serán incompletas e incluso erradas, espero que poco.


No pienses que sé mucho o tengo mucha experiencia, cuando digo cosas como "Aunque el bit ADFR está en un diagrama del datasheet, el bit de free running es ADATE." no es que haya alguna vez usado free running, conceptualmente lo entiendo nada más y hasta ahí


Pude haber buscado "ATmega328p atmega8 differences", pero poco hubiese aprendido. Sin embargo al final sí lo busqué para ver de no haber malinterpretado nada.

No he estudiado el libro, no he leido con absoluta atención los temas generales de los cuales ya tengo conocimiento previo por haber leido a Tanenbaum, Hennessy & Patterson y haber cursado algunas materias, me he concentrado en las partes específicas AVR y más en las que pueda haber diferncia con ATmega328p.

Espero en algún momento hacer algunos de los ejercicios pues están muy buenos.


Muchos conceptos parecen corresponder a AVR core o Mega, así que quizás hay diferencias que se me escapan pues asumí que son comunes. No creo que haya hallado todo, para esa tarea se requiere la experiencia y conocimiento de alguien como el autor original.

El que haya hecho esto no implica que entienda todo ni mucho menos. Por ejemplo las partes de assembly las miré por arriba, siendo el dominio de este lenguaje una de mis deudas con la vida.

Ha sido una experiencia EXTREMADAMENTE instructiva, leer el libro y a la vez estar mirando la datasheet y adaptando, pero cuando iba por la página 50 de las 360 ya me quería matar, si no me creés, hacé la prueba. Como en casi todas si no todas mis notas publicadas, te recomiendo que en lugar de leer la nota lo hagas, la nota es para la gente más vaga y recordatorio de lo que he hecho. Lo interesante es que al haber terminado, no lo necesito más, o sea, si tuviera que repetir esta experiencia con otro libro y microcontrolador, he quedado mejor equipado mentalmente para no necesitar que correspondan.



Suficiente introducción, estos son mis hallazgos, siguiendo la siguiente nomenclatura:

[pXX] número de página sin tag, es por que corresponde a la extensión del texto a ATmega328p que es el objetivo inicial de todo esto. Las referencias al datasheet son a ATmega48A/PA/88A/PA/168A/PA/328/P 8271G–AVR–02/2013 que no es la última pero es la que tenía a mano, luego lo noté.

[pXX adaptación ] no digo que está mal, sólo que me despista, estoy acostumbrado a leer estos temas en inglés y no me molesta que en las traducciones se usen palabras de otros idiomas sin traducir, como cache, buffer, pipeline, stack, heap. Eso produce que al leer textos en español, ya sean nativos como este o traducidos, tenga momentos de pánico al no comprender alguna palabra.

[pXX actualización] si el libro fuera escrito ahora, habría que actualizar algunos datitos generalmente sin importancia

[pXX mi opinión] Ejemplos faltantes, no me puedo resistir, es mi manera de aprender.

[pXX errata] errorcitos de tipeo.


Sección 1.5.1 La Unidad Central de Procesamiento (CPU)

 

[p22 adaptación] segmentación es pipeline


Sección 1.5.4 Temporizador/Contador

 

[p26 errata] para programar la tarea cada VEZ que

Sección 1.6 Clasificación de los Microcontroladores 

 

[p29 actualización] 4, 8, 16, 32 y hasta 64 bits

[p29 mi opinión] ejemplo faltante de Pila, JVM

[p29 mi opinión] ejemplo faltante de Acumulador, la instrucción div de 8086


Sección 1.7 Criterios para la Selección de los Elementos de Procesamiento 

 

[p31 actualización] (costo de microcontrolador) 0.5 a 1000 u$s

Sección 2.1 Características Generales

 

[p36]
Memoria de código:  32KB.
Memoria de datos:  2KB.
Terminales para entrada/salida: 23.
Frecuencia máxima de trabajo: 20Mhz.
Voltaje de alimentación: de 1.8 a 5.5 V .
Temporizadores: 2 de 8 bits y 1 de 16 bits.
Canales PWM: 6.
Fuentes de interrupción: 23.
Interrupciones externas: 2.
Canales de conversión Analógico/Digital: 8 de 10 bits.
Reloj de tiempo real. NO TIENE.
Interfaz SPI Maestro/Esclavo.
Transmisor/Receptor Universal Síncrono/Asíncrono (USART).
Interfaz serial de dos hilos.
Programación “In System”.
Oscilador interno configurable.
Watchdog timer. 


[p36] ATmega328p está disponible en los encapsulados 28-pin PDIP, 32-lead TQFP, 28-pad QFN/MLF and 32-pad QFN/MLF y es pin compatible con ATmega8 al menos para 28-pin PDIP-

[p37] El ATmega8 y el ATmega328p incluyen 3 puertos, 2 de 8 bits y 1 de 7 bits

2.3 Memoria de programa 

 

[p40] 32KB de Flash, rango hasta 0x7FF

[p40] 23 fuentes de interrupción

[p41] Vectores de interrupción [datasheet p65 TAble 12-6]


2.4 Memoria de datos 

 

[p43] Figura 2.8 [datasheet p18 Figure 8-3]

2.4.1 Espacio de SRAM 

 

[p43] concluye en 0x08ff, tiene además 150 Registros Extendidos de I/O(que no sé lo que son) y 2048 de propósito general.

2.4.1.1 Registros I/O 

 

[p44] actualizar figura 2.9


2.4.2 Espacio de EEPROM 

 

[p48] EEPROM mide 1KB

[p49] existe EEAR9 por pasar de direccionar 512B a 1024B


2.6 Sistema de Interrupciones 

 

[p57] 10 interrupciones por temporizadores, una por watchdog

[p58 mi opinión] al comparar las direcciones de ATmega8 vs ATmega16 diria que las direcciones ocupan un byte y dos respectivamente.

2.7 Inicialización del Sistema (reset) 

 

[p61] ATmega328p tiene un handler de interrupción específico para WDT

[p61] ATmega328p no tiene reset por JTAG.

[p62] El registro MCUCSR es MCUSR.

2.8 Reloj del Sistema 

 

[p64 - p70] Las tablas de ajustes para los diversos clocks me superan, ver [datasheet p26].

2.9 Modos de Bajo Consumo de Energía

[p70] Comparte los modos de sleep de ATmega16.

[p72] Los bits de SE y SM[2:0] están en el registro SMCR[3:0] en 0x33 [datasheet p43].


3.1 Repertorio de instrucciones 

 

[p75] Para la ISA de ATMEL entiendo que existen "familias" tal como se vé en acá, así que toda esta sección ATmega328p corresponde a ATmega16 por ser de la misma familia, Enhanced Core with up to 128K ("AVR5", "AVR5.1").

4.1 Interrupciones Externas 

 

[p119-127] Acá hay varios temas, como tengo muy poca experiencia con interrupciones en general y no hice ninguna prueba, tomalo con precaución.
Por un lado, ATmega328p tiene dos interrupciones externas como ATmega8 y los registros están un poco cambiados.

Por el otro, ATmega328p soporta generar interrupciones a partir de prácticamente todos los pines [datasheet p71], agrupadas por puertos.

Una vez generada tenés que determinar cuál fué concretamente el pin que la generó. Acá hay una buena explicación.


4.1.1 Configuración de las Interrupciones Externas 

 

[p120] Los bits de MCUCR[3:0] de las interrupciones externas estan en EICRA[3:0] [ datasheet p 72]


4.1.2 Habilitación y Estado de las Interrupciones Externas

 


[p121] Los bits de GICR[7:6] están en EIMSK[1:0] [datasheet 73]

[p121] Los bits de GIFR[7:6] están en EIFR[1:0] [datasheet 73]


4.2 Temporizadores 

 

Parece que el tiempo no es lo mío, sólo pongo lo más evidente pero sin intentar desarrolla lo que implica.

4.2.3    Pre-escalador



[p133] No existe registro SFIOR ni bits PSR2 o PSR10, quizás sea CLKPR, pero no sé en qué me estoy basando.


4.2.5 Registros Compartidos por los Temporizadores

 


[p134 - 162] Varios registros como TIFR, TIMSK, TCCRx están duplicados o triplicados con A y B o 0-2.


4.1.3 Organización y Registros del Temporizador 2



[p144] ASSR tiene los bits movidos


4.3.1 Generación de PWM con los Microcontroladores AVR



[p155] para los modos PWM no hallé la info para llenar la tabla 4.17


5.1.4 El ADC de un AVR 

 

[p176] Aunque el bit ADFR está en un diagrama del datasheet, el bit de free running es ADATE.


5.1.5 Registros para el Manejo del ADC



[p178] ADTSx de SFIOR está en ADCSRA y B

[p186] AMCE de SFIOR está en ADCSRB

6.1 Comunicación Serial a través de la USART

 

Toda esta sección parece ser compatible pero los registros y los bits tiene los nombres muy levemente cambiados, por lo general tienen un cero, como si los del ATmega8/16 estuvieran pensados para ser únicos y los de ATmega328p para tener múltiples puertos, salvo que tiene uno solo.


6.1.4 Registros para el Manejo de la USART



[p200] Dice que el registro UBRRH comparte su dirección UCSRC. En ATmega328p son registros separados y con nombres UBRR0H y UCSR0C.

7.1.1 Registro para el Manejo del WDT 

 

[p252] El registro WDTCR es WDTCSR, tiene el WDIF (interrupt flag) y WDIE (interrupt enable) debido a que según lo visto en página 57 se puede disparar una interrupción con el WDT y un bit de prescaler extra, WDP3.

7.2.1 Organización de la Memoria Flash 

 

[p254] Las páginas de la memoria Flash de ATmega328p son de 64 words, tal como ATmega16.

[p255] La tabla 7.2 para ATmega328p es [datasheet p282 table 27-13]

[p255] El registro GICR[1:0] es MCUCR[1:0]


7.2.3.2 Capacidades para Leer-Mientras-Escribe 


[p260] La tabla 7.5 para ATmega328p es [datasheet p282 table 27-14]

7.2.3.3 Escritura y Borrado en la Memoria Flash


[P262] El registro SPMCR es SPMCSR


7.2.3.4 Direccionamiento de la Flash para Autoprogramación


[p265] En la tabla debe corresponder a ATmega16

7.3 Bits de Configuración y Seguridad

 

[268] La tabla 7.9 es [datasheet 288 Table 28-8]

[268] La tabla 7.10 es [datasheet 288 Table 28-9]

7.4.2 La Interfaz JTAG y los Mecanismos para la Depuración en un AVR

[270] ATmega328p no tiene JTAG


Y eso es todo amigues.