Se descubre una nueva vulnerabilidad de desbordamiento de enteros en el módulo de seguridad de referencias del lenguaje Move
Recientemente, al investigar a fondo el lenguaje Move, se descubrió una nueva vulnerabilidad de desbordamiento de enteros. Esta vulnerabilidad se encuentra en el módulo de verificación de seguridad de referencias, y su proceso de activación es bastante interesante. Este artículo realizará un análisis profundo de esta vulnerabilidad, al tiempo que presentará conocimientos de fondo relacionados con el lenguaje Move.
El lenguaje Move verifica las unidades de código antes de ejecutar el bytecode, y todo el proceso de verificación se divide en 4 pasos. La vulnerabilidad encontrada en esta ocasión se presenta en el paso de reference_safety.
El módulo de verificación de seguridad se encarga principalmente de verificar si existen referencias colgantes, si el acceso a referencias mutables es seguro y si el acceso a referencias de almacenamiento global es seguro, entre otros. El proceso de verificación comienza con la función analyze_function y verifica cada bloque básico.
En el lenguaje Move, un bloque básico se refiere a una secuencia de código que no tiene instrucciones de ramificación, excepto la entrada y la salida. El sistema determina el bloque básico al recorrer el bytecode y buscar todas las secuencias de instrucciones de ramificación y bucles.
El lenguaje Move admite dos tipos de referencia: referencia inmutable (&) y referencia mutable (&mut). El módulo de seguridad de referencias escaneará las instrucciones de bytes de cada bloque básico en la función para determinar si todas las operaciones de referencia son legales. El proceso de verificación utiliza la estructura AbstractState, que incluye dos componentes: el gráfico de préstamos y las locales, para garantizar la seguridad de las referencias en la función.
Durante el proceso de verificación, el sistema generará el código del bloque básico para el estado posterior y luego combinará el estado anterior y el estado posterior para actualizar el estado del bloque. Si el estado cambia y hay un bucle, se volverá a ejecutar el bloque básico hasta que el estado posterior sea igual al estado anterior o ocurra un error.
La vulnerabilidad se encuentra en la función join_. Cuando la longitud de los parámetros más la longitud de las variables locales supera 256, el uso del tipo u8 para iterar sobre los locales puede provocar un desbordamiento de enteros. Aunque el lenguaje Move tiene un proceso de verificación del número de locales, solo se verifica la cantidad de variables locales, sin incluir la longitud de los parámetros.
Este desbordamiento de enteros puede provocar un ataque de denegación de servicio. Un atacante puede construir un bloque de código en bucle que explote el desbordamiento para modificar el estado del bloque. Cuando se vuelve a ejecutar la función execute_block, si el índice que necesita acceder a las instrucciones no existe en el nuevo mapa de locales de AbstractState, provocará un fallo del sistema.
Para demostrar esta vulnerabilidad, podemos construir un bloque básico que contenga instrucciones de bifurcación incondicionales. Al establecer los parámetros adecuados y la cantidad de variables locales, se puede hacer que la longitud del mapa de locales se desborde a 8. En la segunda ejecución, intentar acceder a un offset que no existe causará un pánico.
Esta vulnerabilidad nos recuerda que incluso los lenguajes diseñados cuidadosamente pueden tener riesgos de seguridad. Para el lenguaje Move, se recomienda agregar más código de verificación en tiempo de ejecución para prevenir situaciones inesperadas. Actualmente, Move realiza principalmente chequeos de seguridad en la fase de verificación, pero una vez que se elude la verificación, podría provocar problemas más graves.
Como pioneros en la investigación de seguridad del lenguaje Move, continuaremos explorando a fondo los problemas de seguridad relacionados, contribuyendo al desarrollo saludable del ecosistema Move.
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
14 me gusta
Recompensa
14
4
Compartir
Comentar
0/400
RunWithRugs
· hace14h
¿Cómo es que ha surgido otra vulnerabilidad de seguridad?
Ver originalesResponder0
TestnetFreeloader
· hace14h
¡Ya hay superficie de ataque, bien!
Ver originalesResponder0
JustAnotherWallet
· hace14h
Ha ocurrido otro problema, la revisión está siendo culpada.
Se ha descubierto una nueva vulnerabilidad de desbordamiento de enteros en el módulo de seguridad de Move.
Se descubre una nueva vulnerabilidad de desbordamiento de enteros en el módulo de seguridad de referencias del lenguaje Move
Recientemente, al investigar a fondo el lenguaje Move, se descubrió una nueva vulnerabilidad de desbordamiento de enteros. Esta vulnerabilidad se encuentra en el módulo de verificación de seguridad de referencias, y su proceso de activación es bastante interesante. Este artículo realizará un análisis profundo de esta vulnerabilidad, al tiempo que presentará conocimientos de fondo relacionados con el lenguaje Move.
El lenguaje Move verifica las unidades de código antes de ejecutar el bytecode, y todo el proceso de verificación se divide en 4 pasos. La vulnerabilidad encontrada en esta ocasión se presenta en el paso de reference_safety.
El módulo de verificación de seguridad se encarga principalmente de verificar si existen referencias colgantes, si el acceso a referencias mutables es seguro y si el acceso a referencias de almacenamiento global es seguro, entre otros. El proceso de verificación comienza con la función analyze_function y verifica cada bloque básico.
En el lenguaje Move, un bloque básico se refiere a una secuencia de código que no tiene instrucciones de ramificación, excepto la entrada y la salida. El sistema determina el bloque básico al recorrer el bytecode y buscar todas las secuencias de instrucciones de ramificación y bucles.
El lenguaje Move admite dos tipos de referencia: referencia inmutable (&) y referencia mutable (&mut). El módulo de seguridad de referencias escaneará las instrucciones de bytes de cada bloque básico en la función para determinar si todas las operaciones de referencia son legales. El proceso de verificación utiliza la estructura AbstractState, que incluye dos componentes: el gráfico de préstamos y las locales, para garantizar la seguridad de las referencias en la función.
Durante el proceso de verificación, el sistema generará el código del bloque básico para el estado posterior y luego combinará el estado anterior y el estado posterior para actualizar el estado del bloque. Si el estado cambia y hay un bucle, se volverá a ejecutar el bloque básico hasta que el estado posterior sea igual al estado anterior o ocurra un error.
La vulnerabilidad se encuentra en la función join_. Cuando la longitud de los parámetros más la longitud de las variables locales supera 256, el uso del tipo u8 para iterar sobre los locales puede provocar un desbordamiento de enteros. Aunque el lenguaje Move tiene un proceso de verificación del número de locales, solo se verifica la cantidad de variables locales, sin incluir la longitud de los parámetros.
Este desbordamiento de enteros puede provocar un ataque de denegación de servicio. Un atacante puede construir un bloque de código en bucle que explote el desbordamiento para modificar el estado del bloque. Cuando se vuelve a ejecutar la función execute_block, si el índice que necesita acceder a las instrucciones no existe en el nuevo mapa de locales de AbstractState, provocará un fallo del sistema.
Para demostrar esta vulnerabilidad, podemos construir un bloque básico que contenga instrucciones de bifurcación incondicionales. Al establecer los parámetros adecuados y la cantidad de variables locales, se puede hacer que la longitud del mapa de locales se desborde a 8. En la segunda ejecución, intentar acceder a un offset que no existe causará un pánico.
Esta vulnerabilidad nos recuerda que incluso los lenguajes diseñados cuidadosamente pueden tener riesgos de seguridad. Para el lenguaje Move, se recomienda agregar más código de verificación en tiempo de ejecución para prevenir situaciones inesperadas. Actualmente, Move realiza principalmente chequeos de seguridad en la fase de verificación, pero una vez que se elude la verificación, podría provocar problemas más graves.
Como pioneros en la investigación de seguridad del lenguaje Move, continuaremos explorando a fondo los problemas de seguridad relacionados, contribuyendo al desarrollo saludable del ecosistema Move.