Espandere l'accesso utente in Path - Filtra i valori dannosi

1

Ho una funzione che accetta un nome di percorso e sostituisce ogni occorrenza di '% u' con una determinata stringa. Per il mio scenario questa data String è l'accesso che un utente / utente malintenzionato inserisce tramite ssh durante l'autenticazione. Il nome del percorso (compreso '% u') è fisso e non può essere modificato dall'utente / utente malintenzionato.

Diciamo che il percorso fisso è:

/usr/local/etc/ssh/keystore/%u/authorized_keys

Se l'utente / utente malintenzionato, ad es. sta ora emettendo il seguente comando:

ssh [email protected]

Il percorso sarà esteso a:

/usr/local/etc/ssh/keystore/root/authorized_keys

Se la root utente è ora autorizzata (sarà determinata dall'appartenenza al gruppo ldap) e ha un certificato x509 valido, la chiave pubblica del certificato x509 verrà scritta nel file authorized_keys esaminato. Se l'utente non è autorizzato, il file authorized_keys verrà troncato.

Un utente malintenzionato ora è in grado di troncare ogni file authorized_keys esistente sul filesystem a causa del fatto che non viene eseguita alcuna convalida dell'input per il dato accesso utente.

Considera la seguente connessione ssh:

ssh ../keystore/[email protected]

Il percorso sarà esteso a:

/usr/local/etc/ssh/keystore/../keystore/foo/authorized_keys

Con una probabilità piuttosto alta l'utente '../keystore/foo' non è autorizzato ad accedere al sistema che conduce al troncamento del file authorized_keys di un utente possibilmente legale 'foo'.

Anche se durante il prossimo collegamento di foo il suo file authorized_keys viene aggiornato di nuovo, voglio liberarmi di questo vettore di attacco.

Mi sono venute in mente due possibili soluzioni:

1. Convalida il login utente con un'espressione regolare (approccio whitelist)

es. usa il NAME_REGEX predefinito:

^ [a-z] [- a-z0-9] * \ $

Ancora se il sistema non usa la funzionalità NAME_REGEX gli utenti verrebbero chiusi da ssh

2. Controlla se il percorso espanso contiene '..' e fallisce se è così (approccio blacklist)

Ciò non chiuderebbe gli utenti, ma non sono ancora sicuro se questo è sufficiente o se esistono altri pattern che potrebbero portare allo stesso comportamento di cui sopra

posta fliX 16.05.2015 - 14:04
fonte

1 risposta

1

Non c'è dubbio che l'approccio alla lista bianca rimane il migliore (in realtà aggiungerei anche una limitazione della dimensione massima a questa regex, immagino che un login legittimo che conta diverse centinaia di caratteri non dovrebbe essere così frequente ...) perché ti proteggerà anche da una serie di exploit insospettati e ti garantisce un certo livello di fiducia nel fatto che il login che passa questi test, valido o no, sia correttamente formato e non abbia la possibilità di danneggiare il sistema.

Avere nomi utente conformi a qualche schema ragionevole non sembra un requisito eccessivo (hai mai provato un account come " foo' or '1' ='1 " da qualche parte? O hai affermato che hai davvero bisogno di un unicode o di un supporto charset non standard per il tuo login preferito?)

    
risposta data 16.05.2015 - 14:54
fonte

Leggi altre domande sui tag