Come funziona il Socket Protection

Per impedire che un utente del sistema possa accedere al server tcp di un altro (backgroundrb, ferret-server,memcached), si e' reso necesario proteggere i socket in stato di LISTEN.

Il modo piu' logico poteva essere quello di fare una verifica sull'uid del socket nel momento dell' accept(). Purtroppo sui socket di tipo INET (per ovvi motivi) questa informazione non e' presente.

Si sono tentate varie strade:

Il sistema di MARKING di iptables vive solo all'interno della catena di mangling, quindi non era utilizzabile.

Il flag TOS dello stack tcp e' solo a 8 bit e a noi serviva specificare un uid (almeno 16bit) al suo interno.

Per questi motivi l'approccio si e' invertito e' anziche mettere il blocco sulla accept() abbiamo agito sulla connect() del client.

Quando un processo esegue una connect() su 127.0.0.1 il sistema verifica che la porta richiesta sia tra quelle in stato di LISTEN (i server sul sistema). In caso positivo, il kernel verifica l'uid del processo chiamante (current->uid) con quello presente nel campo 'socket_protection' (opportunamente aggiunto alla struttura sock) del socket del server.

Se questa condizione e' verificata, la connect() va a buon fine, altrimenti viene restituito -EACCES.

SocketProtection (l'ultima modifica รจ del 2008-03-17 08:07:26, fatta da RobertoDeIoris)