Skip to content
WarHound AI

Application Security

Treat AI tool results as untrusted evidence

AI tools generate responses that mix reasoning with untrusted external data. Application engineers must treat all AI-generated output as potentially compromised, enforcing strict validation, least privilege, and separated data flows to mitigate prompt injection risks.

Observe. Explain. Retest.MAKE EVIDENCE USEFULWARHOUND / FIELD NOTESCONCEPTREVIEW NOTE / ILLUSTRATIVEOBSERVATIONEVIDENCERETESTObserve. Explain. Retest.MAKE EVIDENCE USEFULOBSERVATIONEVIDENCERETESTWARHOUND / CONCEPTUAL ILLUSTRATION
Useful security reviews connect an observation to evidence and a deliberate retest. Conceptual illustration.

Understanding the Prompt Injection Problem

Large Language Models (LLMs) fundamentally lack a structural separation between instructions and data. When an application passes user input or retrieved external content into a prompt, the model processes the entire string as a sequence of tokens to continue. If the input contains text that looks like a new directive, the model may follow it instead of the application's intended task.

This vulnerability is known as prompt injection. It allows an attacker to manipulate the model's behavior by crafting inputs that override the developer's instructions. Impacts range from bypassing safety filters and leaking system configurations to unauthorized tool execution and data exfiltration.

Because the flaw is inherent to how current models parse language, there is no simple patch or single filter that makes a model "secure." Defending an AI application requires treating the model itself as an untrusted component within the system architecture.

Direct and Indirect Attack Vectors

Prompt injection attacks generally fall into two categories: direct and indirect.

Direct prompt injection occurs when a user intentionally inputs malicious instructions. The attacker directly interacts with the application, attempting to jailbreak the model or extract internal data. Common examples include role-playing prompts, "ignore previous instructions" commands, and complex encoding techniques designed to evade simple keyword filters.

Indirect prompt injection is often more dangerous because the malicious payload is hidden in external data that the AI retrieves. For instance, an AI coding assistant might process a compromised code comment, or a Retrieval-Augmented Generation (RAG) system might ingest a poisoned document. In these cases, the user may be innocent, but the application is still manipulated because the model blindly trusts the retrieved context.

  • Malicious instructions hidden in code comments or pull requests.
  • Poisoned documents in vector databases used for RAG.
  • Invisible or hidden text embedded in web pages or resumes.

How Attackers Evade Detection

Attackers use a variety of techniques to bypass input filters and guardrails. Deny lists are rarely effective because natural language provides infinite ways to phrase an instruction. Attackers can translate payloads into low-resource languages, mix scripts, or use "typoglycemia" (scrambled words that remain readable) to evade exact string matches.

More sophisticated attacks use encoding, such as Base64 or Hex, or embed invisible Unicode characters. Multimodal models can also be attacked via steganography or hidden text in images. Furthermore, attackers can automate the generation of thousands of prompt variations (Best-of-N attacks) to systematically discover combinations that bypass safety training and guardrails.

Building a Defense-in-Depth Architecture

Because no single control is foolproof, applications must implement layered defenses. The foundation of this strategy is isolating the LLM and strictly validating its inputs and outputs.

Input screening using pattern matching or LLM-based guardrails can catch known attack types but will produce false positives and miss novel variations. It is not a security boundary. Output monitoring is equally important; applications should check for system prompt leakage, sensitive data exposure, or unauthorized markup before presenting the result to the user or downstream system.

When integrating tools or APIs, the AI must operate under the principle of least privilege. The application layer, not the AI, must enforce authorization and validate parameters. Never trust the AI's assertion that a tool call is safe.

Architectural Patterns for Data Separation

One way to mitigate risk is to physically or logically separate untrusted data from privileged execution environments. The Dual-LLM or CaMeL (CApabilities for MachinE Learning) pattern demonstrates this concept.

In this architecture, a 'Privileged LLM' writes an execution plan without ever seeing the untrusted external data. A separate 'Quarantined LLM' parses the untrusted documents but is denied access to tools or external actions. A deterministic interpreter then tracks the flow of capabilities, blocking any action that violates the configured policy.

While this approach adds complexity, it prevents an injected instruction in a retrieved document from directly manipulating tool arguments. However, it requires strict dependency tracking and does not solve the problem of the model returning misleading or altered summaries.

Human-in-the-Loop Controls

For applications that perform consequential actions—such as modifying code, executing transactions, or changing configurations—automated guardrails are insufficient. A human-in-the-loop (HITL) control must be implemented.

The application should present the proposed action, target, and arguments to a human operator for approval. The decision to execute must be based on the exact operation, not on the wording of the user's prompt or the AI's justification. The execution component must cryptographically or cryptographically verify that the specific action was approved before proceeding.

Sources and Acknowledgments

Primary reference for prompt injection mechanics and mitigation strategies: OWASP LLM Prompt Injection Prevention Cheat Sheet (https://cheatsheetseries.owasp.org/cheatsheets/LLM_Prompt_Injection_Prevention_Cheat_Sheet.html).

Drafted with Gemini and checked for source links, advisory identifiers, structure and unsupported product claims. Examples are synthetic and are not scan results.

Drafted with Gemini and checked for source links, advisory identifiers, structure and unsupported product claims. Examples are synthetic and are not scan results.

Prepared with AI assistance and published by WarHound AI. Check the references and evidence limits in each article.

The WarHoundAI journal

Questions or a factual correction? Get in touch with the article URL and supporting evidence.

Continue reading.

All articles
Application Security

Archive extraction: traversal, symlinks and resource exhaustion

Processing ZIP archives introduces significant risks including path traversal, arbitrary file writes via symlinks, and resource exhaustion. This guide covers safe extraction techniques, testing matrices, and implementation tradeoffs based on OWASP standards.

Read article 6 min read
Application Security

WebSocket authentication and message authorization

Unlike standard HTTP requests, WebSocket connections remain open for persistent bidirectional data exchange, rendering traditional request-based security filters ineffective. Application engineers must implement custom authentication during the initial handshake, continuously manage session validity over long-lived connections, and authorize individual messages independently to prevent hijacking and unauthorized data access.

Read article 6 min read
Database Security

Tenant isolation with PostgreSQL row security

PostgreSQL Row-Level Security (RLS) provides a robust mechanism for enforcing tenant isolation directly at the database layer. By defining permissive and restrictive policies, application engineers can ensure that data access is restricted on a per-user or per-tenant basis prior to application-level filtering. This article details the implementation of these policies, addresses critical race conditions in policy subqueries, and outlines a comprehensive testing matrix to verify isolation boundaries.

Read article 5 min read