Mostrando entradas con la etiqueta Seguridad. Mostrar todas las entradas
Mostrando entradas con la etiqueta Seguridad. Mostrar todas las entradas

sábado, 5 de febrero de 2022

Análisis técnico de la vulnerabilidad Log4Shell


Log4Shell fue (¿es?) una vulnerabilidad descubierta a finales de noviembre del 2021 (CVE-2021-44228) por la que un atacante podría ejecutar código malicioso dentro de un servidor ajeno de una forma extremadamente simple y que casi puso internet patas arriba. Vamos a analizar el tema técnicamente.

Recursos para este artículo


Puedes encontrar el código fuente de todo el artículo en:


Puedes encontrar las versiones vulnerables de Log4J en:


Y la última versión no vulnerable en:


Descárgate el código de ejemplo, y descomprime los zips descargados en la carpeta src, de la siguiente forma:


¿Qué es Log4j?


Apache Log4j es una librería de código abierto muy popular para logs en java. Es extremadamente versátil y escalable.

Entiéndase como logs, el registro de mensajes o sucesos de los que se quiere dejar una constancia tal como si fuera una bitácora. Para ellos se puede usar Apache Log4j.

De forma muy sencilla se indica al Log4J que debe guardar el evento, que entre otros podría ser un error, una advertencia, o un mensaje informativo. El evento o mensaje a guardar es transformado (en caso de ser necesario) y almacenado en un repositorio.

El cómo es transformado nuestro mensaje y cuál es el repositorio donde va a ser guardado es algo que se puede elegir por configuración y que es totalmente ajeno a nuestro programa. El repositorio pudiera ser:

  • La misma consola (es decir el mensaje se muestra por consola).
  • Un archivo de texto.
  • Una base de datos.
  • Un correo electrónico.
  • Incluso podría ser un WebService.
  • O cualquier cosa que se nos ocurra a futuro.

Aquí hay una se las principales ventajas de la arquitectura del Log4J. Nuestros sistemas desconocen (y no tienen que preocuparse) acerca de cómo y dónde se van a guardar nuestras bitácoras ya que esto se puede configura fuera de manera externa.

Hay una separación clara del negocio que resuelve nuestra aplicación, y de aspectos técnicos, en cierta manera “intrascendentes” sobre cómo y donde se guardan nuestros logs, lo cual es lo ideal en un desarrollo empresarial de software.

Veamos un ejemplo de cómo funciona esto:

Log4ShellEjemplo1.java
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Log4ShellEjemplo1 {
 
    public static void main(String[] args) {
 
        //Creola clase encargada de las bitacoras
        Logger logger = LogManager.getLogger(Log4ShellEjemplo1.class);
 
        //Creo la clase para leer stdin
        Scanner in = new Scanner(System.in);
 
        //Presetacion de la aplicación
        System.out.println("Bienvenido a la aplicacion, por favor indique su usuario.");
        System.out.println();
 
        //Solictud de usuario
        System.out.print("Usuario: ");
        String usuario = in.nextLine();
 
        // ....
 
        //Se avisa que el usuario no es correcto y se guarda un evento en la bitacora
        System.out.println("Su usuario es incorrecto.");
        logger.error("El usuario '%s' es incorrecto.".formatted(usuario));
 
    }
}
 
 
public class Log4ShellEjemplo1 {

    public static void main(String[] args) {

        //Creola clase encargada de las bitacoras
        Logger logger = LogManager.getLogger(Log4ShellEjemplo1.class);

        //Creo la clase para leer stdin
        Scanner in = new Scanner(System.in);

        //Presetacion de la aplicación
        System.out.println("Bienvenido a la aplicacion, por favor indique su usuario.");
        System.out.println();

        //Solictud de usuario
        System.out.print("Usuario: ");
        String usuario = in.nextLine();

        // ....

        //Se avisa que el usuario no es correcto y se guarda un evento en la bitacora
        System.out.println("Su usuario es incorrecto.");
        logger.error("El usuario '%s' es incorrecto.".formatted(usuario));

    }
}
Log4ShellEjemplo1.cmd
 
1
2
3
4
5
6
7
8
@ECHO OFF
 
REM CLASSPATH con las versiones vulnerables.
SET CLASSPATH=apache-log4j-2.14.1-bin\log4j-core-2.14.1.jar;apache-log4j-2.14.1-bin\log4j-api-2.14.1.jar
 
REM Ejecuto el ejemplo.
java Log4ShellEjemplo1.java
PAUSE
 
 
@ECHO OFF

REM CLASSPATH con las versiones vulnerables.
SET CLASSPATH=apache-log4j-2.14.1-bin\log4j-core-2.14.1.jar;apache-log4j-2.14.1-bin\log4j-api-2.14.1.jar

REM Ejecuto el ejemplo.
java Log4ShellEjemplo1.java
PAUSE

En el ejemplo anterior se da la bienvenida a una aplicación y se pide un usuario para acceder, se indica que dicho usuario es incorrecto, y se guarda el suceso por medio de Log4J.

Bienvenido a la aplicacion, por favor indique su usuario.

Usuario: Desde las horas extras

Su usuario es incorrecto.

19:32:27.246 [main] ERROR Log4ShellEjemplo1 - El usuario 'Desde las horas extras' es incorrecto.

Presione una tecla para continuar . . .

Sin ninguna configuración por defecto, el “repositorio” para guarda los registros en la misma pantalla (es decir que simplemente se imprimirá el mensaje).

Ahora vamos agregar un archivo de configuración para que en lugar de mostrar la bitácora por pantalla, lo guarde en un archivo de texto (Log4ShellEjemplo2.log), lo que sería mucho más común:

Log4ShellEjemplo2.cmd
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
status = error
name = Log4j2PropertiesConfig
 
appenders = file
 
appender.file.type = File
appender.file.name = FileLogger
appender.file.filename = Log4ShellEjemplo2.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = %d [%t] %-5p %c - %m%n
 
rootLogger.level = debug
rootLogger.appenderRefs = file
rootLogger.appenderRef.file.ref = FileLogger
 
 
status = error
name = Log4j2PropertiesConfig

appenders = file

appender.file.type = File
appender.file.name = FileLogger
appender.file.filename = Log4ShellEjemplo2.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = %d [%t] %-5p %c - %m%n

rootLogger.level = debug
rootLogger.appenderRefs = file
rootLogger.appenderRef.file.ref = FileLogger
Log4ShellEjemplo2.properties
 
1
2
3
4
5
REM CLASSPATH con las versiones vulnerables.
SET CLASSPATH=apache-log4j-2.14.1-bin\log4j-core-2.14.1.jar;apache-log4j-2.14.1-bin\log4j-api-2.14.1.jar
 
REM Ejecuto el ejemplo.
java -Dlog4j.configurationFile=Log4ShellEjemplo2.properties Log4ShellEjemplo1.java
 
 
REM CLASSPATH con las versiones vulnerables.
SET CLASSPATH=apache-log4j-2.14.1-bin\log4j-core-2.14.1.jar;apache-log4j-2.14.1-bin\log4j-api-2.14.1.jar

REM Ejecuto el ejemplo.
java -Dlog4j.configurationFile=Log4ShellEjemplo2.properties Log4ShellEjemplo1.java

Vemos como no hemos tenido que modificar código para modificar esta funcionalidad, simplemente hemos realizado una configuración.

Bienvenido a la aplicacion, por favor indique su usuario.

Usuario: Desde las horas extras

Su usuario es incorrecto.

Presione una tecla para continuar . . .


Por comodidad, seguiremos trabajando con el ejemplo uno y revisaremos los resultados por pantalla.

Uso de Lookups


Los Lookups son una caracterista de Log4J que permite sustituir ciertos valores en el mensaje indicado, por valores almacenados en memoria o obtenidos al vuelo al momento de realizar el log.

Por ejemplo si quisiera guardar el runtime de java podría usar el siguiente Lookup {java:runtime} o si quisiera la versión del sistema operativo pudiera usar esta {java:os}

Veamos esto funcionando, en el lugar de nuestro usuario vamos a poner la siguiente cadena Nuestro usuario es ${java:os}

En la salida del programa se ve la versión del sistema operativo.

Bienvenido a la aplicacion, por favor indique su usuario.

Usuario: Nuestro usuario es ${java:os}

Su usuario es incorrecto.

20:11:23.595 [main] ERROR Log4ShellEjemplo1 - El usuario 'Nuestro usuario es Windows 10 10.0, architecture: amd64-64' es incorrecto.

Presione una tecla para continuar . . .

Parece raro o poco conveniente, que un valor introducido por un usuario modifique lo que se va guardar en el lo g , aunque se podría alegar que de todas formas dicho valor o modificación se guarda en los medios que dispone la aplicación para tal efecto.

Pero los Lookups , son mucho más avanzados, pueden por ejemplo obtener el valor de a escribir en el log mediante HTTP, LDAP o RMI (entre otros) es decir mediante una conexión externa a equipos

Preparación para estudiar la vulnerabilidad


Para entender de manera segura la vulnerabilidad, se creó un simple programa servidor en java, que lo único que hace es esperar una conexiones y mostrar lo que se envié por pantalla.

SimpleJavaServer.java
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public static void main(String[] args) {
 
   //Reviso el puerto
   if (args.length < 1) {
     System.out.println("Debe especificar el puerto.");
     return;
   }
   int port = Integer.parseInt(args[0]);
 
   //Abro el sockect de escucha
   try (ServerSocket serverSocket = new ServerSocket(port)) {
 
     while (true) {
 
       //Quedo en espera
       System.out.println("Escuchando en el puerto " + port + ".");
       Socket socket = serverSocket.accept();
       System.out.println("Cliente conectado\n");
 
       //Creo el buffer de lectura
       InputStream input = socket.getInputStream();
       int buffSize = socket.getReceiveBufferSize();
       byte[] bytes = new byte[buffSize];
 
       //Leo los datos y cierro la conexiones
       int count = input.read(bytes);
       System.out.write(bytes, 0, count);
       socket.close();
       System.out.println();
        
     }
 
   } catch (IOException ex) {
     System.out.println("Server exception: " + ex.getMessage());
     ex.printStackTrace();
   }
 }
 
 
public static void main(String[] args) {

   //Reviso el puerto
   if (args.length < 1) {
     System.out.println("Debe especificar el puerto.");
     return;
   }
   int port = Integer.parseInt(args[0]);

   //Abro el sockect de escucha
   try (ServerSocket serverSocket = new ServerSocket(port)) {

     while (true) {

       //Quedo en espera
       System.out.println("Escuchando en el puerto " + port + ".");
       Socket socket = serverSocket.accept();
       System.out.println("Cliente conectado\n");

       //Creo el buffer de lectura
       InputStream input = socket.getInputStream();
       int buffSize = socket.getReceiveBufferSize();
       byte[] bytes = new byte[buffSize];

       //Leo los datos y cierro la conexiones
       int count = input.read(bytes);
       System.out.write(bytes, 0, count);
       socket.close();
       System.out.println();
       
     }

   } catch (IOException ex) {
     System.out.println("Server exception: " + ex.getMessage());
     ex.printStackTrace();
   }
 }
SimpleJavaServer.cmd
 
1
2
3
REM Ejecuto el ejemplo.
java SimpleJavaServer.java 8888
PAUSE
 
 
REM Ejecuto el ejemplo.
java SimpleJavaServer.java 8888
PAUSE

Si hacemos una petición en nuestro navegador a http://127.0.0.1:8888/ejemplo obtendremos el siguiente resultado.

Escuchando en el puerto 8888.
Cliente conectado
GET /ejemplo HTTP/1.1
Host: 127.0.0.1:8888
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: es-US,es-419;q=0.9,es;q=0.8,en;q=0.7

Explicación de la vulnerabilidad


Lo grave de la vulnerabilidad Log4Shell, es poder ejecutar código en el sistema que está usando el log , es decir en un servidor web que será víctima de un ataque, de una forma bastante simple.

Esto se consigue usando protocolos como LDAP o RMI:

  • LDAP: Ofrece una organización estructurada de objetos, a la que se puede realizar consultas, muy utilizado empresarialmente.
  • RMI: Es un protocolo para ejecución y acceso a código remoto en Java.

Ambos permiten exportar una clase de java, que se instancian y ejecutara en una maquina ajena que lo solicite. Es decir si por ejemplo guardamos un log de la siguiente forma (con una versión log4j vulnerable):

Mi usuario es ${jndi:ldap://127.0.0.1:8888/ejemplo}

Se conecta al servidor 127.0.0.1 y descarga una clase Java posiblemente maliciosa que ejecutar en el contexto de la aplicación (el servidor web en casi todo el caso). Específicamente ejecutará el código ToString() de la c lase maliciosa , para intentar obtener una cadena de texto que guardar en el log. En dicho ToString() estará el código que se ejecutará en el servidor.


Veamos nuestro ejemplo y como ciertamente se intenta conectar al servidor (omitimos la parte del envío y la creación de la clase maliciosa):

  • Iniciamos SimpleJavaServer.cmd
  • Iniciamos Log4ShellEjemplo1.java
Utilizamos la cadena Mi usuario es ${jndi:ldap://127.0.0.1:8888/ejemplo}

Ejecución de Log4ShellEjemplo1

Bienvenido a la aplicacion, por favor indique su usuario.

Usuario: Mi usuario es ${jndi:ldap://127.0.0.1:8888/ejemplo}

Su usuario es incorrecto.

20:59:47.680 [main] ERROR Log4ShellEjemplo1 - El usuario 'Mi usuario es ${jndi:ldap://127.0.0.1:8888/ejemplo}' es incorrecto.

Presione una tecla para continuar . . .

Resultado en SimpleJavaServer


Vemosque efectivamente se conecta y hace una petición (la cadena de texto no es sustitutiva ni ejecutada por qué en el ejemplo no se devuelve una clase maliciosa)

Los caracteres extraños que se muestran es parte de la petición ldap, como no hay una respuesta satisfactoria (por parte del programa de pruebas) se cierra la conexión.

Actualización a versiones no vulnerables


Las versiones vulnerable son desde la versión2.0 a la2.14.x , en la versión2.15 la funcionalidad esta deshabilitada por defecto y en la2.16 la funcionalidad se removió completamente.

Hay que considerar que esta vulnerabilidad afecta a versiones de log4j para Java, con lo que tenemos que tener (en ejecución) algún sistema java, como una servidor o aplicación web con aplicaciones en Java, que use las versiones vulnerables.

Otros frameworks para guardar logs, o en otras tecnologías (como NLog), no son vulnerables por esta circunstancia específica (aunque pueden tener otras vulnerabilidades específicas o no descubiertas que nada tienen que ver con ese tema).

¿Cómo se mitiga el efecto?


La forma más segura de mitigar el efecto es actualizar nuestro software a versiones que no son vulnerables.

Si esto no es posible, se puede deshabilitar la funcionalidad de Lookups, al configurar la máquina virtual de java con el siguiente parámetro.

-Dlog4j2.formatMsgNoLookups=true

Log4ShellEjemplo3.cmd
 
1
2
3
4
5
6
REM CLASSPATH con las versiones vulnerables.
SET CLASSPATH=apache-log4j-2.14.1-bin\log4j-core-2.14.1.jar;apache-log4j-2.14.1-bin\log4j-api-2.14.1.jar
 
REM Ejecuto el ejemplo.
java -Dlog4j2.formatMsgNoLookups=true Log4ShellEjemplo1.java
PAUSE
 
 
REM CLASSPATH con las versiones vulnerables.
SET CLASSPATH=apache-log4j-2.14.1-bin\log4j-core-2.14.1.jar;apache-log4j-2.14.1-bin\log4j-api-2.14.1.jar

REM Ejecuto el ejemplo.
java -Dlog4j2.formatMsgNoLookups=true Log4ShellEjemplo1.java
PAUSE

Otra forma de mitigar el efecto, si la actualización no es posible, es descomprimir el jar de log4j, borrar la clase JndiLookup.class y volver a generar el jar.

Ejemplo con versiones no vulnerables


Log4ShellEjemplo4.cmd
 
1
2
3
4
5
6
REM CLASSPATH con las versiones no vulnerables.
SET CLASSPATH=apache-log4j-2.17.1-bin\log4j-core-2.17.1.jar;apache-log4j-2.17.1-bin\log4j-api-2.17.1.jar
 
REM Ejecuto el ejemplo.
java -Dlog4j2.formatMsgNoLookups=true Log4ShellEjemplo1.java
PAUSE
 
 
REM CLASSPATH con las versiones no vulnerables.
SET CLASSPATH=apache-log4j-2.17.1-bin\log4j-core-2.17.1.jar;apache-log4j-2.17.1-bin\log4j-api-2.17.1.jar

REM Ejecuto el ejemplo.
java -Dlog4j2.formatMsgNoLookups=true Log4ShellEjemplo1.java
PAUSE

Conclusiones finales


Esta vulnerabilidad fue especialmente peligrosa por dos motivos :

  • La cantidad de sitios creados en Java, y que usan log4j es inmensa, además que s on máquinas que forzosamente están conectadas a internet.
  • El modelo de distribución de componentes y aplicaciones en java (basado en jar y parecidos), a diferencia del modelo clásico de librerías comunes, es difícil de actualizar . Frecuentemente se distribuyen todas las dependencias (como log4j) como parte de la aplicación final y esto implicaría que puede estar muchas veces duplicado en una mism a máquina y su sustitución no es fácil (si hay que hacerla de forma inmediata, como este caso).

Hay que considerar que uno de los problemas de esta vulnerabilidad es que ofrece una funcionalidad que estaba activada por defecto y que además permitía salir por defecto a obtener información de otras máquinas, sin ninguna restricción aparente. Puede que esta funcionalidad fuera interesante, y puede que hasta conveniente en algunos casos particulares, pero el hecho de no estar restringido desde un momento, es lo que lo hace demasiado ingenua. Recordemos que nuestra seguridad y nuestro diseño debe estar pensando como una “lista blanca”, en lugar de una “lista negra” (es decir nuestro diseños de seguridad se deben basar en habilitar funcionalidad y permisos explícitamente y no en negarlos explícitamente)




Si te ha gustado la entrada, ¡Compártela! ;-)

martes, 16 de junio de 2020

Seguridad y factores de autentificación. Casos de Fraude y Vulnerabilidades.

¿Por qué cada vez es más complicado seleccionar un password y hay cada vez más medidas y controles de seguridad?

Esto es porque dependemos más de “almacenar” y organizar nuestra vida en medios digitales, y estos datos privados adquiere un cierto valor para usarse de forma maliciosa de diversos formas, como por ejemplo robarnos el dinero que tenemos en nuestras cuentas bancarias.

Los formas tradicionales de protección se hacen obsoletos muy rápido, y las formas de obtener nuestros datos, se vuelve cada vez mas ingeniosas, y se alejan de un clásico ataque de película de hacker, en la que se usan puertas traseras o complicados códigos. La mayoría de los ataques se bajan en ingeniería social aprovechándose de la inocencia e ingenuidad (a veces de la avaricia), de los usuarios.

Vamos a analizar las formas de proteger nuestros sistemas y algunos ataques clásicos que los vulneran.


Diferencia entre privado y secreto


Ante de nada hagamos una diferencia entre que es privado y que es secreto:

  • Privado: Es un dato que solo debemos compartir con personas autorizadas, cuanto menos personas sepan este datos, más seguro es. Generalmente son datos que sirven identificarnos y se complementan con un dato secreto.

  • Secreto: Son datos que solo nosotros debemos conocer, no debemos proporcionarlos a nadie, y en el momento de usarlos debemos ser nosotros mismos los que los usemos a través de un sistema, sin ninguna iteración humana adicional.


Factores de autentificación


Los factores de autentificación son “categorías” que clasifican formas que tiene un usuario de autentificarse dentro de un sistema.

En la actualidad se debe combinar más de un factor de autentificación (más de una forma de autentificación) para garantizar la seguridad de un sistema.

Factor cero de autentificación. Algo que se sabe en común


La autentificación se basa en algo el que usuario (o cliente), y la institución (o empresa) conocen. Este dato debe ser privado, pero en muchos casos se acaba convirtiendo en un elemento público, algunos datos son:

  • Número de cuenta, cliente: Deben ser privados pero generalmente no es así, ya que es el elemento con el cual generalmente nos identifican en un primer nivel y hay que compartir.

  • Números de tarjeta: Debieran ser secretos, pero el simple de usarlas lo expone continuamente.

    Una forma muy sencilla de obtener este dato por parte de empleados maliciosos es la siguiente:

    Al momento de pagar, con papel de carbón o algún tipo de superficie que se marque con la presión, graban estos números simplemente apretando la tarjea con la superficie (recordemos que estos números tienen relieve), es algo muy rápido y pasa desapercibido porque puede estar oculto debajo de la terminal (o incluso en el pantalón) posteriormente con la excusa (o el gesto) de revisar la firma aprenden de memoria el CVE. De esta forma ya tienen el número de tarjeta, la fecha y el CVE, con lo que pueden realizar comprar por internet. Esto es muy común en comercios muy congestionados, donde la prisa se junta con el movimiento del empleado como gasolineras que no son de autoservicio.

    ¿Qué se recomienda en esto casos?:

    • Tapar el CVE, con un poco de papel, o cinta, de forma que sea imposible, revisar este número.

    • Nunca pagar con debito, si no con crédito. Es mucho más fácil ganar una reclamación cuando estas pagan con crédito (ya que le dinero nunca es tuyo y el banco se puede negar a pagar a un negocio fraudulento), que pagar con debito (donde si es tu dinero, y cuando lo pierdes, es más difícil reclamarlo).

    • No activar la compra por internet con tarjetas físicas, sino con tarjetas digitales, que ofrezcan medidas de seguridad como un CVE cambiante, y otras medidas de personalización.

    • Nunca pagar por teléfono (en un llamada telefónica) con la tarjeta.

    • Y sobre todo, nunca, nunca, perder de vista tu tarjeta, por ningún motivo, incluso, si el empleado se tarda mucho en cobrar, hay que pedir que se devuelva la tarjeta. Es común que en un escenario de fraude, el empleado haga que no entra la tarjeta y tiene que llamar a alguien o hacer una operación especial, para liberar el cobro, aprovechando para tomar los datos de la tarjeta.


  • Usuarios: Un usuario que identifica al cliente. Aunque este dato generalmente no se tiene que compartir a una persona (porque es privado y se usa generalmente dentro de sistemas), suele ser conocido por la institución (en decir en ninguna forma esta encriptado de forma no reversible) ya que es un elemento de referencia y seguimiento para distintas actividades.

  • Email o teléfono: Se usan frecuentemente y cada vez más como medios de autentificación, debido a que son fáciles de recordar, pero son extremadamente públicos, con lo cual son el primer punto de entrada para un hackeo.


El problema de este factor de autentificación es que a pesar de sus distintos niveles de privacidad, es necesario que tanto la institución, como el usuario, intercambien de forma clara el “dato”, que ambos conocen para garantizar que el otro también lo conoce, pero al hacerlo comprometemos el datos en si, por que no sabemos si realmente la persona o contraparte con lo que estamos hablando es la intuición, el cliente o solo alguien que quiere obtener dicho dato (para efectos maliciosos).

Factor uno de autentificación. Algo que solo el cliente sabe.


Generalmente aquí estamos hablando de los password, pines y demás.

  • PIN (o NIP) numérico: Es un valor numérico de cuatro o más números, que se usa para acceder a un servicio, como por ejemplo, el pago con una tarjeta.

    No ofrece en si mucha seguridad, debido a que con cuatro números, tenemos solo mil combinaciones posibles (no que no es mucho), la seguridad viene en si en que después de un numero de intentos determinado, el dispositivo o la tarjeta se bloquea (en algunos casos puede borrarse la información), lo cual es realmente lo que proporciona la seguridad.

  • Password: Es una palabra secreta que combina, letras, numero y símbolos, al igual que el pin, no se debe compartir bajo ningún concepto con otra persona.

    Tanto el password como el PIN, se guardan (o se debiera) “encriptados” en los sistemas de seguridad, con una encriptación que se llama “de una sola vía” (conocido comúnmente como hash). Esto quiere decir que no se puede llevar al valor original (el password), desencriptando el valor guardado, porque es imposible, con lo que ni la institución sabe cuál es el password que estamos usando.

    Una anécdota que me paso hace unos años con respecto a los password. Estaba con una líder de proyecto, y necesita acceder a su laptop para obtener un dato, pero ella tenía las manos ocupadas, así medio en broma le comente “voy a entrar con tu password”, y por chiripa y en medio de la broma use el nombre de su hija (ella acaba de madre recientemente), y por sorpresa la computadora de desbloqueo.

    La situación anterior, nos hace ver que sin restricción alguna, seleccionamos podemos seleccionar password que son débiles, relacionado por algún detalle de nuestra vida o contraseñas demasiado comunes que están en diccionarios para hackear contraseñas.

    Cuanta más entropía (menos orden y menos lógica) tenga un password más seguro es, con lo que se establecen una seria de restricciones a su creación, generalmente son las siguientes (cuando más se cumpla, más seguro es el password):

    • Una longitud mínima.

    • Un uso mínimo de mayúsculas y minúsculas.

    • Un uso mínimo de símbolos.

    • Un uso mínimo de números.

    • No permitir caracteres (o números) igual en secuencia, como ldquo;aaa”, o “1111”.

    • No permitir caracteres consecutivos de forma ascendente o descendente, como “1234”, “abcd” o “dcbd”.

    • No permitir palabras que se encuentren seguidas en el teclado como “qwerty”.


Una vez me preguntaron si hacer públicas esas reglas no hace que un ataque sea “más guiado” y por tanto hacer que sea más posible hackear un password. La respuesta es no, es mas hacer pública estas reglas y obligar a que sea cumplida por los usuarios (o clientes), son realmente un elemento disuasorio para los hackers, por que básicamente saben que con los medios actuales esas contraseñas son prácticamente inhackeables (aunque pueden obtenerlas mediante ingeniería social).

Factor tres de Autentificación. Algo que el cliente tiene


El usuario de autentifica con algo que solo él puede poseer, generalmente un elemento físico que se asocian a una identidad y nos permiten el acceso a una acción, característica o servicio. Algunos son:

  • Tarjetas: Las típicas tarjeas que nos permite el acceso a zonas restringidas, o para realizar pagos con ellas.

    Las tarjetas como elemento único de validación son extremadamente inseguras, deben usarse siempre junto con otro elemento.

    En México, por ejemplo, era común en la década pasada que para pagar con tarjeta solo fuera necesario presentar la tarjeta, realizar el pago con el punto de venta y firmar el voucher, en teoría el empleado debiera validad la firma y la identidad con otra autentificación, pero a pesar de ser obligatorio, era a voluntad del empleado y comúnmente nunca se hacía.

    Solo fue hasta hace poco que se comenzó a pedir el NIP de la tarjeta al realizar el pago (pero no para todas las tarjetas, ni bancos), de esta forma ya no queda a la voluntad del empleado el validar la identidad del cliente, sino que además es el cliente el que debe acreditarla, y se si equivoca varias veces, puede bloquear su tarjeta. Esta es una medida de protección fundamental para que la tarjeta no sea solo el medio de identificación posible para hacer un pago.

    Pero nada sirve totalmente, una vez mas es más sencillo realizar fraudes mediante ingeniera social, que mediante complicados y herramientas tecnológicas, como ejemplo los siguientes escenarios:

    Muchos Bancos no tiene personalizadas sus tarjetas de debito (no entiendo el motivo), con que no es fácil ubicar si una tarjeta es tuya entre dos tarjetas iguales del mismo banco, en base a eso, uno de los posibles fraudes es el siguiente:

    Una persona parece consternada cerca de un cajero (esta es el timador uno), cuando otra (este el cliente real), va a usar dicho cajero, el timador se acerca y le dice “oiga no se olvide frotar su tarjeta”, cuando el cliente se muestre perplejo, el timador insiste que debe frotar la tarjeta por qué no funciona el cajero, haciendo que se sienta cada vez mas confundido. Cuando sienta que haya bajado la guardia, le toma la tarjeta rápidamente, y le enseña con gento amable como debe frotarla y se la devuelva rápidamente, pero en el intervalo, le cambia la tarjeta por otra, al final se despide y le desea suerte, todo ocurre tan rápido que la única sensación que tiene el cliente, es que el sujeto es un poco raro y confiado.

    Cuando el cliente vaya a usar su tarjeta y le pida el NIP, es donde se acerca el timador dos, para ver disimuladamente que números está marcando. De esta manera los timadores ya tiene por separado el NIP y la tarjeta, y el cliente está confundido sin saber que ha pasado. Dándoles tiempo a los sujetos de usar las tarjetas en un negocio para compra televisiones o algún elemento de valor, que ya tendrá un tercer timado, en la fila de la caja de un comercio cercano. Todo esto puede pasar en menos de diez minutos.

    Otro timo que se puso de moda hace unos años, esta vez más sofisticado:

    Un timador, con una base de datos de teléfonos y personas (que se puede comprar ilegalmente), se hace pasar por teleoperador de un banco con muchos clientes (lo que aumenta la posibilidad de encontrar un inocente cliente).

    Llama a una víctima de sus lista, y le indica que su banco le realizo un cargo incorrecto (el teleoperador no sabe si el cliente tiene cuenta en un banco, solo es suerte y estadística).

    Le dice “por su seguridad, voy a decirle los 8 primeros números de su tarjeta)”, y aquí reside el engaño, los 8 primeros números de una tarjeta, solo indican a que banco pertenece la tarjeta, y el tipo de producto que es, esto quiere decir, que son iguales para todos los clientes.

    El cliente al ver que le han dado algunos números de su tarjeta (que no aportan realmente nada), le proporciona al timador todos los datos de su tarjeta, lleno de confianza, al pensar que habla con su banco y no con un timador. Al final, el resultado, es que de una forma u otra, el cliente se queda sin su dinero, al haber dado sus datos privados al timador.

  • Tag (Etiqueta RFID) o incluso una matrícula: Los coches pueden tener elementos como tag, que permiten la salida y entrada de vehículos (a veces incluso con reconocimiento óptico de matriculas).

    Uno de los problemas de usar un tag (o la matricula) asociado a un vehículo, es que generalmente esta pegados al mismo vehículo, con lo que se puede decir que están unidos el medio de autentificación y la acción a realizar. Esto quiere decir que por ejemplo si alguien roba tu vehículo en un estacionamiento, podrá salir con el sin más problemas (por ese falta algo más que impida esta circunstancia como un guardia o cámaras de seguridad).

  • Un teléfono: Se garantiza que la operación que se desea hacer es desde un teléfono especifico, generalmente esto se consigue de una forma parecida a la siguiente:

    1. Se genera un identificador único con datos del teléfono.
    2. Se generan claves criptografías (generalmente asimétricas).
    3. Se encriptan estos datos, usando algo mecanismo de protección como un password.

  • Un token o generador de números: Son dispositivos que genera números y se usan en cada operación, por ejemplo, si estoy haciendo una operación bancaria se pedirá un número generado por este dispositivo, y si no es el número correcto, la operación no se realizaran.

    Los dispositivos pueden ser físicos, como un aparato dedicado exclusivamente a esa función, o una aplicación instalada en un teléfono.

    Estos dispositivos, de la siguiente forma:

    1. Existe un servidor y dispositivo, ambos aislados uno de otro, sin comunicación alguna.
    2. El servidor y dispositivo, comparte una misma llave de una determinada longitud llamada semilla.
    3. Ambos generan números basándose, en la semilla (que comparten), y algún elemento independiente de ellos, como la fecha y hora exacta, esto genera un numero, como el servidor y el dispositivo generan comparte la llave, debiera poder generar el mismo número, en el mismo momento (sin tener que estar conectado).

    De esta forma el servidor sabe en cada momento que numero debe generar el dispositivo y solicitárselo al usuarios para garantizar que tiene el dispositivo consigo.

    Uno de los problemas es que el servidor (que está en la empresa que proporciona el servicio, como un banco) sabe cuáles son las semillas que generan el token, es decir es capaz de duplicar dichos números, con lo que en teoría es información que se comparte, y no es algo que tenga exclusivamente el cliente. En otras palabras quien tenga dichas semillas, se pudiera hacer pasar por el cliente.

    Otro de los problemas del token, es que el número sirve para autorizar casi cualquier cosa, con lo que podemos ser engañados, para proporcionar nuestro número actual de token, y realizar operaciones fraudulentas.


Factor tres de Autentificación. Algo que el cliente es


Algo único que está ligado a la persona física del cliente, de forma inequívoca, algo que “el cliente es”, de forma inequívoca e irrepetible, como:

  • Firmas manuscrita: es la clásica firma que hacemos de nuestro puño y letra como prueba de nuestra identidad. Es usual en contratos, y documentos impresos. Aunque se supone que es algo que solo nosotros podemos duplicar exactamente igual, generalmente puede ser copiada y no ofrece mucha seguridad (tal es el caso que en la realización de contratos generalmente hace falta una figura notarial que le de valor, y personas que funjan como testigos).

  • Elementos biométricos: Son elementos que pertenecen a nuestro cuerpo, y que pueden ser validados por un sistema informático, como

  • Huellas: Son los surcos únicos que poseemos en la llama de los dedos.

  • Rostro: Nuestra cara como identificación, el problema es que frecuentemente nuestra cara cambia, con lo que es necesario renovar la autentificación.

  • Iris del ojo: Al igual que las huellas se supone que son elementos únicos en cada uno de nosotros.

El cambio hacia los biométricos ha sido bastante arduo, por no siempre ha dado los resultados requeridos. Unos de los aspectos importantes de los biométricos (y por lo cual han sido hackeados mas de una vez), es que deben garantizar que la persona que está ofreciendo la muestra biométrica está viva y presente, por ejemplo en el caso de las caras es necesario garantizar que realmente estamos leyendo una cara, y no la foto de un sujeto, en el caso del iris, se deben observar movimientos involuntarios del ojo, para garantizarlo.

A veces el uso de biométricos puede ser frustrante, por ejemplo, Es común tener lectores de huella en los teléfonos móviles, estos lectores solemos entrenarlos con nuestra propias huellas y tener un porcentaje de éxito muy elevado, pero lectores empresariales (a veces de poco costo), que se usan másicamente en las empresas para identificar clientes, suelen dar multitud de quebraderos de cabeza.

Autentificación multifactorial


Como hemos visto cualquier solución de autentificación individual, es hackeable en cierto punto, casi siempre usando ingenio más que habilidades tecnológicas.

He aquí el por qué generalmente se usa más de una de forma de autentificación (lo que se conoce por autentificación multifactorial). Por si una es rota, quede la protección de la otra.

De misma forma las técnicas de fraude, avanzan más y de forma muy rápida, con lo que los sistemas se van mas forzados a endurecer sus mecanismos de seguridad, a expensas de la comodidad del usuario.

El principal enemigo del usuario, es su misma ingenuidad, es más fácil que el usuario proporcione sus datos de autentificación mediante engaños, que en si sea hackeado por sofisticados métodos informáticos.



Si te ha gustado la entrada, ¡Compártela! ;-)

miércoles, 4 de julio de 2018

Curso Criptografía, Certificados y Privacidad en Internet


Este año he estado impartiendo un curso, llamado "Criptografía, Certificados y Privacidad en Internet". El curso en si es una charla de dos horas sobre diversos aspectos relacionados con el origen de la criptografía, internet y la seguridad en internet.




Los materiales del curso están en GitHub. Esperando que pudieran ser de utilidad, lo hago de código libre (tanto los ejemplos como la documentación). Se les puede dar el fin que se desee.

Los enlaces relativos al curso son:

Documento explicativo del curso


Presentación del curso


Enlace de GitHub de los materiales


La presentación del curso es la siguiente:

ACERCA DEL INSTRUCTOR


José Luis Bautista Martín, Ingeniero de Sistemas, con maestría en “investigación en ingeniería de Software”. Mi experiencia laboral en cuanto a desarrollo de software abarca desde tecnologías “legacy”, hasta tecnologías de vanguardia, poniendo siempre una especial atención en la construcción de software escalable, modular y sostenible. Igualmente estoy especializado en la interconexión de diversos sistemas y plataformas para conseguir una solución coherente entre la tecnología actual en producción y nuevas tecnologías del mercado.

Una de mis inquietudes actuales es simplificar el desarrollo de software, permitiendo mediante herramientas generadoras de código, patrones de software, programación orientada a aspectos o simplemente interfaces sencillas y claras que el programador se concentre en resolver los problemas propios de la solución a implementar (esto es, los requisitos de negocio a representar en forma de software) y no se tenga que preocupar de tareas repetitivas, generalidades de los sistemas, o problemas técnicos, que no hacen más que distraerle de sus verdaderos objetivos.

ACERCA DE ESTE DOCUMENTO


La misión de este documento es exponer los objetivos, mecánica y temerarios planteados, así como la documentación para el curso de CreSer “Criptografía, Certificados y privacidad en internet”.

OBJETIVOS DEL CURSO


Este curso tiene como objetivo, ser una introducción acerca de la realidad de la privacidad y seguridad en Internet, revisando los motivos y circunstancia (actuales) en la que esta es violada, para posteriormente presentar las herramientas de criptografía, y a los certificados como los medios actuales para garantizarla.

METODOLOGÍA


Sera una conferencia de dos horas, en la que la primera hora se comentara sobre las circunstancias actuales de la seguridad en Internet, y la segunda tendrá una escenario más práctico al usar las herramientas de criptografía y generación de certificados.

REQUISITOS


No requiere ningún requisito en especial, si los asistentes quieren acompañar al instructor en la realización de los ejemplos de criptografía, deberán llevar una laptop, pero no es imprescindible.

EJEMPLOS


Los ejemplos de creación de certificado se encuentran en estas carpetas:

  • Certificadora Inicial: Ejemplo de las estructura de certificadosantesde realizar los ejercicios.
  • Certificadora Final: Ejemplo de las estructura de certificadosdespuésde realizar los ejercicios.


Nota importante: Nunca use los certificados expuesto aquí como productivos, genere siempre sus propias llaves privadas.

CONTENIDO


  • Acerca del instructor
  • Acerca de este documento
  • Objetivos del curso
  • Contenido
  • Metodología
  • Requisitos
  • Introducción
  • Breve historia de las criptografía
  • Breve historia de Internet
  • Seguridad en internet
  • Privacidad en internet
    • Caso espionaje NSA
    • Caso del teléfono el terrorista de San Bernardino
    • Caso Cambridge Analítica
  • Tipos de criptografía
    • Criptografía simétrica
    • Criptografía asimétrica
  • Certificados
    • Entidades certificadoras
    • Entidades intermediarias
    • Certificados personales
    • Configuración de certificados con GnuGPG
  • Anexo I: Ejemplos de certificados
  • Anexo II: Extensiones de archivos criptográficos