Comprendere le migliori pratiche relative alla firma del codice
La firma del codice garantisce agli utenti, ai sistemi operativi e agli strumenti di sicurezza che un’applicazione provenga effettivamente dall’editore dichiarato e non sia stata alterata dopo il rilascio. Senza di essa, il software può essere segnalato come non sicuro, bloccato durante l’installazione o sfruttato da malintenzionati.
La firma del codice viene utilizzata per autenticare l’identità dello sviluppatore di un programma e la sua provenienza, confermando al contempo che il software non è stato alterato dopo la firma.
Firmando un programma, un’applicazione, un file eseguibile o uno script, uno sviluppatore allega un certificato digitale che conferma la propria identità e l’integrità del software. I certificati di firma del codice utilizzano la crittografia a chiave pubblica, la stessa tecnologia impiegata con altri tipi di certificati digitali. Questo approccio è supportato su tutti i sistemi operativi e le piattaforme, dagli ambienti mobili a quelli desktop fino ai sistemi embedded. La firma del codice è ampiamente utilizzata in Windows da Microsoft, in Mac OS X da Apple, nelle distribuzioni Linux, nonché su iOS e Android.
Poiché le minacce informatiche prendono sempre più di mira le lacune nell’affidabilità del software, la firma del codice è diventata una difesa in prima linea contro la manomissione, la distribuzione di malware e gli attacchi alla catena di fornitura.
L’adozione di solide pratiche di firma del codice è quindi fondamentale per gli editori di software e le organizzazioni di sviluppo che intendono proteggere gli utenti, mantenere l’affidabilità della piattaforma e garantire che il software possa essere distribuito in modo sicuro e affidabile. Le seguenti best practice aiutano ad affrontare i rischi più comuni associati alla sicurezza della firma del codice:
- Proteggi il tuo codice con certificati di firma del codice: la raccomandazione più importante di tutte è quella di utilizzare certificati di firma del codice ogni volta che è possibile. Questi certificati verificano la provenienza e l’autenticità del codice per gli utenti finali e aumentano la fiducia dei clienti nella loro sicurezza personale. Firmando correttamente il tuo codice, puoi conferire alla tua applicazione o al tuo programma un livello di affidabilità gestito da un’autorità di certificazione pubblica attendibile come Sectigo. Per una maggiore sicurezza, è possibile utilizzare un certificato di firma del codice con Extended Validation (EV), che offre una verifica dell’identità più rigorosa rispetto alla firma del codice standard.
- Riducete al minimo l’accesso alle chiavi private: qualsiasi buon esperto IT adotterà misure di controllo degli accessi ogni volta che sia possibile; ciò include la limitazione dell’accesso alle chiavi private e ai certificati radice di base. Dovreste consentire l’accesso alle chiavi private della vostra organizzazione solo a un numero ristretto di persone, e tali persone dovrebbero avere un motivo specifico per cui necessitano di tale accesso. L’adozione di una politica di accesso basata sui ruoli (RBAC) all’interno della vostra organizzazione contribuirà a limitare possibili esposizioni.
- Proteggere le chiavi private con hardware crittografico: l’utilizzo di hardware crittografico consente di proteggere le chiavi private con gli algoritmi di crittografia più aggiornati. Questo tipo di hardware dovrebbe essere almeno un prodotto certificato FIPS 140 Livello 2. Prodotti come i moduli di sicurezza hardware (HSM) proteggeranno le vostre chiavi private impedendo che cadano nelle mani di soggetti malintenzionati.
- Codice con marcatura temporale: l’applicazione della marcatura temporale al codice garantisce che il software rimanga affidabile anche dopo la scadenza del certificato di firma, poiché dimostra che il codice è stato firmato mentre il certificato era valido.
- Differenze tra firma di test e firma di rilascio: come descritto sopra, è importante distinguere e comprendere la differenza tra chiavi/certificati di firma di test e di firma di rilascio. I certificati e le chiavi di firma di prova richiedono un livello di sicurezza inferiore e possono essere autofirmati da una CA interna privata. Devono inoltre essere concatenati a un certificato radice diverso da quello del prodotto firmato e rilasciato. Tra le migliori pratiche rientra la configurazione di un’infrastruttura di firma del codice completamente diversa per la firma di rilascio e quella di pre-rilascio. Ciò vi consentirà di impostare controlli di accesso adeguati per il vostro ambiente di test e il codice di produzione.
- Autenticazione del codice: la firma del codice non identifica specificatamente il codice come sicuro; indica semplicemente chi lo ha scritto. Pertanto, il codice deve comunque essere completamente autenticato prima di poter essere rilasciato al pubblico. In questo modo potrete assicurarvi di non diffondere accidentalmente codice errato o dannoso che potrebbe danneggiare i clienti e compromettere la vostra reputazione. Tutte le attività di autenticazione relative alla firma del codice dovrebbero essere registrate per riferimento futuro, nel caso in cui fosse necessaria un’indagine o una risposta a un incidente.
- Eseguire una scansione del codice alla ricerca di malware o virus prima della firma: oltre a verificare che non siano state apportate modifiche al codice, è importante eseguire una scansione alla ricerca di virus o altro codice dannoso. Il codice dannoso può spesso essere inserito inavvertitamente dagli sviluppatori che riutilizzano o introducono codice esistente proveniente da progetti esterni. È molto più facile individuare e correggere gli errori prima che il codice venga rilasciato.
- Limitare l’uso ripetuto delle chiavi: riutilizzare le chiavi private per firmare il codice più volte comporta un rischio maggiore. Se una chiave viene compromessa, tutto il codice firmato con quella chiave in quella data risulterà non valido e dovrà essere aggiornato con un nuovo certificato di firma del codice. Prendere l’abitudine di alternare chiavi e certificati diversi consentirà di distribuire il rischio e ridurrà lo sforzo e l’impatto legati alla riemissione dei certificati.
- Revoca i certificati compromessi: la revoca è una delle attività più importanti per garantire la sicurezza del codice. L’organizzazione di sviluppo è responsabile di segnalare qualsiasi codice, chiave o certificato compromesso alla propria autorità di certificazione (CA), affinché questa possa intraprendere le azioni appropriate. In caso di eventuali problemi, la CA richiederà la revoca del certificato di firma del codice. Se si applica un timestamp al codice, saranno interessati solo i codici la cui data di revoca è successiva all’incidente.
- Monitorare e verificare l’attività di firma: in assenza di visibilità, un uso improprio potrebbe passare inosservato fino a quando non si verificano danni. È necessario mantenere registri dettagliati degli eventi di firma del codice, degli accessi, delle approvazioni e dei timestamp. Revisioni periodiche aiutano a individuare anomalie e supportano le indagini.
- Mantenere politiche e formazione aggiornate: pratiche incoerenti tra i team indeboliscono la sicurezza. È necessario utilizzare politiche formali per definire la gestione delle chiavi, i flussi di lavoro, le approvazioni, gli standard di automazione e la gestione degli incidenti. Una formazione continua garantisce che i team rimangano allineati man mano che le minacce si evolvono.
Come si implementa la firma del codice?
Per implementare la firma del codice è necessaria una coppia di chiavi crittografiche univoca. Questa è costituita da una chiave privata, che viene mantenuta segreta, e da una chiave pubblica, che può essere condivisa. Insieme, costituiscono il fondamento della crittografia a chiave pubblica e consentono di firmare il software senza esporre la chiave privata.
Dopo aver generato la nuova coppia di chiavi utilizzando l’infrastruttura a chiave pubblica (PKI), la chiave pubblica viene inviata a un’autorità di certificazione (CA) come parte di una richiesta di firma del certificato (CSR). La CA verifica l’identità dello sviluppatore o dell’organizzazione ed emette il certificato di firma del codice.
Ora che lo sviluppatore è in possesso del certificato, deve eseguire l’hash del codice del software. L’hash è una procedura in cui si utilizza una funzione hash per convertire il codice in un valore fisso arbitrario. Il risultato dell’hash, chiamato digest, viene quindi crittografato utilizzando la chiave privata. Successivamente, lo sviluppatore combina questo digest con il certificato di firma del codice e la funzione hash per creare un elemento denominato "blocco di firma", che consiste essenzialmente nella combinazione di tutti gli elementi sopra citati in un frammento di codice che può essere facilmente inserito nel software.
Importanza della protezione
Il problema principale della firma del codice è la protezione della chiave privata di firma associata al certificato. Se una chiave viene compromessa, il certificato perde affidabilità e valore, mettendo a rischio il software che avete firmato.
Molte organizzazioni si proteggono utilizzando depositi sicuri e moduli di sicurezza hardware (HSM) per aumentare il livello di sicurezza delle proprie chiavi private. Altre utilizzano piattaforme di gestione dei certificati progettate per automatizzare e proteggere la gestione del ciclo di vita di tutti i certificati di firma del codice. Un esempio è il Sectigo Certificate Manager. L’uso di un gestore di certificati contribuisce in modo significativo a promuovere l’integrità delle chiavi private e di altre risorse di crittografia.
Cosa impedisce la firma del codice?
In poche parole, la firma del codice aiuta a impedire che malware e altro codice dannoso vengano introdotti nel sistema di un utente finale sotto le spoglie di un file innocuo o di un evento come un aggiornamento di Windows. Ciò è possibile consentendo agli utenti di verificare che il file scaricato provenga effettivamente dal mittente e non da un malintenzionato. Ciò rafforza il concetto di fiducia all’interno del sistema, consentendo agli sviluppatori di garantire agli utenti finali che scaricano il software che la fonte è affidabile e sicura.
I certificati di firma del codice EV offrono ulteriori garanzie di sicurezza. Richiedono che la chiave sia archiviata in un dispositivo hardware ad alta sicurezza, conforme allo standard FIPS 140-2 o superiore. Esistono token USB che soddisfano questo requisito e aggiungono un ulteriore livello di protezione tramite un PIN. In alternativa, è possibile archiviare le chiavi nell’HSM on-premise della propria organizzazione.
Una ricerca condotta dal Cyber Forensics Innovation Lab del Georgia Tech dimostra che l’emissione e l’uso di certificati SSL/TLS a validazione estesa (EV) garantiscono una probabilità del 99,99% di essere al riparo da attacchi di phishing e abusi. Il white paper, sponsorizzato da Sectigo, può essere scaricato qui.
Proteggete il vostro software con le soluzioni affidabili di firma del codice di Sectigo
Seguire queste best practice per la firma del codice riduce notevolmente il rischio di distribuzione non autorizzata del software, di avvisi di sicurezza durante l’installazione e di perdita di fiducia da parte degli utenti. Può inoltre portare a tassi di installazione più elevati e a un’adozione più agevole del vostro software.
I certificati emessi da autorità di fiducia sono ampiamente riconosciuti dai sistemi operativi e dalle piattaforme di sicurezza. Sectigo è un’autorità di certificazione leader che offre soluzioni di firma del codice veloci e flessibili. I nostri certificati di firma del codice aiutano gli editori a instaurare un rapporto di fiducia, a proteggere gli utenti da codice manomesso e a distribuire il software più rapidamente. Scopri i diversi tipi di certificati di firma del codice offerti da Sectigo oppure contatta il nostro team di esperti per ulteriori informazioni.