agent-engineering-skills 1.0.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/AGENTS.md +249 -0
- package/LICENSE +21 -0
- package/README.md +113 -0
- package/bin/cli.js +223 -0
- package/docs/agent-integration.md +200 -0
- package/docs/philosophy.md +131 -0
- package/docs/reference-authoring.md +117 -0
- package/docs/skill-authoring.md +126 -0
- package/examples/authorization-bypass.md +191 -0
- package/examples/frontend-review.md +244 -0
- package/examples/race-condition.md +128 -0
- package/examples/xp-reward-loop.md +123 -0
- package/package.json +45 -0
- package/references/engineering.yaml +88 -0
- package/references/frontend.yaml +139 -0
- package/references/product.yaml +54 -0
- package/references/research.yaml +88 -0
- package/references/security.yaml +85 -0
- package/references/ux.yaml +37 -0
- package/scripts/validate.py +454 -0
- package/skills/audit/adversarial-review/SKILL.md +190 -0
- package/skills/audit/business-logic-audit/SKILL.md +182 -0
- package/skills/audit/edge-case-hunter/SKILL.md +159 -0
- package/skills/audit/error-flow-audit/SKILL.md +184 -0
- package/skills/audit/state-consistency-audit/SKILL.md +174 -0
- package/skills/audit/user-flow-audit/SKILL.md +161 -0
- package/skills/frontend/accessibility-review/SKILL.md +186 -0
- package/skills/frontend/animation-review/SKILL.md +171 -0
- package/skills/frontend/interaction-design/SKILL.md +162 -0
- package/skills/frontend/ux-review/SKILL.md +172 -0
- package/skills/frontend/visual-quality-review/SKILL.md +160 -0
- package/skills/meta/research-router/SKILL.md +184 -0
- package/skills/meta/skill-router/SKILL.md +206 -0
- package/skills/product/gamification-audit/SKILL.md +213 -0
- package/skills/reliability/data-integrity-audit/SKILL.md +187 -0
- package/skills/reliability/idempotency-audit/SKILL.md +191 -0
- package/skills/reliability/race-condition-hunter/SKILL.md +181 -0
- package/skills/research/github-reference-research/SKILL.md +197 -0
- package/skills/research/implementation-research/SKILL.md +181 -0
- package/skills/research/market-research/SKILL.md +202 -0
- package/skills/research/reference-research/SKILL.md +186 -0
- package/skills/security/api-abuse-audit/SKILL.md +178 -0
- package/skills/security/authorization-audit/SKILL.md +176 -0
- package/skills/security/input-trust-audit/SKILL.md +178 -0
- package/templates/audit-report.md +89 -0
- package/templates/bug-report.md +107 -0
- package/templates/design-review.md +122 -0
- package/templates/research-report.md +96 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reference-research
|
|
3
|
+
description: Discovers which external sources from the references catalog (methodology, heuristic, inspiration, implementation, discovery) are relevant to the current task and synthesizes findings into actionable patterns, not just a link list.
|
|
4
|
+
category: research
|
|
5
|
+
triggers:
|
|
6
|
+
- "research references"
|
|
7
|
+
- "find external sources for a task"
|
|
8
|
+
- "consult methodology and heuristics"
|
|
9
|
+
- "reference catalog lookup"
|
|
10
|
+
- "discover relevant sources"
|
|
11
|
+
priority: high
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Reference Research
|
|
15
|
+
|
|
16
|
+
## Objective
|
|
17
|
+
|
|
18
|
+
Ensinar o agente a **consultar o catálogo centralizado de referências** (`references/`)
|
|
19
|
+
para descobrir quais fontes externas são relevantes para a tarefa, e a sintetizar o que
|
|
20
|
+
encontrou em um formato acionável, nunca apenas uma lista de links.
|
|
21
|
+
|
|
22
|
+
## When to Use
|
|
23
|
+
|
|
24
|
+
* No início de qualquer tarefa não-trivial que se beneficiaria de saber como outros
|
|
25
|
+
resolveram o mesmo problema.
|
|
26
|
+
* Quando o `research-router` despacha para o catálogo de referências.
|
|
27
|
+
* Quando o `skill-router` indica que pesquisa é necessária (tarefas de arquitetura,
|
|
28
|
+
UX, animação, segurança).
|
|
29
|
+
* **Composição:** a skill de entrada de pesquisa. Ativa o `research-router` e alimenta
|
|
30
|
+
`github-reference-research`, `market-research`, e `implementation-research`. Skills
|
|
31
|
+
de frontend/UX/engenharia referenciam fontes que esta skill consulta.
|
|
32
|
+
|
|
33
|
+
## Mental Model
|
|
34
|
+
|
|
35
|
+
O catálogo em `references/*.yaml` é a primeira fonte de pesquisa. A pergunta é:
|
|
36
|
+
|
|
37
|
+
> "Alguém já resolveu este problema?"
|
|
38
|
+
|
|
39
|
+
E a resposta é uma busca no catálogo por `use_when` que corresponde ao problema, por
|
|
40
|
+
`type` que corresponde ao tipo de conhecimento necessário (metodologia vs inspiração),
|
|
41
|
+
e por `authority` que corresponde ao peso que a fonte deve ter.
|
|
42
|
+
|
|
43
|
+
Classes de conhecimento (do `plan.md` §12 e `docs/reference-authoring.md`):
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
methodology — frameworks estruturados (Laws of UX, OWASP, Reforge)
|
|
47
|
+
heuristic — princípios aplicáveis (Impeccable, Interfaces)
|
|
48
|
+
inspiration — referência visual, não prescritiva (Dribbble, dark.design)
|
|
49
|
+
implementation — padrões de código concretos (Animate UI, GitHub)
|
|
50
|
+
discovery — ferramentas para achar mais fontes (LazyWeb, Shoogle)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
O `type` da fonte determina **como usar** o que ela oferece: metodologias são
|
|
54
|
+
referenciadas como fundamento, inspiração só calibra gosto, implementações são
|
|
55
|
+
referências de código (não para copiar cegamente — ver `AGENTS.md` § 1).
|
|
56
|
+
|
|
57
|
+
## Investigation Procedure
|
|
58
|
+
|
|
59
|
+
1. **Entender o problema** — qual domínio, qual tipo de conhecimento falta.
|
|
60
|
+
2. **Consultar o catálogo** — ler os `references/*.yaml` relevantes para o domínio.
|
|
61
|
+
Para cada candidato, comparar `use_when` e `avoid_when` com o problema.
|
|
62
|
+
3. **Selecionar as fontes** mais relevantes — priorizar pelo `authority`
|
|
63
|
+
(established > vendor > community > curated).
|
|
64
|
+
4. **Visitar/acessar cada fonte** — ler o conteúdo relevante para o problema.
|
|
65
|
+
5. **Extrair padrões, princípios, decisões, trade-offs** — nunca copiar código,
|
|
66
|
+
layout, branding, conteúdo, ou componentes proprietários (ver `AGENTS.md` § 1).
|
|
67
|
+
6. **Sintetizar** no formato obrigatório (ver §17 do `plan.md` e "Output Format"
|
|
68
|
+
abaixo) — nunca apenas uma lista de links.
|
|
69
|
+
7. **Fornecer recomendação** — o que deve ser adotado, adaptado, ou ignorado.
|
|
70
|
+
|
|
71
|
+
## Questions to Ask
|
|
72
|
+
|
|
73
|
+
* Qual domínio do problema? (ux/frontend/engineering/security/product/research)
|
|
74
|
+
* Que tipo de conhecimento é necessário? (metodologia/heurística/inspiração/
|
|
75
|
+
implementação/descoberta)
|
|
76
|
+
* Quais fontes no catálogo têm `use_when` correspondente?
|
|
77
|
+
* Qual a autoridade de cada fonte? (established > community > curated)
|
|
78
|
+
* A fonte oferece metodologia, princípio, código, ou inspiração?
|
|
79
|
+
* O que é extraível sem copiar? (princípio, padrão, trade-off, decisão)
|
|
80
|
+
* Como a fonte se aplica a este contexto específico?
|
|
81
|
+
* Que problemas ela introduziria? (trade-offs)
|
|
82
|
+
* Devo buscar mais fontes? (se necessário, despachar para `discovery` type)
|
|
83
|
+
|
|
84
|
+
## Attack Patterns
|
|
85
|
+
|
|
86
|
+
A skill de research não "ataca" o sistema, mas os padrões de investigação são as
|
|
87
|
+
perguntas de despacho:
|
|
88
|
+
|
|
89
|
+
```text
|
|
90
|
+
problema não-trivial
|
|
91
|
+
↓
|
|
92
|
+
consultar catálogo (references/*.yaml do domínio)
|
|
93
|
+
↓
|
|
94
|
+
cruzar use_when × problema → selecionar fontes
|
|
95
|
+
↓
|
|
96
|
+
visitar fontes selecionadas
|
|
97
|
+
↓
|
|
98
|
+
extrair padrão/princípio/trade-off (não copiar)
|
|
99
|
+
↓
|
|
100
|
+
sintetizar (nunca lista de links)
|
|
101
|
+
↓
|
|
102
|
+
recomendar
|
|
103
|
+
|
|
104
|
+
fontes insuficientes no catálogo
|
|
105
|
+
↓
|
|
106
|
+
despachar para discovery (LazyWeb, Shoogle, Hacker News)
|
|
107
|
+
↓
|
|
108
|
+
nova busca no catálogo (ou github/market/implementation-research)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Evidence Requirements
|
|
112
|
+
|
|
113
|
+
* **Nomear a fonte e seu `type`/`authority`** — para que o leitor saiba o peso.
|
|
114
|
+
* **Mostrar o padrão extraído** — não só o link, mas o que a fonte diz.
|
|
115
|
+
* **Explicitar a adaptação** — não é "copie isto", é "aplique assim".
|
|
116
|
+
* **Escalar confiança (Research):**
|
|
117
|
+
* `CONFIRMED` — padrão replicável e verificado em fonte de alta autoridade.
|
|
118
|
+
* `HIGH CONFIDENCE` — padrão claro de fonte de autoridade média-alta.
|
|
119
|
+
* `POSSIBLE` — padrão sugestivo, fonte de autoridade baixa.
|
|
120
|
+
* `SPECULATIVE` — especulação sobre o que a fonte pode oferecer sem ter lido.
|
|
121
|
+
|
|
122
|
+
## False Positives
|
|
123
|
+
|
|
124
|
+
* **Fonte no catálogo mas irrelevante** — o `use_when` não corresponde à tarefa.
|
|
125
|
+
Não citar fontes irrelevantes só para mostrar cobertura.
|
|
126
|
+
* **Inspiração tratada como evidência** — Dribbble é inspiração, não metodologia.
|
|
127
|
+
Não usar para justificar decisão técnica. Ver `AGENTS.md` § 1.
|
|
128
|
+
* **Fonte de baixa autoridade citada como verdade** — community/curated são úteis
|
|
129
|
+
mas não substituem established/vendor para decisões críticas.
|
|
130
|
+
* **Cópia em vez de adaptação** — extrair código pronto sem contexto ou adaptação
|
|
131
|
+
viola o princípio do repositório. Ver `AGENTS.md` § 1.
|
|
132
|
+
* **Pesquisa excessiva para tarefa trivial** — um botão simples não precisa de
|
|
133
|
+
referências. Ver `AGENTS.md` § 6 (proporcionalidade).
|
|
134
|
+
|
|
135
|
+
## Output Format
|
|
136
|
+
|
|
137
|
+
Nunca retornar apenas uma lista de links. Usar o formato de síntese do `plan.md` §17:
|
|
138
|
+
|
|
139
|
+
```markdown
|
|
140
|
+
## Research
|
|
141
|
+
|
|
142
|
+
### Reference
|
|
143
|
+
[Name]
|
|
144
|
+
|
|
145
|
+
### Relevant Pattern
|
|
146
|
+
O que foi encontrado.
|
|
147
|
+
|
|
148
|
+
### Why It Matters
|
|
149
|
+
Por que este padrão é útil.
|
|
150
|
+
|
|
151
|
+
### Adaptation
|
|
152
|
+
Como ele poderia se aplicar ao projeto atual.
|
|
153
|
+
|
|
154
|
+
### Trade-offs
|
|
155
|
+
Que problemas ele introduz.
|
|
156
|
+
|
|
157
|
+
### Recommendation
|
|
158
|
+
O que deve de fato ser adotado.
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Para cada fonte consultada, produza um bloco de síntese. Se múltiplas fontes dão a
|
|
162
|
+
mesma recomendação, consolide em um bloco e cite as fontes.
|
|
163
|
+
|
|
164
|
+
### Evidence Requirements
|
|
165
|
+
|
|
166
|
+
* **Nomear a fonte e seu `type`/`authority`** — para que o leitor saiba o peso.
|
|
167
|
+
* **Mostrar o padrão extraído** — não só o link, mas o que a fonte diz.
|
|
168
|
+
* **Explicitar a adaptação** — não é "copie isto", é "aplique assim".
|
|
169
|
+
* **Escalar confiança (Research):**
|
|
170
|
+
* `CONFIRMED` — padrão replicável e verificado em fonte de alta autoridade.
|
|
171
|
+
* `HIGH CONFIDENCE` — padrão claro de fonte de autoridade média-alta.
|
|
172
|
+
* `POSSIBLE` — padrão sugestivo, fonte de autoridade baixa.
|
|
173
|
+
* `SPECULATIVE` — especulação sobre o que a fonte pode oferecer sem ter lido.
|
|
174
|
+
|
|
175
|
+
### False Positives
|
|
176
|
+
|
|
177
|
+
* **Fonte no catálogo mas irrelevante** — o `use_when` não corresponde à tarefa.
|
|
178
|
+
Não citar fontes irrelevantes só para mostrar cobertura.
|
|
179
|
+
* **Inspiração tratada como evidência** — Dribbble é inspiração, não metodologia.
|
|
180
|
+
Não usar para justificar decisão técnica. Ver `AGENTS.md` § 1.
|
|
181
|
+
* **Fonte de baixa autoridade citada como verdade** — community/curated são úteis
|
|
182
|
+
mas não substituem established/vendor para decisões críticas.
|
|
183
|
+
* **Cópia em vez de adaptação** — extrair código pronto sem contexto ou adaptação
|
|
184
|
+
viola o princípio do repositório. Ver `AGENTS.md` § 1.
|
|
185
|
+
* **Pesquisa excessiva para tarefa trivial** — um botão simples não precisa de
|
|
186
|
+
referências. Ver `AGENTS.md` § 6 (proporcionalidade).
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-abuse-audit
|
|
3
|
+
description: Treats the API as directly accessible and investigates repetition, replay, ID manipulation, extra fields, alternative endpoints, missing rate limiting, and UI bypass to find abuse the server fails to prevent.
|
|
4
|
+
category: security
|
|
5
|
+
triggers:
|
|
6
|
+
- "audit api abuse"
|
|
7
|
+
- "treat api as directly accessible"
|
|
8
|
+
- "bypass the ui"
|
|
9
|
+
- "missing rate limiting"
|
|
10
|
+
- "replay and id manipulation"
|
|
11
|
+
priority: high
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# API Abuse Audit
|
|
15
|
+
|
|
16
|
+
## Objective
|
|
17
|
+
|
|
18
|
+
Ensinar o agente a **tratar a API como diretamente acessível**, ignorando a UI. O
|
|
19
|
+
usuário malicioso não clica em botões; ele chama endpoints. Esta skill procura abuso
|
|
20
|
+
que o servidor falha em prevenir quando o request é construído à mão: repetição, replay,
|
|
21
|
+
manipulação de IDs, campos extras, endpoints alternativos, ausência de rate limiting, e
|
|
22
|
+
bypass da UI.
|
|
23
|
+
|
|
24
|
+
## When to Use
|
|
25
|
+
|
|
26
|
+
* Em qualquer auditoria onde existe uma API por trás de um frontend.
|
|
27
|
+
* Quando uma ação sensível (grant, create, transfer, redeem, vote) é exposta por
|
|
28
|
+
endpoint.
|
|
29
|
+
* Quando o pedido menciona "API abuse", "rate limiting", "bypass UI", "direct API
|
|
30
|
+
calls", "replay", "mass assignment".
|
|
31
|
+
* **Composição:** pareia com `input-trust-audit` (campos extra = valores confiados),
|
|
32
|
+
`authorization-audit` (ID manipulation = IDOR), `idempotency-audit` (replay/repeat),
|
|
33
|
+
`race-condition-hunter` (concorrência via API), `gamification-audit` (abuso de
|
|
34
|
+
reward via API), `business-logic-audit` (limites via API).
|
|
35
|
+
|
|
36
|
+
## Mental Model
|
|
37
|
+
|
|
38
|
+
A UI é uma camada de conveniência, não de segurança. Toda proteção que vive só na UI
|
|
39
|
+
(esconder campos, desabilitar botões, limitar cliques, validar no submit) é inexistente
|
|
40
|
+
para quem chama a API direto. O modelo:
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
para cada ação exposta:
|
|
44
|
+
qual request a UI faz?
|
|
45
|
+
quais campos/IDs/parâmetros o servidor aceita além do que a UI envia?
|
|
46
|
+
o servidor impõe limite/frequency/idempotência/ownership?
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
O eixo central é: **qual é a diferença entre o que a UI permite e o que a API aceita?**
|
|
50
|
+
Toda diferença é uma superfície de abuso potencial.
|
|
51
|
+
|
|
52
|
+
Classes de abuso (do `plan.md` §7):
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
repetition — chamar a mesma ação N vezes
|
|
56
|
+
replay — reenviar um request capturado
|
|
57
|
+
ID manipulation — trocar IDs para agir sobre recursos alheios
|
|
58
|
+
extra fields — enviar campos que a UI não mostra (mass assignment)
|
|
59
|
+
alternative endpoints — contornar o endpoint protegido por um equivalente desprotegido
|
|
60
|
+
missing rate limiting — nenhuma frequência imposta
|
|
61
|
+
UI bypass — fazer pela API o que a UI proíbe/esconde
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Investigation Procedure
|
|
65
|
+
|
|
66
|
+
1. **Inventariar endpoints** da ação em escopo (e endpoints equivalententes/relacionados).
|
|
67
|
+
2. **Para cada endpoint, capturar o request nominal** — método, path, body, headers,
|
|
68
|
+
auth. Este é o que a UI envia.
|
|
69
|
+
3. **Testar repetição** — envie N vezes. O efeito escala? Há limite?
|
|
70
|
+
4. **Testar replay** — capture um request válido, reenvie após o efeito esperado ter
|
|
71
|
+
expirado/consumido. Ainda funciona?
|
|
72
|
+
5. **Testar ID manipulation** — troque o ID do recurso por um alheio. (conecta a
|
|
73
|
+
`authorization-audit`/IDOR).
|
|
74
|
+
6. **Testar extra fields** — adicione campos não-enviados pela UI (`role`, `xp`,
|
|
75
|
+
`ownerId`, `status`, `price`). Aceitos? (mass assignment).
|
|
76
|
+
7. **Testar endpoints alternativos** — existe um segundo endpoint que faz o mesmo sem
|
|
77
|
+
a checagem? (admin/internal/legacy path).
|
|
78
|
+
8. **Testar rate limiting** — burst de requests. Algum é rejeitado (429)? Ou tudo
|
|
79
|
+
passa?
|
|
80
|
+
9. **Testar UI bypass** — qual ação a UI proíbe (disabled/hidden) cujo endpoint ainda
|
|
81
|
+
aceita?
|
|
82
|
+
10. **Confirmar com evidência** — reproduza o abuso e observe o efeito.
|
|
83
|
+
11. **Reportar** via `templates/audit-report.md`.
|
|
84
|
+
|
|
85
|
+
## Questions to Ask
|
|
86
|
+
|
|
87
|
+
* Quais endpoints servem a ação? Só um, ou há versões alternativas (admin/internal)?
|
|
88
|
+
* O que a UI envia vs o que o servidor aceita? Campos extras são ignorados ou gravados?
|
|
89
|
+
* Repetir o request N vezes — o efeito cresce sem limite?
|
|
90
|
+
* Um request capturado pode ser reenviado depois? (replay / sem nonce ou expiry)
|
|
91
|
+
* Trocar o ID do recurso — acesso alheio permitido?
|
|
92
|
+
* Há rate limiting? Por-IP, por-user, por-recurso? É bypassável (trocar IP, multi-conta)?
|
|
93
|
+
* A UI desabilita uma ação em certo estado — o endpoint correspondente rejeita também?
|
|
94
|
+
* Campos como `role`/`xp`/`price` no body — o servidor lê do payload ou da sessão/DB?
|
|
95
|
+
* Há um endpoint "interno" ou "legacy" sem authz que faz o mesmo efeito?
|
|
96
|
+
|
|
97
|
+
## Attack Patterns
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
repetition
|
|
101
|
+
POST /claim ×100 → 100 rewards? limite imposto?
|
|
102
|
+
|
|
103
|
+
replay
|
|
104
|
+
POST /vote {postId:7} → 200 (registrado)
|
|
105
|
+
replay same request → 200 again? voto duplicado / troca-e-vota de novo?
|
|
106
|
+
|
|
107
|
+
ID manipulation
|
|
108
|
+
POST /react {targetUserId: <other>} → reage em nome/para outro?
|
|
109
|
+
|
|
110
|
+
extra fields (mass assignment)
|
|
111
|
+
PUT /profile {bio:"x"}
|
|
112
|
+
PUT /profile {bio:"x", role:"admin"} → role gravado?
|
|
113
|
+
|
|
114
|
+
alternative endpoint
|
|
115
|
+
POST /reactions (valida "no self-reward")
|
|
116
|
+
POST /reactions/internal/bulk (valida? ou é legacy desprotegido?)
|
|
117
|
+
|
|
118
|
+
missing rate limiting
|
|
119
|
+
1000 req/s para /redeem → nenhum 429? drena estoque/cota
|
|
120
|
+
|
|
121
|
+
UI bypass
|
|
122
|
+
UI: botão "delete" disabled quando status=="locked"
|
|
123
|
+
API: DELETE /item/{id} → aceita mesmo em locked? (validação server-side?)
|
|
124
|
+
|
|
125
|
+
parameter tampering
|
|
126
|
+
POST /transfer {amount: 100, currency}
|
|
127
|
+
POST /transfer {amount: -100} → inverte fluxo? (edge-case overlap)
|
|
128
|
+
|
|
129
|
+
verb tampering
|
|
130
|
+
GET /admin/users bloqueado por authz no GET
|
|
131
|
+
POST /admin/users (ou HEAD) → middleware só protegeu um verbo?
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Evidence Requirements
|
|
135
|
+
|
|
136
|
+
* **Nomear o endpoint e o tipo de abuso** (repeat/replay/ID/extra/alternative/rate/UI
|
|
137
|
+
bypass).
|
|
138
|
+
* **Mostrar o request exato** que abusa (método, path, body, headers) e a resposta.
|
|
139
|
+
* **Mostrar o efeito** — o que o abuso consegue (reward N×, acesso alheio, role
|
|
140
|
+
alterada, cota drenada).
|
|
141
|
+
* **Escalar confiança:**
|
|
142
|
+
* `CONFIRMED` — reproduziu o abuso e observou o efeito (request + resposta +
|
|
143
|
+
consequência).
|
|
144
|
+
* `HIGH CONFIDENCE` — endpoint visivelmente sem a proteção, sem reprodução manual.
|
|
145
|
+
* `POSSIBLE` — abuso plausível, não confirmado.
|
|
146
|
+
* `SPECULATIVE` — "poderia ser abusado" sem rastrear.
|
|
147
|
+
* Abuso que concede valor ou acessa dado alheio = mínimo `HIGH CONFIDENCE` se
|
|
148
|
+
reproduzido.
|
|
149
|
+
|
|
150
|
+
## False Positives
|
|
151
|
+
|
|
152
|
+
* **Rate limiting existe e é eficaz** — se 429 é retornado e o efeito não escala,
|
|
153
|
+
"repetition" é defendido. Confirmar o limite antes de reportar.
|
|
154
|
+
* **Mass assignment defendido por allowlist** — se o servidor usa uma allowlist de
|
|
155
|
+
campos atualizáveis e ignora o resto, `role` extra não é gravado. Confirmar.
|
|
156
|
+
* **Replay defendido por nonce/expiry** — se há idempotency key ou nonce com TTL,
|
|
157
|
+
replay não duplica. Relacionado a `idempotency-audit`; não duplique.
|
|
158
|
+
* **ID manipulation defendido por ownership check** — se o handler valida que o
|
|
159
|
+
recurso pertence ao caller, IDOR não aplica. Relacionado a `authorization-audit`.
|
|
160
|
+
* **Endpoint alternativo é protegido igual** — se `/internal/*` exige admin real,
|
|
161
|
+
não é bypass. Confirmar a proteção no endpoint alternativo.
|
|
162
|
+
* **UI bypass é puramente cosmético** — se a ação "disabled" na UI é também rejeitada
|
|
163
|
+
server-side no mesmo estado, não há bypass.
|
|
164
|
+
* **Ação é pública/idempotente por design** — alguns endpoints públicos sem rate limit
|
|
165
|
+
são aceitáveis (ex: view counter). Julgar pelo impacto.
|
|
166
|
+
|
|
167
|
+
## Output Format
|
|
168
|
+
|
|
169
|
+
Para cada abuso confirmado/plausível, um finding via `templates/audit-report.md`. Em
|
|
170
|
+
**Reproduction**, dê o request exato (curl-equivalente) e a resposta observada. Em
|
|
171
|
+
**Affected component**, nomeie o endpoint. Em **Root cause**, diga qual proteção falta
|
|
172
|
+
(rate limit / allowlist de campos / ownership check / nonce / proteção no endpoint
|
|
173
|
+
alternativo). Em **Recommendation**, indique a defesa server-side (rate limit por-user
|
|
174
|
+
não só por-IP; allowlist de campos; ownership check; idempotency key; descontinuar
|
|
175
|
+
endpoint legacy).
|
|
176
|
+
|
|
177
|
+
Apresente a matriz (endpoint × tipo de abuso × protegido? × evidência). Abuso que
|
|
178
|
+
concede valor ou acessa alheio primeiro; missing rate limiting e UI bypass depois.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: authorization-audit
|
|
3
|
+
description: Analyzes authenticated vs authorized vs owner vs moderator vs admin vs resource-participant and verifies that authorization is enforced on the server for every resource access, not just authentication.
|
|
4
|
+
category: security
|
|
5
|
+
triggers:
|
|
6
|
+
- "audit authorization"
|
|
7
|
+
- "check access control"
|
|
8
|
+
- "authenticated vs authorized"
|
|
9
|
+
- "owner and moderator permissions"
|
|
10
|
+
- "idor and privilege escalation"
|
|
11
|
+
priority: high
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Authorization Audit
|
|
15
|
+
|
|
16
|
+
## Objective
|
|
17
|
+
|
|
18
|
+
Ensinar o agente a separar **autenticação** (quem é você) de **autorização** (o que você
|
|
19
|
+
pode fazer) e a verificar que o servidor impõe autorização para *cada* acesso a recurso.
|
|
20
|
+
O bug canônico desta skill:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
GET /resource/123
|
|
24
|
+
|
|
25
|
+
authenticated ≠ authorized
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Estar logado não significa ter permissão sobre o recurso 123.
|
|
29
|
+
|
|
30
|
+
## When to Use
|
|
31
|
+
|
|
32
|
+
* Sempre que um fluxo envolve recursos pertencentes a um usuário (posts, pedidos,
|
|
33
|
+
documentos, configurações, dados de perfil).
|
|
34
|
+
* Quando há papéis (authenticated / authorized / owner / moderator / admin /
|
|
35
|
+
resource participant) e transições entre eles.
|
|
36
|
+
* Antes de lançar features com dados sensíveis ou multi-tenant.
|
|
37
|
+
* Quando o pedido menciona "authorization", "access control", "permissions", "roles",
|
|
38
|
+
"IDOR", "privilege escalation", "who can access".
|
|
39
|
+
* **Composição:** núcleo de auditoria de acesso. Pareia com `input-trust-audit`
|
|
40
|
+
(ownership/role confiados ao cliente), `api-abuse-audit` (bypass via endpoints
|
|
41
|
+
alternativos), `business-logic-audit` (ownership como regra), `user-flow-audit`
|
|
42
|
+
(fluxos que cruzam fronteiras de papel).
|
|
43
|
+
|
|
44
|
+
## Mental Model
|
|
45
|
+
|
|
46
|
+
Autorização é uma matriz: **sujeito × ação × recurso**. Cada célula deve ter uma
|
|
47
|
+
decisão (permitir / negar) imposta no servidor. Bugs vivem em três lugares:
|
|
48
|
+
|
|
49
|
+
1. **Células não avaliadas** — o handler checa autenticação mas não autorização; a
|
|
50
|
+
célula "qualquer usuário × ler × recurso alheio" nunca é testada.
|
|
51
|
+
2. **Decisão no cliente** — a UI esconde botões baseada em papel, mas o endpoint
|
|
52
|
+
aceita o request de qualquer um. O usuário malicioso não usa a UI.
|
|
53
|
+
3. **Papéis implícitos / confusos** — "authenticated" tratado como "authorized"; ou
|
|
54
|
+
"participant" confundido com "owner"; ou moderator com poder de admin sem checagem
|
|
55
|
+
explícita.
|
|
56
|
+
|
|
57
|
+
Os papéis formam uma hierarquia que deve ser *explícita*:
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
authenticated — tem identidade, nada mais
|
|
61
|
+
authorized — tem permissão para a ação (genérica)
|
|
62
|
+
owner — é dono do recurso específico
|
|
63
|
+
resource participant — é parte do recurso (membro, convidado)
|
|
64
|
+
moderator — pode agir sobre recursos de outros num escopo
|
|
65
|
+
admin — pode agir sobre tudo num escopo
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
A skill percorre a matriz e procura células não-impostas.
|
|
69
|
+
|
|
70
|
+
## Investigation Procedure
|
|
71
|
+
|
|
72
|
+
1. **Listar recursos** e suas ações (CRUD + ações de domínio: approve, invite, transfer).
|
|
73
|
+
2. **Para cada par (recurso, ação), determinar o papel exigido** — owner?
|
|
74
|
+
participant? moderator? admin? ou basta authenticated?
|
|
75
|
+
3. **Verificar onde a decisão é imposta** — handler server-side? middleware?
|
|
76
|
+
só no cliente? em nenhum lugar?
|
|
77
|
+
4. **Testar horizontal privilege escalation** — usuário A acessa recurso de usuário B
|
|
78
|
+
(mesmo papel, dono diferente). O servidor rejeita?
|
|
79
|
+
5. **Testar vertical privilege escalation** — usuário authenticated tenta ação de
|
|
80
|
+
admin/moderator. O servidor rejeita?
|
|
81
|
+
6. **Testar IDOR** — manipular o ID do recurso (`/resource/124` em vez de `/123`) para
|
|
82
|
+
acessar recurso alheio.
|
|
83
|
+
7. **Testar participant vs owner** — um membro de um grupo pode deletar o grupo? Um
|
|
84
|
+
convidado pode transferir ownership?
|
|
85
|
+
8. **Verificar papel vindo do cliente** — role/ownership é confiado no payload?
|
|
86
|
+
(conecta a `input-trust-audit`).
|
|
87
|
+
9. **Confirmar com evidência** — reproduza o acesso indevido ou aponte o handler que
|
|
88
|
+
não checa.
|
|
89
|
+
10. **Reportar** via `templates/audit-report.md`.
|
|
90
|
+
|
|
91
|
+
## Questions to Ask
|
|
92
|
+
|
|
93
|
+
* Para cada (recurso, ação): qual papel é exigido? Onde é checado?
|
|
94
|
+
* O handler valida que o solicitante é o *owner* do recurso, ou só que está logado?
|
|
95
|
+
* Posso trocar o ID no path/body para acessar recurso de outro usuário? (IDOR)
|
|
96
|
+
* Um usuário comum pode chamar um endpoint admin? (vertical escalation)
|
|
97
|
+
* O papel vem do token/sessão (server-side) ou do body do request? (input trust)
|
|
98
|
+
* "Participant" e "owner" são distinguidos? Um participant pode deletar?
|
|
99
|
+
* Moderator tem os poderes de admin delimitados por escopo, ou globais?
|
|
100
|
+
* Há um middleware de autorização ou cada handler reimplementa (e esquece)?
|
|
101
|
+
* A UI esconde ações — e o endpoint correspondente as rejeita sem a UI?
|
|
102
|
+
|
|
103
|
+
## Attack Patterns
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
IDOR — horizontal
|
|
107
|
+
user A: GET /order/1000 (próprio) → 200
|
|
108
|
+
user A: GET /order/1001 (de user B) → 200? deveria ser 403
|
|
109
|
+
|
|
110
|
+
vertical escalation
|
|
111
|
+
user (authenticated): POST /admin/users/delete {id} → 200? deveria ser 403
|
|
112
|
+
|
|
113
|
+
participant → owner action
|
|
114
|
+
member: DELETE /group/{groupId} → permitido? só owner deveria
|
|
115
|
+
|
|
116
|
+
role from client
|
|
117
|
+
PUT /profile {role: "admin"} → aceito? (mass assignment / input trust)
|
|
118
|
+
POST /grant {targetUserId, xp} → sem checar que caller é admin
|
|
119
|
+
|
|
120
|
+
moderator scope bleed
|
|
121
|
+
moderator of forum X acts on forum Y → escopo validado?
|
|
122
|
+
|
|
123
|
+
missing middleware, handler forgets
|
|
124
|
+
/api/orders/* tem authz middleware
|
|
125
|
+
/api/orders/special-case esqueceu de herdar → bypass
|
|
126
|
+
|
|
127
|
+
authenticated treated as authorized
|
|
128
|
+
GET /settings/{userId} → só checa token válido, não que userId==token.sub
|
|
129
|
+
|
|
130
|
+
delete via alternative verb/endpoint
|
|
131
|
+
não pode DELETE /post/123 (checa owner)
|
|
132
|
+
pode POST /post/123/delete (esqueceu checar) → bypass por endpoint alternativo
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Evidence Requirements
|
|
136
|
+
|
|
137
|
+
* **Nomear o (recurso, ação) e o papel exigido vs o papel imposto.**
|
|
138
|
+
* **Mostrar o acesso indevido** — request reproduzido com dois usuários, ou o handler
|
|
139
|
+
que checa só autenticação.
|
|
140
|
+
* **Classificar o tipo** — IDOR (horizontal) / vertical escalation / participant→owner /
|
|
141
|
+
role-from-client / scope-bleed / endpoint-alternativo.
|
|
142
|
+
* **Escalar confiança:**
|
|
143
|
+
* `CONFIRMED` — reproduziu com duas contas (A lê/edita recurso de B, ou common faz
|
|
144
|
+
admin).
|
|
145
|
+
* `HIGH CONFIDENCE` — handler visivelmente não checa ownership, sem reprodução.
|
|
146
|
+
* `POSSIBLE` — endpoint suspeito, caminho não confirmado.
|
|
147
|
+
* `SPECULATIVE` — "deveria haver checagem" sem rastrear.
|
|
148
|
+
* Acesso a dados sensíveis de outro usuário = mínimo `HIGH CONFIDENCE` se reproduzido.
|
|
149
|
+
|
|
150
|
+
## False Positives
|
|
151
|
+
|
|
152
|
+
* **Autorização via middleware/global** — se um middleware impõe authz para todos os
|
|
153
|
+
endpoints sob um prefixo, o handler "sem checagem" está coberto. Confirmar o
|
|
154
|
+
middleware aplica à rota exata.
|
|
155
|
+
* **Recurso é público por design** — alguns recursos são world-readable (perfil
|
|
156
|
+
público, post público). Acessar sem ser owner é intencional. Verificar a intenção.
|
|
157
|
+
* **Participant tem poderes reais** — se o produto define que membros podem deletar,
|
|
158
|
+
isso é decisão de produto, não bug. Marcar `POSSIBLE` se duvidar.
|
|
159
|
+
* **Role imposta por token, não pelo body** — se o servidor ignora `role` no body e usa
|
|
160
|
+
o claim do token, "role from client" é defesa, não defeito. Confirmar.
|
|
161
|
+
* **Endpoint admin separado e protegido** — se a ação admin vive só em `/admin/*`
|
|
162
|
+
protegido, o endpoint "comum" que parece exposto pode nem existir/implementar.
|
|
163
|
+
* **Self-access legítimo** — acessar o próprio recurso via ID alheio-numerado não é
|
|
164
|
+
IDOR se o ID é o seu.
|
|
165
|
+
|
|
166
|
+
## Output Format
|
|
167
|
+
|
|
168
|
+
Para cada (recurso, ação) sem imposição server-side de autorização, um finding via
|
|
169
|
+
`templates/audit-report.md`. Em **Reproduction**, dê o request com duas identidades
|
|
170
|
+
demonstrando o acesso indevido. Em **Root cause**, diga onde a checagem falta
|
|
171
|
+
(middleware ausente, handler esqueceu, role do cliente confiada). Em **Recommendation**,
|
|
172
|
+
indique imposição server-side (middleware de authz centralizado + checagem de ownership
|
|
173
|
+
no handler; nunca confiar role do body).
|
|
174
|
+
|
|
175
|
+
Apresente a matriz (recurso × ação × papel exigido × onde imposto × ✓/✗). IDOR e
|
|
176
|
+
escalada vertical primeiro; participant→owner e scope-bleed depois.
|