Análisis de vulnerabilidades por desbordamiento de enteros en el lenguaje Move
Tras una investigación exhaustiva del lenguaje Move, hemos descubierto una nueva vulnerabilidad de desbordamiento de enteros. Esta vulnerabilidad aparece en la etapa de verificación de seguridad de referencias del proceso de validación del bytecode del lenguaje Move. Este artículo analizará en detalle el proceso de activación de esta vulnerabilidad y explorará algunos conceptos clave del lenguaje Move.
Proceso de verificación de bytecode de Move
El lenguaje Move realiza una verificación de código antes de ejecutar el bytecode, que se divide en 4 pasos. La vulnerabilidad en esta ocasión se presenta en el paso de reference_safety. Este paso es principalmente responsable de verificar la seguridad de las referencias, incluyendo la comprobación de si existen referencias colgantes y si el acceso a referencias mutables es seguro.
El proceso de verificación primero identificará los bloques básicos en el código. Un bloque básico se refiere a una secuencia de código que no tiene instrucciones de bifurcación, excepto en la entrada y la salida. Move determina los bloques básicos al recorrer el bytecode y buscar todas las instrucciones de bifurcación y de bucle.
Seguridad de referencia en Move
Move admite dos tipos de referencias: 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, verificando que todas las operaciones de referencia sean legales.
El proceso de verificación utiliza la estructura AbstractState para representar el estado, que incluye el gráfico de préstamos y los locales. Durante la verificación, se comparan los estados antes y después de la ejecución, y se fusionan para actualizar el estado del bloque.
Análisis de vulnerabilidades
La vulnerabilidad se presenta en la función join_. Esta función se utiliza para combinar el estado antes y después de la ejecución, actualizando el mapa de locales y el gráfico de préstamos. El problema radica en que el iterador de locales devuelve un tipo u8, lo que provoca un desbordamiento cuando la suma de la longitud del parámetro y la longitud de las variables locales supera 256.
Aunque Move tiene un proceso para verificar la cantidad de locales, solo verifica la cantidad de variables locales, sin incluir la longitud de los parámetros.
Explotación de vulnerabilidades
Utilizando este desbordamiento se puede cambiar el estado del bloque básico. En el código de bucle, cada vez que se ejecuta el bloque básico, el estado cambia. Cuando se ejecuta de nuevo, si el índice al que accede la instrucción no existe en el nuevo mapa de locales, provocará un pánico, lo que permitirá llevar a cabo un ataque DoS.
Demostración de PoC
Se proporciona un código PoC reproducible que, al establecer parámetros específicos y la cantidad de variables locales, provoca un desbordamiento de enteros que causa un fallo en el programa.
Resumen
Esta vulnerabilidad vuelve a demostrar la importancia de la auditoría de código. Para el lenguaje Move, se sugiere agregar más comprobaciones de seguridad en tiempo de ejecución, en lugar de depender únicamente de las comprobaciones en la fase de validación. Continuaremos investigando a fondo los problemas de seguridad del lenguaje Move y contribuiremos a su desarrollo.
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.
25 me gusta
Recompensa
25
7
Compartir
Comentar
0/400
RektButStillHere
· 07-11 04:35
Otra vez ha desbordado, tsk tsk.
Ver originalesResponder0
consensus_failure
· 07-11 01:01
¿De verdad hay un bug así?
Ver originalesResponder0
SchrodingersPaper
· 07-09 07:32
¿Movió otra vez? Se ha salido de control, se ha salido de control.
Ver originalesResponder0
DevChive
· 07-08 16:28
El novato fue tomado por tonto
Ver originalesResponder0
ProposalManiac
· 07-08 06:09
Ya se dijo que la verificación de parámetros no puede estar solo en la documentación.
Revelación de la vulnerabilidad de desbordamiento de enteros en el lenguaje Move: riesgos en la verificación de bytecode
Análisis de vulnerabilidades por desbordamiento de enteros en el lenguaje Move
Tras una investigación exhaustiva del lenguaje Move, hemos descubierto una nueva vulnerabilidad de desbordamiento de enteros. Esta vulnerabilidad aparece en la etapa de verificación de seguridad de referencias del proceso de validación del bytecode del lenguaje Move. Este artículo analizará en detalle el proceso de activación de esta vulnerabilidad y explorará algunos conceptos clave del lenguaje Move.
Proceso de verificación de bytecode de Move
El lenguaje Move realiza una verificación de código antes de ejecutar el bytecode, que se divide en 4 pasos. La vulnerabilidad en esta ocasión se presenta en el paso de reference_safety. Este paso es principalmente responsable de verificar la seguridad de las referencias, incluyendo la comprobación de si existen referencias colgantes y si el acceso a referencias mutables es seguro.
El proceso de verificación primero identificará los bloques básicos en el código. Un bloque básico se refiere a una secuencia de código que no tiene instrucciones de bifurcación, excepto en la entrada y la salida. Move determina los bloques básicos al recorrer el bytecode y buscar todas las instrucciones de bifurcación y de bucle.
Seguridad de referencia en Move
Move admite dos tipos de referencias: 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, verificando que todas las operaciones de referencia sean legales.
El proceso de verificación utiliza la estructura AbstractState para representar el estado, que incluye el gráfico de préstamos y los locales. Durante la verificación, se comparan los estados antes y después de la ejecución, y se fusionan para actualizar el estado del bloque.
Análisis de vulnerabilidades
La vulnerabilidad se presenta en la función join_. Esta función se utiliza para combinar el estado antes y después de la ejecución, actualizando el mapa de locales y el gráfico de préstamos. El problema radica en que el iterador de locales devuelve un tipo u8, lo que provoca un desbordamiento cuando la suma de la longitud del parámetro y la longitud de las variables locales supera 256.
Aunque Move tiene un proceso para verificar la cantidad de locales, solo verifica la cantidad de variables locales, sin incluir la longitud de los parámetros.
Explotación de vulnerabilidades
Utilizando este desbordamiento se puede cambiar el estado del bloque básico. En el código de bucle, cada vez que se ejecuta el bloque básico, el estado cambia. Cuando se ejecuta de nuevo, si el índice al que accede la instrucción no existe en el nuevo mapa de locales, provocará un pánico, lo que permitirá llevar a cabo un ataque DoS.
Demostración de PoC
Se proporciona un código PoC reproducible que, al establecer parámetros específicos y la cantidad de variables locales, provoca un desbordamiento de enteros que causa un fallo en el programa.
Resumen
Esta vulnerabilidad vuelve a demostrar la importancia de la auditoría de código. Para el lenguaje Move, se sugiere agregar más comprobaciones de seguridad en tiempo de ejecución, en lugar de depender únicamente de las comprobaciones en la fase de validación. Continuaremos investigando a fondo los problemas de seguridad del lenguaje Move y contribuiremos a su desarrollo.