
Laboratório de pesquisa em segurança: reprodução controlada do CVE-2024-4254 (GHSA-fc78-c36r-cc59) — checkout/execução de código do fork deploy-website.yml em gradio-app/gradio @ d4c503a
Artefacto de investigação automatizado — não é o projeto original.
Este repositório é um laboratório descartável construído por um harness automatizado para uma dissertação de mestrado na Université Laval sobre a reprodução de vulnerabilidades publicadas em workflows do GitHub Actions. É um snapshot verbatim de
gradio-app/gradiono commitd4c503a471cfd202c56fbddd99d5da431a4b7478(2024-08-02), redistribuído sob a licença desse próprio projeto, cujo ficheiro está incluído inalterado neste snapshot.O projeto original não está envolvido, nunca é alvo, e a vulnerabilidade aqui estudada já é pública. Todos os segredos e variáveis neste repositório são valores fictícios gerados aleatoriamente — nenhuma credencial real está presente. As referências de ações e imagens de runner estão fixadas ao que resolviam em 2024-08-02; consulte
pinning.mdno output do harness para todas as alterações feitas ao snapshot.Perguntas ou objeções: [email protected]
Gradio é um pacote Python de código aberto que permite criar rapidamente uma demo ou aplicação web para o seu modelo de machine learning, API, ou qualquer função Python arbitrária. Pode então partilhar um link para a sua demo ou aplicação web em apenas alguns segundos usando as funcionalidades de partilha integradas do Gradio. Não é necessária experiência com JavaScript, CSS ou hospedagem web!
São precisas apenas algumas linhas de Python para criar uma demo bonita como a acima, por isso vamos começar 💫
Pré-requisito: o Gradio requer Python 3.8 ou superior
Recomendamos instalar o Gradio usando pip, que vem incluído por predefinição no Python. Execute isto no seu terminal ou prompt de comando:
pip install gradio
[!TIP] É melhor instalar o Gradio num ambiente virtual. Instruções detalhadas de instalação para todos os sistemas operativos comuns são fornecidas aqui.
Pode executar o Gradio no seu editor de código favorito, Jupyter notebook, Google Colab, ou em qualquer outro lugar onde escreva Python. Vamos escrever a sua primeira aplicação 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] Abreviamos o nome importado de
gradioparagrpara melhor legibilidade do código. Esta é uma convenção amplamente adotada que deve seguir para que qualquer pessoa que trabalhe com o seu código o entenda facilmente.
Agora, execute o seu código. Se escreveu o código Python num ficheiro chamado, por exemplo, app.py, então deve executar python app.py no terminal.
A demo abaixo abrirá num navegador em http://localhost:7860 se executada a partir de um ficheiro. Se estiver a executar dentro de um notebook, a demo aparecerá incorporada no notebook.

Escreva o seu nome na caixa de texto à esquerda, arraste o slider e depois pressione o botão Submit. Deverá ver uma saudação amigável à direita.
[!TIP] Ao desenvolver localmente, pode executar a sua aplicação Gradio em modo de recarga automática (hot reload), que recarrega automaticamente a aplicação Gradio sempre que faz alterações ao ficheiro. Para tal, basta escrever
gradioantes do nome do ficheiro em vez depython. No exemplo acima, escreveria:gradio app.pyno seu terminal. Saiba mais sobre recarga automática no Guia de Recarga Automática.
Compreender a Classe Interface
Reparará que, para criar a sua primeira demo, criou uma instância da classe gr.Interface. A classe Interface foi concebida para criar demos para modelos de machine learning que aceitam uma ou mais entradas e devolvem uma ou mais saídas.
A classe Interface tem três argumentos principais:
fn: a função a envolver com uma interface de utilizador (UI)inputs: o(s) componente(s) Gradio a usar para a entrada. O número de componentes deve corresponder ao número de argumentos na sua função.outputs: o(s) componente(s) Gradio a usar para a saída. O número de componentes deve corresponder ao número de valores de retorno da sua função.O argumento fn é muito flexível — pode passar qualquer função Python que queira envolver com uma UI. No exemplo acima, vimos uma função relativamente simples, mas a função pode ser qualquer coisa, desde um gerador de música a uma calculadora de impostos ou à função de previsão de um modelo de machine learning pré-treinado.
Os argumentos input e output aceitam um ou mais componentes Gradio. Como veremos, o Gradio inclui mais de 30 componentes integrados (como os componentes gr.Textbox(), gr.Image() e gr.HTML()) concebidos para aplicações de machine learning.
[!TIP] Para os argumentos
inputseoutputs, pode passar o nome destes componentes como uma string ("textbox") ou uma instância da classe (gr.Textbox()).
Se a sua função aceitar mais do que um argumento, como no caso acima, passe uma lista de componentes de entrada para inputs, com cada componente de entrada a corresponder a um dos argumentos da função, por ordem. O mesmo se aplica se a sua função devolver mais do que um valor: basta passar uma lista de componentes para outputs. Esta flexibilidade torna a classe Interface uma forma muito poderosa de criar demos.
Iremos aprofundar o gr.Interface na nossa série sobre criação de Interfaces.