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.
- package/CHANGELOG.md +770 -0
- package/LICENSE +21 -0
- package/README.md +295 -0
- package/alp.config.yaml +5 -0
- package/dist/src/agents/agent-definition.js +28 -0
- package/dist/src/agents/capability-catalog.js +33 -0
- package/dist/src/agents/compaction.js +36 -0
- package/dist/src/agents/errors.js +12 -0
- package/dist/src/agents/librarian.js +38 -0
- package/dist/src/agents/main.js +37 -0
- package/dist/src/agents/memory-grant.js +29 -0
- package/dist/src/agents/model-context.js +70 -0
- package/dist/src/agents/modes.js +134 -0
- package/dist/src/agents/oracle.js +36 -0
- package/dist/src/agents/read-thread.js +38 -0
- package/dist/src/agents/registry.js +238 -0
- package/dist/src/agents/render-identity.js +38 -0
- package/dist/src/agents/review.js +37 -0
- package/dist/src/agents/search.js +37 -0
- package/dist/src/agents/shared/house-rules.js +33 -0
- package/dist/src/agents/shared/principal.js +18 -0
- package/dist/src/agents/shared/voice.js +29 -0
- package/dist/src/agents/titling.js +32 -0
- package/dist/src/agents/types.js +15 -0
- package/dist/src/backend/execution-backend.js +2 -0
- package/dist/src/backend/local-execution-store.js +144 -0
- package/dist/src/backend/local-process-backend.js +533 -0
- package/dist/src/backend/local-supervisor.js +104 -0
- package/dist/src/cli/alp.js +380 -0
- package/dist/src/cli/commands/context.js +203 -0
- package/dist/src/cli/commands/delegate.js +136 -0
- package/dist/src/cli/commands/identity-sync.js +31 -0
- package/dist/src/cli/commands/init.js +184 -0
- package/dist/src/cli/commands/mode.js +22 -0
- package/dist/src/cli/commands/principal.js +114 -0
- package/dist/src/cli/commands/run-main.js +90 -0
- package/dist/src/cli/commands/runtime.js +21 -0
- package/dist/src/cli/mode-preference-store.js +62 -0
- package/dist/src/cli/mode-selector.js +178 -0
- package/dist/src/cli/update-check.js +77 -0
- package/dist/src/context/checkpoint.js +134 -0
- package/dist/src/context/compact-journal.js +153 -0
- package/dist/src/context/compact-payload.js +121 -0
- package/dist/src/context/continuity.js +70 -0
- package/dist/src/context/types.js +2 -0
- package/dist/src/delegation/backend-registry.js +40 -0
- package/dist/src/delegation/delegation-service.js +300 -0
- package/dist/src/delegation/types.js +12 -0
- package/dist/src/execution/execution-policy.js +96 -0
- package/dist/src/execution/execution-service.js +115 -0
- package/dist/src/execution/execution-store.js +78 -0
- package/dist/src/execution/identity-capsule.js +65 -0
- package/dist/src/execution/types.js +12 -0
- package/dist/src/hooks/execution-bridge.js +84 -0
- package/dist/src/index.js +4 -0
- package/dist/src/memory/adapters/markdown-file-store.js +257 -0
- package/dist/src/memory/adapters/memory-api-client.js +2 -0
- package/dist/src/memory/adapters/memory-path-mapper.js +76 -0
- package/dist/src/memory/adapters/remote-api-store.js +25 -0
- package/dist/src/memory/context-ranker.js +21 -0
- package/dist/src/memory/errors.js +58 -0
- package/dist/src/memory/memory-service.js +149 -0
- package/dist/src/memory/memory-store.js +2 -0
- package/dist/src/memory/types.js +2 -0
- package/dist/src/policy/capability-policy.js +29 -0
- package/dist/src/policy/delegation-policy.js +25 -0
- package/dist/src/policy/errors.js +10 -0
- package/dist/src/policy/invariants.js +31 -0
- package/dist/src/policy/memory-policy.js +22 -0
- package/dist/src/policy/policy-engine.js +85 -0
- package/dist/src/policy/types.js +8 -0
- package/dist/src/policy/workspace-policy.js +77 -0
- package/dist/src/principal/principal-profile-store.js +89 -0
- package/dist/src/runtime/adapter-files.js +147 -0
- package/dist/src/runtime/claude-adapter.js +177 -0
- package/dist/src/runtime/codex-adapter.js +169 -0
- package/dist/src/runtime/permission-rules.js +156 -0
- package/dist/src/runtime/render-session-context.js +124 -0
- package/dist/src/runtime/render-task-input.js +33 -0
- package/dist/src/runtime/runtime-adapter.js +2 -0
- package/dist/src/runtime/runtime-preference-store.js +66 -0
- package/dist/src/runtime/runtime-selector.js +178 -0
- package/dist/src/runtime/types.js +2 -0
- package/dist/src/runtime/windows-shim.js +57 -0
- package/dist/src/state-paths.js +49 -0
- package/dist/src/workflow/output-validator.js +27 -0
- package/dist/src/workflow/repair-policy.js +8 -0
- package/dist/src/workflow/types.js +22 -0
- package/dist/src/workflow/workflow-runner.js +81 -0
- package/hooks/compact-record.cjs +109 -0
- package/hooks/session-boot.cjs +112 -0
- package/hooks/session-end.cjs +34 -0
- package/package.json +48 -0
- package/scaffold/memory/INDEX.md +27 -0
- package/scaffold/memory/README.md +76 -0
- package/scaffold/memory/projects/INDEX.md +22 -0
- package/scaffold/memory/projects/PROTOCOL.md +128 -0
- package/scaffold/memory/projects/_template/PROJECT.md +45 -0
- package/scripts/alp.cjs +126 -0
- package/scripts/alp.ps1 +4 -0
- package/scripts/alp.sh +3 -0
- package/scripts/bootstrap.cjs +144 -0
- package/scripts/checkout-release.cjs +30 -0
- package/scripts/delegate.cjs +19 -0
- package/scripts/doctor.cjs +158 -0
- package/scripts/doctor.sh +3 -0
- package/scripts/ensure-state.cjs +22 -0
- package/scripts/lib/cli-link.cjs +375 -0
- package/scripts/lib/codex-role.cjs +18 -0
- package/scripts/lib/delegation/command-runner.cjs +108 -0
- package/scripts/lib/delegation/config.cjs +81 -0
- package/scripts/lib/install-paths.cjs +154 -0
- package/scripts/lib/release-manifest.cjs +42 -0
- package/scripts/lib/semver-lite.cjs +20 -0
- package/scripts/lib/state.cjs +274 -0
- package/scripts/lib/uninstall.cjs +252 -0
- package/scripts/lib/update-check-worker.cjs +21 -0
- package/scripts/lib/update.cjs +395 -0
- package/scripts/run-role.cjs +42 -0
- package/scripts/run-role.ps1 +4 -0
- package/scripts/run-role.sh +3 -0
- package/scripts/sync-project-index.sh +167 -0
- package/skills/agent-memory/SKILL.md +109 -0
- package/skills/alp-debug/SKILL.md +90 -0
- package/skills/alp-debug/references/defense-in-depth.md +118 -0
- package/skills/alp-debug/references/investigation-methodology.md +106 -0
- package/skills/alp-debug/references/log-and-ci-analysis.md +96 -0
- package/skills/alp-debug/references/performance-diagnostics.md +112 -0
- package/skills/alp-debug/references/reporting-standards.md +120 -0
- package/skills/alp-debug/references/root-cause-tracing.md +134 -0
- package/skills/alp-debug/references/systematic-debugging.md +93 -0
- package/skills/alp-debug/references/verification.md +86 -0
- package/skills/alp-debug/scripts/find-polluter.sh +63 -0
- package/skills/alp-debug/scripts/find-polluter.test.md +102 -0
- package/skills/alp-plan/SKILL.md +128 -0
- package/skills/alp-plan/references/archive-workflow.md +77 -0
- package/skills/alp-plan/references/codebase-understanding.md +55 -0
- package/skills/alp-plan/references/output-standards.md +96 -0
- package/skills/alp-plan/references/plan-organization.md +129 -0
- package/skills/alp-plan/references/red-team-personas.md +76 -0
- package/skills/alp-plan/references/red-team-workflow.md +81 -0
- package/skills/alp-plan/references/research-phase.md +57 -0
- package/skills/alp-plan/references/scope-challenge.md +82 -0
- package/skills/alp-plan/references/solution-design.md +76 -0
- package/skills/alp-plan/references/validate-question-framework.md +89 -0
- package/skills/alp-plan/references/validate-workflow.md +83 -0
- package/skills/alp-predict/SKILL.md +98 -0
- package/skills/alp-scenario/SKILL.md +86 -0
- package/skills/code-review/SKILL.md +111 -0
- package/skills/code-review/references/code-review-reception.md +114 -0
- package/skills/code-review/references/edge-case-scouting.md +78 -0
- package/skills/code-review/references/verification-before-completion.md +117 -0
- package/skills/delegation/SKILL.md +46 -0
- package/skills/docs-seeker/.env.example +15 -0
- package/skills/docs-seeker/SKILL.md +87 -0
- package/skills/docs-seeker/package.json +25 -0
- package/skills/docs-seeker/references/advanced.md +82 -0
- package/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/skills/docs-seeker/references/errors.md +72 -0
- package/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/skills/docs-seeker/scripts/fetch-docs.js +213 -0
- package/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
- package/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
- package/skills/docs-seeker/workflows/library-search.md +73 -0
- package/skills/docs-seeker/workflows/repo-analysis.md +90 -0
- package/skills/docs-seeker/workflows/topic-search.md +69 -0
- package/skills/git/SKILL.md +121 -0
- package/skills/git/references/branch-management.md +90 -0
- package/skills/git/references/commit-standards.md +82 -0
- package/skills/git/references/gh-cli-guide.md +132 -0
- package/skills/git/references/safety-protocols.md +86 -0
- package/skills/git/references/workflow-commit.md +89 -0
- package/skills/git/references/workflow-merge.md +63 -0
- package/skills/git/references/workflow-pr.md +70 -0
- package/skills/git/references/workflow-push.md +62 -0
- package/skills/gkg/SKILL.md +87 -0
- package/skills/gkg/references/cli-commands.md +92 -0
- package/skills/gkg/references/http-api.md +99 -0
- package/skills/gkg/references/language-support.md +54 -0
- package/skills/problem-solving/SKILL.md +86 -0
- package/skills/problem-solving/references/attribution.md +48 -0
- package/skills/problem-solving/references/collision-zone-thinking.md +71 -0
- package/skills/problem-solving/references/inversion-exercise.md +88 -0
- package/skills/problem-solving/references/meta-pattern-recognition.md +80 -0
- package/skills/problem-solving/references/scale-game.md +82 -0
- package/skills/problem-solving/references/simplification-cascades.md +83 -0
- package/skills/problem-solving/references/when-stuck.md +76 -0
- package/skills/repomix/SKILL.md +94 -0
- package/skills/repomix/references/configuration.md +134 -0
- package/skills/repomix/references/usage-patterns.md +106 -0
- package/skills/repomix/scripts/.coverage +0 -0
- package/skills/repomix/scripts/README.md +179 -0
- package/skills/repomix/scripts/repomix_batch.py +455 -0
- package/skills/repomix/scripts/repos.example.json +15 -0
- package/skills/repomix/scripts/requirements.txt +15 -0
- package/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/research/SKILL.md +107 -0
- package/skills/security-scan/SKILL.md +101 -0
- package/skills/security-scan/references/secret-patterns.md +75 -0
- 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.
|