Vai al contenuto

Alpine Linux, falla in openssh-server: login senza password

Logo di Alpine Linux
Logo: Alpine Linux (sito ufficiale)

Chi gestisce server, VM o immagini cloud Alpine Linux con sshd deve aggiornare openssh e riavviare il demone. Se non può aggiornare subito, deve almeno disattivare le password in SSH. Lo indica l’avviso di sicurezza di Alpine Linux del 5 novembre 2026: chi raggiunge la porta SSH può entrare senza conoscere alcuna password, con una sola connessione.

Alpine Linux, falla in openssh: Login senza password su sshd senza PAM: aggiornare e riavviare
Grafica: opengeek

L’aggiornamento del pacchetto da solo non basta, perché non sostituisce il demone già in esecuzione. Entrambe le strade chiudono il problema.

Chi è esposto e cosa controllare

Secondo Alpine Linux, si è esposti se si verificano tutte queste condizioni:

  • si usa il pacchetto openssh-server, compilato senza PAM, oppure openssh-server-pam con UsePAM no; con UsePAM yes non si è interessati;
  • PasswordAuthentication è su yes, che è il valore predefinito di OpenSSH salvo modifiche;
  • esiste un account con campo password *: root (nell’immagine base come root:* da circa Alpine 3.16), gli utenti solo-chiave creati con adduser senza password o con usermod -p '*', gli utenti da directory service via musl-nscd (nslcd, winbind, sssd) e l’utente alpine delle immagini tiny-cloud;
  • almeno un account locale ha un hash $5$ o $6$.

Non sono interessati i container Docker e simili che non eseguono sshd, i sistemi con PasswordAuthentication no, gli account bloccati con ! nel campo password di /etc/shadow, i sistemi senza hash in stile $ e le immagini cloud configurate con cloud-init, che scrive PasswordAuthentication no.

Sono toccate tutte le release verificate: dalla 3.21 alla 3.24, edge e le più vecchie senza aggiornamenti regolari, dalla 3.16 alla 3.20.

Cosa permette a chi attacca

L’attaccante deve conoscere il nome di un account con campo password *, cioè senza password impostata, una situazione normale per gli account solo-chiave. La macchina deve poi avere almeno un altro account con hash $5$ o $6$. A quel punto basta inviare una password molto lunga, tra 257 e 1024 byte.

Un solo utente con password rende raggiungibili tutti gli account che ne sono privi. Per root vale il PermitRootLogin prohibit-password predefinito: l’accesso diretto è possibile solo con PermitRootLogin yes. Non protegge però se un altro account che può entrare è in grado di diventare root, per esempio con doas.

Al momento della pubblicazione dell’avviso non risultava assegnato nessun CVE. I dettagli sono nelle note di rilascio di OpenSSH 10.6p2.

Versioni corrette per ramo

Le versioni 3.21.10, 3.22.8, 3.23.8 e 3.24.4 contengono il pacchetto corretto. Per aggiornare, da root:

  1. apk upgrade -U -a
  2. rc-service sshd restart

Il supporto della 3.21 è terminato il 1° novembre 2026, ma Alpine ha pubblicato pacchetti corretti per ogni release fino alla 3.16.

Ramo Versione openssh corretta
edge 10.6_p2-r0
3.24 10.3_p1-r2
3.23 10.2_p1-r1
3.22 10.0_p1-r11
3.21 9.9_p2-r1
3.20 9.7_p1-r6
3.19 9.6_p1-r3
3.18 9.3_p2-r4
3.17 9.1_p1-r7
3.16 9.0_p1-r6

Se non puoi aggiornare: disattivare le password

Prima verifica che il login con chiave funzioni e tieni aperta la sessione corrente finché non hai provato un nuovo accesso. Poi, sempre da root, imposta PasswordAuthentication no in un file /etc/ssh/sshd_config.d/00-no-passwords.conf. Alpine precisa che il sshd_config predefinito legge quella directory dalla 3.19 in poi: le release precedenti la ignorano.

Su tutte le release, comprese la 3.19 e successive, l’avviso prescrive anche un comando sed: sed -i.bak -e '1i PasswordAuthentication no' -e 's/^\(\s*PasswordAuthentication[^y#]*\)yes/\1no/i' /etc/ssh/sshd_config. Porta a no ogni riga PasswordAuthentication di /etc/ssh/sshd_config, anche dentro i blocchi Match, inserisce la riga in testa per il caso in cui non ce ne fosse nessuna e salva l’originale come /etc/ssh/sshd_config.bak. Poi si controlla e si riavvia:

  • sshd -t && rc-service sshd restart
  • sshd -T | grep -i passwordauthentication, che deve stampare passwordauthentication no

Per annullare, si cancella il file di drop-in e si ripristina sshd_config.bak.

Immagini cloud tiny-cloud

Le immagini ufficiali tiny-cloud (qcow2, VHD e AMI) dalla 3.18.11 alla 3.24.3 hanno un utente alpine con campo password * e doas senza password. Alla prima accensione sono sicure. Diventano sfruttabili quando sulla macchina compare un hash $6$, per esempio perché un amministratore imposta una password di console o perché user-data aggiunge un utente con hashed_passwd. L’attaccante ottiene una shell come alpine e con doas diventa root.

Le immagini costruite dalle versioni 3.21.10, 3.22.8, 3.23.8, 3.24.4 e successive includono il pacchetto corretto. Quelle di point release precedenti no: su ogni istanza in esecuzione bisogna aggiornare openssh o disattivare l’autenticazione con password.

Come verificare se c’è stato un accesso

Cerca in /var/log/messages le righe di sshd con Accepted password for riferite a un account senza password: alpine, root o un utente solo-chiave. Controlla poi l’uso di doas e gli utenti, i file e le authorized_keys creati di recente sulle macchine esposte. Se non puoi escludere un accesso, Alpine Linux indica di trattare la macchina come compromessa.

Perché succede e chi l’ha segnalato

Senza PAM, sshd verifica la password con crypt() e confronta il risultato con il campo memorizzato. Se il campo è troppo corto per contenere un salt, sshd usa quello di un altro account. La crypt() di musl restituisce la stringa * come segnale d’errore quando la chiave supera i 256 byte, e * è proprio il contenuto del campo degli account senza password: i due valori coincidono e l’accesso riesce.

OpenSSH 10.6p2 evita il problema in sshd, mentre i pacchetti dei rami stabili portano una patch per lo stesso difetto. Il problema è stato segnalato da Özgün Kültekin di Wakefield.

Leggi anche