LLM06
OWASP LLM Top 10 DATA

Sensitive Information Disclosure

Description

LLMs may inadvertently reveal sensitive data including PII, credentials, or proprietary information through outputs. Risks include training data memorization and prompt-based extraction.

Risk

LLMs can leak sensitive information through multiple vectors including memorized training data, inference from context, or manipulation via prompt injection. This includes PII, API keys, confidential business data, or system internals. Disclosed information can enable further attacks, violate privacy regulations, or cause competitive harm.

Attack Scenarios

Attacker uses carefully crafted prompts to extract memorized API keys or passwords that appeared in training data, gaining unauthorized access to systems.

User prompts an LLM chatbot with questions designed to infer confidential business information from responses, such as customer lists or pricing strategies not publicly available.

Mitigations

Data Sanitization

Scrub training data of PII, credentials, and sensitive information before use. Implement automated scanning and manual review processes.

Output Filtering

Monitor LLM outputs for sensitive data patterns including regex for credit cards, SSNs, API keys. Redact detected sensitive information before delivery.

Access Controls

Implement strict authorization for LLM features. Ensure users can only access information appropriate to their privilege level.

Differential Privacy

Apply privacy-preserving techniques during training to reduce memorization of specific data points. Use techniques like DP-SGD where appropriate.

Code Examples

# Good: Output filtering for sensitive data
import re
from typing import Optional

class SensitiveDataFilter:
    PATTERNS = {
        'credit_card': re.compile(r'\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b'),
        'ssn': re.compile(r'\b\d{3}-\d{2}-\d{4}\b'),
        'api_key': re.compile(r'\b[A-Za-z0-9]{32,}\b'),
        'email': re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b')
    }
    
    def filter_output(self, text: str, user_role: str) -> str:
        filtered = text
        for pattern_name, pattern in self.PATTERNS.items():
            if self._should_redact(pattern_name, user_role):
                filtered = pattern.sub('[REDACTED]', filtered)
        return filtered
    
    def _should_redact(self, pattern_name: str, user_role: str) -> bool:
        # Role-based redaction logic
        if user_role == 'admin':
            return pattern_name in ['credit_card', 'ssn']
        return True  # Redact all for non-admin

Evidence Requirements

  • Training data sanitization logs and PII removal reports
  • Output filtering rules and detection patterns
  • Access control policies for LLM features
  • Data loss prevention (DLP) monitoring alerts
  • Privacy impact assessments