Se ha encontrado una nueva vulnerabilidad de desbordamiento de enteros en el módulo de seguridad de referencia de Move
Recientemente, al investigar a fondo el lenguaje Move, hemos descubierto una nueva vulnerabilidad de desbordamiento de enteros. Esta vulnerabilidad existe en el proceso de verificación de seguridad de referencias, y su proceso de activación es bastante interesante. Este artículo analizará en profundidad esta vulnerabilidad y explorará algunos conocimientos de fondo sobre el lenguaje Move.
El lenguaje Move realiza una validación de unidades de código antes de ejecutar el bytecode, que se divide en cuatro pasos. Esta vulnerabilidad se presenta en el paso reference_safety. Este paso es responsable de verificar la seguridad de las referencias, incluyendo la comprobación de si existen referencias colgantes, si el acceso a referencias mutables es seguro, y si el acceso a referencias de almacenamiento global es seguro, etc.
La función de entrada que invoca la verificación de seguridad llamará a analyze_function para validar cada bloque básico. Un bloque básico se refiere a una secuencia de código que no tiene instrucciones de bifurcación excepto las de entrada y salida. El lenguaje Move identifica bloques básicos al recorrer el bytecode y buscar todas las instrucciones de bifurcación y las secuencias de instrucciones de bucle.
El lenguaje Move admite dos tipos de referencias: referencias inmutables (&) y referencias mutables (&mut). El módulo de seguridad de referencias verifica la legalidad de todas las operaciones de referencia escaneando las instrucciones de bytes de los bloques básicos en la función. El proceso de verificación utiliza la estructura AbstractState, que contiene el gráfico de préstamos y locales, para garantizar la seguridad de las referencias en la función.
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, la función iter_locals() devuelve un iterador de tipo u8, lo que provoca un desbordamiento de enteros. Aunque Move tiene un proceso de verificación del número de locales, en el módulo de verificación de límites solo se verifican los locales, sin incluir la longitud de los parámetros.
Este desbordamiento de entero puede provocar un ataque de denegación de servicio (DoS). Cuando hay un bloque de código en bucle y se aprovecha el desbordamiento para cambiar el estado del bloque, el nuevo mapa de locales es diferente al anterior. Al volver a ejecutar la función execute_block, si el índice que necesita acceder a la instrucción no existe en el nuevo mapa de AbstractState locals, provocará un DoS.
Hemos proporcionado un PoC que se puede reproducir en git. El bloque de código en este PoC contiene una instrucción de salto incondicional que, cada vez que se ejecuta la última instrucción, salta de nuevo a la primera instrucción, lo que provoca múltiples llamadas a las funciones execute_block y join.
Esta vulnerabilidad demuestra que incluso lenguajes enfocados en la seguridad como Move pueden tener riesgos de seguridad. La importancia de la auditoría de código es evidente, y los programadores inevitablemente pueden cometer descuidos. Como líderes en la investigación de seguridad del lenguaje Move, continuaremos investigando a fondo los problemas de seguridad de Move.
Sugerimos que los diseñadores del lenguaje Move agreguen más código de verificación en tiempo de ejecución para prevenir situaciones inesperadas. Actualmente, Move realiza verificaciones de seguridad principalmente en la fase de verificación, pero esto puede no ser suficiente. Una vez que se elude la verificación, la falta de suficiente endurecimiento de seguridad en la fase de ejecución puede llevar a problemas más graves.
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.
10 me gusta
Recompensa
10
5
Republicar
Compartir
Comentar
0/400
GasFeeWhisperer
· hace21h
move se ha caído nuevamente
Ver originalesResponder0
StopLossMaster
· hace22h
Otra vez es un agujero que cavaron los de casa.
Ver originalesResponder0
LiquidationWatcher
· hace22h
De nuevo ha salido un fallo.
Ver originalesResponder0
ZKProofEnthusiast
· hace22h
Este bug se ha convertido en un gran problema.
Ver originalesResponder0
ZenMiner
· hace23h
Está envenenado, move va a tener que aplicar otro parche.
Se descubre una vulnerabilidad de desbordamiento de enteros en el módulo de seguridad de Move, que podría provocar un ataque DoS.
Se ha encontrado una nueva vulnerabilidad de desbordamiento de enteros en el módulo de seguridad de referencia de Move
Recientemente, al investigar a fondo el lenguaje Move, hemos descubierto una nueva vulnerabilidad de desbordamiento de enteros. Esta vulnerabilidad existe en el proceso de verificación de seguridad de referencias, y su proceso de activación es bastante interesante. Este artículo analizará en profundidad esta vulnerabilidad y explorará algunos conocimientos de fondo sobre el lenguaje Move.
El lenguaje Move realiza una validación de unidades de código antes de ejecutar el bytecode, que se divide en cuatro pasos. Esta vulnerabilidad se presenta en el paso reference_safety. Este paso es responsable de verificar la seguridad de las referencias, incluyendo la comprobación de si existen referencias colgantes, si el acceso a referencias mutables es seguro, y si el acceso a referencias de almacenamiento global es seguro, etc.
La función de entrada que invoca la verificación de seguridad llamará a analyze_function para validar cada bloque básico. Un bloque básico se refiere a una secuencia de código que no tiene instrucciones de bifurcación excepto las de entrada y salida. El lenguaje Move identifica bloques básicos al recorrer el bytecode y buscar todas las instrucciones de bifurcación y las secuencias de instrucciones de bucle.
El lenguaje Move admite dos tipos de referencias: referencias inmutables (&) y referencias mutables (&mut). El módulo de seguridad de referencias verifica la legalidad de todas las operaciones de referencia escaneando las instrucciones de bytes de los bloques básicos en la función. El proceso de verificación utiliza la estructura AbstractState, que contiene el gráfico de préstamos y locales, para garantizar la seguridad de las referencias en la función.
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, la función iter_locals() devuelve un iterador de tipo u8, lo que provoca un desbordamiento de enteros. Aunque Move tiene un proceso de verificación del número de locales, en el módulo de verificación de límites solo se verifican los locales, sin incluir la longitud de los parámetros.
Este desbordamiento de entero puede provocar un ataque de denegación de servicio (DoS). Cuando hay un bloque de código en bucle y se aprovecha el desbordamiento para cambiar el estado del bloque, el nuevo mapa de locales es diferente al anterior. Al volver a ejecutar la función execute_block, si el índice que necesita acceder a la instrucción no existe en el nuevo mapa de AbstractState locals, provocará un DoS.
Hemos proporcionado un PoC que se puede reproducir en git. El bloque de código en este PoC contiene una instrucción de salto incondicional que, cada vez que se ejecuta la última instrucción, salta de nuevo a la primera instrucción, lo que provoca múltiples llamadas a las funciones execute_block y join.
Esta vulnerabilidad demuestra que incluso lenguajes enfocados en la seguridad como Move pueden tener riesgos de seguridad. La importancia de la auditoría de código es evidente, y los programadores inevitablemente pueden cometer descuidos. Como líderes en la investigación de seguridad del lenguaje Move, continuaremos investigando a fondo los problemas de seguridad de Move.
Sugerimos que los diseñadores del lenguaje Move agreguen más código de verificación en tiempo de ejecución para prevenir situaciones inesperadas. Actualmente, Move realiza verificaciones de seguridad principalmente en la fase de verificación, pero esto puede no ser suficiente. Una vez que se elude la verificación, la falta de suficiente endurecimiento de seguridad en la fase de ejecución puede llevar a problemas más graves.