alp-code 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/CHANGELOG.md +770 -0
  2. package/LICENSE +21 -0
  3. package/README.md +295 -0
  4. package/alp.config.yaml +5 -0
  5. package/dist/src/agents/agent-definition.js +28 -0
  6. package/dist/src/agents/capability-catalog.js +33 -0
  7. package/dist/src/agents/compaction.js +36 -0
  8. package/dist/src/agents/errors.js +12 -0
  9. package/dist/src/agents/librarian.js +38 -0
  10. package/dist/src/agents/main.js +37 -0
  11. package/dist/src/agents/memory-grant.js +29 -0
  12. package/dist/src/agents/model-context.js +70 -0
  13. package/dist/src/agents/modes.js +134 -0
  14. package/dist/src/agents/oracle.js +36 -0
  15. package/dist/src/agents/read-thread.js +38 -0
  16. package/dist/src/agents/registry.js +238 -0
  17. package/dist/src/agents/render-identity.js +38 -0
  18. package/dist/src/agents/review.js +37 -0
  19. package/dist/src/agents/search.js +37 -0
  20. package/dist/src/agents/shared/house-rules.js +33 -0
  21. package/dist/src/agents/shared/principal.js +18 -0
  22. package/dist/src/agents/shared/voice.js +29 -0
  23. package/dist/src/agents/titling.js +32 -0
  24. package/dist/src/agents/types.js +15 -0
  25. package/dist/src/backend/execution-backend.js +2 -0
  26. package/dist/src/backend/local-execution-store.js +144 -0
  27. package/dist/src/backend/local-process-backend.js +533 -0
  28. package/dist/src/backend/local-supervisor.js +104 -0
  29. package/dist/src/cli/alp.js +380 -0
  30. package/dist/src/cli/commands/context.js +203 -0
  31. package/dist/src/cli/commands/delegate.js +136 -0
  32. package/dist/src/cli/commands/identity-sync.js +31 -0
  33. package/dist/src/cli/commands/init.js +184 -0
  34. package/dist/src/cli/commands/mode.js +22 -0
  35. package/dist/src/cli/commands/principal.js +114 -0
  36. package/dist/src/cli/commands/run-main.js +90 -0
  37. package/dist/src/cli/commands/runtime.js +21 -0
  38. package/dist/src/cli/mode-preference-store.js +62 -0
  39. package/dist/src/cli/mode-selector.js +178 -0
  40. package/dist/src/cli/update-check.js +77 -0
  41. package/dist/src/context/checkpoint.js +134 -0
  42. package/dist/src/context/compact-journal.js +153 -0
  43. package/dist/src/context/compact-payload.js +121 -0
  44. package/dist/src/context/continuity.js +70 -0
  45. package/dist/src/context/types.js +2 -0
  46. package/dist/src/delegation/backend-registry.js +40 -0
  47. package/dist/src/delegation/delegation-service.js +300 -0
  48. package/dist/src/delegation/types.js +12 -0
  49. package/dist/src/execution/execution-policy.js +96 -0
  50. package/dist/src/execution/execution-service.js +115 -0
  51. package/dist/src/execution/execution-store.js +78 -0
  52. package/dist/src/execution/identity-capsule.js +65 -0
  53. package/dist/src/execution/types.js +12 -0
  54. package/dist/src/hooks/execution-bridge.js +84 -0
  55. package/dist/src/index.js +4 -0
  56. package/dist/src/memory/adapters/markdown-file-store.js +257 -0
  57. package/dist/src/memory/adapters/memory-api-client.js +2 -0
  58. package/dist/src/memory/adapters/memory-path-mapper.js +76 -0
  59. package/dist/src/memory/adapters/remote-api-store.js +25 -0
  60. package/dist/src/memory/context-ranker.js +21 -0
  61. package/dist/src/memory/errors.js +58 -0
  62. package/dist/src/memory/memory-service.js +149 -0
  63. package/dist/src/memory/memory-store.js +2 -0
  64. package/dist/src/memory/types.js +2 -0
  65. package/dist/src/policy/capability-policy.js +29 -0
  66. package/dist/src/policy/delegation-policy.js +25 -0
  67. package/dist/src/policy/errors.js +10 -0
  68. package/dist/src/policy/invariants.js +31 -0
  69. package/dist/src/policy/memory-policy.js +22 -0
  70. package/dist/src/policy/policy-engine.js +85 -0
  71. package/dist/src/policy/types.js +8 -0
  72. package/dist/src/policy/workspace-policy.js +77 -0
  73. package/dist/src/principal/principal-profile-store.js +89 -0
  74. package/dist/src/runtime/adapter-files.js +147 -0
  75. package/dist/src/runtime/claude-adapter.js +177 -0
  76. package/dist/src/runtime/codex-adapter.js +169 -0
  77. package/dist/src/runtime/permission-rules.js +156 -0
  78. package/dist/src/runtime/render-session-context.js +124 -0
  79. package/dist/src/runtime/render-task-input.js +33 -0
  80. package/dist/src/runtime/runtime-adapter.js +2 -0
  81. package/dist/src/runtime/runtime-preference-store.js +66 -0
  82. package/dist/src/runtime/runtime-selector.js +178 -0
  83. package/dist/src/runtime/types.js +2 -0
  84. package/dist/src/runtime/windows-shim.js +57 -0
  85. package/dist/src/state-paths.js +49 -0
  86. package/dist/src/workflow/output-validator.js +27 -0
  87. package/dist/src/workflow/repair-policy.js +8 -0
  88. package/dist/src/workflow/types.js +22 -0
  89. package/dist/src/workflow/workflow-runner.js +81 -0
  90. package/hooks/compact-record.cjs +109 -0
  91. package/hooks/session-boot.cjs +112 -0
  92. package/hooks/session-end.cjs +34 -0
  93. package/package.json +48 -0
  94. package/scaffold/memory/INDEX.md +27 -0
  95. package/scaffold/memory/README.md +76 -0
  96. package/scaffold/memory/projects/INDEX.md +22 -0
  97. package/scaffold/memory/projects/PROTOCOL.md +128 -0
  98. package/scaffold/memory/projects/_template/PROJECT.md +45 -0
  99. package/scripts/alp.cjs +126 -0
  100. package/scripts/alp.ps1 +4 -0
  101. package/scripts/alp.sh +3 -0
  102. package/scripts/bootstrap.cjs +144 -0
  103. package/scripts/checkout-release.cjs +30 -0
  104. package/scripts/delegate.cjs +19 -0
  105. package/scripts/doctor.cjs +158 -0
  106. package/scripts/doctor.sh +3 -0
  107. package/scripts/ensure-state.cjs +22 -0
  108. package/scripts/lib/cli-link.cjs +375 -0
  109. package/scripts/lib/codex-role.cjs +18 -0
  110. package/scripts/lib/delegation/command-runner.cjs +108 -0
  111. package/scripts/lib/delegation/config.cjs +81 -0
  112. package/scripts/lib/install-paths.cjs +154 -0
  113. package/scripts/lib/release-manifest.cjs +42 -0
  114. package/scripts/lib/semver-lite.cjs +20 -0
  115. package/scripts/lib/state.cjs +274 -0
  116. package/scripts/lib/uninstall.cjs +252 -0
  117. package/scripts/lib/update-check-worker.cjs +21 -0
  118. package/scripts/lib/update.cjs +395 -0
  119. package/scripts/run-role.cjs +42 -0
  120. package/scripts/run-role.ps1 +4 -0
  121. package/scripts/run-role.sh +3 -0
  122. package/scripts/sync-project-index.sh +167 -0
  123. package/skills/agent-memory/SKILL.md +109 -0
  124. package/skills/alp-debug/SKILL.md +90 -0
  125. package/skills/alp-debug/references/defense-in-depth.md +118 -0
  126. package/skills/alp-debug/references/investigation-methodology.md +106 -0
  127. package/skills/alp-debug/references/log-and-ci-analysis.md +96 -0
  128. package/skills/alp-debug/references/performance-diagnostics.md +112 -0
  129. package/skills/alp-debug/references/reporting-standards.md +120 -0
  130. package/skills/alp-debug/references/root-cause-tracing.md +134 -0
  131. package/skills/alp-debug/references/systematic-debugging.md +93 -0
  132. package/skills/alp-debug/references/verification.md +86 -0
  133. package/skills/alp-debug/scripts/find-polluter.sh +63 -0
  134. package/skills/alp-debug/scripts/find-polluter.test.md +102 -0
  135. package/skills/alp-plan/SKILL.md +128 -0
  136. package/skills/alp-plan/references/archive-workflow.md +77 -0
  137. package/skills/alp-plan/references/codebase-understanding.md +55 -0
  138. package/skills/alp-plan/references/output-standards.md +96 -0
  139. package/skills/alp-plan/references/plan-organization.md +129 -0
  140. package/skills/alp-plan/references/red-team-personas.md +76 -0
  141. package/skills/alp-plan/references/red-team-workflow.md +81 -0
  142. package/skills/alp-plan/references/research-phase.md +57 -0
  143. package/skills/alp-plan/references/scope-challenge.md +82 -0
  144. package/skills/alp-plan/references/solution-design.md +76 -0
  145. package/skills/alp-plan/references/validate-question-framework.md +89 -0
  146. package/skills/alp-plan/references/validate-workflow.md +83 -0
  147. package/skills/alp-predict/SKILL.md +98 -0
  148. package/skills/alp-scenario/SKILL.md +86 -0
  149. package/skills/code-review/SKILL.md +111 -0
  150. package/skills/code-review/references/code-review-reception.md +114 -0
  151. package/skills/code-review/references/edge-case-scouting.md +78 -0
  152. package/skills/code-review/references/verification-before-completion.md +117 -0
  153. package/skills/delegation/SKILL.md +46 -0
  154. package/skills/docs-seeker/.env.example +15 -0
  155. package/skills/docs-seeker/SKILL.md +87 -0
  156. package/skills/docs-seeker/package.json +25 -0
  157. package/skills/docs-seeker/references/advanced.md +82 -0
  158. package/skills/docs-seeker/references/context7-patterns.md +68 -0
  159. package/skills/docs-seeker/references/errors.md +72 -0
  160. package/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
  161. package/skills/docs-seeker/scripts/detect-topic.js +172 -0
  162. package/skills/docs-seeker/scripts/fetch-docs.js +213 -0
  163. package/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
  164. package/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
  165. package/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
  166. package/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
  167. package/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
  168. package/skills/docs-seeker/workflows/library-search.md +73 -0
  169. package/skills/docs-seeker/workflows/repo-analysis.md +90 -0
  170. package/skills/docs-seeker/workflows/topic-search.md +69 -0
  171. package/skills/git/SKILL.md +121 -0
  172. package/skills/git/references/branch-management.md +90 -0
  173. package/skills/git/references/commit-standards.md +82 -0
  174. package/skills/git/references/gh-cli-guide.md +132 -0
  175. package/skills/git/references/safety-protocols.md +86 -0
  176. package/skills/git/references/workflow-commit.md +89 -0
  177. package/skills/git/references/workflow-merge.md +63 -0
  178. package/skills/git/references/workflow-pr.md +70 -0
  179. package/skills/git/references/workflow-push.md +62 -0
  180. package/skills/gkg/SKILL.md +87 -0
  181. package/skills/gkg/references/cli-commands.md +92 -0
  182. package/skills/gkg/references/http-api.md +99 -0
  183. package/skills/gkg/references/language-support.md +54 -0
  184. package/skills/problem-solving/SKILL.md +86 -0
  185. package/skills/problem-solving/references/attribution.md +48 -0
  186. package/skills/problem-solving/references/collision-zone-thinking.md +71 -0
  187. package/skills/problem-solving/references/inversion-exercise.md +88 -0
  188. package/skills/problem-solving/references/meta-pattern-recognition.md +80 -0
  189. package/skills/problem-solving/references/scale-game.md +82 -0
  190. package/skills/problem-solving/references/simplification-cascades.md +83 -0
  191. package/skills/problem-solving/references/when-stuck.md +76 -0
  192. package/skills/repomix/SKILL.md +94 -0
  193. package/skills/repomix/references/configuration.md +134 -0
  194. package/skills/repomix/references/usage-patterns.md +106 -0
  195. package/skills/repomix/scripts/.coverage +0 -0
  196. package/skills/repomix/scripts/README.md +179 -0
  197. package/skills/repomix/scripts/repomix_batch.py +455 -0
  198. package/skills/repomix/scripts/repos.example.json +15 -0
  199. package/skills/repomix/scripts/requirements.txt +15 -0
  200. package/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
  201. package/skills/research/SKILL.md +107 -0
  202. package/skills/security-scan/SKILL.md +101 -0
  203. package/skills/security-scan/references/secret-patterns.md +75 -0
  204. package/skills/security-scan/references/vulnerability-patterns.md +136 -0
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: security-scan
3
+ description: Quét bảo mật bằng Grep + shell — secret lộ, phụ thuộc có CVE, mẫu lỗ hổng phổ biến, .env bị track. Kích hoạt khi được giao concern security, khi nghi có credential trong code, hoặc trước khi chốt một thay đổi chạm xác thực hay dữ liệu.
4
+ ---
5
+
6
+ # security-scan — quét lỗ hổng cơ học
7
+
8
+ Dùng cho concern `security`. Đây là bước **quét**, không phải bước
9
+ kết luận: nó tìm chỗ đáng ngờ nhanh và đầy đủ, còn xác định có thật là lỗ hổng hay không
10
+ vẫn là việc đọc code của bạn.
11
+
12
+ Không cần cài gì thêm — chỉ `Grep`, `Glob` và `Bash`.
13
+
14
+ ## Thứ tự chạy
15
+
16
+ Chạy đúng thứ tự này. Secret trước vì nó là loại phát hiện **khẩn cấp nhất** — một key lộ
17
+ cần xoay ngay, không đợi hết báo cáo.
18
+
19
+ ### 1. Nhận diện loại project
20
+
21
+ `package.json` → Node · `requirements.txt`/`pyproject.toml` → Python · `go.mod` → Go ·
22
+ `Cargo.toml` → Rust. Không nhận ra thì bỏ bước audit phụ thuộc, nói rõ trong báo cáo.
23
+
24
+ ### 2. Quét secret — luôn chạy
25
+
26
+ Mẫu regex: `references/secret-patterns.md`.
27
+
28
+ Bỏ qua: `.env.example`, fixture test, tài liệu, `node_modules/`, `dist/`, `vendor/`.
29
+
30
+ Mỗi khớp phải tự hỏi: đây là secret thật hay placeholder (`YOUR_API_KEY`, `xxx`, `changeme`)?
31
+ Placeholder mà báo CHẶN là cách nhanh nhất để lần sau không ai đọc báo cáo của bạn nữa.
32
+
33
+ ### 3. Audit phụ thuộc
34
+
35
+ ```bash
36
+ npm audit --json 2>/dev/null || echo 'npm audit không chạy được'
37
+ pip-audit --format json 2>/dev/null || echo 'pip-audit không có'
38
+ ```
39
+
40
+ Không chạy được thì ghi "chưa audit được vì …" — **không** suy ra là sạch.
41
+
42
+ ### 4. Mẫu lỗ hổng trong code
43
+
44
+ Mẫu: `references/vulnerability-patterns.md`. Grep xong thì **đọc 5–10 dòng quanh chỗ khớp**
45
+ rồi mới kết luận. Grep một mình chỉ ra chỗ đáng nhìn, không ra lỗ hổng.
46
+
47
+ Nhóm chính: SQL injection (nối chuỗi vào query), XSS (`innerHTML`,
48
+ `dangerouslySetInnerHTML` không sanitize), command injection (`exec`/`spawn` với input
49
+ chưa lọc), path traversal, randomness không an toàn (`Math.random` cho mục đích bảo mật),
50
+ `eval()`/`Function()` với input động.
51
+
52
+ ### 5. Kiểm tra .env bị track
53
+
54
+ ```bash
55
+ git ls-files --error-unmatch .env .env.local .env.production 2>/dev/null
56
+ grep -n '\.env' .gitignore 2>/dev/null
57
+ ```
58
+
59
+ ## Luật cứng khi xử lý secret
60
+
61
+ - **Không bao giờ in giá trị secret thật ra báo cáo.** Che còn 4 ký tự đầu + 2 ký tự cuối.
62
+ - **Không chạy, không dùng, không thử** credential tìm được. Kể cả để "kiểm chứng xem có
63
+ thật không" — dùng thử một key thật là hành động khó đảo ngược (HOUSE-RULES §1.2).
64
+ - Tìm thấy credential thật → khuyến nghị **xoay ngay**, và nói rõ nó đã nằm trong lịch sử
65
+ git thì xoá file không đủ.
66
+ - Không tự sửa code, kể cả khi loadout có cấp `Edit`. Quét là việc đọc.
67
+
68
+ ## Mẫu báo cáo
69
+
70
+ Dùng đúng ba mức của `code-review` để bên giao việc không phải quy đổi thang.
71
+
72
+ ```
73
+ ## Quét bảo mật: <scope>
74
+
75
+ Đã chạy: <lệnh nào chạy được, lệnh nào không>
76
+ File đã quét: <số>
77
+
78
+ Tổng: CHẶN n · NÊN SỬA n · GHI NHẬN n
79
+
80
+ ### CHẶN
81
+ - [SECRET] `src/config.js:42` — AWS key, khớp `AKIA[0-9A-Z]{16}`, giá trị `AKIA…4F`
82
+ Sửa: xoay key ngay, chuyển sang biến môi trường. Key đã vào lịch sử git.
83
+ - [SQLi] `src/db/user.ts:88` — nối trực tiếp `req.query.id` vào câu SQL
84
+ Bằng chứng: <đoạn code>
85
+
86
+ ### NÊN SỬA
87
+ - …
88
+
89
+ ### GHI NHẬN
90
+ - …
91
+
92
+ ### Chưa kiểm chứng được
93
+ <phần grep khớp nhưng chưa đọc đủ ngữ cảnh để kết luận, và vì sao>
94
+ ```
95
+
96
+ ## Phạm vi
97
+
98
+ **Làm:** phát hiện secret, audit phụ thuộc, mẫu lỗ hổng phổ biến, `.env` bị track.
99
+
100
+ **Không làm:** pentest, phân tích lúc chạy, bảo mật hạ tầng, audit tuân thủ. Việc đó vượt
101
+ quá thứ đọc code tĩnh trả lời được — gặp thì báo lại, đừng giả vờ kết luận.
@@ -0,0 +1,75 @@
1
+ # Mẫu phát hiện secret
2
+
3
+ Mẫu regex dùng với `Grep`. Loại trừ file test và file ví dụ **trước khi** quét, không lọc sau.
4
+
5
+ ## Độ tin cậy cao — có cấu trúc, ít báo nhầm
6
+
7
+ Khớp một trong những mẫu này gần như chắc chắn là secret thật. Xử lý ngay, không đợi quét xong.
8
+
9
+ | Nguồn | Mẫu |
10
+ |---|---|
11
+ | AWS | `AKIA[0-9A-Z]{16}` |
12
+ | GitHub | `gh[pousr]_[A-Za-z0-9_]{36,255}` · `github_pat_[A-Za-z0-9_]{22,}` |
13
+ | Stripe | `sk_live_[0-9a-zA-Z]{24,}` · `rk_live_[0-9a-zA-Z]{24,}` |
14
+ | Slack | `xox[baprs]-[0-9a-zA-Z-]{10,}` |
15
+ | Google Cloud | `AIza[0-9A-Za-z_-]{35}` |
16
+ | Anthropic | `sk-ant-[A-Za-z0-9_-]{40,}` |
17
+ | Private key | `-----BEGIN (RSA \|EC \|DSA \|OPENSSH )?PRIVATE KEY-----` |
18
+ | JWT trong code | `eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}` |
19
+
20
+ Riêng `sk_live_` của Stripe và `AKIA` của AWS: đây là **khoá production**. Tìm thấy thì
21
+ khuyến nghị xoay ngay, và nói rõ nó đã nằm trong lịch sử git nên xoá file không đủ.
22
+
23
+ ## Độ tin cậy vừa — phải đọc ngữ cảnh
24
+
25
+ Mẫu dưới đây khớp cả secret thật lẫn placeholder. **Đọc 5–10 dòng quanh chỗ khớp** rồi mới
26
+ kết luận.
27
+
28
+ **Khoá API chung**
29
+
30
+ ```
31
+ (?i)(api[_-]?key|apikey|api[_-]?secret)\s*[:=]\s*['"][A-Za-z0-9/+=]{16,}['"]
32
+ ```
33
+
34
+ **Chuỗi kết nối database có credential**
35
+
36
+ ```
37
+ (?i)(postgres|mysql|mongodb|redis)://[^:]+:[^@]+@
38
+ ```
39
+
40
+ **Mật khẩu trong code**
41
+
42
+ ```
43
+ (?i)(password|passwd|pwd)\s*[:=]\s*['"][^'"]{8,}['"]
44
+ ```
45
+
46
+ **Secret chung**
47
+
48
+ ```
49
+ (?i)(secret|token|credential)\s*[:=]\s*['"][A-Za-z0-9/+=]{16,}['"]
50
+ ```
51
+
52
+ ## Loại trừ
53
+
54
+ Bỏ qua khớp trong:
55
+
56
+ | Loại | Cụ thể |
57
+ |---|---|
58
+ | File | `*.example`, `*.test.*`, `*.spec.*`, `*.md`, `*.txt` |
59
+ | Thư mục | `node_modules/`, `dist/`, `vendor/`, `__pycache__/` |
60
+ | Nội dung | dòng có `TODO`, `FIXME`, `YOUR_`, `REPLACE_`, `xxx`, `placeholder`, `changeme` |
61
+ | Nội dung | khai biến không có giá trị thật: `= process.env.`, `= os.getenv(` |
62
+
63
+ Dòng cuối quan trọng: `const key = process.env.API_KEY` là code **đúng**, không phải lỗ
64
+ hổng. Báo nó là CHẶN thì lần sau không ai đọc báo cáo của bạn nữa.
65
+
66
+ ## Khi báo cáo
67
+
68
+ **Không bao giờ in giá trị secret thật.** Che còn 4 ký tự đầu + 2 ký tự cuối:
69
+
70
+ ```
71
+ `src/config.js:42` — AWS key, khớp `AKIA[0-9A-Z]{16}`, giá trị `AKIA…4F`
72
+ ```
73
+
74
+ Và **không chạy, không dùng thử** credential tìm được — kể cả để kiểm xem nó còn hiệu lực
75
+ không. Dùng thử một khoá thật là thao tác khó đảo ngược (HOUSE-RULES §1.2).
@@ -0,0 +1,136 @@
1
+ # Mẫu lỗ hổng trong code
2
+
3
+ Mẫu regex dùng với `Grep`.
4
+
5
+ **Grep chỉ ra chỗ đáng nhìn, không ra lỗ hổng.** Mỗi chỗ khớp phải đọc 5–10 dòng xung quanh
6
+ rồi mới kết luận. Bỏ bước đó thì báo cáo đầy báo nhầm, và phần thật bị chìm mất.
7
+
8
+ ## SQL injection
9
+
10
+ Nối chuỗi vào truy vấn:
11
+
12
+ ```
13
+ (?i)(query|sql|execute)\s*\(.*\+.*\)
14
+ (?i)(SELECT|INSERT|UPDATE|DELETE|DROP).*['"].*\+
15
+ ```
16
+
17
+ Template literal (JS/TS):
18
+
19
+ ```
20
+ (?i)(query|sql|execute)\s*\(`.*\$\{
21
+ ```
22
+
23
+ Câu hỏi quyết định khi đọc ngữ cảnh: **giá trị nối vào có nguồn gốc từ người dùng không?**
24
+ Nối một hằng số trong code không phải lỗ hổng.
25
+
26
+ ## XSS
27
+
28
+ Thao tác DOM nguy hiểm:
29
+
30
+ ```
31
+ \.innerHTML\s*=
32
+ dangerouslySetInnerHTML
33
+ document\.write\(
34
+ ```
35
+
36
+ Output không escape ở template engine:
37
+
38
+ ```
39
+ \{\{\{ # Handlebars — ba ngoặc nhọn
40
+ <%-\s* # EJS — khác <%= (có escape)
41
+ \|safe\b # Jinja2 / Django
42
+ v-html= # Vue
43
+ ```
44
+
45
+ ## Command injection
46
+
47
+ ```
48
+ (?i)(exec|execSync|spawn|spawnSync)\s*\(.*\+
49
+ (?i)(exec|execSync|spawn|spawnSync)\s*\(`.*\$\{
50
+ (?i)child_process.*\(.*\$\{
51
+ os\.system\(.*\+
52
+ subprocess\.(call|run|Popen)\(.*\+
53
+ ```
54
+
55
+ Đây là nhóm nguy hiểm nhất: chạy được lệnh tuỳ ý thường nghĩa là chiếm được máy.
56
+
57
+ ## Path traversal
58
+
59
+ ```
60
+ (?i)(readFile|writeFile|createReadStream|open)\s*\(.*req\.(params|query|body)
61
+ (?i)(readFile|writeFile)\s*\(.*\+.*\)
62
+ ```
63
+
64
+ ## Randomness không an toàn
65
+
66
+ ```
67
+ Math\.random\(\).*(?i)(token|key|secret|password|session|nonce|salt)
68
+ ```
69
+
70
+ `Math.random()` không phải nguồn ngẫu nhiên mật mã. Dùng nó sinh token phiên nghĩa là token
71
+ đoán được — CHẶN, kể cả khi "chưa ai khai thác".
72
+
73
+ ## Hàm nguy hiểm
74
+
75
+ ```
76
+ \beval\s*\(
77
+ new\s+Function\s*\(
78
+ setTimeout\s*\(\s*['"] # truyền chuỗi = eval trá hình
79
+ setInterval\s*\(\s*['"]
80
+ ```
81
+
82
+ Giải tuần tự hoá:
83
+
84
+ ```
85
+ (?i)(pickle\.loads|yaml\.load\(|unserialize\()
86
+ JSON\.parse\(.*req\.(params|query|body)
87
+ ```
88
+
89
+ `yaml.load()` không có `SafeLoader` và `pickle.loads()` trên dữ liệu ngoài đều là chạy code
90
+ tuỳ ý, không phải chỉ đọc dữ liệu.
91
+
92
+ ## Xác thực / phân quyền
93
+
94
+ Credential hardcode:
95
+
96
+ ```
97
+ (?i)(admin|root|password)\s*[:=]\s*['"][^'"]{4,}['"]
98
+ ```
99
+
100
+ Tắt bảo mật:
101
+
102
+ ```
103
+ (?i)(verify|ssl|tls|certificate)\s*[:=]\s*(false|False|0)
104
+ (?i)rejectUnauthorized\s*:\s*false
105
+ NODE_TLS_REJECT_UNAUTHORIZED.*0
106
+ ```
107
+
108
+ Nhóm "tắt bảo mật" đáng soi kỹ: nó thường được thêm để chữa một lỗi lúc phát triển rồi
109
+ không ai gỡ. Tìm thấy trong code chạy thật thì đó là CHẶN.
110
+
111
+ ## Lộ thông tin
112
+
113
+ ```
114
+ (?i)console\.(log|debug|trace)\s*\(.*(?:password|secret|token|key|credential)
115
+ (?i)(DEBUG|VERBOSE)\s*[:=]\s*(true|True|1)
116
+ ```
117
+
118
+ ## Dấu hiệu báo nhầm
119
+
120
+ Bỏ qua chỗ khớp có:
121
+
122
+ - `test`, `spec`, `mock`, `fixture`, `example`, `sample`, `demo`
123
+ - `TODO`, `FIXME`, `HACK`
124
+ - Đọc từ biến môi trường: `process.env.`, `os.getenv(`
125
+ - Nằm trong comment (`//`, `#`, `/*`)
126
+
127
+ ## Xếp mức
128
+
129
+ | Mức | Khi |
130
+ |---|---|
131
+ | **CHẶN** | khai thác được từ input người dùng, dẫn tới chạy code tuỳ ý, vượt xác thực, hoặc lộ dữ liệu |
132
+ | **NÊN SỬA** | mẫu nguy hiểm nhưng đường vào hiện chưa mở, hoặc có lớp chặn khác phía trước |
133
+ | **GHI NHẬN** | chỉ trong code test/dev, không lên production |
134
+
135
+ Chưa xác định được input có tới được chỗ đó không → ghi vào mục **Chưa kiểm chứng được**,
136
+ đừng đoán rồi xếp CHẶN.