Vapordrop, sistema di messaggistica effimera sulla rete Tor e Self Hostable

Un sistema di messaggistica effimera sulla rete Tor che puoi ospitare tu stesso

http://mwgnkmbbgziasslmbqwo5qaeuxpftjbe63y6li62vijk3lpd23a66oyd.onion/

Il Concetto: Dead Drop Digitale

Durante la Guerra Fredda, agenti e informatori utilizzavano i “dead drop” — luoghi fisici prestabiliti dove lasciare messaggi senza mai incontrarsi. Un mattone allentato in un muro, una cavità in un albero, uno scomparto segreto in una panchina del parco.

VaporDrop porta questo concetto nell’era digitale. È un punto di scambio anonimo sulla rete Tor dove due persone possono depositare e ritirare messaggi e file senza conoscersi, senza registrarsi, senza lasciare tracce.

La differenza fondamentale? Potete ospitarlo voi stessi. Il server è vostro, i dati sono sotto il vostro controllo, e quando spegnete il container Docker, tutto svanisce.

Come Funziona l’Accesso

Dimenticate username e password tradizionali. VaporDrop utilizza un sistema mnemonico chiamato Brain Key.

Sei Parole, Una Identità

Per accedere servono sei parole di almeno quattro caratteri ciascuna. Queste parole vengono elaborate attraverso PBKDF2 con 100.000 iterazioni per generare un seed, che a sua volta genera una coppia di chiavi crittografiche P-256. La stessa combinazione di parole produce sempre la stessa identità.

Non c’è “password dimenticata” perché non c’è nessun database utenti. Le vostre sei parole sono la vostra identità.

Scegliere Parole Memorizzabili

Il sistema non richiede parole complicate. Potete usare:

  • Il ritornello di una canzone: “sotto questo sole splendido cammino”
  • Un titolo di libro: “cent anni solitudine garcia marquez”
  • Una frase personale: “nonna maria pasta domenica tavolo”
  • Parole in sequenza logica: “roma milano napoli torino firenze bologna”

L’importante è che siano parole che potete ricostruire mentalmente senza doverle scrivere da nessuna parte.

Il Numeric ID

Una volta effettuato l’accesso, il sistema vi assegna un Numeric ID nel formato 12345678-90. Questo è l’identificativo che condividete con chi deve contattarvi via messaggio. È derivato dalla vostra chiave pubblica, quindi le stesse sei parole produrranno sempre lo stesso Numeric ID.

Messaggi e File: Due Modalità

📨 Messaggi di Testo

Basta il Numeric ID del destinatario. Il messaggio viene cifrato AES-256-GCM nel browser prima dell’invio.

📁 Trasferimento File

Fino a 1GB, cifrati chunk per chunk. Richiede lo scambio delle chiavi pubbliche complete (130 caratteri hex).

Flusso Trasferimento File

  1. Scambio chiavi — Il destinatario copia la sua chiave pubblica e la comunica al mittente
  2. Cifratura locale — Il mittente incolla la chiave, trascina il file — viene cifrato nel browser
  3. Upload chunk — I chunk cifrati (1MB ciascuno) vengono caricati sul server
  4. Download e decifratura — Il destinatario scarica, decifra localmente, e il server cancella i chunk

Crittografia End-to-End

Tutto il codice crittografico viene eseguito nel browser. Il server non vede mai dati in chiaro.

Stack Crittografico

ComponenteAlgoritmoNote
Key ExchangeECDH P-25665 bytes = 130 hex
Symmetric EncryptionAES-256-GCMIV random 12 bytes
Brain Key DerivationPBKDF2-SHA256100.000 iterazioni
Onion Key DerivationArgon2id64MB RAM, 3 iter
Onion Service KeyEd25519Deterministica
RAM ProtectionMemGuardBlocco pagine

Protezioni Attive nel Backend

  • Anti-replay: ogni richiesta include un nonce unico, cachato per 24 ore
  • Rate limiting: massimo 60 richieste al minuto per IP
  • Timing jitter: ritardo random 50-500ms per prevenire timing attacks
  • Padding: messaggi con padding random per mascherare la lunghezza
  • MemGuard: chiavi bloccate in RAM, non swappabili su disco
  • Constant-time comparison: confronti hash resistenti a timing attacks

Il Pulsante Destroy

Nella dashboard trovate un pulsante rosso: 🔥 Destroy.

Cancella istantaneamente:

  • La chiave privata memorizzata nel browser
  • Tutti i contatti salvati localmente
  • Le preferenze del tema
  • Qualsiasi dato locale associato a VaporDrop

Nota: questo non cancella i messaggi già depositati sul server per voi. Quelli rimangono fino alla scadenza automatica (7 giorni) o fino a quando li recuperate.

Vita dei Dati sul Server

Messaggi e file hanno una vita massima di 7 giorni.

Trascorsa una settimana dal deposito, un garbage collector automatico li elimina definitivamente. Questa scelta bilancia due esigenze: dare tempo sufficiente al destinatario di recuperare i dati, e non accumulare indefinitamente materiale sul server.

Per esigenze diverse potete modificare le costanti nel codice sorgente e deployare la vostra istanza personalizzata.

Self-Hosting con Docker

VaporDrop è distribuito come container Docker. Funziona su qualsiasi sistema: Linux, Windows, macOS.

Download:

Requisiti

  • Docker e Docker Compose installati
  • Almeno 512MB di RAM disponibili
  • Connessione internet per la rete Tor
  • Spazio disco per i file temporanei (consigliato 10GB)

Installazione Rapida (DockerHub)

# Scarica l'immagine pre-compilata
docker pull gabx788/vapordrop:latest

# Crea directory per i file
mkdir -p vapordrop/static vapordrop/file_storage
cd vapordrop

# Scarica il frontend
curl -o static/index.html https://raw.githubusercontent.com/gabrix73/vapordrop/main/static/index.html

# Avvia (sostituisci con la tua frase segreta)
docker run -d \
  --name vapordrop \
  -e VAPOR_KEY="la-tua-frase-segreta-molto-lunga" \
  -v ./static:/app/static:ro \
  -v ./file_storage:/app/file_storage \
  --cap-add IPC_LOCK \
  --read-only \
  --tmpfs /tmp:size=256M \
  --tmpfs /run:size=64M \
  gabx788/vapordrop:latest

# Trova il tuo indirizzo .onion
docker logs -f vapordrop

Installazione da Sorgente (GitHub)

# Clona il repository
git clone https://github.com/gabrix73/vapordrop.git
cd vapordrop

# Imposta la chiave segreta
export VAPOR_KEY="la-tua-frase-segreta-molto-lunga"

# Builda e avvia
docker compose up -d --build

# Trova il tuo indirizzo .onion
docker compose logs -f

Windows/macOS con Docker Desktop

Installa Docker Desktop, avvialo, apri un terminale e segui gli stessi comandi. Docker Desktop gestisce automaticamente la VM Linux sottostante.

La Variabile VAPOR_KEY

VAPOR_KEY è la frase segreta che genera deterministicamente l’indirizzo .onion del vostro servizio.

  • Stessa frase = stesso indirizzo .onion
  • Frase diversa = indirizzo diverso

Attenzione: Se perdete la frase, perdete l’indirizzo. Se qualcuno la conosce, può impersonare il vostro servizio. Trattatela come una master password.

Dockerfile (Multi-Stage Hardened)

# STAGE 1: Build
FROM golang:1.22-alpine AS builder
RUN apk add --no-cache git ca-certificates
WORKDIR /build
COPY go.mod go.sum* ./
RUN go mod download 2>/dev/null || true
COPY main.go .
RUN [ -f go.mod ] || go mod init vapordrop
RUN go mod tidy
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
    -ldflags="-s -w -extldflags '-static'" \
    -trimpath -o vapordrop main.go

# STAGE 2: Runtime
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
    tor ca-certificates && rm -rf /var/lib/apt/lists/*
RUN groupadd -g 1000 vapor && \
    useradd -r -s /bin/false -d /app -u 1000 -g 1000 vapor
WORKDIR /app
COPY --from=builder /build/vapordrop /app/vapordrop
COPY static/ /app/static/
RUN chown -R vapor:vapor /app && chmod 500 /app/vapordrop
USER vapor
ENTRYPOINT ["/app/vapordrop"]

docker-compose.yml (Hardened)

services:
  vapordrop:
    build: .
    container_name: vapordrop
    volumes:
      - ./static:/app/static:ro
      - ./file_storage:/app/file_storage
    environment:
      - VAPOR_KEY=${VAPOR_KEY:?VAPOR_KEY obbligatoria}
    
    # Security
    cap_add:
      - IPC_LOCK          # Per MemGuard
    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges:true
    read_only: true
    
    # RAM-only temp dirs
    tmpfs:
      - /tmp:size=256M,mode=1777,uid=1000,gid=1000
      - /run:size=64M,mode=1777
    
    deploy:
      resources:
        limits:
          memory: 512M
    
    restart: unless-stopped

Primo Avvio

Nei log vedrete:

⚙️  Key derivation with Argon2id (~64MB RAM, ~1 sec)...
⚙️  Starting VaporDrop Node...
⚙️  Creating Onion Service v3...
═══════════════════════════════════════════════════════
✅ VAPORDROP ONLINE
🔗 http://abc123xyz456...onion
═══════════════════════════════════════════════════════

Struttura del Progetto

vapordrop/
├── main.go              # Backend Go (~700 righe)
├── go.mod               # Dipendenze: memguard, bine, crypto
├── go.sum
├── Dockerfile           # Multi-stage hardened
├── docker-compose.yml   # Con security options
├── static/
│   └── index.html       # Frontend completo (~500 righe)
└── file_storage/        # Directory chunk (auto-creata)

Endpoint API

EndpointMetodoFunzione
/api/registerPOSTRegistra Numeric ID ↔ Public Key
/api/resolve/{id}GETRisolve ID in Public Key(s)
/api/sendPOSTDeposita messaggio cifrato
/api/fetchPOSTRitira messaggi (e li cancella)
/api/file/initPOSTInizia trasferimento file
/api/file/chunk/{id}/{n}POSTCarica chunk cifrato
/api/file/pending/{pk}GETLista file in attesa
/api/file/download/{id}/{n}GETScarica chunk
/api/file/complete/{id}POSTConferma download (cancella)
/api/statsGETStatistiche pubbliche

Personalizzazione

Costanti modificabili in main.go:

const (
    MessageTTL       = 7 * 24 * time.Hour    // Durata messaggi
    FileTTL          = 7 * 24 * time.Hour    // Durata file
    MaxFileSize      = 1 << 30               // 1GB max
    FileChunkSize    = 1 << 20               // 1MB per chunk
    MaxPendingFiles  = 1000                  // File in attesa
    MaxIdentities    = 100000                // Identità registrate
    RateLimitWindow  = 1 * time.Minute       // Finestra rate limit
    MaxRequestsPerIP = 60                    // Richieste per IP
)

Domande Frequenti

Cosa succede se dimentico le sei parole?

Perdete l’accesso a quell’identità. Non esiste recupero. I messaggi depositati per voi rimarranno sul server fino alla scadenza, ma non potrete leggerli.

Posso usare le stesse parole su nodi diversi?

Sì. Le stesse sei parole generano la stessa identità ovunque. Potete accedere dal nodo pubblico o dal vostro nodo privato con le stesse credenziali.

Il gestore del server può leggere i miei messaggi?

No. La cifratura avviene nel browser prima dell’invio. Il server riceve e memorizza solo blob cifrati.

Come verifico che il codice sia sicuro?

Il frontend è un singolo file HTML ispezionabile. Aprite gli strumenti sviluppatore del browser e verificate che le chiamate crittografiche avvengano localmente prima di qualsiasi fetch al server.

Perché P-256 e non X25519?

Web Crypto API nei browser supporta nativamente P-256. Per curve non-NIST servirebbe includere librerie JavaScript esterne, aumentando la superficie di attacco.

Beta Testing & Feedback

⚠️ VaporDrop è attualmente in fase di testing. Il software è funzionante ma potrebbe contenere bug o comportamenti imprevisti.

Cerchiamo attivamente feedback da parte degli utenti. Se riscontrate bug, disfunzionamenti, o avete critiche e suggerimenti, contattateci su IRC:

ConnessioneIndirizzoPortaNote
Clearnet (TLS 1.3)irc.virebent.art6667Connessione cifrata
Tor (Onion)2xz3ngedsne2ngd3blpgnrqmeitffnzsnjacdjinu63yi5tjcyfitbid.onion6667No TLS (già cifrato da Tor)
  • Canale: #lobby
  • Contatto: Gabx

Conclusione

VaporDrop non è per tutti. Non ha le emoji animate di Telegram, non ha le spunte blu di WhatsApp, non ha i gruppi con centinaia di persone di Signal.

È uno strumento minimale per uno scopo specifico: permettere a due persone di scambiarsi informazioni in modo effimero, anonimo, e verificabile.

Se avete bisogno di un canale di comunicazione che non lasci tracce, che non richieda fiducia in terze parti, e che possiate ospitare voi stessi — VaporDrop è un’opzione.

Sei parole. Nessun account. Nessuna traccia.


VaporDrop è software sperimentale distribuito senza garanzie. Per comunicazioni critiche, verificate il codice sorgente e considerate di ospitare la vostra istanza.

Commenti

Lascia un commento