Online ·gennaio 2026 —· Repository privata

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. 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. 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. 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. 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. 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. 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. 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. 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.