2019/05/19

Forzando Brutalmente MD5 - parte 3 - threads, forks



¿Venís de leer la intro, la parte 1 y la parte 2?

El tema


Desde hace años, tantos que ni es argumento de venta, tenemos computadoras multicore, esto es, que tienen varias CPUs. Pudo haber sido una novedad en desktop, pero en servidores hace rato que no lo es.

Esto puede ser de dos modos: que un mismo chip tenga varios cores o en una misma placa varios chips y estos a su vez varios cores.

Mi primera experiencia con multicore fue un mother dual Pentium 133, comprado en el Parque Los Andes de una pila de mothers de descarte que no estoy seguro de haberlo hecho arrancar. 

Por que el mundo y sus acontecimientos a veces es muy pequeño, en esa misma época por canje en un trabajo me dieron el mismo mother con sus CPUs y su gigante gabinete y sus placas EISA y ese si funcionó. Ahi pude probar un trabajo práctico de threads (Taller I) mientras también lo hacia en mi Pentium 3 de 700 y en una macintosh (PPC unicore) todo con linux. Esta última muy complicado pues sólo la pude hacer arrancar con un Gentoo y en el medio del proceso de instalación compilé y probé, ya que luego de la instalación el bootloader no funcionaba, muy complicado...

Volviendo al tema,  una fuerza que ha impulsado el mundo multicore es la dificultad creciente de aumentar la velocidad del reloj, al punto que se ha tendido incluso a bajar la velocidad para disminuir el consumo pero a la vez aumentado los cores para aumentar la capacidad de procesamiento.

Sin embargo, no importa cuantos cores tengas, el tiempo de una tarea no paralelizable depedende de la velocidad del reloj y sobre esto volveré en la parte de FPGA.

Dos maneras de ejecutar simultáneamente tareas es por medio de disparar programas a la vez (forks) o a un programa pedirle que ejecute una función en un hilo (thread) distinto.

 

Multicore
Multicore

 

Estas funciones o programas pueden tener propósitos distintos como tener en un core el procesamiento y en el otro la interacción con la interfaz gráfica o, como en el caso actual, hacer lo mismo con distintos sets de datos.

Algunas diferencias son que los forks se comunican mediante llamadas interprocesos, red, memoria compartida, archivos y los threads, como son parte de un mismo programa, por variables compartidas.

En este caso, como no hay comunicación, da lo mismo y de hecho la performance es la misma.

Se puede combinar con loop unroll y AVX2 y aumentar mucho el rendimiento. 

 

Multicore + AVX2
Multicore + AVX2





cpucpu unrollavx2avx2 + unrollthreads x4threads x 4
+ avx
threads x 32
velocidad5.79.628.447.932.5153.4179
rendimiento watt0.861.444.267.194.8823.013.1
rendimiento dolar2.38411.8319.9613.5463.9213.16


En el caso del threads por 32 se trata de dos CPU de 16 cores no pude ejectuar el ejemplo con dedicación exclusiva así que el rendimiento deber ser superior. Además, me parece recordar que no tenía AVX2, debía tener AVX y aunque se puede aprovechar no debo haber tenido ganas de hacerlo.



cpucpu unrollavx2avx2
+ unroll
threads x4threads x 4
+ avx2
threads x 32


5.709.6028.4047.9032.50153.40179.00
cpu5.701.001.684.988.405.7026.9131.40
cpu unroll9.60
1.002.964.993.3915.9818.65
avx228.40

1.001.691.145.406.30
avx2 + unroll47.90


1.000.683.203.74
threads x432.50



1.004.725.51
threads x 4
+ avx2
153.40




1.001.17
threads x 32179.00





1.00



 Código

  • https://github.com/cpantel/Forzando-Brutalmente-MD5/tree/master/v4_threads
  • https://github.com/cpantel/Forzando-Brutalmente-MD5/tree/master/v4_threads_32cores
  • https://github.com/cpantel/Forzando-Brutalmente-MD5/tree/master/v4_threads_avx2
  • https://github.com/cpantel/Forzando-Brutalmente-MD5/tree/master/v5_fork
Seguí con la parte 4

2019/04/26

FLISOL 2019

He tenido la oportunidad asistir a medias a dos flisoles y de dar una charla en ambas, paso a compartir la experiencia y las notas de la charla.



Avellaneda

Sólo pude asistir a la de Marcos Russo de centrux de Docker, me hubiera gustado que fuera más demo que presentación, entendiendo que habiendo conectividad dudosa se complica preparar el entorno para hacerla off-line.


CABA

Sólo pude asistir a la de Tor, que se convirtió más en meetup que la exposición planeada por que ocurrió una turbia circunstancia que impidió que quienes iban a exponer pudieran hacerlo. Pese a que no tengo información completa de lo que ocurrió, por lo cual no voy a decir nada más que lo que voy a decir, mi intuición me dice que fué un acto de malicia intencional.

Charla de ponderación y clasificación de vulnerabilidades


El objetivo como siempre es estimular el pensamiento atacante/defensor propio de la seguridad de la información, con la variedad de tener herramientas no tan subjetivas para evaluar como lidiar con la vulnerabilidades.

No voy a transcribir el contenido completo, ni pegar la presentación, es más bien un machete con las ideas principales y los links, útil para quien asistió y no tomó nota o por si la diera otra vez (lo dudo, la dí seis veces en el trabajo, ya me aburrió y creo que ya asistieron todas las personas a las que les podía interesar) tengas elementos para evaluar si te interesa asistir.


Dado el tiempo disponible de sólo la mitad no pude hacer los ejercicios que hago en el trabajo pero mejor, no creo que quienes están buena parte del día en el evento se aguanten dos horas de este tema.

Algunas definiciones



Falla: comportamiento no previsto

Amenaza: algo que puede dañar

Vulnerabilidad: defecto en un sistema que lo deja expuesto ante una amenaza

Vulnerabilidad: es una falla explotable




Riesgo: probabilidad de que el daño se produzca

Y esta es el primer acercamiento a medir una Vulnerabilidad:

Riesgo = Amenaza * Vulnerabilidad

Gestión de riesgo


  • Mitigar
  • Asumir
  • Transferir
  • Evitar
  • Ignorar (*)
  • No gestionar (*)

Las dos últimas no figuran en los libros pero si en la realidad y se las suele confundir con "Asumir".

Una pisca de teoría de Seguridad de la Información


  • Confidencialidad
  • Integridad
  • Disponibilidad
Esas tres palabrìtas son la base de la S.I., como armonìa, melodía y ritmo para la música y nos llevan al segundo acercamiento a medir algo:

Riesgo = consecuencia * probabilidad

Riesgo = (C + I + D) *(amenaza * exposición)

Se le da un valor entre 0 y 1 a cada aspecto.


Algunos métodos útiles para reflexionar

 

DREAD

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?



Se le pone a cada item un valor de 1 a 10.

Lo usó Microsoft hasta 2008.


Más detalles:  https://en.wikipedia.org/wiki/DREAD_(risk_assessment_model)

STRIDE

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



Fijage que en la columna de atributos deseados aparecen Confidencialidad, Integridad y Disponibilidad, sumándose autenticación, autorización y no repudio, que forman los seis conceptos básicos de la S.I.


Mas detalles: https://en.wikipedia.org/wiki/STRIDE_(security)

Detección de vulnerabilidades

  • Modelado
    • attack tree, data flow, stride, que pasa si...
  • Pentesting
    • white vs gray vs black box
    • perimetral (automática, infraestructura)
  • Análisis estático de código
  • in the wild
  • reportes ajenos


 CVSS V3


Y por fín, la medición actual, a leer:

https://www.first.org/cvss/calculator/3.0


Esta dividido en tres regiones:

Base: es la calificación de la vulnerabilidad "en el aire", sin relación con lo que la rodea, es atemporal, una vez definida no debería cambiar salvo se descubra un error.

Temporal: es una modificación introducida por la evolución en el tiempo de los exploits que hayan, la confirmación y corrección oficial

Entorno: es la aplicación en un entorno particular y considerando los requerimientos relativos a CID.

La clave de este tema es entender que el nucleo está conformado por el impacto en la Confidencialidad, Integridad y Disponibilidad.


Clasificación

 

Para mi hay distintas categorías de clasificación:

"Muertas", o sea, es un amontonamiento de información histórica y "Vivas", se van adaptando al momento, priorizan según algún criterio de frecuencia y éxito.