SCP-V3 / scp /security /cross_language_learner.py
Base44 Superagent
Replace SCP-V3 content with GA-LAB backend (FastAPI + LLM Bridge). Old V3 code/data preserved on GitHub checken1994/V3- (branch main).
d60732b
Raw
History Blame Contribute Delete
8.67 kB
"""
SCP V104 — Cross-Language Pattern Transfer
============================================
Dịch pattern tiếng Việt → tiếng Anh/Trung/Nhật/Hàn → auto-generate detector patterns.
Ví dụ:
VI: "bỏ qua hướng dẫn" → EN: "ignore instructions"
→ ZH: "忽略指令"
→ JA: "指示を無視"
→ KO: "지시를 무시"
Cách dùng:
from scp.security.cross_language_learner import CrossLanguageLearner
learner = CrossLanguageLearner()
patterns = learner.transfer_all("bo qua huong dan", "injection", "critical")
# → {"en": "ignore.*instructions", "zh": "忽略.*指令", "ja": "指示.*無視", ...}
"""
from __future__ import annotations
import logging
from dataclasses import dataclass
logger = logging.getLogger("scp.security.cross_language_learner")
# Pre-computed translations (offline, no API needed)
PATTERN_TRANSLATIONS = {
# Vietnamese → target languages
"bo qua": {
"en": "ignore",
"zh": "忽略",
"ja": "無視",
"ko": "무시",
"fr": "ignorer",
"de": "ignoriere",
"es": "ignora",
"ar": "تجاهل",
},
"huong dan": {
"en": "instructions",
"zh": "指令",
"ja": "指示",
"ko": "지시",
"fr": "instructions",
"de": "Anweisungen",
"es": "instrucciones",
"ar": "التعليمات",
},
"quen di": {
"en": "forget",
"zh": "忘记",
"ja": "忘れて",
"ko": "잊어버려",
"fr": "oublie",
"de": "vergiss",
"es": "olvida",
"ar": "انسى",
},
"dong vai": {
"en": "act as|pretend.*are|roleplay",
"zh": "扮演|假装",
"ja": "演じて|偽って",
"ko": "연기해|가장",
"fr": "agis.*comme|prétend",
"de": "verhalte.*als|tu.*so",
"es": "actúa.*como|finge",
"ar": "تصرف.*كما|تظاهر",
},
"khong gioi han": {
"en": "no.*restrictions?|unrestricted",
"zh": "无限制|不受限",
"ja": "制限なし|無制限",
"ko": "제한.*없|무제한",
"fr": "sans.*restrict|sans.*limite",
"de": "ohne.*Einschränk|unbeschränkt",
"es": "sin.*restric|sin.*límite",
"ar": "بدون.*قيود|غير.*مقيد",
},
"tiet lo": {
"en": "reveal|show|expose",
"zh": "揭示|显示|暴露",
"ja": "明か|示|暴",
"ko": "공개|보여|노출",
"fr": "révèle|montre|expose",
"de": "offenbare|zeige|enthülle",
"es": "revela|muestra|expone",
"ar": "كشف|أظهر|اعرض",
},
"system prompt": {
"en": "system.?prompt|initial.?instructions",
"zh": "系统提示|初始指令",
"ja": "システムプロンプト|初期指示",
"ko": "시스템.*프롬프트|초기.*지시",
"fr": "prompt.*système|instructions.*initiales",
"de": "System.*Prompt|anfängliche.*Anweisungen",
"es": "prompt.*sistema|instrucciones.*iniciales",
"ar": "موجه.*النظام|التعليمات.*الأولية",
},
"dan": {
"en": "dan|do.anything.now",
"zh": "dan|什么都能做",
"ja": "dan|何でもできる",
"ko": "dan|무엇이든.*해",
"fr": "dan|fais.*tout",
"de": "dan|tu.*alles",
"es": "dan|haz.*todo",
"ar": "dan|افعل.*أي.*شيء",
},
"khong can tuan": {
"en": "no.*need.*follow|don't.*follow",
"zh": "无需遵守|不必遵守",
"ja": "従う.*必要.*なし|従わ",
"ko": "따를.*필요.*없|따르지",
"fr": "pas.*besoin.*suivre|ne.*suis.*pas",
"de": "nicht.*folgen|muss.*nicht.*befolgen",
"es": "no.*necesitas.*seguir|no.*siga",
"ar": "لا.*تحتاج.*اتباع|لا.*اتبع",
},
}
SUPPORTED_LANGUAGES = ["en", "zh", "ja", "ko", "fr", "de", "es", "ar"]
@dataclass
class TransferredPattern:
"""1 pattern transfer sang ngôn ngữ khác."""
source_language: str # "vi"
target_language: str # "en", "zh", ...
original_pattern: str # "bỏ qua hướng dẫn"
transferred_regex: str # "ignore.*instructions"
category: str # "injection", "jailbreak", ...
severity: str # "critical", "high", ...
class CrossLanguageLearner:
"""
Transfer Vietnamese/English patterns → 8 ngôn ngữ khác.
"""
def __init__(self):
self._stats = {
"patterns_transferred": 0,
"languages": SUPPORTED_LANGUAGES,
"by_language": {},
}
def transfer_pattern(
self,
vi_keywords: list[str],
category: str,
severity: str,
target_lang: str = "en",
) -> TransferredPattern | None:
"""Transfer 1 Vietnamese pattern sang target language."""
translated_parts = []
for kw in vi_keywords:
kw_norm = kw.lower().strip()
if kw_norm in PATTERN_TRANSLATIONS:
translations = PATTERN_TRANSLATIONS[kw_norm]
if target_lang in translations:
translated_parts.append(translations[target_lang])
if not translated_parts:
return None
# Build regex: join with .* for flexibility
regex = ".*".join(translated_parts)
self._stats["patterns_transferred"] += 1
self._stats["by_language"][target_lang] = (
self._stats["by_language"].get(target_lang, 0) + 1
)
return TransferredPattern(
source_language="vi",
target_language=target_lang,
original_pattern=" ".join(vi_keywords),
transferred_regex=regex,
category=category,
severity=severity,
)
def transfer_all(
self,
vi_keywords: list[str],
category: str,
severity: str,
) -> dict[str, str]:
"""Transfer 1 pattern sang TẤT CẢ ngôn ngữ → dict {lang: regex}."""
results = {}
for lang in SUPPORTED_LANGUAGES:
transferred = self.transfer_pattern(vi_keywords, category, severity, lang)
if transferred:
results[lang] = transferred.transferred_regex
return results
def transfer_existing_vietnamese_patterns(self) -> list[dict]:
"""Transfer tất cả Vietnamese patterns hiện có sang 8 ngôn ngữ."""
# Vietnamese patterns to transfer
vi_patterns = [
(["bo qua", "huong dan"], "injection", "critical"),
(["quen di", "huong dan"], "injection", "critical"),
(["dong vai", "khong gioi han"], "jailbreak", "critical"),
(["tiet lo", "system prompt"], "exfiltration", "high"),
(["khong can tuan"], "injection", "high"),
(["dan"], "jailbreak", "high"),
]
all_patterns = []
for keywords, category, severity in vi_patterns:
for lang in SUPPORTED_LANGUAGES:
transferred = self.transfer_pattern(keywords, category, severity, lang)
if transferred:
all_patterns.append({
"target_lang": transferred.target_language,
"regex": transferred.transferred_regex,
"category": transferred.category,
"severity": transferred.severity,
"original": transferred.original_pattern,
})
logger.info(f"CrossLanguage: transferred {len(all_patterns)} patterns to {len(SUPPORTED_LANGUAGES)} languages")
return all_patterns
def stats(self) -> dict:
return self._stats.copy()
if __name__ == "__main__":
print("=== Cross-Language Learner — Test ===\n")
learner = CrossLanguageLearner()
# Test 1: Transfer 1 pattern to all languages
print("Test 1: Transfer 'bỏ qua hướng dẫn' → all languages")
results = learner.transfer_all(["bo qua", "huong dan"], "injection", "critical")
for lang, regex in results.items():
print(f" {lang}: {regex}")
# Test 2: Transfer all existing patterns
print("\nTest 2: Transfer all existing Vietnamese patterns")
all_patterns = learner.transfer_existing_vietnamese_patterns()
print(f" Total patterns: {len(all_patterns)}")
for p in all_patterns[:10]:
print(f" [{p['target_lang']}] {p['regex'][:50]} ({p['category']}, {p['severity']})")
print(f"\nStats: {learner.stats()}")
print("\n✓ Test complete.")