kodu 2.2.0 → 3.0.2
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/README.md +24 -3
- package/bin/kodu.js +40 -0
- package/package.json +12 -67
- package/scripts/install.js +68 -0
- package/scripts/postinstall.js +22 -0
- package/AGENTS.md +0 -214
- package/__tests__/core/fs/fs.service.test.ts +0 -72
- package/__tests__/core/registry/registry.service.test.ts +0 -82
- package/__tests__/shared/cleaner/cleaner.service.test.ts +0 -102
- package/__tests__/shared/git/git.service.test.ts +0 -84
- package/__tests__/shared/runbook/runbook.service.test.ts +0 -104
- package/__tests__/shared/tokenizer/tokenizer.service.test.ts +0 -45
- package/biome.json +0 -50
- package/dist/package.json +0 -96
- package/dist/src/app.module.d.ts +0 -2
- package/dist/src/app.module.js +0 -42
- package/dist/src/app.module.js.map +0 -1
- package/dist/src/commands/clean/clean.command.d.ts +0 -37
- package/dist/src/commands/clean/clean.command.js +0 -240
- package/dist/src/commands/clean/clean.command.js.map +0 -1
- package/dist/src/commands/clean/clean.module.d.ts +0 -2
- package/dist/src/commands/clean/clean.module.js +0 -26
- package/dist/src/commands/clean/clean.module.js.map +0 -1
- package/dist/src/commands/init/init.command.d.ts +0 -10
- package/dist/src/commands/init/init.command.js +0 -96
- package/dist/src/commands/init/init.command.js.map +0 -1
- package/dist/src/commands/init/init.module.d.ts +0 -2
- package/dist/src/commands/init/init.module.js +0 -22
- package/dist/src/commands/init/init.module.js.map +0 -1
- package/dist/src/commands/ops/ops-add.command.d.ts +0 -18
- package/dist/src/commands/ops/ops-add.command.js +0 -102
- package/dist/src/commands/ops/ops-add.command.js.map +0 -1
- package/dist/src/commands/ops/ops-init.command.d.ts +0 -22
- package/dist/src/commands/ops/ops-init.command.js +0 -130
- package/dist/src/commands/ops/ops-init.command.js.map +0 -1
- package/dist/src/commands/ops/ops-list.command.d.ts +0 -12
- package/dist/src/commands/ops/ops-list.command.js +0 -73
- package/dist/src/commands/ops/ops-list.command.js.map +0 -1
- package/dist/src/commands/ops/ops-path.command.d.ts +0 -9
- package/dist/src/commands/ops/ops-path.command.js +0 -52
- package/dist/src/commands/ops/ops-path.command.js.map +0 -1
- package/dist/src/commands/ops/ops-runbook.command.d.ts +0 -12
- package/dist/src/commands/ops/ops-runbook.command.js +0 -81
- package/dist/src/commands/ops/ops-runbook.command.js.map +0 -1
- package/dist/src/commands/ops/ops-status.command.d.ts +0 -11
- package/dist/src/commands/ops/ops-status.command.js +0 -62
- package/dist/src/commands/ops/ops-status.command.js.map +0 -1
- package/dist/src/commands/ops/ops-use.command.d.ts +0 -12
- package/dist/src/commands/ops/ops-use.command.js +0 -76
- package/dist/src/commands/ops/ops-use.command.js.map +0 -1
- package/dist/src/commands/ops/ops.command.d.ts +0 -7
- package/dist/src/commands/ops/ops.command.js +0 -56
- package/dist/src/commands/ops/ops.command.js.map +0 -1
- package/dist/src/commands/ops/ops.helpers.d.ts +0 -2
- package/dist/src/commands/ops/ops.helpers.js +0 -11
- package/dist/src/commands/ops/ops.helpers.js.map +0 -1
- package/dist/src/commands/ops/ops.module.d.ts +0 -2
- package/dist/src/commands/ops/ops.module.js +0 -36
- package/dist/src/commands/ops/ops.module.js.map +0 -1
- package/dist/src/commands/pack/pack.command.d.ts +0 -51
- package/dist/src/commands/pack/pack.command.js +0 -355
- package/dist/src/commands/pack/pack.command.js.map +0 -1
- package/dist/src/commands/pack/pack.module.d.ts +0 -2
- package/dist/src/commands/pack/pack.module.js +0 -27
- package/dist/src/commands/pack/pack.module.js.map +0 -1
- package/dist/src/core/config/config.module.d.ts +0 -2
- package/dist/src/core/config/config.module.js +0 -23
- package/dist/src/core/config/config.module.js.map +0 -1
- package/dist/src/core/config/config.schema.d.ts +0 -19
- package/dist/src/core/config/config.schema.js +0 -56
- package/dist/src/core/config/config.schema.js.map +0 -1
- package/dist/src/core/config/config.service.d.ts +0 -7
- package/dist/src/core/config/config.service.js +0 -49
- package/dist/src/core/config/config.service.js.map +0 -1
- package/dist/src/core/config/prompt.service.d.ts +0 -10
- package/dist/src/core/config/prompt.service.js +0 -80
- package/dist/src/core/config/prompt.service.js.map +0 -1
- package/dist/src/core/file-system/fs.module.d.ts +0 -2
- package/dist/src/core/file-system/fs.module.js +0 -21
- package/dist/src/core/file-system/fs.module.js.map +0 -1
- package/dist/src/core/file-system/fs.service.d.ts +0 -27
- package/dist/src/core/file-system/fs.service.js +0 -203
- package/dist/src/core/file-system/fs.service.js.map +0 -1
- package/dist/src/core/registry/registry.module.d.ts +0 -2
- package/dist/src/core/registry/registry.module.js +0 -22
- package/dist/src/core/registry/registry.module.js.map +0 -1
- package/dist/src/core/registry/registry.schema.d.ts +0 -24
- package/dist/src/core/registry/registry.schema.js +0 -21
- package/dist/src/core/registry/registry.schema.js.map +0 -1
- package/dist/src/core/registry/registry.service.d.ts +0 -16
- package/dist/src/core/registry/registry.service.js +0 -91
- package/dist/src/core/registry/registry.service.js.map +0 -1
- package/dist/src/core/ui/ui.module.d.ts +0 -2
- package/dist/src/core/ui/ui.module.js +0 -22
- package/dist/src/core/ui/ui.module.js.map +0 -1
- package/dist/src/core/ui/ui.service.d.ts +0 -22
- package/dist/src/core/ui/ui.service.js +0 -43
- package/dist/src/core/ui/ui.service.js.map +0 -1
- package/dist/src/main.d.ts +0 -2
- package/dist/src/main.js +0 -16
- package/dist/src/main.js.map +0 -1
- package/dist/src/shared/cleaner/cleaner.service.d.ts +0 -23
- package/dist/src/shared/cleaner/cleaner.service.js +0 -223
- package/dist/src/shared/cleaner/cleaner.service.js.map +0 -1
- package/dist/src/shared/cleaner/cleaner.types.d.ts +0 -21
- package/dist/src/shared/cleaner/cleaner.types.js +0 -3
- package/dist/src/shared/cleaner/cleaner.types.js.map +0 -1
- package/dist/src/shared/constants.d.ts +0 -4
- package/dist/src/shared/constants.js +0 -113
- package/dist/src/shared/constants.js.map +0 -1
- package/dist/src/shared/deps/deps.module.d.ts +0 -2
- package/dist/src/shared/deps/deps.module.js +0 -21
- package/dist/src/shared/deps/deps.module.js.map +0 -1
- package/dist/src/shared/deps/deps.service.d.ts +0 -15
- package/dist/src/shared/deps/deps.service.js +0 -114
- package/dist/src/shared/deps/deps.service.js.map +0 -1
- package/dist/src/shared/git/git.module.d.ts +0 -2
- package/dist/src/shared/git/git.module.js +0 -21
- package/dist/src/shared/git/git.module.js.map +0 -1
- package/dist/src/shared/git/git.service.d.ts +0 -5
- package/dist/src/shared/git/git.service.js +0 -56
- package/dist/src/shared/git/git.service.js.map +0 -1
- package/dist/src/shared/runbook/runbook.module.d.ts +0 -2
- package/dist/src/shared/runbook/runbook.module.js +0 -22
- package/dist/src/shared/runbook/runbook.module.js.map +0 -1
- package/dist/src/shared/runbook/runbook.service.d.ts +0 -20
- package/dist/src/shared/runbook/runbook.service.js +0 -118
- package/dist/src/shared/runbook/runbook.service.js.map +0 -1
- package/dist/src/shared/runbook/runbook.templates.d.ts +0 -6
- package/dist/src/shared/runbook/runbook.templates.js +0 -49
- package/dist/src/shared/runbook/runbook.templates.js.map +0 -1
- package/dist/src/shared/tokenizer/tokenizer.module.d.ts +0 -2
- package/dist/src/shared/tokenizer/tokenizer.module.js +0 -21
- package/dist/src/shared/tokenizer/tokenizer.module.js.map +0 -1
- package/dist/src/shared/tokenizer/tokenizer.service.d.ts +0 -10
- package/dist/src/shared/tokenizer/tokenizer.service.js +0 -36
- package/dist/src/shared/tokenizer/tokenizer.service.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/docs/todo.md +0 -7
- package/knip.json +0 -10
- package/kodu.json +0 -63
- package/kodu.schema.json +0 -100
- package/lefthook.yml +0 -11
- package/nest-cli.json +0 -8
- package/registry.schema.json +0 -39
- package/scripts/generate-json-schema.ts +0 -27
- package/skills/ac/SKILL.md +0 -239
- package/skills/al/SKILL.md +0 -98
- package/skills/audit/SKILL.md +0 -205
- package/skills/audit/audit-baseline-template.yml +0 -188
- package/skills/audit/runtime-detect.md +0 -64
- package/skills/audit/stacks/_generic.md +0 -41
- package/skills/audit/stacks/_registry.md +0 -47
- package/skills/audit/stacks/go.md +0 -66
- package/skills/audit/stacks/java.md +0 -44
- package/skills/audit/stacks/node.md +0 -57
- package/skills/audit/stacks/python.md +0 -45
- package/skills/audit/stacks/rust.md +0 -44
- package/skills/audit-api-contracts/SKILL.md +0 -201
- package/skills/audit-architecture/SKILL.md +0 -200
- package/skills/audit-bugs/SKILL.md +0 -226
- package/skills/audit-concurrency/SKILL.md +0 -197
- package/skills/audit-deployment/SKILL.md +0 -218
- package/skills/audit-docs/SKILL.md +0 -209
- package/skills/audit-errors/SKILL.md +0 -216
- package/skills/audit-logging/SKILL.md +0 -197
- package/skills/audit-matrix/SKILL.md +0 -245
- package/skills/audit-meta/SKILL.md +0 -120
- package/skills/audit-naming/SKILL.md +0 -200
- package/skills/audit-owasp/SKILL.md +0 -223
- package/skills/audit-performance/SKILL.md +0 -199
- package/skills/audit-reinvention/SKILL.md +0 -214
- package/skills/audit-secrets/SKILL.md +0 -198
- package/skills/audit-tests/SKILL.md +0 -210
- package/skills/audit-validation/SKILL.md +0 -206
- package/skills/audit-verify/SKILL.md +0 -139
- package/skills/audit-yagni/SKILL.md +0 -188
- package/skills/doc-gen/SKILL.md +0 -490
- package/skills/doc-gen/scripts/doc_gen.py +0 -911
- package/skills/generate-project-docs/SKILL.md +0 -380
- package/skills/implement-project/SKILL.md +0 -409
- package/skills/liteend-init/SKILL.md +0 -84
- package/skills/litefront-init/SKILL.md +0 -96
- package/skills/litefront-prototype/SKILL.md +0 -484
- package/skills/ops/SKILL.md +0 -94
- package/skills/post-call-task-builder/SKILL.md +0 -419
- package/skills/project-setup-standardizer/SKILL.md +0 -285
- package/skills/skills-best-practices/SKILL.md +0 -415
- package/skills/start/SKILL.md +0 -319
- package/skills/tech-blueprint/SKILL.md +0 -890
- package/skills/tech-blueprint/scripts/blueprint_validator.py +0 -417
- package/src/app.module.ts +0 -29
- package/src/commands/clean/clean.command.ts +0 -235
- package/src/commands/clean/clean.module.ts +0 -13
- package/src/commands/init/init.command.ts +0 -92
- package/src/commands/init/init.module.ts +0 -9
- package/src/commands/ops/ops-add.command.ts +0 -83
- package/src/commands/ops/ops-init.command.ts +0 -125
- package/src/commands/ops/ops-list.command.ts +0 -57
- package/src/commands/ops/ops-path.command.ts +0 -38
- package/src/commands/ops/ops-runbook.command.ts +0 -74
- package/src/commands/ops/ops-status.command.ts +0 -47
- package/src/commands/ops/ops-use.command.ts +0 -76
- package/src/commands/ops/ops.command.ts +0 -42
- package/src/commands/ops/ops.helpers.ts +0 -20
- package/src/commands/ops/ops.module.ts +0 -23
- package/src/commands/pack/pack.command.ts +0 -347
- package/src/commands/pack/pack.module.ts +0 -14
- package/src/core/config/config.module.ts +0 -10
- package/src/core/config/config.schema.ts +0 -58
- package/src/core/config/config.service.ts +0 -43
- package/src/core/config/prompt.service.ts +0 -80
- package/src/core/file-system/fs.module.ts +0 -8
- package/src/core/file-system/fs.service.ts +0 -248
- package/src/core/registry/registry.module.ts +0 -9
- package/src/core/registry/registry.schema.ts +0 -46
- package/src/core/registry/registry.service.ts +0 -128
- package/src/core/ui/ui.module.ts +0 -9
- package/src/core/ui/ui.service.ts +0 -39
- package/src/main.ts +0 -12
- package/src/shared/cleaner/cleaner.service.ts +0 -289
- package/src/shared/cleaner/cleaner.types.ts +0 -23
- package/src/shared/constants.ts +0 -118
- package/src/shared/deps/deps.module.ts +0 -8
- package/src/shared/deps/deps.service.ts +0 -175
- package/src/shared/git/git.module.ts +0 -8
- package/src/shared/git/git.service.ts +0 -47
- package/src/shared/runbook/runbook.module.ts +0 -9
- package/src/shared/runbook/runbook.service.ts +0 -164
- package/src/shared/runbook/runbook.templates.ts +0 -66
- package/src/shared/tokenizer/tokenizer.module.ts +0 -8
- package/src/shared/tokenizer/tokenizer.service.ts +0 -30
- package/tsconfig.build.json +0 -7
- package/tsconfig.json +0 -28
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: audit-owasp
|
|
3
|
-
description: >
|
|
4
|
-
Аудит безопасности приложения по OWASP Top 10: инъекции, broken auth, IDOR, XSS,
|
|
5
|
-
CSRF, SSRF, логические уязвимости. Запускай при /audit-owasp.
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Правило применимости (Relevance Rule)
|
|
9
|
-
|
|
10
|
-
Применим к серверному коду с HTTP-роутингом, аутентификацией, работой с БД или файловой системой. Для чисто фронтендовых компонентов без fetch/API calls — применяй только XSS/CSRF секции. Для CLI-инструментов без сетевого взаимодействия — верни пустой ответ.
|
|
11
|
-
|
|
12
|
-
## Runtime Detection & Stack Profile
|
|
13
|
-
|
|
14
|
-
Этот аудит стек-агностичен: проверки сформулированы нейтрально, а конкретика
|
|
15
|
-
(инструменты, идиомы, анти-паттерны, примеры) берётся из профиля стека.
|
|
16
|
-
|
|
17
|
-
1. **Профиль передан контекстом?** Если оркестратор `/audit` передал
|
|
18
|
-
`runtime=<id>` и/или содержимое профиля — используй его, шаги 2–3 пропусти.
|
|
19
|
-
|
|
20
|
-
2. **Иначе определи РОВНО ОДИН рантайм** этого каталога:
|
|
21
|
-
```bash
|
|
22
|
-
if [ -f package.json ]; then echo "runtime=node"
|
|
23
|
-
elif [ -f go.mod ]; then echo "runtime=go"
|
|
24
|
-
elif [ -f pyproject.toml ] || [ -f requirements.txt ] || [ -f setup.py ]; then echo "runtime=python"
|
|
25
|
-
elif [ -f Cargo.toml ]; then echo "runtime=rust"
|
|
26
|
-
elif [ -f pom.xml ] || ls build.gradle* settings.gradle* >/dev/null 2>&1; then echo "runtime=java"
|
|
27
|
-
else echo "runtime=generic"; fi
|
|
28
|
-
```
|
|
29
|
-
Один запуск = один рантайм; не миксуй backend и frontend. Если найдено
|
|
30
|
-
несколько маркеров (монорепо) — выбери соответствующий текущему scope/анализируемым
|
|
31
|
-
файлам и зафиксируй выбор в разделе Audit Coverage.
|
|
32
|
-
|
|
33
|
-
3. **Загрузи профиль** через Read: `./skills/audit/stacks/<runtime>.md`
|
|
34
|
-
(fallback `./skills/audit/stacks/_generic.md`, если файл не найден).
|
|
35
|
-
|
|
36
|
-
Дальше используй профиль:
|
|
37
|
-
- **Инструменты** — из секции «Tooling by category» профиля (раздел
|
|
38
|
-
«Инструментальная поддержка» ниже ссылается на категории, а не на команды).
|
|
39
|
-
- **Ожидания PASS** — из «Idioms»; **формулировки FAIL** — из «Anti-patterns».
|
|
40
|
-
- **Точечные подсказки** — из «Check-ID hints» по префиксу `OWA-`.
|
|
41
|
-
- Если профиль `tier: general` или `runtime=generic` → стек-специфичные находки
|
|
42
|
-
без однозначного evidence помечай `🔍 UNVERIFIED`, а не `❌ FAIL`. Проверки,
|
|
43
|
-
чей механизм в рантайме отсутствует, помечай `N/A`.
|
|
44
|
-
|
|
45
|
-
## Severity Guide
|
|
46
|
-
|
|
47
|
-
| Severity | Критерий назначения |
|
|
48
|
-
|----------|---------------------|
|
|
49
|
-
| 🔴 Critical | RCE, auth bypass, data corruption, необратимый финансовый риск |
|
|
50
|
-
| 🟠 High | Падение production, privilege escalation, утечка данных |
|
|
51
|
-
| 🟡 Medium | Деградация производительности или поддерживаемости без immediate outage |
|
|
52
|
-
| 🟢 Low | Стиль, читаемость, слабое нарушение конвенции |
|
|
53
|
-
|
|
54
|
-
Правило: severity = impact × exploitability × blast radius. Одинаковый паттерн → одинаковый severity между аудитами.
|
|
55
|
-
|
|
56
|
-
## Чеклист
|
|
57
|
-
|
|
58
|
-
| Check ID | Проверка |
|
|
59
|
-
|----------|----------|
|
|
60
|
-
| OWA-01 | A03: Все запросы к БД/OS/LDAP параметризованы, нет injection |
|
|
61
|
-
| OWA-02 | A01: Все защищённые маршруты имеют auth-middleware |
|
|
62
|
-
| OWA-03 | A01: Resource ownership проверяется, нет IDOR [⚡ dynamic] |
|
|
63
|
-
| OWA-04 | A02: Пароли хранятся безопасно (bcrypt/argon2/scrypt) |
|
|
64
|
-
| OWA-05 | A05: Безопасная конфигурация сервера (CORS, security headers, body limits) |
|
|
65
|
-
| OWA-06 | A07: Защита от перебора (rate limiting на auth и чувствительных эндпоинтах) |
|
|
66
|
-
| OWA-07 | A09: Техническая информация не утекает в ответы (stack trace, внутренние пути) |
|
|
67
|
-
| OWA-08 | A10: URL из user input не передаётся в HTTP-клиент без whitelist (SSRF) |
|
|
68
|
-
| OWA-09 | A05: CSRF-защита реализована (SameSite cookies или CSRF-токены на state-changing запросах) |
|
|
69
|
-
|
|
70
|
-
## Правила верификации
|
|
71
|
-
|
|
72
|
-
1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
|
|
73
|
-
2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
|
|
74
|
-
3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
|
|
75
|
-
- Проверки с `[⚡ dynamic]` нельзя статически подтвердить — только `🔍 UNVERIFIED` или `❌ FAIL` (при явном evidence), но не `✅ PASS`
|
|
76
|
-
4. **Baseline приоритетен**: check_id есть в `docs/audit-baseline.yml` → `⏸ ACCEPTED`.
|
|
77
|
-
5. **Только 🔴/🟠 FAIL требуют решения**: 🟡/🟢 — решение необязательно.
|
|
78
|
-
|
|
79
|
-
## Evidence Quality Rules
|
|
80
|
-
|
|
81
|
-
Любой `❌ FAIL` обязан содержать:
|
|
82
|
-
- Точный `file:line`
|
|
83
|
-
- Минимальный код-фрагмент (1–3 строки)
|
|
84
|
-
- Causal chain: почему именно это нарушение → какой риск возникает
|
|
85
|
-
|
|
86
|
-
Запрещено:
|
|
87
|
-
- Предполагать runtime behavior без evidence в коде
|
|
88
|
-
- Предполагать prod-конфигурацию по dev-конфигу
|
|
89
|
-
- Предполагать отсутствие middleware без проверки всей router chain
|
|
90
|
-
- Если вывод основан на предположении — только `🔍 UNVERIFIED`
|
|
91
|
-
|
|
92
|
-
## Language Rule
|
|
93
|
-
|
|
94
|
-
Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
|
|
95
|
-
|
|
96
|
-
## Baseline
|
|
97
|
-
|
|
98
|
-
До анализа:
|
|
99
|
-
```bash
|
|
100
|
-
if [ ! -f ./docs/audit-baseline.yml ]; then
|
|
101
|
-
mkdir -p ./docs
|
|
102
|
-
cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
|
|
103
|
-
printf "accepted: []\n" > ./docs/audit-baseline.yml
|
|
104
|
-
fi
|
|
105
|
-
cat ./docs/audit-baseline.yml
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## Контекст анализа
|
|
109
|
-
|
|
110
|
-
**OWA-01 — Параметризованные запросы, нет injection:**
|
|
111
|
-
- SQL строки, собранные через конкатенацию/template literals
|
|
112
|
-
- NoSQL injection через неэкранированные операторы (`$where`, `$regex`)
|
|
113
|
-
- Command injection: user input попадает в shell-команды без экранирования
|
|
114
|
-
- LDAP/XPath запросы с неэкранированным user input
|
|
115
|
-
|
|
116
|
-
**OWA-02 — Auth middleware на защищённых маршрутах:**
|
|
117
|
-
- Protected routes без auth middleware
|
|
118
|
-
- Privilege escalation: обычный пользователь вызывает admin-действие
|
|
119
|
-
- Directory traversal в file operations
|
|
120
|
-
- Отсутствие авторизации на отдельных маршрутах роутера
|
|
121
|
-
|
|
122
|
-
**OWA-03 — Resource ownership проверяется:**
|
|
123
|
-
- IDOR: ресурс запрашивается по ID без проверки ownership текущего пользователя
|
|
124
|
-
- Bulk operations изменяют ресурсы других пользователей
|
|
125
|
-
- Indirect object reference через связанные сущности без проверки доступа
|
|
126
|
-
|
|
127
|
-
**OWA-04 — Безопасное хранение паролей:**
|
|
128
|
-
- Слабые алгоритмы хеширования (MD5, SHA1 для паролей)
|
|
129
|
-
- Пароли не хешируются через bcrypt/argon2/scrypt
|
|
130
|
-
- Симметричное шифрование с hardcoded key
|
|
131
|
-
- HTTP вместо HTTPS для передачи credentials
|
|
132
|
-
|
|
133
|
-
**OWA-05 — Безопасная конфигурация сервера:**
|
|
134
|
-
- CORS не должен быть wildcard (`*`) в production; origins только по whitelist
|
|
135
|
-
- Не выставлены security-заголовки (X-Frame-Options, CSP, HSTS и т.п.)
|
|
136
|
-
- Не ограничен размер тела запроса (DoS через огромное тело запроса)
|
|
137
|
-
- Открытые error pages с технической информацией
|
|
138
|
-
- Конкретика из профиля (Go: `http.MaxBytesReader`, chi `cors`/`secure`; Node: `express.json({ limit })`, Helmet)
|
|
139
|
-
|
|
140
|
-
**OWA-06 — Защита от перебора:**
|
|
141
|
-
- Отсутствие rate limiting на login/register/reset-password эндпоинтах
|
|
142
|
-
- Нет rate limiting на чувствительных операциях (смена пароля, OTP-проверка)
|
|
143
|
-
- Session tokens не инвалидируются при logout
|
|
144
|
-
- Проверка JWT без явного whitelist алгоритмов: нужно отклонять `alg:none` и подмену RS256↔HS256 (атакующий передаёт `alg:none` либо RS256 с публичным ключом, выданным за HS256-секрет); слабые алгоритмы / короткий ключ
|
|
145
|
-
- Конкретика из профиля (Go: go-oidc `Verifier` / golang-jwt `WithValidMethods`; Node: `jwt.verify(token, secret, { algorithms: [...] })`)
|
|
146
|
-
|
|
147
|
-
**OWA-07 — Техническая информация не утекает:**
|
|
148
|
-
- Stack trace в ответах production API
|
|
149
|
-
- Внутренние пути файловой системы в error messages
|
|
150
|
-
- Версии зависимостей/фреймворка в заголовках или ответах
|
|
151
|
-
- SQL-ошибки или DB-специфичные сообщения в API responses
|
|
152
|
-
|
|
153
|
-
**OWA-08 — SSRF: URL из user input без whitelist:**
|
|
154
|
-
- URL из user input передаётся в HTTP-клиент без whitelist
|
|
155
|
-
- Fetch к внутренним адресам (169.254.x.x, 10.x.x.x, localhost, metadata endpoints)
|
|
156
|
-
- Редиректы на внутренние ресурсы без валидации destination
|
|
157
|
-
|
|
158
|
-
**OWA-09 — CSRF-защита:**
|
|
159
|
-
- State-changing запросы (POST/PUT/PATCH/DELETE) принимаются без CSRF-токена и без проверки `Origin`/`Referer`
|
|
160
|
-
- Cookies без корректных атрибутов (`SameSite`, `Secure`, `HttpOnly`) — браузер отправит cookie в cross-site запросе либо она доступна скрипту/по HTTP
|
|
161
|
-
- Мутации (включая GraphQL) доступны через GET вместо POST — обходит CSRF-защиту
|
|
162
|
-
- `SameSite=None` без явного обоснования (нужно только для cross-site iframe/embed сценариев)
|
|
163
|
-
|
|
164
|
-
## Граница с другими аудитами
|
|
165
|
-
|
|
166
|
-
- **Stack trace в ответах** (OWA-07) — первичный: `audit-errors` (ERR-02). Если обнаружено здесь — добавь cross-ref «*см. ERR-02*» в доказательство, не создавай дублирующий `❌ FAIL`.
|
|
167
|
-
- **Валидация полей, типов, диапазонов** — первичный: `audit-validation`. Здесь не дублируй.
|
|
168
|
-
- **Secrets в коде** — первичный: `audit-secrets`. Здесь не дублируй.
|
|
169
|
-
- **API-контракты** — первичный: `audit-api-contracts`. Здесь не дублируй.
|
|
170
|
-
|
|
171
|
-
## Инструментальная поддержка
|
|
172
|
-
|
|
173
|
-
Перед анализом используй инструмент категории **dep-audit** из профиля стека
|
|
174
|
-
(секция «Tooling by category»): он выявляет уязвимые зависимости (известные CVE).
|
|
175
|
-
Это самостоятельная зона, не входит в текущий чеклист, но критические CVE стоит
|
|
176
|
-
вынести в раздел замечаний отчёта. Если ячейка категории пустая
|
|
177
|
-
(`tier: general`/`generic`) — пропусти этот шаг.
|
|
178
|
-
|
|
179
|
-
## Формат вывода
|
|
180
|
-
|
|
181
|
-
| Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
|
|
182
|
-
|----------|----------|--------|-------------|----------------|---------|------------|
|
|
183
|
-
| OWA-01 | A03: Все запросы к БД/OS/LDAP параметризованы, нет injection | ✅ PASS | High | `db/queries.ts` проверен — все запросы параметризованы | — | — |
|
|
184
|
-
| OWA-02 | A01: Все защищённые маршруты имеют auth-middleware | ❌ FAIL 🔴 | High | `routes/admin.ts:14` | **1. Добавить authMiddleware на все /admin routes** \\ 2. Использовать router-level middleware \\ 3. Добавить проверку в каждый handler | Нет |
|
|
185
|
-
| OWA-05 | A05: Безопасная конфигурация сервера (CORS, security headers, body limits) | ⏸ ACCEPTED | Medium | `app.ts:9` | В baseline: внутренний сервис | — |
|
|
186
|
-
|
|
187
|
-
Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
|
|
188
|
-
|
|
189
|
-
Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
|
|
190
|
-
|
|
191
|
-
Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
|
|
192
|
-
|
|
193
|
-
`Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
|
|
194
|
-
|
|
195
|
-
Требования к решениям:
|
|
196
|
-
- Взаимно исключающие (не перефразировки одного и того же)
|
|
197
|
-
- Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
|
|
198
|
-
- Не требуют переписать всю систему — realistic migration cost
|
|
199
|
-
- Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
|
|
200
|
-
|
|
201
|
-
В конце отчёта добавь раздел покрытия:
|
|
202
|
-
```
|
|
203
|
-
## Audit Coverage
|
|
204
|
-
Проверено: src/module1/**, src/module2/**
|
|
205
|
-
Пропущено: scripts/**, migrations/**, tests/**
|
|
206
|
-
Файлов проверено: N | Пропущено: N
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
Если все PASS — выведи: `✅ Критических OWASP-уязвимостей не обнаружено.`
|
|
210
|
-
|
|
211
|
-
## Сохранение результатов
|
|
212
|
-
|
|
213
|
-
1. Найди папку сессии:
|
|
214
|
-
```bash
|
|
215
|
-
ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
|
|
216
|
-
```
|
|
217
|
-
Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
|
|
218
|
-
2. Сохрани через Write: `<AUDIT_DIR>/audit-owasp.md`
|
|
219
|
-
|
|
220
|
-
```
|
|
221
|
-
# Audit Report: OWASP Application Security — <YYYY-MM-DD HH:MM>
|
|
222
|
-
<таблица>
|
|
223
|
-
```
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: audit-performance
|
|
3
|
-
description: >
|
|
4
|
-
Аудит ресурсов и производительности: блокирующие вызовы, N+1 запросы, тяжёлые запросы
|
|
5
|
-
без лимитов, memory leaks, отсутствие пагинации. Запускай при /audit-performance.
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Правило применимости (Relevance Rule)
|
|
9
|
-
|
|
10
|
-
Применим к коду с I/O операциями (БД, HTTP, файлы), обработкой коллекций, кэшированием. Для stateless математических утилит без I/O — верни пустой ответ.
|
|
11
|
-
|
|
12
|
-
## Runtime Detection & Stack Profile
|
|
13
|
-
|
|
14
|
-
Этот аудит стек-агностичен: проверки сформулированы нейтрально, а конкретика
|
|
15
|
-
(инструменты, идиомы, анти-паттерны, примеры) берётся из профиля стека.
|
|
16
|
-
|
|
17
|
-
1. **Профиль передан контекстом?** Если оркестратор `/audit` передал
|
|
18
|
-
`runtime=<id>` и/или содержимое профиля — используй его, шаги 2–3 пропусти.
|
|
19
|
-
|
|
20
|
-
2. **Иначе определи РОВНО ОДИН рантайм** этого каталога:
|
|
21
|
-
```bash
|
|
22
|
-
if [ -f package.json ]; then echo "runtime=node"
|
|
23
|
-
elif [ -f go.mod ]; then echo "runtime=go"
|
|
24
|
-
elif [ -f pyproject.toml ] || [ -f requirements.txt ] || [ -f setup.py ]; then echo "runtime=python"
|
|
25
|
-
elif [ -f Cargo.toml ]; then echo "runtime=rust"
|
|
26
|
-
elif [ -f pom.xml ] || ls build.gradle* settings.gradle* >/dev/null 2>&1; then echo "runtime=java"
|
|
27
|
-
else echo "runtime=generic"; fi
|
|
28
|
-
```
|
|
29
|
-
Один запуск = один рантайм; не миксуй backend и frontend. Если найдено
|
|
30
|
-
несколько маркеров (монорепо) — выбери соответствующий текущему scope/анализируемым
|
|
31
|
-
файлам и зафиксируй выбор в разделе Audit Coverage.
|
|
32
|
-
|
|
33
|
-
3. **Загрузи профиль** через Read: `./skills/audit/stacks/<runtime>.md`
|
|
34
|
-
(fallback `./skills/audit/stacks/_generic.md`, если файл не найден).
|
|
35
|
-
|
|
36
|
-
Дальше используй профиль:
|
|
37
|
-
- **Инструменты** — из секции «Tooling by category» профиля (раздел
|
|
38
|
-
«Инструментальная поддержка» ниже ссылается на категории, а не на команды).
|
|
39
|
-
- **Ожидания PASS** — из «Idioms»; **формулировки FAIL** — из «Anti-patterns».
|
|
40
|
-
- **Точечные подсказки** — из «Check-ID hints» по префиксу `PER-`.
|
|
41
|
-
- Если профиль `tier: general` или `runtime=generic` → стек-специфичные находки
|
|
42
|
-
без однозначного evidence помечай `🔍 UNVERIFIED`, а не `❌ FAIL`. Проверки,
|
|
43
|
-
чей механизм в рантайме отсутствует, помечай `N/A`.
|
|
44
|
-
|
|
45
|
-
## Severity Guide
|
|
46
|
-
|
|
47
|
-
| Severity | Критерий назначения |
|
|
48
|
-
|----------|---------------------|
|
|
49
|
-
| 🔴 Critical | RCE, auth bypass, data corruption, необратимый финансовый риск |
|
|
50
|
-
| 🟠 High | Падение production, privilege escalation, утечка данных |
|
|
51
|
-
| 🟡 Medium | Деградация производительности или поддерживаемости без immediate outage |
|
|
52
|
-
| 🟢 Low | Стиль, читаемость, слабое нарушение конвенции |
|
|
53
|
-
|
|
54
|
-
Правило: severity = impact × exploitability × blast radius. Одинаковый паттерн → одинаковый severity между аудитами.
|
|
55
|
-
|
|
56
|
-
## Чеклист
|
|
57
|
-
|
|
58
|
-
| Check ID | Проверка |
|
|
59
|
-
|----------|----------|
|
|
60
|
-
| PER-01 | Нет N+1: DB-запросы не выполняются внутри циклов [⚡ dynamic] |
|
|
61
|
-
| PER-02 | Выборки из БД ограничены (LIMIT, пагинация) |
|
|
62
|
-
| PER-03 | Обработчики запросов не содержат блокирующего I/O |
|
|
63
|
-
| PER-04 | CPU-интенсивные операции вынесены из main thread |
|
|
64
|
-
| PER-05 | Независимые async-операции выполняются параллельно |
|
|
65
|
-
| PER-06 | Кэши ограничены по размеру и времени жизни (TTL + size limit) |
|
|
66
|
-
| PER-07 | Event listeners и subscriptions очищаются при завершении |
|
|
67
|
-
| PER-08 | Нет утечек памяти: timers и closures не удерживают большие объекты в долгоживущем scope |
|
|
68
|
-
|
|
69
|
-
## Правила верификации
|
|
70
|
-
|
|
71
|
-
1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
|
|
72
|
-
2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
|
|
73
|
-
3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
|
|
74
|
-
- Проверки с `[⚡ dynamic]` нельзя статически подтвердить — только `🔍 UNVERIFIED` или `❌ FAIL` (при явном evidence), но не `✅ PASS`
|
|
75
|
-
4. **Baseline приоритетен**: check_id есть в `docs/audit-baseline.yml` → `⏸ ACCEPTED`.
|
|
76
|
-
5. **Только 🔴/🟠 FAIL требуют решения**: 🟡/🟢 — решение необязательно.
|
|
77
|
-
|
|
78
|
-
## Evidence Quality Rules
|
|
79
|
-
|
|
80
|
-
Любой `❌ FAIL` обязан содержать:
|
|
81
|
-
- Точный `file:line`
|
|
82
|
-
- Минимальный код-фрагмент (1–3 строки)
|
|
83
|
-
- Causal chain: почему именно это нарушение → какой риск возникает
|
|
84
|
-
|
|
85
|
-
Запрещено:
|
|
86
|
-
- Предполагать runtime behavior без evidence в коде
|
|
87
|
-
- Предполагать prod-конфигурацию по dev-конфигу
|
|
88
|
-
- Предполагать отсутствие middleware без проверки всей router chain
|
|
89
|
-
- Если вывод основан на предположении — только `🔍 UNVERIFIED`
|
|
90
|
-
|
|
91
|
-
## Language Rule
|
|
92
|
-
|
|
93
|
-
Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
|
|
94
|
-
|
|
95
|
-
## Baseline
|
|
96
|
-
|
|
97
|
-
До анализа:
|
|
98
|
-
```bash
|
|
99
|
-
if [ ! -f ./docs/audit-baseline.yml ]; then
|
|
100
|
-
mkdir -p ./docs
|
|
101
|
-
cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
|
|
102
|
-
printf "accepted: []\n" > ./docs/audit-baseline.yml
|
|
103
|
-
fi
|
|
104
|
-
cat ./docs/audit-baseline.yml
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Контекст анализа
|
|
108
|
-
|
|
109
|
-
**PER-01 — Нет N+1:**
|
|
110
|
-
- Запрос к БД внутри цикла по результатам другого запроса
|
|
111
|
-
- ORM relations загружаются lazy внутри loop
|
|
112
|
-
- Отсутствие `include`/`join` там где возможна одна выборка
|
|
113
|
-
- DataLoader / batch loading не используется при множественных точечных запросах
|
|
114
|
-
|
|
115
|
-
**PER-02 — Выборки ограничены:**
|
|
116
|
-
- SELECT без LIMIT/пагинации (возможный full table scan)
|
|
117
|
-
- Запросы без WHERE на индексированных полях
|
|
118
|
-
- Агрегации на больших таблицах без materialized view / кэша
|
|
119
|
-
- Нет cursor-based пагинации при больших наборах данных
|
|
120
|
-
|
|
121
|
-
**PER-03 — Нет блокирующего I/O в handlers:**
|
|
122
|
-
- Синхронные файловые операции в async контексте (Node: `fs.readFileSync`)
|
|
123
|
-
- `sleep`/busy-wait в request handler
|
|
124
|
-
- Синхронные операции с большими буферами блокирующие event loop (Node)
|
|
125
|
-
- Go: блокирующие сетевые/I/O-вызовы без таймаута/`context.Context` в обработчике; синхронные тяжёлые вызовы вне горутины (менее критично, чем блокировка event loop в Node, но всё равно держат соединение)
|
|
126
|
-
|
|
127
|
-
**PER-04 — CPU-операции вне main thread:**
|
|
128
|
-
- CPU-intensive операции (crypto, image processing, compression) в main thread без worker
|
|
129
|
-
- Тяжёлые вычисления (сортировка больших массивов, regex на длинных строках) в request path
|
|
130
|
-
|
|
131
|
-
**PER-05 — Параллельные независимые операции:**
|
|
132
|
-
- Последовательные независимые HTTP-запросы вместо `Promise.all`
|
|
133
|
-
- Sequential await там где возможен parallel fetch
|
|
134
|
-
- Повторные запросы к одному URL без мемоизации в рамках одного запроса
|
|
135
|
-
|
|
136
|
-
**PER-06 — Кэши ограничены:**
|
|
137
|
-
- Кэш без TTL (unbounded growth, stale data навсегда)
|
|
138
|
-
- Кэш без size limit (memory leak в long-lived процессах)
|
|
139
|
-
- In-memory кэш без механизма инвалидации при обновлении данных
|
|
140
|
-
|
|
141
|
-
**PER-07 — Event listeners очищаются:**
|
|
142
|
-
- Event listeners без `removeEventListener` / `off` (leak в long-lived процессах)
|
|
143
|
-
- RxJS subscriptions без `unsubscribe` в destroy/cleanup
|
|
144
|
-
- WebSocket / SSE connections без cleanup при завершении request lifecycle
|
|
145
|
-
- Накопление данных в memory без flush (buffer без drain)
|
|
146
|
-
- Go: горутина-подписчик/воркер без пути завершения по `ctx.Done()` (goroutine leak); незакрытый канал/`time.Ticker` без `Stop()`
|
|
147
|
-
|
|
148
|
-
**PER-08 — Нет утечек памяти через timers и closures:**
|
|
149
|
-
- `setInterval` / `setTimeout` без соответствующего `clearInterval` / `clearTimeout` в cleanup (Node)
|
|
150
|
-
- Closure в долгоживущем объекте захватывает большой массив/объект — GC не может его собрать
|
|
151
|
-
- `global`-объект или module-level переменная накапливает записи без ограничения (unbounded grow)
|
|
152
|
-
- Circular reference между объектами с WeakMap/WeakRef там где нужна сильная ссылка
|
|
153
|
-
- Go: `defer` в цикле/долгой функции держит ресурсы (rows/файлы/locks) дольше нужного — освобождение откладывается до конца функции, а не итерации
|
|
154
|
-
|
|
155
|
-
## Формат вывода
|
|
156
|
-
|
|
157
|
-
| Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
|
|
158
|
-
|----------|----------|--------|-------------|----------------|---------|------------|
|
|
159
|
-
| PER-01 | Нет N+1: DB-запросы не выполняются внутри циклов | ✅ PASS | High | `repos/` проверены — запросы вне циклов | — [⚡ dynamic] | — |
|
|
160
|
-
| PER-02 | Выборки из БД ограничены (LIMIT, пагинация) | ❌ FAIL 🟠 | High | `repos/user.ts:45` | **1. Добавить .take(limit).skip(offset) в запрос** \\ 2. Добавить cursor-based пагинацию \\ 3. Установить максимальный лимит через конфиг | Нет |
|
|
161
|
-
| PER-06 | Кэши ограничены по размеру и времени жизни (TTL + size limit) | ⏸ ACCEPTED | Medium | `cache/store.ts:12` | В baseline: кэш управляется Redis с TTL | — |
|
|
162
|
-
|
|
163
|
-
Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
|
|
164
|
-
|
|
165
|
-
Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
|
|
166
|
-
|
|
167
|
-
Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
|
|
168
|
-
|
|
169
|
-
`Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
|
|
170
|
-
|
|
171
|
-
Требования к решениям:
|
|
172
|
-
- Взаимно исключающие (не перефразировки одного и того же)
|
|
173
|
-
- Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
|
|
174
|
-
- Не требуют переписать всю систему — realistic migration cost
|
|
175
|
-
- Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
|
|
176
|
-
|
|
177
|
-
В конце отчёта добавь раздел покрытия:
|
|
178
|
-
```
|
|
179
|
-
## Audit Coverage
|
|
180
|
-
Проверено: src/module1/**, src/module2/**
|
|
181
|
-
Пропущено: scripts/**, migrations/**, tests/**
|
|
182
|
-
Файлов проверено: N | Пропущено: N
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
Если все PASS — выведи: `✅ Производительных антипаттернов не обнаружено.`
|
|
186
|
-
|
|
187
|
-
## Сохранение результатов
|
|
188
|
-
|
|
189
|
-
1. Найди папку сессии:
|
|
190
|
-
```bash
|
|
191
|
-
ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
|
|
192
|
-
```
|
|
193
|
-
Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
|
|
194
|
-
2. Сохрани через Write: `<AUDIT_DIR>/audit-performance.md`
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
# Audit Report: Resource & Performance — <YYYY-MM-DD HH:MM>
|
|
198
|
-
<таблица>
|
|
199
|
-
```
|