# CASAN — Bản đồ Tấn công (Attack Catalog) > **Một trang nhìn-là-hiểu**: gom TẤT CẢ vector tấn công trong 2 script demo > (`run-all.sh` = Part 1 · `run-hardening.sh` = Part 2) vào một chỗ, phân theo > **chiều tấn công** và đánh dấu **cái nào dùng AI, cái nào tất định**. > > Tài liệu chi tiết "chặn thế nào": `CASAN_ATTACK_PLAYBOOK.md`. --- ## 🧭 Chú giải (đọc 20 giây là dùng được cả trang) **Chiều tấn công — tấn công đi vào đâu:** | Ký hiệu | Chiều | Ý nghĩa | |---|---|---| | 📥 | INPUT | Prompt/đầu vào của agent | | 📤 | OUTPUT | Đầu ra model (rò rỉ chiều ra) | | 📄 | ARTIFACT | Injection giấu trong file agent sẽ đọc (gián tiếp) | | 🔧 | TOOL-OUT | Kết quả tool quay lại ngữ cảnh model | | 📒 | AUDIT | Giả mạo nhật ký kiểm toán | | 📊 | TELEMETRY | Giả mạo dữ liệu token/chi phí | | 💰 | COST | Lạm dụng token/đốt tiền | | ⚙️ | ACTION | Hành động nguy hiểm (ghi file, lệnh huỷ diệt) | | 📦 | SUPPLY | Dependency độc do LLM tự thêm | | 🕵️ | EXFIL | Bí mật/PII rời khỏi tổ chức | | 🧪 | RUNTIME | Code sinh ra thoát sandbox | | 🏆 | EVIDENCE | Giả mạo chính gói bằng chứng | **Có dùng AI không:** 🤖 = **có gọi model** (Ollama ornith:9b) · ⚙️ = **tất định, KHÔNG AI** (regex/hash/chữ ký/policy) **Verdict trên màn hình:** ⛔ BLOCK `rc=2` · ✋ REQUIRE_APPROVAL `rc=3` · ❌ MISMATCH/FAIL `rc=1` · 🟢 PASS/OK `rc=0` · 📊 số đo --- ## 🛡️ Defense-in-depth: mỗi chiều bị chặn ở đâu ``` ┌─────────────────── CASAN HARNESS ───────────────────┐ 📥 INPUT ───────▶│ H4-in ▶ H5 govern ▶ H2 tool-gate ▶ H6 exec ▶ H4-out│──────▶ 📤 OUTPUT (A1-A7,HA1-4) │ ⛔ ⛔ SoD ⛔ authz 💰 cost ⛔ │ (A9) │ │ 📄 ARTIFACT ────▶│ artifact-scan (A5) 🔧 tool-output-scan (A3-har) │ 📦 SUPPLY ──────▶│ supply-chain-gate (HC2) │ ⚙️ ACTION ──────▶│ action-gate (HC1) 🧪 sandbox-run (HC4) │ 🕵️ EXFIL ───────▶│ data-exfil-guard (HC3) │ └──────────────────────────────────────────────────────┘ 📒 AUDIT (B1,B2) 📊 TELEMETRY (HA5) 💰 COST (D1,HA6) 🏆 EVIDENCE (HE1-4) hash-chain+RSA manifest ký số trần+ngân sách pack ký số, tamper-evident ``` **Nguyên tắc:** AI chỉ là **tầng leo thang tuỳ chọn** (semantic) — nó chỉ **THÊM** được lệnh chặn, không gỡ. Mọi đảm bảo lõi (fail-closed, audit bất biến, trần chi phí, chặn hành động) **chạy được với 0 phụ thuộc AI**. → *"Model sinh bản nháp; harness quyết định bản nháp có được tin hay không."* --- ## PART 1 — Attack Battery (`run-all.sh`) · 23 vector + chain ### ⭐ H4 — Security (9) | ID | Tấn công | Chiều | Control | Verdict | AI | |---|---|:--:|---|:--:|:--:| | **A1** | Direct prompt injection ("ignore previous…") | 📥 | `security-check.sh` blocklist | ⛔ `rc=2` | ⚙️ | | **A2** | Novel paraphrase (regex LỌT — minh hoạ gap) | 📥 | chỉ rule-based, tắt semantic | 🟢 `rc=0` *(cố ý lọt)* | ⚙️ | | **A3** | Semantic classify câu đã lọt ở A2 | 📥 | `model-router.sh --role classify` | ⛔ `verdict=INJECTION` | 🤖 | | **A4** | Obfuscation (leetspeak/whitespace) | 📥 | normalize fold trước match | ⛔ `rc=2` | ⚙️ | | **A5** 🔥 | Indirect injection giấu trong artifact | 📄 | `artifact-scan.sh` | ⛔ `rc=2` | ⚙️ | | **A6** | Secret (RSA private key) trong input | 📥 | regex private-key/secret | ⛔ `rc=2` | ⚙️ | | **A7** | PII / số thẻ tín dụng trong input | 📥 | regex pii-credit-card | ⛔ `rc=2` | ⚙️ | | **A8** | Red-team recall định lượng (30 mẫu) | 📥 | `phase3-redteam-metrics.sh` | 📊 `recall≥0.8 > regex` | 🤖 | | **A9** | Secret (AWS key) rò ở ĐẦU RA | 📤 | `security-check.sh` mode=output | ⛔ `rc=2` | ⚙️ | ### ⭐ H5 — Governance (8) | ID | Tấn công | Chiều | Control | Verdict | AI | |---|---|:--:|---|:--:|:--:| | **B1** 🔥 | Audit tamper — sửa 1 ký tự | 📒 | hash-chain SHA-256 | ❌ `AUDIT_HASH_MISMATCH` | ⚙️ | | **B2** | Chain re-forge (tính lại toàn bộ hash) | 📒 | chữ ký RSA trên HEAD | 🟢 `anchor=signed` *(re-forge bất khả)* | ⚙️ | | **B3** | Secret vô tình commit vào repo | 📦 | `secrets-scan.sh` | 🟢 `PASS` | ⚙️ | | **B4** | Tìm đường tắt `--no-verify`/bypass | meta | `circuit-breaker-check.sh` | 🟢 `no bypass` | ⚙️ | | **B5** | Tool-call không truy vết được | 📒 | `verify-tool-audit.sh` | 🟢 `TOOL_AUDIT_VALID` | ⚙️ | | **B6** 🔥 | Tự-duyệt (actor == approver) | ⚙️ | `governance-check.sh` SoD | ⛔ `rc=2` | ⚙️ | | **B7** | Agent sai quyền cố deploy | ⚙️ | `tool-registry-gate.sh` least-priv | ⛔ `rc=2` | ⚙️ | | **B8** | Spam deploy (lần 3 trong 1 run) | 💰 | rate-limit 2/run | ⛔ `rc=2` | ⚙️ | ### ⭐ H6 — AgentOps (6) | ID | Tấn công | Chiều | Control | Verdict | AI | |---|---|:--:|---|:--:|:--:| | **D1** 🔥 | Cost-spike: step tốn 3× token | 💰 | `cost-spike-detect.sh` | ⛔ `rc=2` | ⚙️ | | **D2** | Negative control (không báo động giả) | 💰 | cùng detector | 🟢 `rc=0` | ⚙️ | | **D3** | Drift: model đổi hành vi | 📊 | `drift-detect.sh` difflib | ⚠️ `DRIFT_WARN` | ⚙️ | | **D4** | Telemetry token THẬT (nguồn H6) | 📊 | `model-router.sh` ghi token thật | 📊 `real tokens` | 🤖 | | **D5** | Hallucination scan (claim vô căn cứ) | 📊 | `hallucination-scan.py` | 📊 sẵn sàng | ⚙️ | | **D6** | Hallucination RATE: dirty > clean | 📊 | đếm tín hiệu, fail-able | 📊 `dirty>clean` | ⚙️ | ### 🔥 Cross-layer chain + lát cắt pipeline thật (REAL=1) | Cảnh | Tấn công | Chiều | Control (defense-in-depth) | Verdict | AI | |---|---|:--:|---|:--:|:--:| | **CHAIN** | injection → lái tool → lộ credential → hành động sai | 📥→🔧→📒 | ① H4 ⛔ → ② tool-input schema ⛔ → ③ tool-exec timeout → ④ audit VALID | ⛔ chặn 4 lớp | ⚙️* | | **PIPELINE** | Chạy STEP1 thật qua wrapper | 📥 | `casan-harness.sh` → `casan-step.mjs` | 🟢 `audit +1` | 🤖 nếu tới review-step | | **MONEY-SHOT** | Cost-spike trên token pipeline THẬT | 💰 | `agent-metrics` đo → `cost-spike-detect` | ⛔ `rc=2` | ⚙️ | *Chain: lớp H4 có thể gọi semantic nếu chạy REAL=1 + Ollama; còn lại tất định. --- ## PART 2 — Production Hardening (`run-hardening.sh`) · 15 cảnh ### ⭐ Track A — H4/H5/H6 Hardening (7) | ID | Tấn công | Chiều | Control | Verdict | AI | |---|---|:--:|---|:--:|:--:| | **HA1** 🔥 | Homoglyph (і/о/е Cyrillic giả) | 📥 | `unicode-normalize.py` NFKC + fold confusable | ⛔ `rc=2` | ⚙️ | | **HA2** | Zero-width + fullwidth | 📥 | strip zero-width + fold fullwidth | ⛔ `rc=2` | ⚙️ | | **HA3** 🔥 | Base64-smuggled injection | 📥 | `decode-suspicious.py` giải mã + quét lại | ⛔ `rc=2` | ⚙️ | | **HA4** 🔥 | Strict fail-closed: model chết → CHẶN | 📥 | `CASAN_SECURITY_STRICT=1` fail-closed | ⛔ `rc=2` *(không SKIP âm thầm)* | 🤖† | | **HA5** | Telemetry integrity: sửa 1 token | 📊 | `telemetry-integrity.sh` manifest ký | ❌ `MISMATCH` `rc=1` | ⚙️ | | **HA6** 🔥 | Cost slow-boil + spray (né median) | 💰 | trần tuyệt đối + ngân sách tích luỹ | ⛔ `rc=2` | ⚙️ | | **HA7** | Benign FP budget (chống bắt nhầm) | 📥 | `benign-fp-report.sh` 95 mẫu EN/VI/JA | 📊 `FP=0%` | ⚙️ | †HA4 nói VỀ tầng AI: khi model semantic không sẵn sàng, control **tất định** quyết định fail-closed (chặn) thay vì tin bừa. ### ⭐ Track C-MVP — Kiểm soát ngoài 3 harness lõi (4) | ID | Tấn công | Chiều | Control | Verdict | AI | |---|---|:--:|---|:--:|:--:| | **HC1** 🔥 | Ghi `.env`/private-key/CI · `rm -rf` · `curl\|bash` · cài dep | ⚙️ | `action-gate.sh` (theo hành động) | ⛔ `rc=2` / ✋ `rc=3` | ⚙️ | | **HC2** 🔥 | Typosquat · postinstall · gói độc | 📦 | `supply-chain-gate.sh` diff + denylist | ⛔ `rc=2` / ✋ `rc=3` | ⚙️ | | **HC3** 🔥 | Secret→cloud · PII→audit | 🕵️ | `data-exfil-guard.sh` theo đích | ⛔ `rc=2` / mask | ⚙️ | | **HC4** 🔥 | Đọc `~/.ssh` · fork-bomb · ghi ngoài workspace | 🧪 | `sandbox-run.sh` policy tĩnh + ulimit | ⛔ `rc=2` | ⚙️ | ### 🏆 Evidence Pack — "Vì sao tin output này?" (4) | ID | Cảnh | Chiều | Control | Verdict | AI | |---|---|:--:|---|:--:|:--:| | **HE1** | `casan pack` đóng gói 12 file bằng chứng | 🏆 | `evidence-pack.sh pack` | 🟢 `CREATED anchor=signed` | ⚙️ | | **HE2** | `casan verify-pack` pack nguyên vẹn | 🏆 | `evidence-pack.sh verify-pack` | 🟢 `VALID` | ⚙️ | | **HE3** 🔥🔥 | Đổi 1 byte → CHỨNG NHẬN VÔ HIỆU | 🏆 | recompute hash vs manifest | ❌ `TAMPERED` `rc=1` | ⚙️ | | **HE4** | Certified chỉ khi ĐỦ cổng | 🏆 | `run-summary.certified` gate | 📊 earned-not-stamped | ⚙️ | --- ## 📊 Tổng kết một dòng - **~38 cảnh tấn công** trong 2 script · **12 chiều tấn công** khác nhau · phủ OWASP LLM/Agentic Top 10 · CSA MAESTRO · MITRE ATLAS. - **Chỉ 3–4 cảnh dùng AI** (A3 semantic · A8 recall · D4 telemetry · HA4 nói về AB layer) — **phần còn lại HOÀN TOÀN tất định**: regex, chuẩn hoá Unicode, giải base64, hash-chain SHA-256, chữ ký RSA, allowlist hành động, edit-distance, ulimit. - **140 automated checks** đứng sau các cảnh này (baseline 79 + hardening 61), 0 fail — xem `casan-next-plans/CASAN_HARDENING_STATUS.md`. - **Thông điệp:** an toàn KHÔNG phụ thuộc "model xịn". AI là tầng leo thang tuỳ chọn chỉ thêm-chặn; harness tất định giữ mọi đảm bảo lõi.