Pasquale "sid" Fiorillo ha scoperto una vulnerabilità critica in GoSign Desktop <= 2.4.0 che consente a un attaccante di eseguire codice arbitrario sul sistema tramite aggiornamenti insicuri e bypass TLS. L'exploit sfrutta la disattivazione della verifica dei certificati TLS quando è configurato un proxy, insieme a un meccanismo di aggiornamento basato su manifest non firmati.
Il vendor Tinexta InfoCert, inizialmente collaborativo, ha interrotto ogni comunicazione dopo aver ricevuto i dettagli tecnici, ignorando richieste di follow-up e rilasciando la versione 2.4.1 senza notifiche pubbliche nè menzione degli autori della scoperta. A seguito del comportamento opaco e non conforme alle best practice di disclosure responsabile, si è proceduto con una pubblicazione forzata (forced disclosure).
Multiple Vulnerabilities in GoSign Desktop leads to Remote Code Execution
- Name: TLS Verification Bypass and Insecure Update in GoSign Desktop
- System Affected: GoSign Desktop <= 2.4.0
- Fix: GoSign Desktop 2.4.1 (partially fixed)
- Vendor: Tinexta InfoCert S.p.A.
- Severity: High
- CVSS 3.1 8.2/10: AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
- Advisory: https://www.ush.it/team/ush/hack-gosign-desktop_240/gosign-desktop-exec.txt
- PoC: https://www.ush.it/team/ush/hack-gosign-desktop_240/
- Author: Pasquale 'sid' Fiorillo
- Contributors: Francesco 'ascii' Ongaro; Marco Lunardi
- Date: 20251003
GoSign
GoSign è una soluzione di firma elettronica avanzata e qualificata sviluppata da Tinexta InfoCert S.p.A. e utilizzata da pubbliche amministrazioni, aziende e professionisti per gestire flussi di approvazione con tracciabilità e sicurezza.
La soluzione web/saas dello stesso prodotto ha ottenuto la qualificazione "QC2" da parte dell'Agenzia per la Cybersicurezza Nazionale (ACN).
La qualificazione QC2 certifica la capacità di un servizio di gestire in modo sicuro dati critici, inclusi quelli trattati dalla Pubblica Amministrazione. In base al regolamento dell'ACN, in vigore dal 1o agosto 2024, i fornitori di servizi cloud per le pubbliche amministrazioni devono rispettare requisiti rigorosi in materia di sicurezza e resilienza. Questa qualificazione consente alle pubbliche amministrazioni di adottare soluzioni certificate per la protezione dei dati sensibili e garantire la continuità operativa dei servizi essenziali.
GoSign Desktop, oggetto di questo advisory, è la versione on-premise rilasciata per Microsoft Windows, Linux Ubuntu, e Apple OSX.
Executive Summary
Abbiamo identificato una vulnerabilità critica nel software GoSign Desktop, prodotto da Tinexta Infocert, una piattaforma ampiamente diffusa per la firma, verifica e gestione di documenti elettronici. Solo nel 2021, la piattaforma è stata utilizzata da 1,6 milioni di persone per eseguire oltre 830 milioni di transazioni di firma, a conferma del suo ruolo centrale nell'ecosistema digitale italiano ed europeo.
GoSign desktop disabilita la validazione dei certificati TLS (SSL_VERIFY_NONE) nei moduli libdgsapi.so e libcurl.so quando è configurato per usare un server proxy, rimuovendo ogni garanzia sull'identità del server durante le comunicazioni cifrate. Questo compromette la sicurezza delle comunicazioni cifrate e apre la strada ad attacchi Man-In-The-Middle (MitM).
Inoltre, il meccanismo di aggiornamento del software fa affidamenteo su un manifest non firmato pertanto la sicurezza è delegata esclusivamente al layer TLS.
Abbiamo verificato tre scenari di attacco, che compromettono gravemente la sicurezza degli utenti che utilizzano GoSign Desktop:
Installazione di software malevolo (Critico): un attaccante sulla rete può ingannare il client e fargli installare aggiornamenti fasulli, prendendo il controllo del computer con i privilegi dell'utente che esegue GoSign Desktop (windows, osx) o con i privilegi amministrativi (linux).
Furto di credenziali (Alto): le informazioni di accesso (token, password temporanee) possono essere intercettate perchè il programma non verifica l'identità del server.
Elevazione dei privilegi (Alto): un attaccnate locale con privilegi dell'utente che esegue GoSign Desktop può attivare in autonomia le impostazioni proxy del programma e iniettare un aggiornamento malevolo per ottenere il pieno controllo del sistema (linux).
TLS verification bypass
Il processo GoSignDesktop, tramite libdgsapi.so e libcurl.so disabilita la verifica dei certificati TLS chiamando SSL_CTX_set_verify(mode=SSL_VERIFY_NONE) quando è configurato per utilizzre un server proxy.
Questa configurazione disabilita completamente la validazione dei certificati durante l'handshake TLS, annullando di fatto le garanzie di autenticità e riservatezza del canale TLS, consentendo a un attaccante remoto di effettuare Man-in-the-Middle (MitM) e di intercettare e manipolare il traffico. Non viene verificata nè l'autenticità del server Infocert nè l'autenticità del server Proxy.
La vulnerabilità è stata verificata nei metodi relativi al controllo degli aggiornamenti(UpdateManager::get_manifest, UpdateManager::check_and_download) e nelle operazioni di rinnovo e autenticazione OAuth (ISACBinder::refresh e UpdateManager::getIdentity).
Tuttavia, è verosimile che qualsiasi richiesta originata da libdgsapi.so sia affetta dallo stesso problema di validazione dei certificati.
Versioni testate e risultate affette dall'assenza di verifica dei certificati TLS:
- GoSign Desktop 2.4.0 (standard) Windows
- GoSign Desktop 2.4.0 (standard) Linux
Il vendor conferma che anche la versione OSX è affetta dalla stessa vulnerabilità:
- GoSign Desktop 2.4.0 (standard) OSX
Insecure Update
Il meccanismo di aggiornamento di GoSign Desktop fa affidamento su un manifest non firmato contenente l'URL del pacchetto e il relativo hash SHA-256: un MitM può quindi fornire un manifest malevolo e l'hash corrispondente, indurre il client a scaricare e installare un pacchetto compromesso e, conseguentemente, ottenere esecuzione di codice remoto.
Di fatto, l'autenticazione del manifest degli aggiornamenti è affidata esclusivamente al layer TLS, che però non viene verificato: ciò rende inefficace ogni garanzia di autenticità.
Questa architettura è concettualmente errata, poichè il manifest, non essendo firmato digitalmente, protegge al massimo dalla non integrità accidentale (es. file corrotti), ma non previene attacchi attivi. In assenza di TLS valido e di firma del manifest, un attaccante può sostituire sia il pacchetto sia il suo hash, eludendo completamente il meccanismo di sicurezza.
Invece di adottare soluzioni consolidate per la distribuzione sicura del software, è stato implementato un meccanismo personalizzato che reintroduce rischi noti e ampiamente documentati. Si tratta di una scelta progettuale evitabile vista la presenza di standard affidabili, ampiamente utilizzati nel settore, che avrebbero garantito integrità e autenticità degli aggiornamenti.
Verified security impacts
Abbiamo confermato tre scenari di attacco concreti che compromettono gravemente la sicurezza di GoSign Desktop:
- Information Disclosure dei secrets OAuth
- Remote Code Execution
- Privilege Escalation
è possibile che esistano ulteriori vettori di attacco non ancora identificati. Vista la gravità degli impatti già verificati, abbiamo allertato immediatamente le autorità competenti (ACN/CSIRT Italia) per garantire una gestione responsabile e tempestiva dell'incidente.
CVSS 3.1
- CVSS Base Score: 8.2
- CVSS 3.1 Vector: AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
CWE Mappings
- CWE-295: Improper Certificate Validation: uso di SSL_VERIFY_NONE / disabilitazione della verifica TLS
- CWE-347: Improper Verification of Cryptographic Signature: assenza di verifica della firma sui manifest/metadata
- CWE-200: Exposure of Sensitive Information to an Unauthorized Actor: esposizione di segreti OAuth via canale non verificato
Attack scenarios
MitM
Nel caso tipico di un attacco Man-in-the-Middle, un attaccante in posizione di intercettazione del traffico di rete può rispondere alle richieste TLS originate da GoSign Desktop presentando un certificato autofirmato. Poichè GoSign Desktop, se configurato ad usare un proxy, disabilita la verifica dei certificati, il client stabilisce la connessione senza verificare l'identità del server.
L'attaccante può così intercettare e leggere richieste e risposte sensibili: in particolare le chiamate OAuth possono rivelare segreti come client_secret, token JWT o refresh token.
Allo stesso tempo, l'attaccante può rispondere alle richieste di aggiornamento fornendo un manifest manipolato che punta a un pacchetto compromesso e include l'hash SHA-256 corrispondente al payload malevolo. Il client, non avendo nè la verifica TLS attiva nè una firma digitale sul manifest, scarica l'aggiornamento ed esegue il codice fornito dall'attaccante con privilegi amministrativi (root) nel caso in cui il client sia Linux o con i privilegi dell'utente che esegue GoSign nel caso in cui il client sia Windows oppure Mac OS X.
Privilege Escalation
Una seconda modalità di sfruttamento si basa sulla compromissione preliminare dell'account utente, non privilegiato, che esegue GoSign Desktop.
L'attaccante locale può modificare in autonomia le impostazioni HTTP-PROXY contenute nel file di configurazione ~/.gosign/dike.conf inducendo il client a scaricare un aggiornamento malevolo e ottenere così privilegi amministrativi (root).
Proof of Concept Video: https://www.ush.it/team/ush/hack-gosign-desktop_240/gosigndesktop_mitm_poc.mp4
Proof of Concept Exploit: https://www.ush.it/team/ush/hack-gosign-desktop_240/
Gestione della Responsible Disclosure da parte del vendor Tinexta Infocert
Dopo il primo contatto, sono stati condivisi con il vendor tutti i dettagli tecnici della vulnerabilità, il PoC, e suggerimenti sulla mitigazione, sia tramite email cifrate sia tramite una Teams Call richiesta dal vendor ed effettuata il 16/10/2025 alle ore 15:00. In questa call, alla quale erano presenti il responsabile della sicurezza di Infocert e il responsabile del prodotto GoSign Desktop, il vendor conferma la vulnerabilità e si individua nel 31/10/2025 una deadline plausibile per il rilascio della fix.
Dopo tale call il vendor non invierà alcun aggiornamento e non risponderà più a nessuna comunicazione.
Il 04/11/2025 la fix viene rilasciata pubblicamente senza alcuna segnalazione da parte del vendor e senza aver onorato la richiesta di citazione in un changelog.
ACN/CSIRT Italia è stato aggiornato sul comportamento scorretto del vendor relativo alla gestione di una buona pratica di Responsible Disclosure.
Fix in GoSign Desktop 2.4.1
Nella versione 2.4.1 di GoSign Desktop, rilasciata il 04/11/2025 è stata introdotta la fix che verifica la firma del manifest degli aggiornamenti. La mancata verifica dei certificati TLS nel caso in cui l'applicazione sia configurata ad usare un proxy, non viene corretta.
- Information Disclosure dei secrets OAuth (NOT FIXED)
- Remote Code Execution (FIXED)
- Privilege Escalation (FIXED)
Details
Le evidenze raccolte indicano che la disattivazione della verifica dei certificati TLS non è un'anomalia isolata: il comportamento SSL_VERIFY_NONE è applicato sistematicamente durante l'inizializzazione delle connessioni TLS da parte di GoSign Desktop se è attiva l'impostazione per usare un server proxy.
Per dimostrarlo è stato utilizzato un approccio dinamico di instrumentazione a runtime che intercetta le API OpenSSL responsabili della configurazione della verifica dei certificati. Di seguito viene dimostrato che il comportamento di default dell'applicazione è impostare il flag SSL_VERIFY_NONE e che il check dei certificati risulta disattivato volontariamente. Nella sua configurazione attuale, GoSign rappresenta di fatto una backdoor installata su un numero elevatissimo di sistemi in uso presso importanti amministrazioni pubbliche, ministeri e aziende italiane.
Per osservare il comportamento a runtime è stata sviluppata una libreria di hook (LD_PRELOAD) che intercetta le chiamate alle funzioni SSL_CTX_set_verify() e SSL_set_verify() esportate dalle librerie di crittografia.
/* gcc -shared -fPIC -o log_ssl_verify.so log_ssl_verify.c -ldl -rdynamic */
#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <execinfo.h>
#include <stdint.h>
typedef void (*ssl_ctx_set_verify_t)(void*, int, void*);
typedef void (*ssl_set_verify_t)(void*, int);
static ssl_ctx_set_verify_t real_SSL_CTX_set_verify = NULL;
static ssl_set_verify_t real_SSL_set_verify = NULL;
static void dump_backtrace(FILE *f) {
void *buffer[50];
int nptrs = backtrace(buffer, 50);
char **strings = backtrace_symbols(buffer, nptrs);
if (strings != NULL) {
for (int i = 0; i < nptrs; ++i) {
fprintf(f, " %s\n", strings[i]);
}
free(strings);
} else {
fprintf(f, " <no backtrace available>\n");
}
}
void SSL_CTX_set_verify(void *ctx, int mode, void *cb) {
if (!real_SSL_CTX_set_verify) {
real_SSL_CTX_set_verify = (ssl_ctx_set_verify_t)dlsym(RTLD_NEXT, "SSL_CTX_set_verify");
}
FILE *f = fopen("/tmp/gosign_ssl_verify.log", "a");
if (f) {
fprintf(f, "PID %d: SSL_CTX_set_verify called with mode=%d\n", getpid(), mode);
dump_backtrace(f);
fclose(f);
}
if (real_SSL_CTX_set_verify) real_SSL_CTX_set_verify(ctx, mode, cb);
}
void SSL_set_verify(void *ssl, int mode) {
if (!real_SSL_set_verify) {
real_SSL_set_verify = (ssl_set_verify_t)dlsym(RTLD_NEXT, "SSL_set_verify");
}
FILE *f = fopen("/tmp/gosign_ssl_verify.log", "a");
if (f) {
fprintf(f, "PID %d: SSL_set_verify called with mode=%d\n", getpid(), mode);
dump_backtrace(f);
fclose(f);
}
if (real_SSL_set_verify) real_SSL_set_verify(ssl, mode);
}
Avvio del processo tramite e ottenimento del log in gosign_ssl_verify.log:
export LD_PRELOAD=./log_ssl_verify.so
/usr/lib/gosigndesktop/GoSignDesktop & disown
Log di avvio:
$ export LD_PRELOAD=./log_ssl_verify.so
$ /usr/lib/gosigndesktop/GoSignDesktop & disown
[1] 282062
$ Profile verified!
Using @ffi-napi
2025-10-03 21:21:22.977 [info] info LoggerElectron initialized
2025-10-03 21:21:22.978 [info] Current log level: { verbose: false, defaultLogLevel: 'info' }
2025-10-03 21:21:23.191 [info] (main) homeDir is '/home/sid/.gosign'
Creating certificate store: {"filename":"/home/sid/.gosign/certificates.db","autoload":true}
Creating option store: {"filename":"/home/sid/.gosign/options.db","autoload":true}
~ Analytics ~ currentCustomization standard
Native module: @ice/dike-core-linux x64
2025-10-03 21:21:23.200 [info] (DikeClients) Loading profile from: /usr/lib/gosigndesktop/resources/app/current-customization/profile.jwt
2025-10-03 21:21:23.200 [info] (DikeClients) Homepath for core library is '/home/sid/.gosign'
HOME_PATH: /home/sid/.gosign
2025-10-03 21:21:23.201 [warn] (DikeClients) LIBRARY PATH __dirname IS STILL BROKEN, PLEASE CHECK ISSUE ON GITHUB!!!
https://github.com/electron/electron/issues/8206
2025-10-03 21:21:23.201 [info] (DikeClients) ======================= PRODUCTION ENV =======================
Native module: @ice/dike-core-linux x64
Profile verified!
2025:10:03 21:21:23 (0xfd27cd80)[INFO][dgs] (prepare_tempdir): Removing session dir /home/sid/.gosign/sessiondir_7cb271e1
Scheduler -> getMessages
Registering channel get-version
Registering channel jobs-channel
Registering channel add-jobs-channel
Registering channel test-pin
Registering channel set-configuration
Registering channel get-session-params
Registering channel device-list
Registering channel change-pin
Registering channel unlock-pin
Registering channel unlock-ce-pin
[..]
Contenuto di gosign_ssl_verify.log contenente l'evidenza di SSL_CTX_set_verify(mode=0) e relativo backtrace:
PID 282062: SSL_CTX_set_verify called with mode=0
./log_ssl_verify.so(+0x1272) [0x796e00465272]
./log_ssl_verify.so(SSL_CTX_set_verify+0x9b) [0x796e004653e2]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x734f4) [0x796dfcabb4f4]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x7419f) [0x796dfcabc19f]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x74b09) [0x796dfcabcb09]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x1a8ef) [0x796dfca628ef]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x14ca5) [0x796dfca5cca5]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x189bf) [0x796dfca609bf]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x483e9) [0x796dfca903e9]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(curl_multi_perform+0xea) [0x796dfca9195a]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(curl_easy_perform+0x14b) [0x796dfca6c7eb]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs14NetworkRequest7executeEv+0x54e) [0x796df3d8dc9e]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs10ISACBinder7refreshERNS_12IdentityDataE+0x450) [0x796df3d733e0]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs10ISACBinder11getIdentityERNS_12IdentityDataEb+0x55d) [0x796df3d7ab5d]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(dgs_oauth_get_identity+0x1b7) [0x796df3c2efc7]
/lib/x86_64-linux-gnu/libffi.so.8(+0x7b16) [0x796dfe7efb16]
/lib/x86_64-linux-gnu/libffi.so.8(+0x43ef) [0x796dfe7ec3ef]
/lib/x86_64-linux-gnu/libffi.so.8(ffi_call+0x12e) [0x796dfe7ef0be]
/usr/lib/gosigndesktop/resources/app/node_modules/ffi-napi/build/Release/ffi_bindings.node(_ZN3FFI3FFI12AsyncFFICallEP9uv_work_s+0x23) [0x796dfcaef533]
/usr/lib/gosigndesktop/GoSignDesktop(+0x18f14d4) [0x59e78df734d4]
PID 282062: SSL_CTX_set_verify called with mode=0
./log_ssl_verify.so(+0x1272) [0x796e00465272]
./log_ssl_verify.so(SSL_CTX_set_verify+0x9b) [0x796e004653e2]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x734f4) [0x796dfcabb4f4]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x7419f) [0x796dfcabc19f]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x74b09) [0x796dfcabcb09]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x1a8ef) [0x796dfca628ef]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x14ca5) [0x796dfca5cca5]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x189bf) [0x796dfca609bf]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x483e9) [0x796dfca903e9]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(curl_multi_perform+0xea) [0x796dfca9195a]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(curl_easy_perform+0x14b) [0x796dfca6c7eb]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs14NetworkRequest7executeEv+0x54e) [0x796df3d8dc9e]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs13UpdateManager12get_manifestERNS0_14UpdateManifestE+0x2bb) [0x796df3e2dc5b]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs13UpdateManager18check_and_downloadERNS_17UpdateManagerDataEb+0x178) [0x796df3e30bd8]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN5boost10statechart12simple_stateIN3dgs16WaitCheckRequestENS2_10UpdaterFSMENS_3mpl4listIN4mpl_2naES8_S8_S8_S8_S8_S8_S8_S8_S8_S8_S8_S8_S8_S8_S8_S8_S8_S8_S8_EELNS0_12history_modeE0EE10react_implERKNS0_10event_baseEPKv+0x1e5) [0x796df3d0cb25]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs10UpdaterFSM18process_event_jsonE14DGS_FLOW_EVENTRKN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEEE+0x43a) [0x796df3d0171a]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs7FlowFSM12processeventE14DGS_FLOW_EVENTRKN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEEE+0x53) [0x796df3cccb73]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(dgs_flow_post_event+0xc5) [0x796df3c30085]
/lib/x86_64-linux-gnu/libffi.so.8(+0x7b16) [0x796dfe7efb16]
/lib/x86_64-linux-gnu/libffi.so.8(+0x43ef) [0x796dfe7ec3ef]
/lib/x86_64-linux-gnu/libffi.so.8(ffi_call+0x12e) [0x796dfe7ef0be]
/usr/lib/gosigndesktop/resources/app/node_modules/ffi-napi/build/Release/ffi_bindings.node(_ZN3FFI3FFI12AsyncFFICallEP9uv_work_s+0x23) [0x796dfcaef533]
/usr/lib/gosigndesktop/GoSignDesktop(+0x18f14d4) [0x59e78df734d4]
PID 282062: SSL_CTX_set_verify called with mode=0
./log_ssl_verify.so(+0x1272) [0x796e00465272]
./log_ssl_verify.so(SSL_CTX_set_verify+0x9b) [0x796e004653e2]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x734f4) [0x796dfcabb4f4]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x7419f) [0x796dfcabc19f]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x74b09) [0x796dfcabcb09]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x1a8ef) [0x796dfca628ef]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x14ca5) [0x796dfca5cca5]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x189bf) [0x796dfca609bf]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x483e9) [0x796dfca903e9]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(curl_multi_perform+0xea) [0x796dfca9195a]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(curl_easy_perform+0x14b) [0x796dfca6c7eb]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcaCRLCache.so(+0x5873e) [0x796df2ae673e]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcaCRLCache.so(+0x59e85) [0x796df2ae7e85]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcaCRLCache.so(+0x2f884) [0x796df2abd884]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libdeSign.so(_Z9loadEUTSLv+0x26) [0x796df2098386]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs6Design13isTSLToUpdateE16DGS_COUNTRY_CODE+0x4a) [0x796df3c116fa]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs10TSLManager18check_TSLs_updatesEv+0xa7) [0x796df3e2bc07]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs4Core16tsl_checkupdatesERNS_7TSLDataE+0x2c) [0x796df3bb865c]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(dgs_tsl_checkupdates+0x87) [0x796df3c2f357]
/lib/x86_64-linux-gnu/libffi.so.8(+0x7b16) [0x796dfe7efb16]
/lib/x86_64-linux-gnu/libffi.so.8(+0x43ef) [0x796dfe7ec3ef]
/lib/x86_64-linux-gnu/libffi.so.8(ffi_call+0x12e) [0x796dfe7ef0be]
/usr/lib/gosigndesktop/resources/app/node_modules/ffi-napi/build/Release/ffi_bindings.node(_ZN3FFI3FFI12AsyncFFICallEP9uv_work_s+0x23) [0x796dfcaef533]
/usr/lib/gosigndesktop/GoSignDesktop(+0x18f14d4) [0x59e78df734d4]
PID 282062: SSL_CTX_set_verify called with mode=0
./log_ssl_verify.so(+0x1272) [0x796e00465272]
./log_ssl_verify.so(SSL_CTX_set_verify+0x9b) [0x796e004653e2]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x734f4) [0x796dfcabb4f4]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x7419f) [0x796dfcabc19f]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x74b09) [0x796dfcabcb09]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x1a8ef) [0x796dfca628ef]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x14ca5) [0x796dfca5cca5]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x189bf) [0x796dfca609bf]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x483e9) [0x796dfca903e9]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(curl_multi_perform+0xea) [0x796dfca9195a]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(curl_easy_perform+0x14b) [0x796dfca6c7eb]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcaCRLCache.so(+0x5873e) [0x796df2ae673e]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcaCRLCache.so(+0x59e85) [0x796df2ae7e85]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcaCRLCache.so(+0x31007) [0x796df2abf007]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libdeSign.so(_Z26checkCountryCACertsUpdatesPc+0x2d) [0x796df20987bd]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs6Design13isTSLToUpdateE16DGS_COUNTRY_CODE+0xd0) [0x796df3c11780]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs10TSLManager18check_TSLs_updatesEv+0xa7) [0x796df3e2bc07]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs4Core16tsl_checkupdatesERNS_7TSLDataE+0x2c) [0x796df3bb865c]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(dgs_tsl_checkupdates+0x87) [0x796df3c2f357]
/lib/x86_64-linux-gnu/libffi.so.8(+0x7b16) [0x796dfe7efb16]
/lib/x86_64-linux-gnu/libffi.so.8(+0x43ef) [0x796dfe7ec3ef]
/lib/x86_64-linux-gnu/libffi.so.8(ffi_call+0x12e) [0x796dfe7ef0be]
/usr/lib/gosigndesktop/resources/app/node_modules/ffi-napi/build/Release/ffi_bindings.node(_ZN3FFI3FFI12AsyncFFICallEP9uv_work_s+0x23) [0x796dfcaef533]
/usr/lib/gosigndesktop/GoSignDesktop(+0x18f14d4) [0x59e78df734d4]
PID 282062: SSL_CTX_set_verify called with mode=0
./log_ssl_verify.so(+0x1272) [0x796e00465272]
./log_ssl_verify.so(SSL_CTX_set_verify+0x9b) [0x796e004653e2]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x734f4) [0x796dfcabb4f4]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x7419f) [0x796dfcabc19f]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x74b09) [0x796dfcabcb09]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x1a8ef) [0x796dfca628ef]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x14ca5) [0x796dfca5cca5]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x189bf) [0x796dfca609bf]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(+0x483e9) [0x796dfca903e9]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(curl_multi_perform+0xea) [0x796dfca9195a]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/lib/libcurl.so.4(curl_easy_perform+0x14b) [0x796dfca6c7eb]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs14NetworkRequest7executeEv+0x54e) [0x796df3d8dc9e]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(_ZN3dgs14NetworkManager15checkConnectionEv+0xd2) [0x796df3d8ec92]
/usr/lib/gosigndesktop/resources/app/node_modules/@ice/dike-core-js/node_modules/@ice/dike-core-linux/native/libdgsapi.so(dgs_check_connection+0x2b) [0x796df3c27e2b]
/lib/x86_64-linux-gnu/libffi.so.8(+0x7b16) [0x796dfe7efb16]
/lib/x86_64-linux-gnu/libffi.so.8(+0x43ef) [0x796dfe7ec3ef]
/lib/x86_64-linux-gnu/libffi.so.8(ffi_call+0x12e) [0x796dfe7ef0be]
/usr/lib/gosigndesktop/resources/app/node_modules/ffi-napi/build/Release/ffi_bindings.node(_ZN3FFI3FFI12AsyncFFICallEP9uv_work_s+0x23) [0x796dfcaef533]
/usr/lib/gosigndesktop/GoSignDesktop(+0x18f14d4) [0x59e78df734d4]
L'analisi statica del binario /usr/lib/gosigndesktop/GoSignDesktop ha restituito una serie di stringhe che suggeriscono l'esistenza di flag e parametri atti a disabilitare controlli TLS o a registrare informazioni crittografiche.
Queste occorrenze indicano che il codice include meccanismi (o supporta parametri) che, se attivati, possono alterare il comportamento di verifica dei certificati o abilitare logging sensibile delle chiavi TLS.
$ strings -n 1 /usr/lib/gosigndesktop/GoSignDesktop | grep -i -E 'ignore-certificate-errors|certificate-error|ignore-urlfetcher-cert-requests|ssl-key-log-file' > binary_relevant_strings.txt'
$ cat binary_relevant_strings.txt
certificate-error
ssl-key-log-file argument missing
ignore-urlfetcher-cert-requests
ignore-certificate-errors-spki-list
ssl-key-log-file
ignore-certificate-errors
[..]
Per verificare se questi parametri fossero passati al processo in esecuzione, è stata controllata la linea di comando di tutti i processi GoSignDesktop leggendo i rispettivi /proc/<pid>/cmdline.
L'avvio del binario sui sistemi analizzati mostra che i processi figlio utilizzano vari --type (zygote, gpu-process, renderer, ecc.) e opzioni interne tipiche di runtime basati su Chromium/Electron, ma non risultano presenti i flag che disabiliterebbero esplicitamente la verifica TLS.
$ for p in $( pgrep -f GoSignDesktop ); do echo "=== PID $p ===" >> proc_cmdlines.txt; cat /proc/$p/cmdline 2>/dev/null | tr '\0' ' ' >> proc_cmdlines.txt || echo "no /proc/$p/cmdline" >> proc_cmdlines.txt; echo >> proc_cmdlines.txt; done
$ cat proc_cmdlines.txt
=== PID 282062 ===
/usr/lib/gosigndesktop/GoSignDesktop
=== PID 282065 ===
/usr/lib/gosigndesktop/GoSignDesktop --type=zygote --no-zygote-sandbox
=== PID 282066 ===
/usr/lib/gosigndesktop/chrome-sandbox /usr/lib/gosigndesktop/GoSignDesktop --type=zygote
=== PID 282067 ===
/usr/lib/gosigndesktop/GoSignDesktop --type=zygote
=== PID 282069 ===
/usr/lib/gosigndesktop/GoSignDesktop --type=zygote
=== PID 282106 ===
/usr/lib/gosigndesktop/GoSignDesktop --type=gpu-process --field-trial-handle=13821780690570354888,7554827926380561664,131072 --enable-features=WebComponentsV0Enabled --disable-features=CookiesWithoutSameSiteMustBeSecure,SameSiteByDefaultCookies,SpareRendererForSitePerProcess --gpu-preferences=OAAAAAAAAAAgAAAQAAAAAAAAAAAAAAAAAABgAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA== --shared-files
=== PID 282114 ===
/usr/lib/gosigndesktop/GoSignDesktop --type=utility --utility-sub-type=network.mojom.NetworkService --field-trial-handle=13821780690570354888,7554827926380561664,131072 --enable-features=WebComponentsV0Enabled --disable-features=CookiesWithoutSameSiteMustBeSecure,SameSiteByDefaultCookies,SpareRendererForSitePerProcess --lang=en-US --service-sandbox-type=network --standard-schemes=file --secure-schemes=file --bypasscsp-schemes --cors-schemes --fetch-schemes --service-worker-schemes --streaming-schemes --shared-files=v8_context_snapshot_data:100
=== PID 282279 ===
/usr/lib/gosigndesktop/GoSignDesktop --type=renderer --field-trial-handle=13821780690570354888,7554827926380561664,131072 --enable-features=WebComponentsV0Enabled --disable-features=CookiesWithoutSameSiteMustBeSecure,SameSiteByDefaultCookies,SpareRendererForSitePerProcess --lang=en-US --standard-schemes=file --secure-schemes=file --bypasscsp-schemes --cors-schemes --fetch-schemes --service-worker-schemes --streaming-schemes --app-path=/usr/lib/gosigndesktop/resources/app --node-integration-in-worker --no-sandbox --no-zygote --preload=/usr/lib/gosigndesktop/resources/app/preload.js --context-isolation --background-color=#fff --enable-spellcheck --enable-websql --disable-electron-site-instance-overrides --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=4 --no-v8-untrusted-code-mitigations --shared-files=v8_context_snapshot_data:100
Traffico HTTP che dimostra la mancata firma del manifest degli aggiornamenti:
GET /gosign/download/update HTTP/1.1
Host: rinnovofirma.infocert.it
Cookie:
Accept: application/json
Cache-Control: no-cache
Connection: keep-alive
HTTP/1.1 200 OK
Date: Fri, 03 Oct 2025 21:44:39 GMT
Server: Apache
Content-Security-Policy: upgrade-insecure-requests; frame-ancestors none; object-src none
X-Frame-Options: SAMEORIGIN
Last-Modified: Thu, 04 Sep 2025 10:16:23 GMT
ETag: "453-63df703669aaa"
Accept-Ranges: bytes
Content-Length: 1107
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: application/json
{
"control":{
"probability": 100
},
"darwin": {
"2.3.7": {
"packages": {
"dmg": {
"any": {
"url": "https://gosignupdates.infocert.it/gosign/standard/GoSignDesktop-standard-2.3.7-8aa7cbe.dmg",
"sha256": "05ae06770253f2dadc9cce36b44d1198781eb874bb19fd10a10d8311749e4b84",
"size": 163804666 ,
"releaseDate": "2025-05-26"
}
}
},
"type": "MANDATORY"
}
},
"linux": {
"2.4.0": {
"packages": {
"deb": {
"64": {
"url": "https://gosignupdates.infocert.it/gosign/standard/gosigndesktop_2.4.0_amd64.deb",
"sha256": "02b7bc38365f3e456c4f41ef7ccd4bfa2134e54868345aad323823aabe740576",
"size": 102522536,
"releaseDate": "2025-04-04"
}
}
},
"type": "MANDATORY"
}
}
}
Proof of Concept
Il Proof of Concept fornito ha come target un'installazione di GoSign Desktop su Linux Debian/Ubuntu con architettura amd64 e simula un privilege escalation a root da parate di un attaccante locale.
Dopo l'exploit dovrai reinstallare GoSign Desktop riscaricandolo dal sito ufficiale poichè questo viene sostituito dall'aggiornamento fasullo. La configurazione di GoSign Desktop viene preservata.
Build
Compila il finto pacchetto di aggiornamento .deb, crea il virtual environment python con le dipendenze necessarie all'exploit.
make
Run
Configura l'exploit come proxy di GoSign Desktop per simulare l'attacco.
make run
PoC Evidence
Dopo aver installato il finto pacchetto di aggiornamento .deb puoi verificare l'impatto controllando il file /tmp/gosigndesktop_mitm_poc.log.
cat /tmp/gosigndesktop_mitm_poc.log
Pulizia
Puoi rimuovere la configurazione del proxy, il file .deb e il virtual environment.
make clean
Timeline
- 2025-10-03: Discovery
- 2025-10-04: Proof of Concept
- 2025-10-04: Tentativo di contatto a Infocert S.p.A.
- 2025-10-04: Contestuale notifica a ACN/CSIRT Italia
- 2025-10-04: Risposta da parte di ACN/CSIRT Italia che rimane in attesa di eventuali seguiti
- 2025-10-07: Risposta da Infocert Cyber Security Operation
- 2025-10-07: Condivisione delle informazioni e evidenze tecniche con il vendor
- 2025-10-09: Infocert ringrazia per la segnalazione e comunica di approfondire il problema
- 2025-10-16: Call con Infocert per confronto tecnico. Infocert conferma la vulnerabilità, oltre 1 milione di utenti affetti. In questa fase condivido con loro tutti gli aspetti tecnici sia sulla vulnerabilità che sulla remediation.
- 2025-10-26: Richiesta di un aggiornamento al vendor, nessuna risposta
- 2025-11-04: Rilascio della versione 2.4.1, nessuna comunicazione da parte del vendor
- 2025-11-08: Richiesta spiegazioni e aggiornamenti al vendor, nessuna risposta
- 2025-11-14: Segnalazione ad ACN/CSIRT Italia del comportamento scorretto del vendor
- 2025-11-14: Pubblicazione advisor
Credits
Pasquale "Sid" Fiorillo is credited with the discovery of this vulnerability, with the contribution of Francesco "ascii" Ongaro and Marco Lunardi.
Pasquale "Sid" Fiorillo
Website: https://www.ush.it/
Email: sid AT ush DOT it
Francesco "ascii" Ongaro
Website: https://www.ush.it/
Email: ascii AT ush DOT it
Legal Notices
Copyright (c) 2025 Pasquale "Sid" Fiorillo
Permission is granted for the redistribution of this alert electronically. It may not be edited in any way without express written consent. If you wish to reprint the whole or any part of this alert in any other medium than electronically, please email for permission.
Disclaimer: The information in the advisory is believed to be accurate at the time of publishing based on currently available information. Use of the information constitutes acceptance for use in an AS IS condition. There are no warranties with regard to this information. Neither the author nor the publisher accepts any liability for any direct, indirect, or consequential loss or damage arising from use of, or reliance on, this information.