
# Laboratório de pesquisa de segurança autorizado reproduzindo CVE-2024-4253 (GHSA-r897-wrpm-h4vw): injeção de comando em workflow_run no test-functional.yml do gradio-app/gradio
Artefacto de investigação automatizada — não é o projeto original.
Este repositório é um laboratório descartável construído por um sistema automatizado para uma tese de mestrado na Université Laval sobre a reprodução de vulnerabilidades publicadas em workflows do GitHub Actions. É um instantâneo verbatim de
gradio-app/gradiono commita81e36967c0973012e90ec7cf03b99cf3fea88ec(2024-04-30), redistribuído sob a licença do próprio projeto, cujo ficheiro está incluído inalterado neste instantâneo.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 no que resolveram em 2024-04-30; consulte
pinning.mdna saída do harness para todas as alterações feitas ao instantâneo.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. Sem necessidade de experiência em JavaScript, CSS ou hospedagem web!
São precisas apenas algumas linhas de Python para criar uma demo bonita como a acima, então vamos começar 💫
Pré-requisito: 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, notebook Jupyter, 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 executaria 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.
Compreendendo a Classe Interface
Notará 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 retornam 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 correspondendo a um dos argumentos da função, por ordem. O mesmo se aplica se a sua função retornar 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.