OpenSSH CVE-2026-123158 \"sshole\": bypass di autenticazione su Alpine già sfruttato
CVE-2026-123158 (\"sshole\") consente l'accesso senza password agli account bloccati su Alpine/musl. Già sfruttata; corretta in OpenSSH 10.6p2.
Pubblicato da Zero Hunt, un red team AI autonomo su un'appliance on-premise con AI privata: penetration test automatizzato per reti e infrastrutture, in black box o gray box, con una persona che approva ogni passo che conta.
Un attaccante remoto che raggiunge la porta SSH di una macchina Alpine Linux — o di qualsiasi sistema Linux basato su musl libc e compilato senza PAM — può autenticarsi su account che dovrebbero rifiutare ogni password, inviando una password che nessuno ha mai impostato. La falla, CVE-2026-123158, soprannominata "sshole" da chi l'ha scoperta, è stata corretta in OpenSSH 10.6p2 il 5 novembre. La società di threat intelligence Previdian riferisce che il primo tentativo di sfruttamento ha raggiunto i suoi sensori meno di nove ore dopo la pubblicazione del CVE, e che uno di quei tentativi è arrivato a root su un honeypot che gira una vera Alpine. È il raro bypass di autenticazione tanto banale quanto già in uso.
Notizia in evoluzione — pubblicata alle 13:54 (12:54 UTC) del 2026-11-06. Aggiornata man mano che vendor e CISA pubblicano.
In breve
| CVE | CVE-2026-123158 |
| Prodotto / versioni colpite | OpenSSH precedente a 10.6p2 su Linux con musl libc e PAM disabilitato — es. il pacchetto openssh-server di Alpine; Alpine da 3.16 a 3.24 ed edge |
| Corretta in | OpenSSH 10.6p2 (2026-11-05); Alpine edge 10.6_p2-r0 con back-port per ramo (3.24 10.3_p1-r2 · 3.23 10.2_p1-r1 · 3.22 10.0_p1-r11 · 3.21 9.9_p2-r1; patch anche su 3.16–3.20) |
| CVSS | 8.1 High · CVSS 3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H · assegnato da MITRE (stato NVD: Received) |
| Sfruttata attivamente | Sì · Previdian riferisce un accesso root riuscito su un honeypot Alpine; primo tentativo < 9h dopo la divulgazione (via Help Net Security) |
| CISA KEV | Non presente (versione catalogo 2026.11.04) |
| PoC pubblico | Sì · PoC non verificati pubblicati su GitHub; Previdian avverte che potrebbero contenere malware (al 2026-11-06) |
| Advisory ufficiale | Note di rilascio OpenSSH 10.6p2 · Advisory Alpine Linux |
Come una password di 300 byte apre un account bloccato
Il bug è la collisione di tre scelte progettuali, nessuna delle quali sbagliata da sola. Il resoconto del ricercatore descrive la catena, e la descrizione NVD ne conferma la forma.
Gli account che non dovrebbero mai accettare una password — utenti solo-chiave, utenti di directory service, root su Alpine — portano un singolo * nel campo password di /etc/shadow. Un * non è un hash valido, quindi in teoria nessuna password può corrispondervi.
Nel 2016 OpenSSH modificò sshd per chiudere una fuga temporale che permetteva l'enumerazione degli username (CVE-2016-6210): quando un account non ha un hash utilizzabile, sshd ora esegue comunque l'hashing della password fornita contro un salt preso in prestito da un altro account, solo per consumare lo stesso tempo che un attaccante vedrebbe per un utente reale. Come dice il ricercatore, "sshd prende il salt di un altro account e fa comunque l'hash della tua password, solo per sprecare lo stesso tempo".
Il terzo pezzo è musl. Dal 2012 la crypt() di musl rifiuta le password SHA-256/512 più lunghe di 256 byte e, in caso di errore, restituisce la stringa non abbinabile *. Quindi su una macchina musl, fare l'hash di una password sovradimensionata contro il salt preso in prestito restituisce * — esattamente ciò che l'account bloccato già memorizza. Le due stringhe coincidono e sshd lascia passare il login. Il trigger pratico è una password di circa 257–1024 byte. OpenSSH ritiene che "la causa radice del bug [sia] fuori da sshd, ma sia sfruttabile tramite sshd", ed è per questo che 10.6p2 introduce un workaround invece di una correzione di una riga.
Il ricercatore ha compilato sshd in ogni combinazione possibile — glibc, musl, PAM, senza PAM, shadow, senza shadow — lanciandogli circa 17.600 login anomali. "Ogni build concordava su ogni login. Tranne musl senza PAM."
Chi è esposto e come verificare
Sei esposto solo se valgono tutte queste condizioni, secondo l'advisory Alpine:
- Esegui
openssh-serverdi Alpine (compilato senza PAM), oppureopenssh-server-pamconUsePAM no. PasswordAuthenticationèyes— il default di OpenSSH.- Almeno un account ha il campo password
*(su Alpine root èroot:*; così gli utenti solo-chiave e gli utenti di directory via musl-nscd). - Almeno un account locale ha un hash reale
$5$/$6$— è il suo salt a venire preso in prestito.
Non colpite: le distribuzioni glibc (Debian, Ubuntu, Fedora), qualsiasi autenticazione via PAM, Dropbear, OpenBSD, gli account bloccati con ! e ogni host con PasswordAuthentication no. Il raggio d'azione è Alpine e la lunga coda dei sistemi basati su musl — OpenWrt, Buildroot, Yocto e moltissime immagini container.
Due configurazioni trasformano il "si logga un utente bloccato" in root. Su Alpine dove un amministratore ha impostato PermitRootLogin yes, root è raggiungibile direttamente. E sulle immagini ufficiali AWS e Azure di Alpine (tiny-cloud da 3.18.11 a 3.24.3), l'utente di default alpine ha doas senza password — quindi un login come alpine è, di fatto, root.
# Sei musl-senza-PAM? (l'sshd di default di Alpine lo è)
ldd /usr/sbin/sshd | grep -q musl && echo "musl libc"
sshd -T | grep -iE 'passwordauthentication|usepam'
# Elenca gli account col campo password "*" (bersagli candidati)
awk -F: '$2=="*"{print $1}' /etc/shadow
Remediation
1. Sono colpito?
Esegui i tre comandi qui sopra. Se sshd è collegato a musl, è impostato passwordauthentication yes e /etc/shadow contiene uno o più account * accanto a un account con hash reale, considera l'host vulnerabile.
2. Patch — versioni corrette esatte
Aggiorna a OpenSSH 10.6p2 o al back-port Alpine per il tuo ramo: 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; patch anche su 3.16–3.20. Su Alpine, apk upgrade -U -a. Le release 3.21.10, 3.22.8, 3.23.8 e 3.24.4 contengono il fix.
Aggiornare il pacchetto non riavvia l'sshd in esecuzione. Il vecchio binario continua ad accettare connessioni finché non riavvii il servizio: rc-service sshd restart. Una macchina patchata ma mai riavviata è ancora esposta. Tieni aperta la sessione corrente e prova un nuovo login prima di chiuderla.
3. Non puoi patchare subito? Controllo compensativo
Basta una riga per chiudere il buco: imposta PasswordAuthentication no e riavvia sshd. L'indicazione dello sviluppatore OpenSSH Damien Miller per i sistemi colpiti è stata netta — impostarlo "o disabilitare SSH per questi sistemi IMMEDIATAMENTE". Su Alpine:
echo 'PasswordAuthentication no' > /etc/ssh/sshd_config.d/00-no-passwords.conf
sshd -t && rc-service sshd restart
sshd -T | grep -i passwordauthentication # deve stampare: passwordauthentication no
4. Caccia alla compromissione
L'attacco si manifesta come un login riuscito con password su un account che non ha password — quindi la prova è una riga di log che dovrebbe essere impossibile. Su Alpine, cerca nel syslog:
grep "Accepted password for" /var/log/messages | grep -E 'root|alpine|<utenti-solo-chiave>'
Qualsiasi Accepted password per root, alpine o un account solo-chiave è un riscontro confermato. Previdian ha osservato l'attaccante eseguire id, uname e hostname in sessioni SSH non interattive — mappalo su T1133 (External Remote Services) per l'ingresso, T1078.003 (Valid Accounts: Local) per l'accesso risultante e T1033/T1082 (discovery di utente e sistema) per la ricognizione. L'unico IOC pubblico finora è l'indirizzo sorgente 89.116.89[.]18 (con base in Giappone); trattalo come indicatore, non come confine. Rivedi anche l'uso recente di doas, gli utenti creati di recente e i file authorized_keys.
5. Eradicazione e verifica
Se non puoi escludere un login riuscito, tratta la macchina come compromessa: ruota ogni credenziale e chiave raggiungibile dagli account colpiti, rivedi authorized_keys e la persistenza in cron/servizi, e ricostruisci in caso di dubbio. Poi conferma il fix con lo stesso test che l'avrebbe sfruttato — tenta un login con password sovradimensionata contro un account * da un sshd patchato e riavviato, e verifica che venga rifiutato.
Cosa non si sa ancora
- Scala. Il dato pubblico di Previdian è di otto tentativi da un singolo indirizzo contro un solo sensore. Il volume di scansioni su scala Internet non è ancora quantificato.
- CISA KEV. Il CVE non è nel catalogo (versione 2026.11.04) al momento della scrittura. Dato lo sfruttamento confermato in rete di un servizio così diffuso, la situazione potrebbe cambiare; aggiorneremo il post.
- Stato NVD. Il record è ancora "Received" — l'8.1 è il punteggio di MITRE; l'analisi NVD potrebbe modificarlo.
- Provenienza dei PoC. Codice proof-of-concept circola su GitHub, ma Previdian avverte che le copie pubbliche non sono verificate e possono contenere malware. Non eseguire PoC non fidati in produzione.
Trovare ogni macchina esposta prima della prossima scansione
La difficoltà reale qui non è il fix — è una riga — ma sapere quali dei tuoi host soddisfano davvero tutte e quattro le precondizioni. Una flotta con immagini base Alpine in runner CI, sidecar, apparati e firmware IoT non ha un inventario ordinato di "musl, senza PAM, password auth attivo, un account * più un account con hash reale". È un problema di validazione dell'esposizione, ed è esattamente la domanda a cui risponde un penetration test automatico dimostrando la raggiungibilità invece di indovinarla da una stringa di versione.
Zero Hunt esegue quella validazione come un red team AI autonomo su un apparato on-premise, sui propri modelli privati, con un umano che approva qualunque azione tocchi un host vivo. Il suo AI Remediation Advisor ordina ciò che ha dimostrato sfruttabile — un account senza password raggiungibile via SSH batte un numero CVSS ogni volta — restituisce il fix esatto con il passo del riavvio e il ripiego PasswordAuthentication no, e ri-verifica la macchina con lo stesso test a password sovradimensionata che ha dimostrato il bypass, così "patchato" significa provato, non presunto. C'è una simmetria che vale la pena notare: il ricercatore che ha trovato "sshole" ha detto di essersi appoggiato a sciami di agenti per macinare 17.600 login di test. Trovare la prossima classe di questi bug prima di un attaccante è ormai un lavoro per macchine che attaccano — tenute in casa, sotto il tuo controllo, e spente da nessuno se non da te.
Tutte le vulnerabilità che CISA segnala come sfruttate, con le scadenze federali: tracker CISA KEV →
Una patch per ogni CVE? Un programma CTEM verifica quali esposizioni sono davvero sfruttabili prima del prossimo advisory: cos'è il CTEM →
È sfruttabile nel tuo ambiente?
Zero Hunt lo verifica sulla tua rete: un red team AI autonomo su un'appliance on-premise, con AI privata, in black box o gray box e con una persona che approva ogni passo che conta. La prova di cosa è sfruttabile, la correzione e le evidenze firmate — nessun dato esce dal tuo perimetro.