RemoteViewer
Il controllo remoto, ridefinito.
RemoteViewer è una piattaforma completa di accesso remoto, progettata come uno stack di produzione e non come un semplice viewer: identità, registrazione dei dispositivi, brokering delle sessioni, permessi granulari, audit, crash reporting, politiche di aggiornamento, TURN/ICE, firma delle release e strumenti per gli operatori fanno tutti parte del sistema.
Il control plane in Go gestisce identità, policy e signaling, mentre il flusso del desktop remoto resta peer-to-peer via WebRTC quando possibile, con fallback su TURN quando il NAT richiede un relay. Sopra la cifratura DTLS/SRTP di WebRTC, il protocollo RV-E2E-v1 autentica i due peer con certificati firmati da una CA dedicata, così né il control plane né un relay possono impersonarli.
Host e client girano su Windows 10/11 e su Ubuntu 22.04, 24.04 e 26.04, e interoperano in entrambe le direzioni. Su Windows l’host è un servizio con helper SYSTEM e non richiede più driver kernel firmati da Microsoft; su Linux è diviso in un demone non privilegiato e in agenti per sessione, con cattura X11 e Wayland (PipeWire).
Il prodotto è distribuito come setup Windows Host (solo il computer da controllare) e Full (client più Host locale), con un installer Qt 6 proprio e aggiornamenti delta firmati Ed25519, e come pacchetti .deb host, client e combinato da un repository APT firmato.
È un monorepo di circa 360.000 righe — C++20 per host, client e librerie condivise, Go per il backend, Angular per le console web — con i file Protobuf come unica fonte di verità per i contratti tra i componenti. La versione attuale è la 0.4.0.
In cifre
- righe di codice
- 360k
- commit
- 1850+
- capability di sessione
- 63
- casi di test C++ su Linux
- 1200+
- pacchetti: 2 setup Windows, 3 .deb
- 5
- versione attuale
- 0.4.0
In evidenza
Identità end-to-end
RV-E2E-v1: certificati Ed25519 a breve durata, asserzioni di revoca, pinning TOFU e binding del fingerprint DTLS; nessun frame parte finché l’handshake non è stabilito.
Bassa latenza
Encoding e decoding hardware (Media Foundation, VA-API, NVENC/NVDEC), decode zero-copy opzionale e rendering OpenGL; la qualità si adatta in tempo reale a RTT, jitter e packet loss.
Windows e Linux
Host e viewer su Windows 10/11 e Ubuntu 22.04/24.04/26.04, X11 e Wayland, con gli stessi protocolli e interoperabilità in entrambe le direzioni.
Host Windows senza driver kernel
Ctrl+Alt+Del via SendSAS, input sul desktop sicuro (UAC, login, blocco) tramite helper SYSTEM e display virtuale UMDF firmato sulla macchina: funziona con Secure Boot attivo.
Permessi granulari
63 capability di sessione con preset e policy a livelli (organizzazione, utente, gruppo, dispositivo), più permessi di sistema e ruoli personalizzati per dashboard e API.
Strumenti di amministrazione
Task manager, esplora file, terminale, servizi, programmi, aggiornamenti e sessioni utente, su Windows e su Linux, con elevazione controllata.
File e clipboard
Drag-and-drop di file e cartelle su data channel o relay QUIC con token HMAC, checksum e ripresa; clipboard condivisa con storico e trasferimento dei file su richiesta.
Multi-monitor e display virtuali
Selezione di uno, più o tutti i monitor remoti, profili di display e monitor virtuali creati dalla sessione (IddCx su Windows, Mutter su GNOME).
Rilasci firmati
Cataloghi e manifest firmati Ed25519, aggiornamenti delta con canali, rollout graduale, pinning e rollback; repository APT firmato con SBOM e provenance.
Architettura
Il control plane gestisce identità, policy e signaling; video, audio e input viaggiano peer-to-peer tra viewer e host su WebRTC, con TURN come fallback e un relay QUIC per i file più grandi.
Lato viewer
- Desktop client · C++/Qt 6
- Decode HW · OpenGL renderer
- Web dashboard · Angular
- Platform console · Angular
Control plane
- REST API · Go
- gRPC signaling · sessions · files
- WebSocket presence
- QUIC file relay
- RV-E2E CA · TURN credentials
Stato e infrastruttura
- PostgreSQL
- Redis pub/sub
- STUN / TURN (coturn)
- Vault Transit · CA signing
- Prometheus
Lato host
- Windows: service · SYSTEM helpers
- Linux: hostd · session agents
- DXGI / WGC · X11 / PipeWire
- Ghost tools
Come nasce una sessione
Il percorso di una sessione mediata dal control plane. Su una LAN il client può anche collegarsi direttamente all’IP dell’host: il signaling avviene tra i due peer con l’handshake cifrato RV-DIRECT-AUTH-v1 e la policy locale dell’host decide i permessi.
- 1
Autenticazione
Il viewer accede via REST (JWT, refresh token, 2FA se richiesta). L’host mantiene uno stream di signaling gRPC autenticato con il token del dispositivo e un lease di presenza.
- 2
Creazione della sessione
Il client chiede una sessione per dispositivo registrato o per RemoteViewer ID. Il control plane verifica organizzazione e policy, applica i gate (conferma, password, TOTP) e calcola il CapabilityGrant.
- 3
Autorizzazione dell’host
L’host riceve la richiesta con il grant candidato e accetta, rifiuta o chiede una verifica; il grant definitivo e immutabile arriva con SessionAuthorized.
- 4
Signaling
Il viewer apre il suo stream gRPC con un token monouso. Offer/answer SDP e candidati ICE passano per il relay Redis, che collega stream su istanze diverse del control plane.
- 5
Connessione peer-to-peer
ICE prova prima il collegamento diretto e ripiega su TURN con credenziali effimere; WebRTC stabilisce DTLS/SRTP per media e data channel.
- 6
Handshake RV-E2E-v1
PeerHello/PeerFinish verificano certificati, revoche e fingerprint DTLS e derivano le chiavi HMAC di sessione. Fino a Established non passano né video né messaggi.
- 7
Sessione attiva
Video e audio viaggiano su SRTP; input, clipboard, file e strumenti sul data channel con tag HMAC e anti-replay. L’host verifica il grant per ogni messaggio.
- 8
Chiusura e audit
La disconnessione di un lato chiude la sessione sull’altro; le sessioni terminate non si riaprono e gli accessi restano nel log di audit.
Struttura del repository
Un unico monorepo: CMake e vcpkg per la parte C++, moduli Go per il backend, un workspace Angular per il web. I file .proto generano i binding C++ e Go, e il catalogo delle capability genera helper Go, C++ e TypeScript.
desktop-host/
L’host Windows e Linux: cattura, encoding, WebRTC, input, strumenti remoti e integrazione con il sistema.
- capture/ — DXGI, WGC e helper per il desktop sicuro; X11, PipeWire, audio WASAPI e PipeWire
- webrtc/ — factory degli encoder, encoder hardware, quality controller, zero-copy, decoder MFT e VA-API
- input/ — SendInput, helper per il desktop sicuro, XTest, portali Wayland, uinput
- service/ — HostService, SessionManager con i grant, dispatcher degli strumenti, ciclo di vita dei driver
- linux/ — hostd, agenti di sessione, headless e greeter, broker Polkit, pacchetti, systemd e terminali PTY
- wayland/ · vdisplay/ — sessioni portale e Mutter, token di ripristino, display virtuale Xorg headless
- drivers/windows/ — display virtuale IddCx (UMDF) e audio virtuale opzionale
- utils/ — backend degli strumenti Ghost: processi, servizi, terminale, Windows Update e Features, programmi
desktop-client/
Il viewer Qt: sessioni a schede e finestre staccate, rendering, input e pannelli degli strumenti remoti.
- controllers/ — un grafo di controller per sessione: ciclo di vita, input, clipboard, file, audio, display, strumenti Ghost
- video/ — bridge WebRTC, renderer OpenGL YUV/NV12, monitor delle statistiche di qualità
- ui/ — finestre e schede, elenco dispositivi, impostazioni, Ghost UI, scambio file
- services/ · network/ — signaling gRPC, presenza WebSocket, E2E, TURN, layout dei comandi sincronizzato
- commands/ · keymap/ — catalogo dei comandi della sessione e mappatura della tastiera tra piattaforme
control-plane/
Il backend Go: server REST e gRPC, relay di signaling e QUIC, più gli strumenti da riga di comando per CA e firma delle release.
- cmd/ — server, cagen e cactl per la CA, relsign per le release, generatori dei TBS
- internal/api — handler REST, wrapper di autenticazione, catalogo delle release, download e repository APT
- internal/auth · sso · social · scim — utenti, JWT, MFA, permessi di sistema, OIDC/SAML, login social, provisioning SCIM
- internal/broker — sessioni, signaling, relay Redis/ibrido, risoluzione dei grant, 2FA di sessione
- internal/device · org · displayprofile — registro dispositivi, enrollment, gruppi, profili di display
- internal/ca · turn · filetransfer — CA RV-E2E con firmatario Vault, credenziali TURN, metadati e relay QUIC
- internal/platform · audit · crashreport · metrics — console di piattaforma, audit, crash report, diagnostica e metriche Prometheus
shared/
Librerie C++ comuni a host, client e installer.
- protocol/ — messaggi binari del data channel e wrapping sicuro con HMAC
- crypto/ · security/ — RV-E2E-v1, Ed25519, HMAC/HKDF, chiavi di release incorporate
- ipc/ — pipe autenticate HostControl v1 e ServiceControl v1
- quic/ · filetransfer/ — trasferimenti QUIC (ngtcp2), cartelle, compressione, risoluzione dei conflitti
- storage/ · config/ · diagnostics/ — store delle credenziali macchina, configurazione, support bundle con filtro privacy
- ui/ · styles/ — ThemeManager e token di stile per tema chiaro e scuro
proto-spec/
Contratti Protobuf: auth, common, device, file, session ed e2e, più il catalogo YAML delle capability di sessione (rbac).
web/
Workspace Angular con due applicazioni e una libreria condivisa.
- apps/dashboard — console del tenant: dispositivi, gruppi, utenti, sessioni, audit, crash report, diagnostica, aggiornamenti, CA
- apps/platform-console — console degli operatori: organizzazioni, utenti, dispositivi, approvazioni, audit, monitor
desktop-installer/
Installer e uninstaller Qt 6 a procedura guidata per le edizioni Host e Full, con payload in allowlist.
tests/ · tools/ · scripts/ · packaging/ · infra/
Test unitari e di integrazione C++, controllo dei confini di piattaforma, script di build e rilascio per Windows e Linux, packaging .deb, stack Docker locale e regole di alert.
docs/
Architettura, feature, riferimenti (REST, gRPC, protocollo, schema del database, configurazione), sicurezza, qualificazione e changelog, in inglese e italiano.
Specifiche tecniche
Supporto per piattaforma
Le stesse funzioni, implementate con le API native di ciascun sistema.
| Area | Windows 10/11 | Ubuntu 22.04 / 24.04 / 26.04 |
|---|---|---|
| Cattura | DXGI Desktop Duplication, WGC, desktop sicuro | X11 (RandR), Wayland via portale e PipeWire, Mutter su GNOME |
| Encoding | Encoder hardware Media Foundation (NVIDIA, Intel, AMD), fallback software | VA-API, NVENC, baseline software H.264/VP8 |
| Decoding | MFT H.264 con D3D11, zero-copy via WGL_NV_DX_interop | VA-API e NVDEC, zero-copy via DMA-BUF/EGL e CUDA-GL |
| Input | SendInput, helper SYSTEM su Winlogon, SendSAS per Ctrl+Alt+Del | XTest, portale RemoteDesktop/Mutter, helper uinput ristretto |
| Audio | Loopback WASAPI, driver virtuale opzionale | PipeWire con fallback PulseAudio, Opus |
| Display virtuali | Driver IddCx UMDF firmato sulla macchina | Fino a 4 monitor Mutter; Xorg dummy headless |
| Modello dei processi | App host, servizio Windows, helper SYSTEM e UAC | hostd, agenti di sessione/headless/greeter, servizio strumenti attivato via socket |
| Distribuzione | Setup Host e Full, aggiornamenti delta firmati | Pacchetti .deb host, client e combinato da APT firmato |
Livelli di fiducia
| Livello | Tecnologia | Cosa protegge |
|---|---|---|
| Account e dispositivi | JWT, refresh token, token dispositivo e macchina, token di signaling monouso | Accesso alle API e agli stream di signaling |
| Signaling | gRPC + TLS | Scambio dei metadati tra peer e control plane |
| Trasporto | WebRTC DTLS / SRTP / SCTP | Riservatezza e integrità tra i peer o attraverso TURN |
| Identità E2E | Certificati RV-E2E-v1, PeerHello/PeerFinish, SRA, pinning | Identità dei peer e integrità dei messaggi anche se control plane o relay non sono fidati |
| Autorizzazione | Permessi di sistema, gate di ammissione, CapabilityGrant, policy locale dell’host | Quali API può usare l’utente e quali azioni può fare nella sessione |
| Rilasci | Firme Ed25519 su catalogo e manifest, SHA-256 per file, APT firmato GPG | Integrità degli aggiornamenti, con una chiave separata da quella della CA |
Protocollo del data channel
Ogni frame ha un header binario di 18 byte (opcode, sequenza, lunghezza, timestamp); con RV-E2E attivo si aggiunge un tag HMAC-SHA256 di 16 byte con finestra anti-replay a 64 bit. I campi nuovi si aggiungono in coda, così i peer più vecchi continuano a funzionare.
| Famiglia | Area | Messaggi |
|---|---|---|
| 0x01xx | Auth | login, refresh, logout |
| 0x02xx | Dispositivi | enrollment, heartbeat, elenco |
| 0x03xx | Sessione | creazione, offer/answer SDP, ICE, chiusura |
| 0x04xx | Input | mouse, tastiera con Unicode, cursore ad alta frequenza |
| 0x05xx | Clipboard | testo e dati, storico, annunci e pull di file |
| 0x06xx | File | chunk, ack, drag-and-drop, file system, proprietà, miniature |
| 0x07xx | Strumenti | processi, servizi, terminale, programmi, Windows Features e Update |
| 0x08xx | Stampa | popup di stampa remota |
| 0x09xx | Controllo servizio | processi elevati, watchdog, desktop sicuro, stream del task manager |
| 0x0Axx · 0x0Bxx | Display e audio | monitor, display virtuali, profili, stato ed endpoint audio |
Capability di sessione
Il catalogo è un file YAML da cui vengono generati Go, C++ e TypeScript. Ogni voce ha una sensibilità (basic, advanced, privileged, destructive) e dice se richiede audit. I preset (solo visualizzazione, desktop interattivo, file, clipboard, supporto, accesso completo, personalizzato) si espandono in capability e passano per le policy.
| Categoria | Voci | Esempi |
|---|---|---|
| desktop_input | 4 | video, mouse, tastiera, Ctrl+Alt+Del |
| clipboard | 4 | lettura e scrittura di testo e file |
| files | 6 | elenco, download, upload, cestino, eliminazione definitiva, attributi |
| processes | 5 | elenco, terminazione, priorità, dump, avvio |
| services | 5 | elenco, controllo, configurazione, credenziali, eliminazione |
| terminal_elevation | 6 | terminale, avvio di strumenti, UAC, credenziali fornite |
| programs_registry | 13 | registro, programmi installati, avvio automatico, pacchetti APT/Snap/Flatpak, componenti |
| updates_features | 4 | Windows Features, scansione e installazione aggiornamenti |
| user_sessions | 4 | elenco, disconnessione, logoff, messaggi |
| power_display | 5 | riavvio, spegnimento, lettura/selezione/modifica dei display |
| secure_desktop | 2 | cattura e input sul desktop sicuro |
| audio_drivers | 5 | ascolto e controllo audio, lettura e gestione driver |
Servizi e porte predefinite
| Porta | Componente | Ruolo |
|---|---|---|
| 8080/tcp | HTTP | API REST, dashboard, /health e /ready, repository APT |
| 50051/tcp | gRPC | signaling, sessioni, metadati dei trasferimenti |
| 8081/tcp | WebSocket | presenza ed enrollment |
| 4433/udp | QUIC | relay dei file |
| 9090/tcp | Prometheus | metriche |
| 3478 · 5349 | STUN / TURN | attraversamento del NAT |
| 5432 · 6379 | PostgreSQL · Redis | stato persistente; relay di signaling e invalidazione dei token |
Nel dettaglio
Sessione remota
- Coda di frame limitata tra cattura ed encoder: vince sempre il frame più recente, con keyframe su richiesta e watchdog per recuperare lo stream.
- Puntatore corretto anche quando WebRTC ridimensiona il video: le coordinate vengono rimappate sulla cattura originale e sul monitor scelto.
- Tastiera tra piattaforme: testo come Unicode e tasti virtuali per le scorciatoie, layout risolti con XKB su Linux (verificati US, IT, DE, FR).
- Policy di accettazione per dispositivo: automatica, rifiutata o con conferma, password o TOTP; connessioni ad hoc per RemoteViewer ID con rate limit e backoff.
- Connessione diretta via IP su LAN, senza passare dal control plane per il signaling.
- Client a schede con finestre staccabili, command palette e barra degli strumenti personalizzabile, sincronizzata sull’account.
Identità e sicurezza
- JWT con refresh token; nel browser cookie HttpOnly, protezione CSRF, header di sicurezza, rate limiting e lockout.
- 2FA via TOTP o email, codici di recupero e di backup; login social (Google, Microsoft, GitHub), SSO OIDC/SAML con JIT e provisioning SCIM 2.0.
- CA Ed25519 per RV-E2E con firma via Vault Transit in produzione, rotazione a caldo delle chiavi e rinnovo proattivo dei certificati.
- Credenziali macchina protette (DPAPI su Windows, store AES-GCM con rilevamento delle manomissioni su Linux) e rotazione di tutti i token con compare-and-swap.
- Host bloccato finché non è registrato in un’organizzazione, con flussi di approvazione dei dispositivi.
Permessi e policy
- Due livelli separati: i permessi di sistema governano dashboard e API, le capability di sessione cosa si può fare su un host.
- Ruoli owner, admin, viewer e personalizzati; il middleware ricarica l’utente a ogni richiesta, così un JWT vecchio o falsificato non concede permessi.
- Policy a livelli (organizzazione, utente, gruppo, dispositivo, policy locale dell’host) con editor a tre stati: eredita, consenti, nega.
- Il grant è l’intersezione con le capability dichiarate dall’host ed è fail-closed: un ID sconosciuto o un grant vuoto bloccano la sessione.
- L’host verifica ogni messaggio contro il grant e ricontrolla prima degli effetti collaterali; il client mostra un CapabilityDenied strutturato.
Host Windows
- Servizio Windows con watchdog, helper SYSTEM per il desktop sicuro e helper UAC per le operazioni amministrative.
- Gestione locale tramite le named pipe autenticate HostControl v1 e ServiceControl v1, con correlation ID e autorizzazione per comando.
- Il video resta attivo durante i passaggi al desktop sicuro: la duplicazione normale si sospende mentre Winlogon controlla l’input.
- Pagina Driver nelle impostazioni: stato desiderato e reale, riavvio richiesto, installazione, riparazione e diagnostica gestite dal servizio.
- Tema chiaro/scuro coerente anche quando host e client girano come SYSTEM, leggendo la preferenza dell’utente collegato.
Host Linux
- hostd gira come utente di sistema remoteviewer, senza login e con un sandbox systemd rigoroso; possiede identità, token e signaling.
- Un agente per sessione utente, senza capability e con NoNewPrivileges, gestisce cattura, input e media; agenti dedicati per headless e greeter GDM.
- IPC RVAG/RVLC su socket SOCK_SEQPACKET con credenziali del kernel, legame alla sessione logind e protezione dal replay.
- Operazioni privilegiate solo tramite Polkit e un servizio root attivato via socket che accetta operazioni systemd/logind tipizzate.
- Strumenti nativi: processi da /proc, unità systemd, pacchetti APT/Snap/Flatpak, aggiornamenti autenticati, terminali PTY.
Strumenti remoti
Gli strumenti “Ghost” girano sull’host e si usano dal client senza disturbare l’utente remoto.
- Task manager con processi, prestazioni e GPU; terminazione, priorità, affinità e dump.
- Esplora file a doppio pannello con copia, spostamento, conflitti Chiedi/Salta/Sovrascrivi, cestino e proprietà.
- Terminale con scelta della shell, completamento dei percorsi ed esecuzione come utente corrente, elevato o con credenziali.
- Servizi, programmi all’avvio, programmi installati, Windows Features, Windows Update e sessioni utente.
- Comandi di sistema: blocco, logout, riavvio, spegnimento e popup di stampa remota.
Amministrazione e operazioni
- Dashboard Angular per tenant e admin: dispositivi, gruppi, utenti, sessioni, audit, crash report, diagnostica di rete, aggiornamenti e CA.
- Console di piattaforma separata per gli operatori: realm di autenticazione distinto, allowlist CIDR, TOTP obbligatorio, step-up, doppia approvazione e audit a catena verificabile.
- Crash reporting con minidump opzionali e retention, support bundle con filtro privacy che rimuove token, chiavi e password.
- Endpoint /health e /ready strutturati, metriche Prometheus su latenze HTTP/gRPC, CA, Redis e crash, con regole di alert.
Rilasci e aggiornamenti
- Due setup Windows autosufficienti dalla stessa build, con payload in allowlist e protezione dal downgrade di edizione.
- Aggiornamenti delta verificati da catalogo e manifest firmati Ed25519; canali, rollout graduale, pinning e rollback dalla dashboard.
- Pacchetti per Jammy, Noble e Resolute costruiti in Docker e pubblicati con swap atomico in un repository APT firmato servito dal control plane.
- Aggiornamenti consapevoli della piattaforma: Linux riceve solo rilasci APT, Windows solo setup Windows.
Qualità e test
- Test GTest/CTest per host, client e librerie condivise (oltre 1.200 casi sulla build Linux), test Go con race detector.
- CI su Windows e Ubuntu 22.04/24.04/26.04 con E2E full-stack su Linux, actionlint e check obbligatori.
- Controllo dei confini di piattaforma: nessuna API Windows fuori dalle zone autorizzate e nessun import vietato nei binari Linux.
- Framework di qualificazione per la GA con matrici di esecuzione, protocollo statistico BCa ed evidenze sigillate e firmate.
Stato e prossimi passi
Le funzioni sono implementate; alcune aree hanno ancora gate di qualificazione aperti.
- Client Linux: GA in attesa delle evidenze sigillate sulla matrice GPU Intel/AMD/NVIDIA e dei test di fault Wayland.
- Host Windows senza driver: qualificazione su VM pulite con Secure Boot attivo.
- Trasferimenti QUIC: matrice di validazione in produzione (ripresa, checksum, cartelle grandi, reti instabili).
- Firma Authenticode dei setup; il driver audio virtuale richiede ancora il test-signing. macOS è un’espansione futura.