Python ctypes desborda el análisis de vulnerabilidad, su computadora está siendo atacada

Introducción

Python es un lenguaje de programación rápido y elegante. ctypes es una biblioteca de funciones externas de Python. Proporciona tipos de datos compatibles con C y permite llamar a funciones en DLL o bibliotecas compartidas. Este módulo se puede utilizar para encapsular estas bibliotecas en Python puro. Hay un problema de desbordamiento de pila en ctypes. El alcance de la vulnerabilidad: menor que la versión 3.9.1, afectando al módulo _ctypes / callproc.c.

Analizar el medio ambiente

Versión del sistema: Win10 x64

Versión del entorno: VS2019

Versión del código fuente de Python: 3.8.7rc1

Configuración del entorno

1. Instale VS2019, visite https://visualstudio.microsoft.com/zh-hans/vs/ y siga los pasos de instalación para instalar.

2. Visite https://github.com/python/cpython/tree/v3.8.7rc1/ para descargar el código fuente de CPython.

3. Ejecute cpython-3.8.7rc1 \ PCbuild \ build.bat bajo la autoridad de administrador y espere a que se ejecute correctamente.

4. Ejecute cpython-3.8.7rc1 \ PCbuild \ pcbuild.sln.

5. Después de iniciar vs2019, haga clic con el botón derecho y seleccione la solución para buscar propiedades -> propiedades de configuración. Dado que no es necesario analizar otros módulos, no es necesario compilarlos. Marque de acuerdo con la figura.

6. Seleccione Generar -> Generar solución en la barra de menú.

7. Una vez iniciado el entorno, establezca un punto de interrupción en el método que debe depurarse.

Análisis de código

Primero veamos el método _ctypes \ callproc.c PyCArg_repr. La función de esta función convierte el tipo de datos al tipo de datos C para su transmisión. El búfer variable [256] se define en este método para almacenar caracteres.

El código del problema se encuentra en cpython-3.8.7rc1 \ Modules_ctypes \ callproc.c Línea: 521. Utilice sprintf como formato de cadena, porque la longitud de doble precisión supera las expectativas. Cuando se proporciona una cadena de caracteres extralarga, desencadenará un desbordamiento de cadena extralarga.

Observemos la situación DEBUG después de ejecutar el POC

>>> from ctypes import * 

>>> c_double.from_param(1e300)

La situación de depuración indica que se ha desencadenado el desbordamiento, el impacto real de la vulnerabilidad es pequeño y la longitud del búfer 256 no se puede utilizar de forma continua. Si tiene alguna buena idea, bienvenido a agregar.

Situación de reparación

Visitemos https://github.com/python/cpython/blob/master/Modules/_ctypes/callproc.cLine:488 PyCArg_repr ().

Este problema se ha solucionado en la nueva versión y sprintf se ha reemplazado con PyUnicode_FromFormat.

Recordatorio: Se ha corregido la última versión. Aquellos que necesiten usar C \ C ++ para desarrollar módulos de Python deben prestar atención a la actualización.

para resumir

Como lenguaje adhesivo, Python tiene una gama relativamente amplia de problemas de seguridad para combinar las ventajas de varios lenguajes. Aunque el problema tiene poco impacto, la idea de cavar lagunas es muy buena.

Introducción

Python es un lenguaje de programación rápido y elegante. ctypes es una biblioteca de funciones externas de Python. Proporciona tipos de datos compatibles con C y permite llamar a funciones en DLL o bibliotecas compartidas. Este módulo se puede utilizar para encapsular estas bibliotecas en Python puro. Hay un problema de desbordamiento de pila en ctypes. El alcance de la vulnerabilidad: menor que la versión 3.9.1, afectando al módulo _ctypes / callproc.c.

Analizar el medio ambiente

Versión del sistema: Win10 x64

Versión del entorno: VS2019

Versión del código fuente de Python: 3.8.7rc1

Mucha gente aprende Python y no sabe por dónde empezar.
Muchas personas aprenden Python y después de dominar la gramática básica, no saben dónde encontrar casos para comenzar.
Muchas personas que han realizado estudios de casos no saben cómo adquirir conocimientos más avanzados.
Entonces, para estos tres tipos de personas, les proporcionaré una buena plataforma de aprendizaje, ¡gratis para recibir tutoriales en video, libros electrónicos y el código fuente del curso!
Grupo QQ: 705933274

Configuración del entorno

1. Instale VS2019, visite https://visualstudio.microsoft.com/zh-hans/vs/ y siga los pasos de instalación para instalar.

2. Visite https://github.com/python/cpython/tree/v3.8.7rc1/ para descargar el código fuente de CPython.

3. Ejecute cpython-3.8.7rc1 \ PCbuild \ build.bat bajo la autoridad de administrador y espere a que se ejecute correctamente.

4. Ejecute cpython-3.8.7rc1 \ PCbuild \ pcbuild.sln.

5. Después de iniciar vs2019, haga clic con el botón derecho y seleccione la solución para buscar propiedades -> propiedades de configuración. Dado que no es necesario analizar otros módulos, no es necesario compilarlos. Marque de acuerdo con la figura.

6. Seleccione Generar -> Generar solución en la barra de menú.

7. Una vez iniciado el entorno, establezca un punto de interrupción en el método que debe depurarse.

Análisis de código

Primero veamos el método _ctypes \ callproc.c PyCArg_repr. La función de esta función convierte el tipo de datos al tipo de datos C para su transmisión. El búfer variable [256] se define en este método para almacenar caracteres.

El código del problema se encuentra en cpython-3.8.7rc1 \ Modules_ctypes \ callproc.c Línea: 521. Utilice sprintf como formato de cadena, porque la longitud de doble precisión supera las expectativas. Cuando se proporciona una cadena de caracteres extralarga, desencadenará un desbordamiento de cadena extralarga.

Observemos la situación DEBUG después de ejecutar el POC

>>> from ctypes import * 

>>> c_double.from_param(1e300)

La situación de depuración indica que se ha desencadenado el desbordamiento, el impacto real de la vulnerabilidad es pequeño y la longitud del búfer 256 no se puede utilizar de forma continua. Si tiene alguna buena idea, bienvenido a agregar.

Situación de reparación

Visitemos https://github.com/python/cpython/blob/master/Modules/_ctypes/callproc.cLine:488 PyCArg_repr ().

Este problema se ha solucionado en la nueva versión y sprintf se ha reemplazado con PyUnicode_FromFormat.

Recordatorio: Se ha corregido la última versión. Aquellos que necesiten usar C \ C ++ para desarrollar módulos de Python deben prestar atención a la actualización.

para resumir

Como lenguaje adhesivo, Python tiene una gama relativamente amplia de problemas de seguridad para combinar las ventajas de varios lenguajes. Aunque el problema tiene poco impacto, la idea de cavar lagunas es muy buena.

Todavía quiero recomendar el grupo de aprendizaje de Python que construí yo mismo : 705933274 , todos los cuales están aprendiendo Python. Si quieren aprender o están aprendiendo Python, pueden unirse. Todos son parte del desarrollo de software y comparten productos secos de de vez en cuando (solo relacionado con el desarrollo de software de Python), incluida una copia de los últimos materiales avanzados de Python y la enseñanza basada en cero compilada por mí en 2021. ¡Bienvenidos amigos que están en un nivel avanzado e interesados ​​en Python para que se unan!

 

Supongo que te gusta

Origin blog.csdn.net/m0_55479420/article/details/114878308
Recomendado
Clasificación