Skip to content
Back to skills

Soft Instruction Defense

ASecurity

Defends tool-augmented LLM agents against prompt injection via iterative input sanitization. Multi-pass inspection detects malicious instructions in untrusted data, remediates them, and re-evaluates until clean or iteration limit reached. Raises attack barrier while maintaining agent usability.

  • 6 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 9, 2026
ai-agentspythonrustgitapisecurity

Works with

  • api

Security analysis

A100/100

Scanned September 9, 2026

npx -y skills add ADu2021/skillXiv --skill soft-instruction-defense --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Soft Instruction Defense?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Soft Instruction Defense
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/adu2021-soft-instruction-defense/badge)](https://www.skillsdirectory.com/skills/adu2021-soft-instruction-defense)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: soft-instruction-defense
title: "Soft Instruction De-escalation Defense"
version: 0.0.2
engine: skillxiv-v0.0.2-claude-opus-4.6
license: MIT
url: "https://arxiv.org/abs/2510.21057"
keywords: [Security, Prompt Injection, Agent Safety, Sanitization]
description: "Defends tool-augmented LLM agents against prompt injection via iterative input sanitization. Multi-pass inspection detects malicious instructions in untrusted data, remediates them, and re-evaluates until clean or iteration limit reached. Raises attack barrier while maintaining agent usability."
---

# Soft Instruction De-escalation Defense: Protecting Agent Workflows

Tool-augmented agents process untrusted data from APIs, web responses, and user-provided documents. Prompt injection attacks embed malicious instructions within this data to hijack agent behavior.

SIC (Soft Instruction de-escalation) implements iterative sanitization loops that detect and remediate injected instructions while maintaining partial functionality, making attacks harder and more detectable.

## Core Concept

Key insight: **single-pass sanitization misses injections** that later steps expose. Iterative loops catch missed attacks by:
- Inspecting input for instruction-like content
- Remediating detected malicious instructions
- Re-evaluating sanitized output
- Halting if instructions persist after iterations

This raises the cost for attackers while preserving agent capability.

## Architecture Overview

- Instruction pattern detection (imperative verbs, command syntax)
- Remediation strategies (rewriting, masking, removal)
- Iterative sanitization loop with convergence checks
- Failsafe termination when malicious content persists

## Implementation Steps

Implement instruction detection that identifies suspicious patterns in untrusted data. This uses heuristics and ML to flag instruction-like content:

```python
class InstructionDetector:
    def __init__(self):
        # Patterns for common injection attacks
        self.imperative_verbs = [
            'ignore', 'forget', 'override', 'bypass', 'execute',
            'run', 'follow', 'replace', 'change', 'disable'
        ]

        # High-risk instruction patterns
        self.instruction_patterns = [
            r'ignore.*instructions',
            r'(from now on|henceforth)',
            r'new (task|instruction|mode)',
            r'system.*prompt',
        ]

    def detect_instructions(self, text):
        """Flag potentially malicious instructions in text."""
        detections = []

        # Check for imperative verbs
        tokens = text.lower().split()
        for i, token in enumerate(tokens):
            if token in self.imperative_verbs:
                # Check if next tokens form instruction-like pattern
                if i < len(tokens) - 1:
                    detections.append({
                        'type': 'imperative',
                        'position': i,
                        'span': ' '.join(tokens[i:min(i+4, len(tokens))])
                    })

        # Check for regex patterns
        for pattern in self.instruction_patterns:
            matches = re.finditer(pattern, text, re.IGNORECASE)
            for match in matches:
                detections.append({
                    'type': 'pattern',
                    'pattern': pattern,
                    'span': match.group()
                })

        return detections
```

Implement remediation strategies that remove or rewrite detected injections. Different strategies apply based on context:

```python
class InstructionRemediator:
    def remediate(self, text, detections, strategy='mask'):
        """Remove or rewrite detected instructions."""
        if strategy == 'mask':
            # Replace instruction content with placeholders
            remediated = text
            for detection in sorted(detections, key=lambda x: x.get('position', 0), reverse=True):
                span = detection['span']
                remediated = remediated.replace(span, '[REMOVED]')
            return remediated

        elif strategy == 'rewrite':
            # Rewrite instructions as non-imperative statements
            remediated = text
            for detection in detections:
                span = detection['span']
                # Convert "ignore X" to "X should be noted"
                rewritten = self._convert_to_passive(span)
                remediated = remediated.replace(span, rewritten)
            return remediated

        elif strategy == 'remove':
            # Delete instruction sentences
            remediated = text
            for detection in sorted(detections, key=lambda x: x.get('position', 0), reverse=True):
                span = detection['span']
                # Remove entire sentence containing instruction
                sentences = remediated.split('.')
                filtered = [s for s in sentences if span not in s]
                remediated = '.'.join(filtered)
            return remediated

        return text

    def _convert_to_passive(self, instruction):
        """Convert imperative to passive voice."""
        # Simple heuristic: add "It is noted that"
        return f"It is noted that {instruction.lower()}"
```

Implement the iterative sanitization loop that applies detection and remediation repeatedly:

```python
class IterativeSanitizer:
    def __init__(self, max_iterations=5):
        self.detector = InstructionDetector()
        self.remediator = InstructionRemediator()
        self.max_iterations = max_iterations

    def sanitize(self, untrusted_input):
        """Iteratively sanitize input until clean or limit reached."""
        current_text = untrusted_input
        iteration = 0
        sanitization_history = []

        while iteration < self.max_iterations:
            # Detect instructions in current text
            detections = self.detector.detect_instructions(current_text)

            if not detections:
                # No instructions found - text is clean
                return {
                    'status': 'clean',
                    'text': current_text,
                    'iterations': iteration,
                    'history': sanitization_history
                }

            # Remediate detected instructions
            remediated = self.remediator.remediate(current_text, detections)

            sanitization_history.append({
                'iteration': iteration,
                'detections_count': len(detections),
                'remediation_strategy': 'mask'
            })

            if remediated == current_text:
                # Remediation didn't change text - likely complex instruction
                return {
                    'status': 'suspicious',
                    'text': current_text,
                    'iterations': iteration,
                    'reason': f'{len(detections)} persistent instructions',
                    'history': sanitization_history
                }

            current_text = remediated
            iteration += 1

        # Exceeded iteration limit with suspicious content
        return {
            'status': 'failed_sanitization',
            'text': current_text,
            'iterations': iteration,
            'reason': f'Max iterations ({self.max_iterations}) reached',
            'history': sanitization_history
        }
```

## Practical Guidance

| Parameter | Recommendation |
|-----------|-----------------|
| Max iterations | 3-5 (balance safety vs. latency) |
| Detection sensitivity | Medium (avoid false positives) |
| Remediation strategy | Mask or remove (safer than rewrite) |
| Suspicious content handling | Halt agent execution |

**When to use:**
- Tool-augmented agents processing untrusted data
- Systems handling user-provided documents or web scraping
- High-security applications where prompt injection risk is high
- Scenarios with unpredictable external input sources

**When NOT to use:**
- Fully controlled data sources (fine-tuning, internal APIs)
- Real-time systems with strict latency requirements (overhead ≈10-20ms per input)
- Natural language that uses imperatives legitimately

**Common pitfalls:**
- Detection rules too narrow (miss sophisticated injections)
- Remediation breaking legitimate instructions (false positives)
- Insufficient iterations (miss layered attacks)
- Not logging injection attempts (security visibility lost)

Reference: [Soft Instruction De-escalation Defense on arXiv](https://arxiv.org/abs/2510.21057)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.