Salt, keys e cookies per WordPress

Rendere il vostro sito più sicuro aggiungendoci un po' di sale!

Come abbiamo visto nell’articolo precedente Quanto è sicuro l’algoritmo delle password di WordPress?, il framework per le password di WordPress, utilizza l’algoritmo MD5 insieme ad una sequenza casuale lunga 64 caratteri.

Questa sequenza viene chiamata “sale” (salt in inglese) ed è una tecnica utilizzata per rafforzare l’integrità delle password WordPress visto che il solo hash con l’algoritmo MD5 non basta a garantire l’inviolabilità delle password di WordPress.

Salt & Keys

Nel file di configurazione wp-config.php c’è una sezione chiamata “Authentication Unique Keys and Salts” dove vengono salvate sia le “salts” che le “keys“.

A. Gruppo delle “Keys” (4 stringhe)

Le “keys” vengono generate automaticamente durante l’installazione di WordPress e vengono salvate sia nel database che nel file wp-config.php.
Le prime 3 vengono usate per la generazione di cookie (per una spiegazione sui cookie vedi la sezione successiva) e l’ultima per la generazione di nonce (per approfondimenti vedi WordPress Nonces su WordPress.org).

a) AUTH_KEY
Chiave utilizzata per generare un cookie di autorizzazione per fornire all’utente che si collega tramite un canale non protetto (protocollo http) l’accesso al pannello di amministrazione (dashboard), quindi poter apportare modifiche al sito.

b) SECURE_AUTH_KEY
Stessa tipologia della chiave precedente, ma questa volta per collegamenti tramite canale protetto da certificato SSL (protocollo https).

c) LOGGED_IN_KEY
Chiave utilizzata per generare un cookie per un utente che accede al sistema. Questo tipo di cookie non permette di apportare modifiche al sistema.

d) NONCE_KEY
Chiave utilizzata per generare un token nonce (“number used once“). La chiave stessa viene generata dalla concatenazione dell’ID utente + il parametro $action + data/ora attuale (timestamp).
Il token nonce viene usato per identificare in modo univoco le richieste indirizzate al sito. In questo modo quando il sito riceve una richiesta remota, viene verificato se è presente un token nonce o meno. Se non è presente la richiesta viene rifiutata, se invece è presente il valore del token nonce viene confrontato con quello salvato nel sistema, se il token nonce corrisponde allora la richiesta viene accolta altrimenti rifiutata tramite errore 403 (Forbidden).
Esempio (eliminazione di un commento di un post):

https://www.esempio.it/wp-admin/comment.php?c=16570&action=deletecomment&_wpnonce=389c3b47b9

B. Gruppo delle “Salts” (4 stringhe)

Le “salts” vengono generate partendo dalle “keys” create al momento dell’installazione di WordPress e vengono salvate nel file wp-config.php
Durante le operazioni di hashing, le “salts” vengono concatenate alle “keys” per rafforzare gli hash creati durante le varie operazioni di autenticazioni ed autorizzazioni eseguite dal sistema.

a) AUTH_SALT
Stringa aggiunta alla corrispondente chiave AUTH_KEY per generare un hash per la creazione del cookie di autorizzazione.

b) SECURE_AUTH_SALT
Stringa aggiunta alla corrispondente chiave SECURE_AUTH_KEY per generare un hash per la creazione del cookie di autorizzazione.

c) LOGGED_IN_SALT
Stringa aggiunta alla corrispondente chiave LOGGED_IN_KEY per generare un hash per la creazione del cookie di accesso al sistema.

d) NONCE_SALT
Stringa aggiunta alla corrispondente chiave NONCE_KEY per generare un hash per la creazione del token di protezione.

Cookies

A differenza di altri sistemi basati sul linguaggio PHP, che usano le sessioni PHP  per gestire l’autenticazione degli utenti, WordPress gestisce l’autenticazione tramite un sistema basato sui cookie.

I cookie creati da WordPress sono 4:

1) wordpress_[hash]

Al momento del login viene creato un primo cookie dove vengono memorizzati le specifiche di autenticazione dell’utente. Questo cookie viene utilizzato per accedere al pannello di amministrazione (dashboard) per connessioni tramite canale non protetto (http).

2) wordpress_sec_[hash]

Le stesse funzionalità del cookie di cui sopra, per le connessioni tramite canale protetto da certificato SSL (https).

3) wordpress_logged_in_[hash]

Dopo il login viene creato un secondo cookie con le specifiche dell’identità dell’utente e l’orario di login.

4) wp-settings-{time}-[UID]

Cookie utilizzato per la personalizzazione dell’interfaccia del pannello di amministrazione (dashboard).

Struttura cookie

Esempio struttura cookie di autenticazione (AUTH_COOKIE)

a) Cookie ID
Il cookie ID viene generato dalla concatenazione della stringa “wordpress_” + hash generato dal hashing MD5 dell’url del sito
(vedi codice file sorgente WordPress ver. 5.2.3)

b) Username
E il nome utente registrato nel sistema

c) Expiration
Corrisponde alla data e ora di scadenza del cookie (durata di default 48 ore), in formato Unix timestamp – Wikipedia)

d) Hash
Si tratta di un hash di tipo HMAC (hash-based message authentication code – Wikipedia).
In un primo passaggio l’hash viene generato da un valore MD5 del nome utente abbinato alla data di scadenza del cookie.
Successivamente viene generato un secondo hash col nome utente, la data di scadenza e 4 caratteri del hash della password dell’utente.
Infine in un terzo passaggio, vengono concatenate le stringhe AUTH_KEY e AUTH_SALT, che vengono poi passate alla funzione wp_hash, per generare il hash definitivo.
(vedi codice file sorgente WordPress ver. 5.2.3)

Quali sono i rischi?

Il rischio più evidente è quello che un utente malintenzionato possa entrare in possesso dei vostri cookie di accesso al vostro pannello di controllo di WordPress.
Attacchi di questo genere vengono eseguiti ridirezionando le richieste fatte tramite browser da un utente remoto, verso un sito malevolo, creato appositamente per impossessarsi dei cookie presenti nel computer dell’utente.

Un altro rischio altrettanto evidente, è la possibilità che un utente malintenzionato possa entrare in possesso delle “salt & keys” del vostro file wp-config.php.
Partendo dalle “salt & keys“, è possibile creare di sana pianta e in breve tempo, un cookie col quale avere accesso liberamente al pannello di amministrazione con diritti di amministratore! (chiamato in gergo “cookie forging” ovvero contraffazione cookie).

Come proteggersi?

1) Certificato SSL

Il primo livello di protezione è il certificato SSL, che grazie alla cifratura dei dati scambiati tra server web e browser del visitatore, rafforza la sicurezza del sistema impedendo ad eventuali utenti malintenzionati di intercettare il flusso di dati e leggerne i contenuti.

2) Abilitare il header di sicurezza HSTS

Installare un certificato SSL nel proprio sito è di poco aiuto, se non viene abilitato il header di sicurezza HSTS (HTTP Strict Transport Security) che obbliga i visitatori del sito ad utilizzare esclusivamente il protocollo cifrato HTTPS per comunicare col server web.
Per istruzioni su come implementarlo nel proprio sito consultare il mio articolo sui header HTTP di sicurezza

3) File di configurazione wp-config.php

a) impostare permessi 644

b) Bloccare l’accesso al file tramite direttive nel file htaccess

c) Impostare login e accesso pannello di amministrazione (dashboard) esclusivamente tramite canale cifrato SSL

Inserire le seguenti direttive nel file wp-config.php:

define( ‘FORCE_SSL_LOGIN’, true );
define( ‘FORCE_SSL_ADMIN’, true );

d) Cambiare regolarmente le “salts & keys

Per cambiare le “salts & keys“, lo si può fare manualmente usando l’app ufficiale fornita da WordPress all’indirizzo https://api.wordpress.org/secret-key/1.1/salt/ e copiando/incollando le nuove stringhe, oppure comodamente tramite un plugin che fa tutto il lavoro in automatico!

Plugin Salt Shaker

Questo plugin una volta installato permette di programmare la sostituzione delle “salts & keys” in modo automatico.

Share on facebook
Share on twitter
Share on linkedin
Share on email
Roberto Jobet

Roberto Jobet

Sono un esperto di sicurezza informatica specializzato nella sicurezza di siti WordPress. Offro servizi professionali per garantire la riservatezza, l'integrità e la disponibilità di siti WordPress.

Tutti i post

Altri post che potrebbero interessarti!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *