|
1 | 1 | # SolShield |
2 | 2 |
|
3 | | -Pre-signature transaction analysis for Solana. Intercepts unsigned transactions, decides if they are safe to sign, and surfaces a verdict the wallet can render before the user approves. |
| 3 | +Una extensión de Chrome que mira lo que tu wallet va a firmar y te avisa si parece estafa. Antes de que toques "Confirmar". |
4 | 4 |
|
5 | | -Blockaid and Blowfish already occupy this space. Both are closed, pay-walled, and scoped to what their vendors choose to cover. SolShield is the open reference implementation the ecosystem should have shipped two years ago. |
| 5 | +Funciona con Phantom, Solflare, Backpack, Glow, Trust y Coin98. |
6 | 6 |
|
7 | | -> Active development. Not production-ready. Public APIs and data schemas will break until 1.0. |
| 7 | + |
8 | 8 |
|
9 | | -## Threat model |
| 9 | +## Por qué hice esto |
10 | 10 |
|
11 | | -The wallet layer on Solana is thin. When the user clicks *approve*, the signature authorizes the requested operation with almost no in-context explanation. SolShield sits between the dApp and the signature, takes the serialized transaction, and answers a single question: **is this safe to sign?** |
| 11 | +Llevo un año en Solana y ya he visto de todo. Un amigo perdió como mil quinientos dólares firmando un mensaje de "Sign in" en una página falsa de Magic Eden. El mensaje en realidad no era un login, era un permit para que un drainer le moviera todos los tokens. Otro firmó algo "para reclamar un airdrop" y al día siguiente no tenía SOL. |
12 | 12 |
|
13 | | -Inspection runs in four passes, cheap to expensive: |
| 13 | +Existen Blockaid y Blowfish que hacen algo parecido y son buenos. El problema es que son cerrados, son pagos, y solo te enteras de cómo funcionan si firmás un contrato comercial con ellos. Yo quería algo donde pudiera ver cada regla y cada prompt. Algo que cualquiera pudiera correr en su propio servidor sin pedir permiso. |
14 | 14 |
|
15 | | -1. **Static analysis.** Instruction decoding, known-bad program IDs, unlimited-approval anti-patterns, silent mint/freeze authority swaps, squatted token metadata, CPI guard violations. |
16 | | -2. **Dynamic simulation.** Execute against forked mainnet state. Diff balances, token ownership, and account authorities. Catch hidden transfers and delegated authority the static pass missed. |
17 | | -3. **Heuristic and ML classification.** Claude Haiku 4.5 for triage, Claude Opus 4.7 for deep reasoning on ambiguous cases. Prompts, few-shots, and the curated threat corpus all live in-tree — nothing is hidden in a remote config. |
18 | | -4. **Reputation.** Program, signer, and destination history via Helius and on-chain feeds. |
| 15 | +Así que lo armé. |
19 | 16 |
|
20 | | -The output is bounded: a numerical risk score, a categorical verdict (`safe | suspicious | danger`), and a human-readable reason ready to drop into a wallet modal. |
| 17 | +## Qué hace exactamente |
21 | 18 |
|
22 | | -## Attack surface it covers |
| 19 | +Cuando una página te pide firmar algo en tu wallet: |
23 | 20 |
|
24 | | -- Drainer programs and their obfuscated variants |
25 | | -- Malicious token approvals and unlimited delegations |
26 | | -- Hidden SOL/SPL transfers camouflaged inside legitimate-looking instructions |
27 | | -- Authority swaps (mint, freeze, upgrade) |
28 | | -- Squatted token metadata impersonating reputable mints |
29 | | -- Compromised IDL payloads served through dApp frontends |
30 | | -- Suspicious program deployments masquerading as known protocols |
| 21 | +1. SolShield se mete entre la página y tu wallet, y agarra la solicitud antes de que tu wallet la vea. |
| 22 | +2. Le pasa los bytes a Claude (sí, el de Anthropic) más 23 reglas escritas a mano que detectan patrones típicos de drainers. |
| 23 | +3. Te muestra un cartel con el resultado en lenguaje normal: "esto es seguro", "ojo, esto huele raro", o "no firmes esto, te van a vaciar la wallet". |
| 24 | +4. Vos decidís. Si decís que no, tu wallet ni se entera de que alguien intentó. |
31 | 25 |
|
32 | | -What it deliberately does **not** do: trade execution guidance, price-impact warnings, MEV routing. Different tool, different problem. |
| 26 | +Se ve así cuando algo es sospechoso: |
33 | 27 |
|
34 | | -## Repository layout |
| 28 | + |
| 29 | + |
| 30 | +Si clickeás "REJECT", la transacción se cancela ahí mismo. Phantom o Solflare ni siquiera abren su popup pidiéndote confirmación: |
| 31 | + |
| 32 | + |
| 33 | + |
| 34 | +## Un ejemplo concreto para que se entienda |
| 35 | + |
| 36 | +Imaginá que entrás a una página que parece Magic Eden pero en realidad es `magiceden-airdrop.fake`. Te pide que firmes un mensaje que dice algo así: |
35 | 37 |
|
36 | 38 | ``` |
37 | | -packages/core Rule engine, instruction parser, policy types |
38 | | -packages/ai Anthropic-backed analysis layer (Haiku + Opus) |
39 | | -packages/sdk Client library for wallets and dApps |
40 | | -apps/web Dashboard, live demo, public threat feed |
| 39 | +phishing.com wants you to sign in with your Solana account: |
| 40 | +
|
| 41 | +Welcome! Sign to verify ownership. |
41 | 42 | ``` |
42 | 43 |
|
43 | | -Strict TypeScript, pnpm workspaces, `@solana/kit` (not the retired web3.js v1), Prisma + Postgres, Redis. Docker Compose for local development, the same containers in production. |
| 44 | +A primera vista parece un login normal. Pero ese mensaje, una vez firmado, le da al atacante una firma criptográfica que puede usar en otra página. Es lo que se llama "spoofed SIWS domain" — el mensaje dice ser de un dominio (`phishing.com`) pero la página que lo pide es otra (`magiceden-airdrop.fake`). |
| 45 | + |
| 46 | +SolShield ve que el dominio del mensaje no coincide con dónde estás y lo marca como peligro nivel 90/100. Claude te explica en una frase: |
| 47 | + |
| 48 | +> "Este mensaje dice ser de phishing.com pero te lo está pidiendo magiceden-airdrop.fake — un ataque clásico de suplantación de dominio. Si firmás, podrían usar tu identidad o vaciar tu wallet." |
| 49 | +
|
| 50 | +Y listo. Vos clickeás Reject y nunca pasó nada. |
| 51 | + |
| 52 | +## Cómo se ve en magiceden de verdad |
| 53 | + |
| 54 | +Esto es una sesión real con la extensión instalada, navegando a Magic Eden auténtico: |
| 55 | + |
| 56 | + |
| 57 | + |
| 58 | +Cuando Magic Eden te pide firmar el SIWS para login (que es legítimo), SolShield revisa el mensaje, lo marca como `safe`, y no muestra nada. No te molesta cuando todo está bien. Si el mensaje en cambio tuviera un dominio raro o un patrón de permit con cantidades, ahí sí te frenaría. |
| 59 | + |
| 60 | +## Y para cuando el wallet abre su popup gigante |
| 61 | + |
| 62 | +Phantom abre una pestaña entera ocupando toda la pantalla cuando le pedís confirmar. Si nuestro cartel quedara escondido detrás, no servíamos para nada. Por eso SolShield abre TAMBIÉN una ventana del navegador separada, fuera del DOM de la página, para que la veas seguro: |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +Esa ventana tiene un botón "VOLVER A LA PESTAÑA Y DECIDIR" que te lleva de vuelta donde está el overlay. Es defensa en cuatro capas: el cartel en la página, una notificación del sistema operativo, un punto rojo en el icono de la extensión, y esta ventana popup. Una de las cuatro siempre la ves, importa qué tan ocupado tengas Chrome. |
44 | 67 |
|
45 | | -## Running locally |
| 68 | +## La página |
46 | 69 |
|
47 | | -Prereqs: Node 22+, pnpm 10+, Docker. |
| 70 | +`https://solshield.dev` |
| 71 | + |
| 72 | + |
| 73 | + |
| 74 | +## Cómo funciona por dentro |
| 75 | + |
| 76 | +Tres pedazos: |
| 77 | + |
| 78 | +**La extensión** (`apps/extension`) |
| 79 | +Lo que se instala en Chrome. Tiene dos scripts que se inyectan en cada página: uno se mete entre tu wallet y la página para interceptar las llamadas, y otro se encarga de mostrar los carteles. Hecha con React + Plasmo. |
| 80 | + |
| 81 | +**El servidor** (`apps/web`) |
| 82 | +Una API en Next.js que recibe la transacción o el mensaje, le pasa 23 reglas determinísticas (cosas tipo "este programa está en lista negra" o "este mensaje contiene una URL sospechosa"), y si algo se ve raro, le pregunta a Claude para que explique en lenguaje natural qué pasa. Está corriendo en un servidor mío en Hetzner. |
| 83 | + |
| 84 | +**Las reglas y los prompts** (`packages/core`, `packages/ai`) |
| 85 | +Archivos de texto cualquiera puede leer en GitHub. Si te parece que falta una regla o el prompt de Claude se puede mejorar, mandá un PR. Nada está oculto. |
| 86 | + |
| 87 | +## Por qué Claude |
| 88 | + |
| 89 | +Probé varios modelos. Claude Haiku 4.5 me da respuestas claras y cortas en menos de un segundo, y cuesta como $0.001 por análisis. Cuando una transacción es muy ambigua, escala a Claude Opus 4.7 que es más lento pero analiza instrucción por instrucción. |
| 90 | + |
| 91 | +Los créditos los pago yo. Por ahora cubrimos todo desde el servidor, no necesitas tu propia API key — instalas la extensión y listo. Si la cosa crece y se queda corto, ya veré. Si querés correrlo en tu propio servidor con tu key, también podés (`docker compose up`). |
| 92 | + |
| 93 | +## Instalación |
| 94 | + |
| 95 | +Por ahora no está en la Chrome Web Store (la voy a subir cuando esté más estable). Mientras tanto: |
48 | 96 |
|
49 | 97 | ```bash |
| 98 | +git clone https://github.com/ivaldepablo/solshield |
| 99 | +cd solshield |
50 | 100 | pnpm install |
51 | | -cp .env.example .env # HELIUS_API_KEY, ANTHROPIC_API_KEY |
52 | | -docker compose up -d # postgres + redis |
53 | | -pnpm -F web dev |
| 101 | +pnpm -F @solshield/extension build |
54 | 102 | ``` |
55 | 103 |
|
56 | | -## Roadmap |
| 104 | +Después en Chrome: |
| 105 | + |
| 106 | +1. Andá a `chrome://extensions` |
| 107 | +2. Activá "Developer mode" arriba a la derecha |
| 108 | +3. Click en "Load unpacked" |
| 109 | +4. Seleccioná la carpeta `apps/extension/build/chrome-mv3-prod` |
| 110 | + |
| 111 | +Ya deberías ver el icono de SolShield en la toolbar. |
| 112 | + |
| 113 | +## Wallets que funcionan |
| 114 | + |
| 115 | +Probadas con cuentas reales en Solana mainnet: |
57 | 116 |
|
58 | | -- [x] Monorepo scaffold |
59 | | -- [ ] Instruction decoder on top of `@solana/kit` |
60 | | -- [ ] Static rule set — the top 20 drainer patterns at minimum |
61 | | -- [ ] Forked-mainnet simulator with balance/ownership diffing |
62 | | -- [ ] AI layer — Haiku 4.5 triage + Opus 4.7 deep reasoning |
63 | | -- [ ] `@solshield/sdk` published to npm |
64 | | -- [ ] Wallet integrations — Phantom, Solflare, Backpack |
65 | | -- [ ] Public threat feed with signed, timestamped incidents |
66 | | -- [ ] Third-party security audit before 1.0 |
| 117 | +- Phantom |
| 118 | +- Solflare |
| 119 | +- Backpack |
| 120 | +- Glow |
| 121 | +- Trust |
| 122 | +- Coin98 |
67 | 123 |
|
68 | | -## Security |
| 124 | +También funciona con cualquier wallet que implemente el estándar wallet-standard. |
69 | 125 |
|
70 | | -SolShield is security-critical software. If you think you have found a vulnerability, do **not** open a public issue. Read [`SECURITY.md`](./SECURITY.md) for the disclosure path. |
| 126 | +## Lo que falta |
71 | 127 |
|
72 | | -Nothing here is a substitute for reviewing transactions yourself. SolShield reduces risk. It does not eliminate it. |
| 128 | +Cosas pendientes que voy haciendo cuando tengo tiempo: |
73 | 129 |
|
74 | | -## Contributing |
| 130 | +- Subirla a la Chrome Web Store |
| 131 | +- Detectar tokens clonados de Pump.fun (cuando un token gradúa, hay una ventana de minutos donde alguien puede crear uno con el mismo nombre en Raydium para confundir y cazar gente que compra rápido) |
| 132 | +- Soporte para Firefox |
| 133 | +- Mejor UX cuando Phantom abre su pestaña full-screen y te roba el foco |
| 134 | +- Más reglas a medida que aparezcan drainers nuevos |
75 | 135 |
|
76 | | -[`CONTRIBUTING.md`](./CONTRIBUTING.md). Rule submissions are especially welcome — a new drainer pattern the same day it hits mainnet is worth more than any feature. |
| 136 | +Si tenés ideas, abrí un issue. Si encontrás un bypass — que SolShield no detecte algo malicioso que debería — eso es lo más útil que podés reportar. |
77 | 137 |
|
78 | | -## License |
| 138 | +## Contacto |
79 | 139 |
|
80 | | -Apache 2.0. See [`LICENSE`](./LICENSE). |
| 140 | +- Mail: hi@solshield.dev |
| 141 | +- GitHub: [@ivaldepablo](https://github.com/ivaldepablo) |
81 | 142 |
|
82 | | ---- |
| 143 | +## Licencia |
83 | 144 |
|
84 | | -Maintained by [@0xnullpavel](https://github.com/0xnullpavel). Reachable through GitHub issues or `security@solshield.dev` for sensitive reports. |
| 145 | +MIT. Hacé lo que quieras con esto, fork it, mejoralo, vendelo. Solo no te hagas pasar por mí. |
0 commit comments