iron-edge 2.1.0 → 2.3.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/README.md +29 -9
- package/bin/iron-edge.js +15 -3
- package/installer/gerados.js +106 -0
- package/installer/install.js +10 -78
- package/installer/update.js +343 -0
- package/package.json +1 -1
- package/skills/blindar-sistema/SKILL.md +123 -0
- package/skills/blindar-sistema/advanced/frieren-opcional.md +61 -0
- package/skills/blindar-sistema/kb/idor.md +94 -0
- package/skills/blindar-sistema/kb/llm-injection.md +86 -0
- package/skills/blindar-sistema/kb/secrets.md +89 -0
- package/skills/blindar-sistema/kb/sqli.md +77 -0
- package/skills/blindar-sistema/procedures/llm-endpoint-hardening.md +80 -0
- package/skills/blindar-sistema/procedures/sandbox-dado-falso.md +63 -0
- package/skills/blindar-sistema/procedures/secret-hygiene.md +72 -0
- package/skills/gate/SKILL.md +6 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Sandbox: um ambiente de teste com dado falso
|
|
2
|
+
|
|
3
|
+
> Procedimento do pacote **blindar-sistema**. Cria um lugar seguro para testar
|
|
4
|
+
> segurança e bug sem tocar em dado de gente real. É a TRAVA da etapa avançada
|
|
5
|
+
> (o teste ao vivo): nada que faça requisição real roda fora daqui.
|
|
6
|
+
|
|
7
|
+
## Por que isto existe
|
|
8
|
+
|
|
9
|
+
A auditoria white-box (ler o código) é segura em qualquer lugar, não toca dado. Mas
|
|
10
|
+
na hora de PROVAR uma falha ao vivo, ou rodar a ferramenta externa opcional, você
|
|
11
|
+
precisa de um sistema que seja seu e onde, se algo vazar, vazou nome de mentira.
|
|
12
|
+
Testar contra produção com cliente real é o erro que este passo elimina.
|
|
13
|
+
|
|
14
|
+
## A regra única e inegociável
|
|
15
|
+
|
|
16
|
+
> Só teste contra um sistema **seu**, em ambiente de **teste**, com **dado
|
|
17
|
+
> sintético** (inventado). Nunca produção. Nunca dado de gente real. Nunca site de
|
|
18
|
+
> terceiro. O teste ao vivo faz requisição real, por isso ele só roda aqui.
|
|
19
|
+
|
|
20
|
+
## Como montar (escolha um caminho)
|
|
21
|
+
|
|
22
|
+
### Caminho A: ambiente local (qualquer stack, é o padrão)
|
|
23
|
+
|
|
24
|
+
1. Suba o sistema na sua máquina (localhost) apontando para um banco local ou de
|
|
25
|
+
teste, nunca para o banco de produção.
|
|
26
|
+
2. Confirme, olhando a variável de ambiente ativa, que o banco NÃO é o de produção
|
|
27
|
+
antes de qualquer teste.
|
|
28
|
+
3. Popule com dado sintético (Caminho C abaixo).
|
|
29
|
+
|
|
30
|
+
### Caminho B: branch de teste do banco (se usa Supabase, requer plano pago)
|
|
31
|
+
|
|
32
|
+
O Supabase tem "branch": uma cópia isolada do banco para desenvolvimento, separada
|
|
33
|
+
da produção. ⚠️ Branching é recurso de plano pago, não existe no Free. Se você está
|
|
34
|
+
no Free, use o Caminho A (local).
|
|
35
|
+
|
|
36
|
+
1. No painel do Supabase, crie uma branch de desenvolvimento do projeto.
|
|
37
|
+
2. Aponte o ambiente de teste do app para a branch (as variáveis de ambiente da
|
|
38
|
+
branch, não as de produção).
|
|
39
|
+
3. Popule a branch com dado sintético, nunca com um dump de produção com dado real.
|
|
40
|
+
|
|
41
|
+
### Caminho C: semear dado sintético
|
|
42
|
+
|
|
43
|
+
Crie de 10 a 30 registros inventados, cobrindo os papéis que você quer testar (ex.:
|
|
44
|
+
dois usuários comuns para provar IDOR entre contas, um admin, alguns pedidos).
|
|
45
|
+
|
|
46
|
+
- Nomes, e-mails e telefones inventados (ex.: `teste1@exemplo.com`). Nunca reaproveite
|
|
47
|
+
dado de cliente de verdade "só para o teste".
|
|
48
|
+
- Se precisar de volume, um script de seed que gera os registros. Guarde o script
|
|
49
|
+
junto do projeto para recriar o sandbox quando quiser.
|
|
50
|
+
|
|
51
|
+
## Checklist antes de testar ao vivo
|
|
52
|
+
|
|
53
|
+
- [ ] O alvo é um sistema meu (não de terceiro)
|
|
54
|
+
- [ ] O ambiente é de teste (local ou branch), confirmado pela variável de ambiente
|
|
55
|
+
- [ ] O banco tem SÓ dado sintético, nenhum registro de cliente real
|
|
56
|
+
- [ ] A URL do teste não é a de produção
|
|
57
|
+
|
|
58
|
+
## Depois do teste
|
|
59
|
+
|
|
60
|
+
- Não deixe o sandbox exposto na internet com um proxy ligado.
|
|
61
|
+
- Se criou branch, apague ou pause quando terminar.
|
|
62
|
+
- O achado que você provou aqui vale para produção: leve o CONSERTO para produção,
|
|
63
|
+
nunca o teste.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Tirar segredo do histórico do Git
|
|
2
|
+
|
|
3
|
+
> Procedimento do pacote **blindar-sistema**. Conduza uma etapa de cada vez,
|
|
4
|
+
> esperando o usuário terminar. Só se aplica a um repositório do próprio usuário.
|
|
5
|
+
|
|
6
|
+
## Por que apagar o arquivo NÃO basta
|
|
7
|
+
|
|
8
|
+
Se uma chave foi commitada uma vez, ela continua no **histórico** do Git e em
|
|
9
|
+
qualquer clone ou fork, mesmo depois de você apagar o arquivo. A auditoria (veja
|
|
10
|
+
`kb/secrets.md`) aponta que vazou; tirar do passado é este procedimento.
|
|
11
|
+
|
|
12
|
+
## Ordem certa (não inverta)
|
|
13
|
+
|
|
14
|
+
### Passo 1: REVOGAR e gerar a chave de novo (PRIMEIRO, sempre)
|
|
15
|
+
|
|
16
|
+
Este é o passo que realmente protege. Enquanto a chave antiga for válida, ela está
|
|
17
|
+
comprometida, esteja no histórico ou não.
|
|
18
|
+
|
|
19
|
+
- Chave da API de IA (Claude/OpenAI): no painel do provedor, revogue a chave e gere
|
|
20
|
+
outra.
|
|
21
|
+
- Gateway de pagamento (Stripe/Mercado Pago): rotacione a chave secreta.
|
|
22
|
+
- Banco (Supabase service_role, senha do Postgres): rotacione no painel.
|
|
23
|
+
- Depois de gerar a nova, atualize a variável de ambiente no servidor e no deploy
|
|
24
|
+
(Vercel/host) ANTES de derrubar a antiga em produção, para não quebrar o sistema.
|
|
25
|
+
|
|
26
|
+
Se você não consegue gerar outra chave, resolva isso antes: uma chave que você não
|
|
27
|
+
sabe revogar é um risco em aberto.
|
|
28
|
+
|
|
29
|
+
### Passo 2: Limpar o histórico
|
|
30
|
+
|
|
31
|
+
Só depois de revogada, remova o arquivo do histórico inteiro.
|
|
32
|
+
|
|
33
|
+
Ferramenta recomendada: `git filter-repo`.
|
|
34
|
+
|
|
35
|
+
**Instalar (escolha o seu sistema):**
|
|
36
|
+
- macOS: `brew install git-filter-repo`
|
|
37
|
+
- Windows: `pip install git-filter-repo` (precisa de Python)
|
|
38
|
+
- Alternativa oficial: veja docs.github.com, "Removing sensitive data".
|
|
39
|
+
|
|
40
|
+
**Rodar (uma linha por comando, vale para PowerShell também):**
|
|
41
|
+
```
|
|
42
|
+
git filter-repo --invert-paths --path CAMINHO/DO/ARQUIVO-COM-SEGREDO
|
|
43
|
+
```
|
|
44
|
+
Troque `CAMINHO/DO/ARQUIVO-COM-SEGREDO` pelo arquivo real (ex.: `.env`).
|
|
45
|
+
|
|
46
|
+
**Se não der para instalar o filter-repo** (máquina travada, sem Python, sem brew):
|
|
47
|
+
- Alternativa: **BFG Repo-Cleaner** (`bfg --delete-files .env`), precisa de Java.
|
|
48
|
+
- Se nada disso rodar agora, NÃO trave: o Passo 1 (revogar) já neutralizou a chave.
|
|
49
|
+
Marque o Passo 2 como tarefa e siga o guia oficial do GitHub depois. Chave
|
|
50
|
+
revogada no histórico é um registro morto, não um risco ativo.
|
|
51
|
+
|
|
52
|
+
### Passo 3: Subir e avisar
|
|
53
|
+
|
|
54
|
+
⚠️ O `git filter-repo` **remove o remote `origin` de propósito** (é uma trava de
|
|
55
|
+
segurança dele). Por isso um `git push` simples falha com "No configured push
|
|
56
|
+
destination". Religue o remote e suba tudo (uma linha por comando):
|
|
57
|
+
```
|
|
58
|
+
git remote add origin URL-DO-SEU-REPOSITORIO
|
|
59
|
+
git push origin --force --all
|
|
60
|
+
git push origin --force --tags
|
|
61
|
+
```
|
|
62
|
+
O `--all` e o `--tags` garantem que o segredo saia de todos os branches e tags, não
|
|
63
|
+
só do atual. Avise quem tem clone do repo para reclonar (o histórico mudou). Daí em
|
|
64
|
+
diante: **segredo só em variável de ambiente**, nunca no código, nunca no front-end.
|
|
65
|
+
|
|
66
|
+
## Checklist
|
|
67
|
+
|
|
68
|
+
- [ ] Chave revogada e nova chave gerada
|
|
69
|
+
- [ ] Variável de ambiente atualizada no servidor/deploy
|
|
70
|
+
- [ ] Histórico limpo (ou tarefa marcada, se a ferramenta não rodou agora)
|
|
71
|
+
- [ ] Remote religado e `push --force --all --tags` feito, quem tem clone avisado
|
|
72
|
+
- [ ] `.env` no `.gitignore` para não repetir
|
package/skills/gate/SKILL.md
CHANGED
|
@@ -171,6 +171,12 @@ Mandar junto **só a lista de âncoras que vale** para o tipo da peça (seção
|
|
|
171
171
|
- ★ **DADOS**: números conferidos contra a fonte crua (export, API, planilha); as somas fecham; períodos corretos.
|
|
172
172
|
- **CLAREZA**: quem lê entende sem tradução?; a decisão recomendada está explícita?; zero jargão vazio.
|
|
173
173
|
|
|
174
|
+
⚠️ **Relatório de tráfego pago: a medição desce ao nível do anúncio, sempre.** Auditar no nível da campanha deixa passar o defeito mais caro que existe nesse tipo de peça. Três regras, todas medidas contra a API, nunca contra o status:
|
|
175
|
+
1. **Toda peça que o relatório diz estar "no ar" precisa ter impressão > 0 no período.** `effective_status = ACTIVE` não prova veiculação — em 02/09/2026, quatro anúncios ativados no dia anterior estavam todos ACTIVE e só dois entregavam. Campo ausente na resposta da API significa zero, não "não medido". **E a janela da consulta faz parte da medição:** `date_preset: "last_7d"` exclui o dia corrente e faz peça que está entregando aparecer com zero — foi assim que uma auditoria acusou como parado um anúncio com 63 impressões.
|
|
176
|
+
2. **Toda data citada no relatório bate com a data vigente da ficha do cliente** (bloco "Informação que vence"). Data futura não é sinônimo de data válida: a vaga pode ter fechado antes.
|
|
177
|
+
3. **O período do relatório é o mesmo em todos os blocos**, ou a divergência está escrita na peça. Mídia por ciclo de veiculação e negócio por mês-calendário podem conviver — desde que o leitor saiba.
|
|
178
|
+
Caso que originou a regra: um painel de cliente afirmava "anúncios novos no ar" enquanto as quatro peças novas tinham R$ 0,00 e zero impressão, e R$ 918,59 do mês haviam sido gastos com a arte da data anterior. Três lentes aprovaram o texto; quem pegou foi a medição por anúncio.
|
|
179
|
+
|
|
174
180
|
### DOCUMENTO (PDF, proposta, contrato, apostila) — âncoras lista A
|
|
175
181
|
- ★ **FATOS**: todo número, preço, nome, data e promessa conferido contra a fonte (contrato, sistema, memória do projeto).
|
|
176
182
|
- **FORMA**: fundo e identidade corretos (do cliente, não de quem produziu); anti-vícios de IA (travessão, "não é X, é Y", negação dramática); ortografia; paginação (rodapé que vira página órfã).
|