ワンクリックで
security-auditor
Audita segurança do CYPHER V3 — API keys, autenticação, rate limiting, wallet security, inputs
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Audita segurança do CYPHER V3 — API keys, autenticação, rate limiting, wallet security, inputs
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Testa cada API route do CYPHER V3 com dados reais — valida schemas, mede performance, detecta breaking changes, garante que cada endpoint retorna o que promete
Especialista em Bitcoin Ordinals, Runes, BRC-20, Rare Sats, wallet integration e protocolo Bitcoin para CYPHER V3
Modo John Carmack — foco absoluto numa única tarefa técnica, sem distrações, implementação direta e eficiente
Escreve código TypeScript/React/Next.js de produção para CYPHER V3
Garante o fluxo correto de dados desde APIs externas até ao utilizador — cache em camadas, fallbacks inteligentes, transformação de dados, sem dados stale ou inválidos na UI
Identifica e corrige bugs, memory leaks, hydration mismatches, e erros silenciosos no CYPHER V3
| name | security-auditor |
| description | Audita segurança do CYPHER V3 — API keys, autenticação, rate limiting, wallet security, inputs |
| version | 2.0 |
| tags | ["security","audit","api-keys","authentication","wallet","crypto"] |
# 1. API keys expostas no código
grep -rn "sk_\|pk_\|api_key\|API_KEY\|secret\|SECRET\|password\|PASSWORD" src/ --include="*.ts" --include="*.tsx" | grep -v "process\.env\|\.env\|example\|test"
# 2. NEXT_PUBLIC_ com dados sensíveis
grep -rn "NEXT_PUBLIC_" .env.local .env.example 2>/dev/null | grep -iE "secret|key|password|token|private"
# 3. npm audit
npm audit --audit-level=high
# 4. Hardcoded endpoints HTTP (deve ser HTTPS)
grep -rn "http://" src/ | grep -v "localhost\|127\.0\|test\|comment"
# 5. eval() ou injeção de código
grep -rn "eval(\|new Function(\|innerHTML\s*=" src/ --include="*.ts" --include="*.tsx"
# Verificar .gitignore
grep -E "\.env\.local|\.env\.production" .gitignore
# Verificar se há keys no histórico git
git log --all --full-history --oneline | head -20
git grep -i "secret\|api_key" $(git rev-list --all) 2>/dev/null | head -10
Variáveis obrigatórias em Railway/Vercel (NUNCA no código):
NEXTAUTH_SECRET, JWT_SECRET, ADMIN_JWT_SECRETAGENT_ENCRYPTION_KEY, SECURITY_ENCRYPTION_KEYSUPABASE_SERVICE_ROLE_KEYSTRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRETVerificar em todas as rotas críticas:
# Rotas sem rate limiting
grep -rn "export async function" src/app/api/ | grep -v "withRateLimit\|rateLimit"
Rotas que DEVEM ter rate limiting:
/api/agent/* — máximo 10 req/min/api/trading/* — máximo 30 req/min/api/auth/* — máximo 5 tentativas/15min/api/runes/*, /api/ordinals/* — máximo 60 req/minImplementação correta:
import { Ratelimit } from '@upstash/ratelimit'
import { redis } from '@/lib/cache/redis'
const ratelimit = new Ratelimit({
redis,
limiter: Ratelimit.slidingWindow(10, '1 m'),
analytics: true,
})
export async function POST(req: NextRequest) {
const ip = req.headers.get('x-forwarded-for') ?? '127.0.0.1'
const { success, limit, reset, remaining } = await ratelimit.limit(ip)
if (!success) {
return NextResponse.json(
{ error: 'Too many requests' },
{
status: 429,
headers: {
'X-RateLimit-Limit': limit.toString(),
'X-RateLimit-Remaining': remaining.toString(),
'X-RateLimit-Reset': new Date(reset).toISOString(),
},
}
)
}
// continuar
}
Verificar em src/agent/wallet/:
grep -rn "privateKey\|mnemonic\|seed" src/ | grep -v "test\|mock\|comment"
Padrões obrigatórios:
// NUNCA armazenar private keys em localStorage
// ✅ CORRETO — sempre usar SecureKeyStore
import { SecureKeyStore } from '@/agent/wallet/SecureKeyStore'
// SEMPRE validar endereços antes de transações
import { isValidBitcoinAddress } from '@/lib/utils/validation'
import { isAddress } from 'viem' // para EVM
// SEMPRE simular transação antes de executar
const simulation = await simulateTransaction(params)
if (!simulation.success) throw new Error(simulation.error)
// DEVE verificar assinatura em /api/webhooks/stripe
import Stripe from 'stripe'
export async function POST(req: NextRequest) {
const body = await req.text()
const sig = req.headers.get('stripe-signature')!
let event: Stripe.Event
try {
event = stripe.webhooks.constructEvent(body, sig, process.env.STRIPE_WEBHOOK_SECRET!)
} catch (err) {
return NextResponse.json({ error: 'Invalid signature' }, { status: 400 })
}
// processar evento
}
Verificar em next.config.js:
// DEVEM existir estes headers
const securityHeaders = [
{ key: 'X-DNS-Prefetch-Control', value: 'on' },
{ key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubDomains; preload' },
{ key: 'X-Frame-Options', value: 'SAMEORIGIN' },
{ key: 'X-Content-Type-Options', value: 'nosniff' },
{ key: 'Referrer-Policy', value: 'origin-when-cross-origin' },
{ key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
]
# Verificar se RLS está ativo nas tabelas sensíveis
# No Supabase Dashboard → Table Editor → selecionar tabela → RLS deve estar ON
# Tabelas críticas: users, transactions, agent_sessions, trading_positions
// SEMPRE sanitizar inputs antes de queries
import { z } from 'zod'
import DOMPurify from 'isomorphic-dompurify'
const SafeStringSchema = z.string()
.min(1)
.max(500)
.regex(/^[a-zA-Z0-9\s\-_\.]+$/, 'Invalid characters')
// Para conteúdo HTML
const sanitized = DOMPurify.sanitize(userInput, { ALLOWED_TAGS: [] })
## Auditoria de Segurança — CYPHER V3
**Data:** [data]
**Commit:** [hash]
### 🔴 CRÍTICO (bloqueia produção)
- [ ] item 1
### 🟡 ALTO (resolver em 48h)
- [ ] item 1
### 🟢 MÉDIO (resolver na próxima sprint)
- [ ] item 1
### ✅ OK
- rate limiting: ativo
- headers: configurados
^0.0.156 — atualizações frequentes de segurança^3.6.1 — verificar CVEs antes de atualizarnpm audit DEVE retornar zero HIGH/CRITICAL antes de qualquer deploy