T01 · Skill Instruction Hijacking
- Location
arena-agent.js:393- Finding
Untrusted Remote Game Data Is Embedded in the LLM System Prompt
- Content
View full analysis
p.id !== player.id) .map(p => `[${p.id}] ${p.username} (${p.rank_title})`) .join('\n ') || 'none nearby'; const myContracts = (state.my_contracts || []) .map(c => `[${c.id}] ${c.contract_type}: ${c.description} ${c.progress || 0}/${c.target} ($${c.scaled_reward || c.base_reward})`) .join('\n '); const offeredContracts = (state.contracts || []) .filter(c => c.status === 'offered') .map(c => `[${c.id}] ${c.contract_type}: ${c.description} ($${c.scaled_reward || c.base_reward})`) .join('\n '); // Dynamic context only return `${STATIC_SYSTEM_PREFIX} ## Your Status ${player.username} | ${rankTitle} (${rank}/7) | XP: ${player.reputation_xp || 0} | ${player.current_district} Dirty: $${player.dirty_cash || 0} | Clean: $${player.clean_cash || 0} | Heat: ${player.heat_level?.toFixed(1) || 0}/${HEAT_MAX} ${player.heat_level > 25 ? 'RISK' : ''} Season: $${player.season_revenue || 0} | Shaken: ${player.is_shaken ? 'YES' : 'No'} | Launder cap: $${player.solo_launder_remaining ?? '?'} ## Resources Inventory: ${inventory} Dealers (${(state.dealers || []).length}/8): ${dealers} Cooks: ${cooks} Gear: ${gear} Contracts: ${contracts} ## Environment Players: ${districtPlayers}${buildMarketSummary(state.market, rank, player.current_district)} ${buildCrewSection(state, player)} ${buildTurfSection(state, player)} ${formatActionHistory(recentActions)} ${formatAvailableActions(state, rank, availableDrugs, hasActiveContract, player)}`; } ``` The resulting string is subsequently supplied as the system-role message in `llm.js:25-29`: ```js const mes ...[truncated 2468 chars]- Remediation
View remediation
