Para tratar de conseguir confidencialidad podemos usar la cryptografia , ¿Como?
Imaginemos 2 personas conectadas que tratan de comunicarse entre ellas de forma segura, para conseguirlo han usado una Key y cifrado, el que envia el mensaje lo encripta y el receptor lo decripta. En este caso la confidencialidad depende de la Key.
Para continuar tenemos que entender 2 conceptos importantes, la clave publica y la clave privada.
Public Key "Clave publica": emisor y receptor intercambian dos claves, receptor tiene la clave que sera secreta y la otra es publica, todos pueden verla. Requiere ser generada.
Private Key "Clave privada": se comparte entre emisor y receptor una clave que solo tienen que conocer ellos. tiene que ser random y el intercambio debe ser seguro.
Encriptar : E(KEY , Mensaje) -> cifrado
Decryption : D(KEY, cifrado) -> Mensaje/Error
Con estos dos ultimos conceptos es con los que mas se juega en criptografia, imagina que por ejemplo con E(Key1 , Texto1) consegumos un cifrado que fuse igual que E(Key, Texto2), significaria que podriamos llegar a ver como afecta la key al resultado. Entonces para definir seguridad tendriamos que decir que seguridad consiste en que sea imposible obtener cualquier informacion del cifrado. Solo consideramos que es seguro si el atacante al ver el texto cifrado no tiene mas informacion.
Para el intercambio de claves , hay que tener en cuenta que si las claves son muy pequeñas estadisticamente seria posible obtener la clave con cierta probabilidad alta, y si esta es demasiado grande receptor y emisor no podrian usarla. Para solucionar este problema usamos aritmetica modular tal que :

El problema que tenemos aqui es que si con g contenido en (Zp)*, y un h random de (Zp)*, se encuentra ga = h se podria romper puesto que se podria sacar las claves, entonces el sistema tiene que ser amplio con un N alto.
Pero sigue sin ser lo suficientemente seguro, debemos usar para ello Decisional Diffie-Hellman (DDH). Si se selecciona una g y una p dificiles el sistema tendria que ser resistente.
TLS/SSL: Para realizar el intercambio el protocolo que permite esto es TLS que sopora DH y ECDH (elliptic curves Diffie Hellman - mismo principio pero distinta aritmetica).
One Time Pad : K son bits randoms se aplica una operacion de XOR entre la clave y el mensaje. Con esto conseguimos seguridad mientras K solo se utilice una vez. Si se utliza dos veces podria usarse esa segunda para obtener el mensaje. c = K+m, c1 = K + m2 -> c+c1 = m+m1.
Tras el concepto inicial y comprobar que tiene que cumplir que para una misma key puedan usar un mismo algoritmo, tenemos el concepto de "Indistinguishability against chosen-plaintext attacks"- IND-CPA . Segun este un plan es seguro si no hay algún adversario que con un tiempo limitado consigue una probabilidad cerca de 1/2.
Determinista : para todo m tal que m, E(K,m) es siempre el mismo valor resultante
Indeterminista: para todo m tal que m, E(K,m) es resultante un valor random. Los IND-CPA tienen que ser indeterministas para ser seguros.
Private Key requiere llaves compartidas. El intercambio de claves resuelve esto pero necesita un protocolo. Receptor tiene que cambiar las diferentes claves con sus receptores. Con la encriptación clave pública, receptor genera un par de llaves publicas, las publica y se desconecta (sin Intercambio de claves). Puede recibir mensajes de muchos remitentes.
La clave privada es mas rapida , la publica necesita asumir mas problemas matematicos y por ende tenerlo mas en cuenta. La clave publica suele necesitar ser certificada para asegurarno de su autenticidad.
El Gamal PKE: ver mas

La clave de encriptación es pública y es diferente de la clave de desencriptación que se mantiene en secreto (privado). En rsa, esta asimetría se basa en la dificultad práctica de la factorización del producto de dos grandes números primos.
receptor seleccionan un p y un q primos, N = pxq , luego un e,d talque axd = 1 mod gam(N), sk (secreta)= (p,q,d) y pk (publica)= (N,e).
Se encrypt talque Enc(m,pk) = m^e mod N = c.
Se decrypt talque Dec(c,sk) = c^d mod N = m.
El problema sera por tanto cuando dado un c y (e,N), calcula m tal que m^e = c mod N. Ademas RSA es determinista puesto que es posible identificar que hay distintos m , por tanto es necesario hacerlo random.
La idea es poder asegurar que el emisor del mensaje es el verdadero autor del mensaje.

Block cipher es un algoritmo determinista que opera en grupos de bits de longitud fija, llamado bloques, con una transformación invariable especificada por una clave simétrica. Los cifrados de bloque funcionan como elementos importantes en el diseño de muchos protocolos criptográficos, y son ampliamente utilizados para aplicar la codificación de los datos de granel.
Toma una llave y un mensaje (plaintext) y productos una etiqueta Mac (k, m) → t.
Toma una llave, un mensaje y una etiqueta y productos aceptados (1) o Rechazo (0).
un atacante podria usar un tag visto anteriormente por tanto es necesario usar un HASH:
Entra un input con un tamaño variable y sale un mensaje con un tamaño fijo
Decimos que es seguro cuando ese mensaje solo se puede obtener con la clave y el mensaje original. Es decir H(x) = c , no existe otro H(x1) = c, cuando c=c2 decimos que hay colisiones. Ejemplos son MD5,SHA-1,SHA-2,SHA-3.
By the birthday paradox, a brute-force attack succeeds with probability 2^-L/2 ⇒ output length is critical
Buscaremos: Confidentiality, Integrity (Communication not modified), Authentication (Communication between intended parties), Availability (Communication happens in reasonable time).
La mayoria de los ataques en esta parte consisten en la intercepcion de paquetes, es necesario entender de protocolos de red para entender ciertos ataques y problemas.
El primer protocolo que veremos es HTTPS = HTTP over SSL/TLS, siendo TLS = Transport Layer Security y SSL = Secure Sockets Layer.

Confidentiality: utiliza cryptografia para encriptar los datos, cada conexion tiene sus propias keys, se negocian al comienzo de cada sesion.
Integrity: Cada mensaje tiene un mac para ver la identidad
Authentication: Se puede identificar a las dos partes con sus claves publicas (normalmente el servidor)
Cipher Suites: define el intercambio de las claves , el cifrado por bloques y el hash a utilizar. Se puede ver en el apartado de seguridad del navegador.
SSL Hanshake Protocol: se intercambian las claves, se autentifican , usan la clave publica, certifican esa clave y por tanto al termina la comunicacion esta cifrada y firmada.
Certificados: Para confirmar las diferentes partes se utilizan certifcados, estos son generado por diferentes entidades que se encargan de su proteccion y reparto. Ademas de la revocacion , hay dos formas de cancelar un certificado - Certificate Revocation Lists (CRL) y Online Certificate Status Protocol (OCSP).


En este ataque el atacante lo que hace es simular que el es el servidor , cuando el usuario se quiere conectar con la pagina el atacante simula ser la pagina.
Como funciona si hay certificacion y clave publicas ... antes del https habia mucha facilidad para este ataque, con la llegada de los certificados los pasos consisten en que el atacante falsifica el certificado o simplemente usa uno distinto por eso muchas paginas tienen certificados con dominio. La manera de asegurar que es el certificado correcto es en el navegador con el candado ver que efectivamente la entidad que lo suministra es la correcta.
SNI : permite a un servidor presentar multiples certificados para sus diferentes puertos.
SSL Strip Attack [Moxie, 2009]: Muchos usuarios olvidan poner https y ponen http sin pensar que puede ser una copia de la web a la que ellos querian llegar.
No solo eso los propios desarrolladores usan contenido que no es https que hacer que todo el trabajo de certificacion no se seguro. Solution: Strict Transport Security: Usar en todo https

Las compañias suele usar estos metodos para controlar las conexiones de sus empleados: HTTP tunnel y Man in the Middle interception
Consiste en atacar la disponibilidad de un sistema. Se consigue mandando trafico sobre la red.

Consiste en la no autenticacion de las dirrecciones IP, el atacante falsifica su origen y pone la del servidor que quiere atacar, entones le llegara una oleada de paquetes (normalmente se busca una llamada que gener mucho trafico). LA solucion para este tipo de ataques es Ingress Filtering, osea filtrado por ip realizado por el ISP (tu distribuidor de internet por asi decirlo).
Consiste en que la vistima no pueda acceptar mas conexiones, se llena el buffer de SYN de la vistima. La unica solucion son las syn cookies : consiste en una seleccion de numeros para realizar la sincronizacion ISN S = SYN Cookie = t mod 32 || m || s

El atacante selecciona un destino y este obtiene las respues de las victimas.
Send traffic to reflector using Target’s IP as source IP address.Reflector response > Attacker request.

La idea es crear un grupo de host para realizar los ataques de forma simultanea. Hay paginas que permiten contratar este tipo de servicios. Se puede realizar con Reflector y aumentar el tamaño del ataque.
Se ataca al DNS y no al servidor (el DNS no pude dar la ip del dominio y es imposible acceder sin conocer la ip del dominio)
Proxys que interceptan el trafico HTTP e impiden este tipo de ataques. Tambie hay otros como los captchas o DDOos Protection Servicies

Buscaremos: Confidentiality, Integrity (Communication not modified), Authentication (Communication between intended parties), Availability (Communication happens in reasonable time).
Los defectos son partes del software mas implementadas, las vulnerabilidades son un defecto de software pertinente que puede ser explotado para efectuar un Comportamiento no deseado.
Un adversario no es un usuario normal!! Por tanto tenemos que no tener bugs ni flaws (errores de diseño)
Se examina el codigo del programa, piensas distintos posibles comportamientos.
Se selecciona una parte del codigo , para este buscamos lo que se denomina abstract domain, este determina el acierto, el coste en tiempo y espacio. Es importante acotar lo maximo posible el resultado para tener mas precision.
Con la ejecucion del programa, miramos la ejecucion, debemos ver que medir (valores, tiempo de ejecucion, uso de memoria, frecuencia..)y que debe retornar.
Es mas preciso que el static.
Es posible mezclar los dos para conseguir una mayor aproximacion
Utilizan errores de memorias en programas que utilizan lengaujes como C o C++ donde tienes que tener en cuenta la memoria que utilizas.
para este caso es necesario tener en cuenta loos espacios reservados, los saltos entre funciones...
La idea es utilziar esos bloques libres para poder meter nuestro codigo e infectar el sistema.
Para evitar estos errores puedes usar lenguajes que tengan compiladores con pruebas de violacion de memoria. Tambien puedes ir linea a linea mirando que esa memoria no sea corrompible. Detect overflows with canaries: escribe un valor random en memoria y comrpueba si sigue ahi al ejecutar el programa.

Heartbleed El mensaje especifica la longitud de su porción de echo - back, pero el SSL software no comprobó que la longitud fuera exacta.
Dangling Pointers Un error de puntero se produce cuando un puntero es liberado, pero el programa sigue utilizándolo. Un atacante puede arreglar la memoria liberada que sea reasignada y sea de su control.
Control flow integrity: se reliza un grafo con las llamadas entre funciones. Video explicativo
In-line Monitor: Insertar una etiqueta justo antes de la dirección objetivo de una transferencia indirecta. Introduzca código para comprobar la etiqueta del objetivo en cada transferencia indirecta.
Injection: Los ataques de inyección se aplican a una aplicación en incluir Los comandos no deseados en los datos envían a un intérprete. Por ejemplo pasos para SQL injection :
Taint Analysis : no confies en lo que introduce el usuario. En cuanto una var esta afectatada o tainted todas las que interectuan con ella lo estan.
Que es ? El objetivo generar datos de mal generidad, generados automáticamente diseñados, para activar defectos de implementación.
el objetivo es mirar si al meter strings aleatorios vemos algun error.

Side channel:Es cualquier ataque basado en la información obtenida de la aplicación de un sistema informático, en lugar de debilidades en el propio algoritmo implementado (por ejemplo, cryptanalisis y fallos de software). La información, el consumo de energía, las filtraciones electromagnéticas o incluso el sonido pueden proporcionar una fuente adicional de información, que puede ser explotada.
fijarse en cosas como lo que tarda en darte la respuesta incorrecta y asi poder sacar la respuesta correcta testeando caracter a caracter cual va tardando mas y por tanto es cierto.
Cache-based Side Channel

Un programa al finar el pasar y tratar memoria de un punto a otro (prg): Mems -> Mems
Es necesario formailizar los programas en forma de sintaxis acotando las variables ... σ ∈ Mems = Vars → ℕ. infoflow-basics
Reglas de asignacion : ninguna variable secreta puede ser asignada a una variable publica.
Reglas de IF: una variable secreta no puede ser determinante para el valor de una clave publica
Variables publicas y privadas, el atacante puede ver las publicas , casos Non-interference ( ):
program f1(xpublic, xsecret) {
xpublic = xsecret + 1
}
Caso malo , decidimos el valor de la variable publica en funcion de una privada que viene de memoria
--
program f2(xpublic, xsecret) {
xsecret = 0
xpublic = xsecret + 1
}
bien
--
program f3(xpublic, xsecret) {
xsecret = xpublic + 1
}
bien
--
program f4(xpublic, xsecret) {
xsecret = 1
}
bien -> se asgina una variable privada, no afecta en ningun momento la publica
--
program f5(xpublic, xsecret) {
if (xsecret==0)
xpublic = 1
else
xpublic = 0
}
mal -> una varibale secreta que viene de memoria no puede incidir sobre una variable publica
La cuestión es que una variable secreta (no modificada) no puede inferir en variables públicas, ya sea explícitamente (asignación) o implícitamente (si se declara secreta y asignación a público). Ademas la secreta siempre tiene que venir de memoria sino es asi y modifica la publica no seria caso nulo.
NI permite comprobar de forma statica si es seguro y de forma dinamica.
La principal idea de este ataque es explotar como funciona la memoria cache, la cache aumenta la velocidad considerablemente pero al mismo tiempo al guardar los datos importantes es posible atacarla y sacar informacion importante.
Si el atacante pone en cache sus datos la cpu puede ejecutarlos por tanto es importante tener en cuenta como funciona y como es vulnerable.
covert channel: dos procesos pueden construir un canal encubierto basado en las instrucciones de AVX como sigue. Aquí, supongo que el proceso p1 envía información y el proceso p2 lo recibe. Para enviar un poco a procesar p2, el proceso p1 ejecuta una instrucción de AVX (si es b = 1) o no AVX (si b = = 0). Para leer el bit b, el proceso p2 ejecuta una instrucción adicional de AVX para la cual él es la ejecución. Si la instrucción de p2 se llevó 1 ciclo, entonces b es 1. Si la instrucción de p2 tomó 51 ciclos, entonces b = 0.
Como es habitual, los procesos tienen que ponerse de acuerdo sobre la tasa de transmisión y la programación. Esto también debe tener en cuenta el tiempo suficiente para dejar que AVX se apague después de cada transmisión (por ejemplo, no pueden transmitir más de 1 bit por 200 ciclos).
Conclusiones: Son parte de las cpu modernas y hay que tenerlos en cuenta, no vale solo con Retrocediendo estado,