X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=tcpsockadv.tex;h=28b2318a09a93b8c6dfa69213563f4020d855c7c;hp=7351738281d804bdd6762a143c2b2c93ced5cb26;hb=0c3c06a023684951f7f1e189d270cf322c0dfe31;hpb=38b9e1e53adc5b440459a6044f3a8ff133f34824 diff --git a/tcpsockadv.tex b/tcpsockadv.tex index 7351738..28b2318 100644 --- a/tcpsockadv.tex +++ b/tcpsockadv.tex @@ -1,4 +1,4 @@ - %% tcpsockadv.tex +%% tcpsockadv.tex %% %% Copyright (C) 2003 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free @@ -658,10 +658,38 @@ presenta un file descriptor aperto, e lo imposta (\texttt{\small 44}) come nuovo massimo, per poi tornare (\texttt{\small 44}) al ciclo principale con un \code{break}, e rieseguire \func{select}. -Se infine si sono letti dei dati (ultimo caso rimasto) si potrà invocare -(\texttt{\small 49}) \func{FullWrite} per riscriverli indietro sul socket in -questione, avendo cura di uscire con un messaggio in caso di errore -(\texttt{\small 50--53}). +Se infine si sono effettivamente letti dei dati dal socket (ultimo caso +rimasto) si potrà invocare immediatamente (\texttt{\small 49}) +\func{FullWrite} per riscriverli indietro sul socket stesso, avendo cura di +uscire con un messaggio in caso di errore (\texttt{\small 50--53}). Si noti +che nel ciclo si esegue una sola lettura, contrariamente a quanto fatto con la +precedente versione (si riveda il codice di \secref{fig:TCP_ServEcho_second}) +in cui si continuava a leggere fintanto che non si riceveva un +\textit{end-of-file}, questo perché usando l'\textit{I/O multiplexing} non si +vuole essere bloccati in lettura. L'uso di \func{select} ci permette di +trattare automaticamente anche il caso in cui la \func{read} non è stata in +grado di leggere tutti i dati presenti sul socket, dato che alla iterazione +successiva \func{select} ritornerà immediatamente segnalando l'ulteriore +disponibilità. + +Il nostro server comunque soffre di una vulnerabilità per un attacco di tipo +\textit{Denial of Service}. Il problema è che in caso di blocco di una +qualunque delle funzioni di I/O, non avendo usato processi separati, tutto il +server si ferma e non risponde più a nessuna richiesta. Abbiamo scongiurato +questa evenienza per l'I/O in ingresso con l'uso di \func{select}, ma non vale +altrettanto per l'I/O in uscita. Il problema pertanto può sorgere qualora una +delle chiamate a \func{write} effettuate da \func{FullWrite} si blocchi. Con +il funzionamento normale questo non accade in quanto il server si limita a +scrivere quanto riceve in ingresso, ma qualora venga utilizzato un client +malevolo che esegua solo scritture e non legga mai indietro l'\textsl{eco} del +server, si potrebbe giungere alla saturazione del buffer di scrittura, ed al +conseguente blocco del server su di una \func{write}. + +Le possibili soluzioni in questo caso sono quelle di ritornare ad eseguire il +ciclo di risposta alle richieste all'interno di processi separati, utilizzare +un timeout per le operazioni di scrittura, o eseguire queste ultime in +modalità non bloccante, cocludendo le operazioni qualora non vadano a buon +fine.