Analyze Python code for class pollution vulnerabilities (Python's prototype pollution), identify vulnerable merge functions, and demonstrate exploitation techniques for authorized security testing. Use this skill whenever the user mentions Python security, prototype pollution, class pollution, merge vulnerabilities, __class__ manipulation, __globals__ access, or needs to audit Python code for object injection attacks.
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
Instruções da origem · Visualização somente leitura
name
python-class-pollution
description
Analyze Python code for class pollution vulnerabilities (Python's prototype pollution), identify vulnerable merge functions, and demonstrate exploitation techniques for authorized security testing. Use this skill whenever the user mentions Python security, prototype pollution, class pollution, merge vulnerabilities, __class__ manipulation, __globals__ access, or needs to audit Python code for object injection attacks.
Python Class Pollution Analysis
A skill for identifying and analyzing class pollution vulnerabilities in Python code — the Python equivalent of JavaScript prototype pollution.
What is Class Pollution?
Class pollution occurs when an attacker can modify class attributes, inheritance chains, or global variables through untrusted input that gets merged into objects. This is possible because Python allows dynamic modification of:
__class__.__qualname__ - Class names
__class__.__base__ - Inheritance chain
__class__.__init__.__globals__ - Module globals
__kwdefaults__ - Function keyword defaults
__init__.__globals__ - Class initialization globals
Detection Patterns
1. Vulnerable Merge Functions
Look for recursive merge functions that use setattr() without validation:
# VULNERABLE PATTERNdefmerge(src, dst):
for k, v in src.items():
ifhasattr(dst, k) andtype(v) == dict:
merge(v, getattr(dst, k))
else:
setattr(dst, k, v) # DANGEROUS: no validation
Red flags:
setattr() on untrusted input
Recursive merging without key validation
No filtering of dunder attributes (__class__, __globals__, etc.)
Direct attribute assignment from user-controlled dictionaries
Impact: Can forge Flask session cookies and escalate privileges.
Safe Merge Implementation
import re
defsafe_merge(src, dst, allowed_keys=None):
"""Safe merge that prevents class pollution."""# Block dangerous dunder attributes
dangerous_patterns = [
r'^__.*__$', # All dunder attributesr'^_.*$', # Private attributes
]
for k, v in src.items():
# Skip dangerous keysifany(re.match(p, k) for p in dangerous_patterns):
continue# Skip if key not in allowed listif allowed_keys and k notin allowed_keys:
continueifhasattr(dst, '__getitem__'):
if dst.get(k) andisinstance(v, dict):
safe_merge(v, dst.get(k), allowed_keys)
else:
dst[k] = v
elifhasattr(dst, k) andisinstance(v, dict):
safe_merge(v, getattr(dst, k), allowed_keys)
else:
setattr(dst, k, v)
Audit Checklist
When reviewing Python code for class pollution:
Find all merge(), update(), copy() functions
Check if they use setattr() on untrusted input
Verify dunder attributes are filtered
Look for __class__, __globals__, __init__ in user input
Check if objects are created from user-controlled dicts
Review serialization/deserialization code
Examine config loading from external sources
Check for json.loads() → object conversion patterns
Testing (Authorized Only)
Use the detect_class_pollution.py script to scan codebases: