
# Laboratorio de investigación de seguridad autorizado que reproduce CVE-2024-4253 (GHSA-r897-wrpm-h4vw): inyección de comandos en workflow_run en test-functional.yml de gradio-app/gradio
Artefacto de investigación automatizado — no es el proyecto original.
Este repositorio es un laboratorio desechable construido por un sistema automatizado para una tesis de maestría en la Université Laval sobre la reproducción de vulnerabilidades publicadas en flujos de trabajo de GitHub Actions. Es una instantánea verbatim de
gradio-app/gradioen el commita81e36967c0973012e90ec7cf03b99cf3fea88ec(2024-04-30), redistribuida bajo la licencia de ese proyecto, cuyo archivo se incluye sin cambios en esta instantánea.El proyecto original no está involucrado, nunca es el objetivo, y la vulnerabilidad estudiada aquí ya es pública. Cada secreto y variable en este repositorio es un valor ficticio generado aleatoriamente — no hay ninguna credencial real presente. Las referencias de acciones y las imágenes de ejecutores están fijadas a lo que resolvieron el 2024-04-30; consulta
pinning.mden la salida del sistema para cada cambio realizado en la instantánea.Preguntas u objeciones: [email protected]
Gradio es un paquete de Python de código abierto que te permite crear rápidamente una demo o aplicación web para tu modelo de aprendizaje automático, API o cualquier función arbitraria de Python. Luego puedes compartir un enlace a tu demo o aplicación web en solo unos segundos usando las funciones de compartir integradas de Gradio. ¡No se necesita experiencia con JavaScript, CSS ni alojamiento web!
Solo se necesitan unas pocas líneas de Python para crear una demo hermosa como la anterior, así que comencemos 💫
Requisito previo: Gradio requiere Python 3.8 o superior
Recomendamos instalar Gradio usando pip, que viene incluido por defecto en Python. Ejecuta esto en tu terminal o símbolo del sistema:
pip install gradio
[!TIP] Es mejor instalar Gradio en un entorno virtual. Instrucciones detalladas de instalación para todos los sistemas operativos comunes se proporcionan aquí.
Puedes ejecutar Gradio en tu editor de código favorito, cuaderno de Jupyter, Google Colab o cualquier otro lugar donde escribas Python. Escribamos tu primera aplicación de Gradio:
import gradio as gr
def greet(name, intensity):
return "Hello " * intensity + name + "!"
demo = gr.Interface(
fn=greet,
inputs=["text", "slider"],
outputs=["text"],
)
demo.launch()
[!TIP] Acortamos el nombre importado de
gradioagrpara una mejor legibilidad del código. Esta es una convención ampliamente adoptada que deberías seguir para que cualquiera que trabaje con tu código pueda entenderlo fácilmente.
Ahora, ejecuta tu código. Si has escrito el código de Python en un archivo llamado, por ejemplo, app.py, entonces ejecutarías python app.py desde la terminal.
La demo de abajo se abrirá en un navegador en http://localhost:7860 si se ejecuta desde un archivo. Si estás ejecutando dentro de un cuaderno, la demo aparecerá integrada dentro del cuaderno.

Escribe tu nombre en el cuadro de texto de la izquierda, arrastra el control deslizante y luego presiona el botón Enviar. Deberías ver un saludo amigable a la derecha.
[!TIP] Cuando desarrolles localmente, puedes ejecutar tu aplicación de Gradio en modo de recarga automática, que recarga automáticamente la aplicación de Gradio cada vez que hagas cambios en el archivo. Para hacer esto, simplemente escribe
gradioantes del nombre del archivo en lugar depython. En el ejemplo anterior, escribirías:gradio app.pyen tu terminal. Aprende más sobre la recarga automática en la Guía de recarga automática.
Entendiendo la clase Interface
Notarás que para crear tu primera demo, creaste una instancia de la clase gr.Interface. La clase Interface está diseñada para crear demos de modelos de aprendizaje automático que aceptan una o más entradas y devuelven una o más salidas.
La clase Interface tiene tres argumentos principales:
fn: la función a envolver con una interfaz de usuario (UI)inputs: el/los componente(s) de Gradio a usar para la entrada. El número de componentes debe coincidir con el número de argumentos en tu función.outputs: el/los componente(s) de Gradio a usar para la salida. El número de componentes debe coincidir con el número de valores de retorno de tu función.El argumento fn es muy flexible — puedes pasar cualquier función de Python que quieras envolver con una UI. En el ejemplo anterior, vimos una función relativamente simple, pero la función podría ser cualquier cosa, desde un generador de música hasta una calculadora de impuestos o la función de predicción de un modelo de aprendizaje automático preentrenado.
Los argumentos input y output toman uno o más componentes de Gradio. Como veremos, Gradio incluye más de 30 componentes integrados (como los componentes gr.Textbox(), gr.Image() y gr.HTML()) diseñados para aplicaciones de aprendizaje automático.
[!TIP] Para los argumentos
inputsyoutputs, puedes pasar el nombre de estos componentes como una cadena ("textbox") o una instancia de la clase (gr.Textbox()).
Si tu función acepta más de un argumento, como en el caso anterior, pasa una lista de componentes de entrada a inputs, con cada componente de entrada correspondiendo a uno de los argumentos de la función, en orden. Lo mismo aplica si tu función devuelve más de un valor: simplemente pasa una lista de componentes a outputs. Esta flexibilidad hace que la clase Interface sea una forma muy poderosa de crear demos.