
Framework di benchmarking per la valutazione di agenti AI che utilizzano il computer contro la prompt injection indiretta multi-step, con decomposizione automatica di obiettivi avversari e ambienti di test in sandbox AWS.
Per prima cosa, installa tutte le dipendenze e assicurati di utilizzare Python 3.10.
conda create -n stepjack python=3.10
conda activate stepjack
pip install -r requirements.txt
Utilizziamo l'ambiente AWS fornito da RedTeamCUA.
AWS
Configura NETWORK_INTERFACE_MAP:
Configura NETWORK_INTERFACE_MAP in aws_config.py in base alle tue istanze AWS.
Configura il tuo security group:
È importante configurare un security group che consenta l'accesso legittimo alle istanze hostate bloccando al contempo i tentativi di accesso non autorizzati. Questo è cruciale perché l'AMI, per impostazione predefinita, utilizza solo l'autenticazione di base basata su password, che è relativamente facile da compromettere.
La tua macchina locale accederà ai servizi hostati su AWS tramite connessioni HTTP/TCP. Pertanto, dovresti consentire esplicitamente l'accesso alle seguenti porte: 8092, 6379, 9999, 5000, 9222, 8091, 2999 e 3000, che sono utilizzate da WebArena o TheAgentCompany.
Inoltre, utilizziamo SSH per modificare direttamente il database sottostante al fine di simulare scenari di iniezione. Di conseguenza, l'accesso SSH dall'indirizzo IP locale deve essere consentito anche nelle impostazioni del security group.
Configura le credenziali AWS usando aws configure, che ti chiederà:
scripts/run_gpt54_2step.sh mostra un esempio di esecuzione di GPT-5.4 CUA su StepJack.
Imposta le variabili d'ambiente
Chiavi API CUA
# Per GPT
unset OPENAI_BASE_URL
export OPENAI_API_KEY="sk-proj-XXXX"
# Per Kimi
export KIMI_API_KEY='sk-XXXX'
# Per Qwen
export OPENAI_BASE_URL="https://dashscope-us.aliyuncs.com/compatible-mode/v1"
export OPENAI_API_KEY="sk-XXXX"
# Per Claude
export ANTHROPIC_API_KEY='sk-XXXX'
Credenziali AWS
export AWS_REGION='XX'
export AWS_ACCESS_KEY='XX'
export AWS_SECRET_KEY='XX'
Esegui gli esperimenti
# Per GPT
python run_gpt54_multienv.py \
--observation_type screenshot \
--agent_type GPT54Agent \
--headless \
--model gpt-5.4-mini-2026-03-17 \
--result_dir ./results_gpt54 \
--test_all_meta_path "./dataset/{subset}/{platform_instruction}/test_{k}_step.json" \
--test_config_base_dir "./dataset/{subset}/{platform_instruction}" \
--max_steps {15*k} \
--sleep_after_execution 4 \
--provider_name aws \
--num_envs 12 \
--aws_ami {reddit | agentcompany}
# Per Kimi
python run_kimi_multienv.py \
--observation_type screenshot \
--agent_type KimiAgent \
--headless \
--model Kimi-K2.5 \
--result_dir ./results_kimi \
--test_all_meta_path "./dataset/{subset}/{platform_instruction}/test_{k}_step.json" \
--test_config_base_dir "./dataset/{subset}/{platform_instruction}" \
--max_steps {15*k} \
--sleep_after_execution 4 \
--provider_name aws \
--num_envs 12 \
--aws_ami {reddit | agentcompany}
# Per Qwen
python run_qwen35vl_multienv.py \
--observation_type screenshot \
--agent_type Qwen35VLAgent \
--headless \
--model qwen3.5-plus-2026-02-15 \
--coord relative \
--enable_thinking \
--result_dir ./results_qwen \
--test_all_meta_path "./dataset/{subset}/{platform_instruction}/test_{k}_step.json" \
--test_config_base_dir "./dataset/{subset}/{platform_instruction}" \
--max_steps {15*k} \
--sleep_after_execution 4 \
--provider_name aws \
--num_envs 12 \
--aws_ami {reddit | agentcompany}
# Per Claude
python run_claude_multienv.py \
--observation_type screenshot \
--action_space pyautogui \
--agent_type AnthropicAgent \
--api_provider anthropic \
--headless \
--model {claude-sonnet-4-6 | claude-haiku-4-5} \
--result_dir ./results_claude \
--test_all_meta_path "./dataset/{subset}/{platform_instruction}/test_{k}_step.json" \
--test_config_base_dir "./dataset/{subset}/{platform_instruction}" \
--max_steps {15*k} \
--sleep_after_execution 4 \
--provider_name aws \
--num_envs 12 \
--aws_ami {reddit | agentcompany}
Argomenti:
single_step (k=1), w_urgent (Urgent = Y), wo_urgent (Urgent = N).forum, forum_follow, owncloud, owncloud_follow. Corrispondono a 2 piattaforme e 2 tipi di istruzioni utente.(subset, k): single_step solo con k=1; w_urgent e wo_urgent solo con k \in \{2,3\}.reddit per la piattaforma forum o agentcompany per la piattaforma owncloud.Il codice della pipeline di decomposizione automatica si trova in auto_decomp/.
cd auto_decomp. Aggiungi nuovi obiettivi avversari da decomporre in adv_goals.py.python iterative_refinement.py -k {k} per ogni k \in \{2, 3\}. Output: ir/goal_*_k{k}_N20_K3_all.json, contenente i risultati della Fase 1.python selected_examples/select_examples.py. Output: selected_examples/selected_examples.json che seleziona i primi 10 esempi dalla Fase 1.StepJack si basa su RedTeamCUA (Liao et al., 2025; arXiv:2505.21936), che a sua volta deriva da OSWorld (XLANG NLP Lab, 2024). Entrambe le fonti a monte sono concesse in licenza sotto Apache-2.0.
Alcune directory di dati di StepJack non hanno intestazioni per-file perché contengono fixture binarie o non sorgente. La loro provenienza è registrata qui per l'attribuzione: