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.
Files changed (48) hide show
  1. package/AGENTS.md +249 -0
  2. package/LICENSE +21 -0
  3. package/README.md +113 -0
  4. package/bin/cli.js +223 -0
  5. package/docs/agent-integration.md +200 -0
  6. package/docs/philosophy.md +131 -0
  7. package/docs/reference-authoring.md +117 -0
  8. package/docs/skill-authoring.md +126 -0
  9. package/examples/authorization-bypass.md +191 -0
  10. package/examples/frontend-review.md +244 -0
  11. package/examples/race-condition.md +128 -0
  12. package/examples/xp-reward-loop.md +123 -0
  13. package/package.json +45 -0
  14. package/references/engineering.yaml +88 -0
  15. package/references/frontend.yaml +139 -0
  16. package/references/product.yaml +54 -0
  17. package/references/research.yaml +88 -0
  18. package/references/security.yaml +85 -0
  19. package/references/ux.yaml +37 -0
  20. package/scripts/validate.py +454 -0
  21. package/skills/audit/adversarial-review/SKILL.md +190 -0
  22. package/skills/audit/business-logic-audit/SKILL.md +182 -0
  23. package/skills/audit/edge-case-hunter/SKILL.md +159 -0
  24. package/skills/audit/error-flow-audit/SKILL.md +184 -0
  25. package/skills/audit/state-consistency-audit/SKILL.md +174 -0
  26. package/skills/audit/user-flow-audit/SKILL.md +161 -0
  27. package/skills/frontend/accessibility-review/SKILL.md +186 -0
  28. package/skills/frontend/animation-review/SKILL.md +171 -0
  29. package/skills/frontend/interaction-design/SKILL.md +162 -0
  30. package/skills/frontend/ux-review/SKILL.md +172 -0
  31. package/skills/frontend/visual-quality-review/SKILL.md +160 -0
  32. package/skills/meta/research-router/SKILL.md +184 -0
  33. package/skills/meta/skill-router/SKILL.md +206 -0
  34. package/skills/product/gamification-audit/SKILL.md +213 -0
  35. package/skills/reliability/data-integrity-audit/SKILL.md +187 -0
  36. package/skills/reliability/idempotency-audit/SKILL.md +191 -0
  37. package/skills/reliability/race-condition-hunter/SKILL.md +181 -0
  38. package/skills/research/github-reference-research/SKILL.md +197 -0
  39. package/skills/research/implementation-research/SKILL.md +181 -0
  40. package/skills/research/market-research/SKILL.md +202 -0
  41. package/skills/research/reference-research/SKILL.md +186 -0
  42. package/skills/security/api-abuse-audit/SKILL.md +178 -0
  43. package/skills/security/authorization-audit/SKILL.md +176 -0
  44. package/skills/security/input-trust-audit/SKILL.md +178 -0
  45. package/templates/audit-report.md +89 -0
  46. package/templates/bug-report.md +107 -0
  47. package/templates/design-review.md +122 -0
  48. 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.