Seguridad

Reto Web3 en Level_Up! «Replay_me»: La importancia de una correcta validación de firmas

Hoy traemos un nuevo reto de la plataforma de aprendizaje de Level_UP! el reto que traemos hoy es el de «Replay_Me», el cual se basa y trabaja la importancia que tiene la validación de firmas y no permitir la posibilidad de reutilizarlas. Si observamos algunas vulnerabilidades en proyectos desplegados en la web3 podemos encontrar este tipo de situaciones. El pedirle a un usuario que firme un mensaje es algo muy normal y que ocurre con frecuencia, ya que es la forma que tenemos de verificar que la persona que está al otro lado es el propietario de dicha clave.

Figura 1: Reto Web3 en Level_Up! «Replay_me».
 La importancia de una correcta validación de firmas

Por esta razón, conocer bien el concepto de verificación de firmas y anulación de éstas es importante cuando uno desarrolla un proyecto Web3. El nuevo reto es el número 13 (level = 12) y tiene una dificultad de 5 sobre 5. ¿Es tan complejo? La verdad es que el concepto en sí es complejo y requiere de una base previa que se puede ir tomando cuando uno se va adentrando en este mundo.


En la siguiente imagen se puede visualizar los diferentes retos de los que consta en Junio de 2023 la plataforma Level_UP!, ya disponible, por supuesto, en su Github. Además, estamos trabajando y evaluando alguna sorpresa a corto plazo que enriquecerá la gamificación de la plataforma. No desvelaremos nada, pero seguro que gusta y mucho.

Figura 3: Retos en Level_Up! Junio de 2023

Además, recientemente, se ha realizado un pequeño CTF en Escuela 42 dónde la gente se ha divertido mucho con la plataforma, así nos lo han hecho saber y estamos muy contentos con la experiencia, pero esto lo dejamos para contar otro día.


Conociendo el reto: replay_me


Ahora, vamos a detallar un poco el reto en sí. Cuando accedemos a la página de despliegue del reto en la plataforma, podemos encontrar diferentes pasos (como siempre). El primer ‘snippet’ de código que encontramos es el de una función ‘deposit’ que hace “algo” y envía un hash de un mensaje y tres elementos (no desvelo más). Con estos 4 parámetros se puede verificar el mensaje y la firma de quién invoca esta función (al menos quién invoca la función tiene esos parámetros).

Figura 4: Reto «replay_me»

En el paso 4 nos hablan de reutilizar una firma y nos preguntan que dónde se encuentra. Sabemos que todo estará en la Blockchain de una forma u otra. Si hay un cambio y se realiza una transacción, en la Blockchain debe estar. Hay una función en el código completo del contrato, el cual se puede ver, que habla de una función ‘_verifyMessage’. El usuario podrá utilizar para validar “cosas”.

Figura 5: Pistas y pasos del Reto «replay_me»

El reto no es sencillo, pero en el paso a paso y en las pistas se da bastante información. El premio son muchos puntos… 250 puntos que sumar a tu cuenta en Level_UP!


Bug solventado


Hace unos días, nos dimos cuenta de un pequeño gran bug en la plataforma, precisamente en el contrato base. Recordemos que este contrato es el que gestiona las flag de cada contrato y de si éstos están resueltos o no. Dicho de otra forma, un bug en este contrato es la muerte del juego. Hemos parcheado el código y solucionado el problema, pero queríamos hablar de varias cosas para que todos podamos aprender. Aquí se puede ver el último commit en el repositorio de Level_UP! solventando el bug de la visibilidad de playerStatus.

Si observamos el código del contrato base.sol tenemos un atributo cuya visibilidad era pública. Ese atributo era playerStatus, el cual almacena un mapping a una estructura level_status. La estructura level_status almacena la dirección de un contrato nivel X desplegado, el valor de su flag (recordad que son dinámicas) y si el contrato estaba resuelto o no.

Figura 6: Visibilidad de playerStatus

La visibilidad pública de dicho atributo permitía que un usuario pudiera hacer trampas y solicitar que pasa su dirección de usuario y una dirección de contrato que haya desplegado le mostrase el ‘status’. En ese ‘status’ hay tres campos: nivel del contrato, flag y si el reto se había pasado. Como podemos entender, se podía tener acceso a la flag sin necesidad de pasar el reto. Tras la actualización, el bug queda resuelto, aunque seguiremos haciendo pruebas para encontrar fallos. 

Os animamos a que si probáis la nueva versión y encontráis algún fallo nos lo hagáis saber vía nuestro buzón público en https://MyPublicInbox.com/IdeasLocas.  Esperamos que disfrutéis del nuevo reto y que sigáis sumando puntos de conocimiento en web3 y la seguridad de ésta.


Esperamos que sigas disfrutando de la plataforma Level_UP! y mucho ánimo con el resto de retos. Y recuerda que si quieres aprender de estas tecnologías, tienes Bit2Me Academy, que es una plataforma online para aprender de Web3, BitCoin, Tokenomics o Ethereum con cursos gratuitos además del libro dedicado a «Bitcoin: La tecnología Blockchain y su investigación» de Yaiza Rubio y Félix Brezo que seguro que te ayudan a ponerte las pilas.


Más artículos de Web3, Blockchain & SmartContracts
Saludos,

Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros «Metasploit para Pentesters«, «Hacking con Metasploit: Advanced Pentesting» «Hacking Windows«, «Ethical Hacking«, «Got Root«,  “Pentesting con Powershell” y de «Empire: Hacking Avanzado en el Red Team«, Microsoft MVP en Seguridad y Security Researcher en el equipo de «Ideas Locas» de la unidad CDCO de Telefónica.  Para consultas puedes usar el Buzón Público para contactar con Pablo González

Figura 15: Contactar con Pablo González

Powered by WPeMatico

Gustavo Genez

Informático de corazón y apasionado por la tecnología. La misión de este blog es llegar a los usuarios y profesionales con información y trucos acerca de la Seguridad Informática.