Le web socket rappresentano un problema di sicurezza per il mio computer locale?

2

Per aggirare un problema con IntelliJ, mi è stato consigliato di configurare il mio daemon Docker locale affinché funzioni sulla porta 2375 senza autenticazione TLS. Tuttavia, sono preoccupato che un sito Web dannoso possa connettersi al servizio Docker e avviare i contenitori.

Ho letto le voci della mailing list del 2015 che dicono che ad un certo punto Chrome non sarà autorizzato a connettersi a localhost per impostazione predefinita, ma non so se questo è ancora successo.

Non ho mai sentito di questo attacco, quindi forse non è possibile. C'è qualcosa di autorevole che potrei leggere per mettere a riposo la mente?

    
posta Steve Rukuts 14.06.2017 - 11:40
fonte

3 risposte

0

Aggiornamento - sembra che ora ci sia un proof of concept attack . È al 100% una vulnerabilità di sicurezza. Grazie a rjdkolb per averlo scoperto.

Dopo aver trascorso un po 'di tempo con la console di Chrome, posso vedere che è possibile collegarsi a websocket e ricevere eventi sui contenitori. Non sono sicuro di cosa possa fare questa API perché non trovo molto in termini di riferimento, ma è abbastanza brutto che tu possa perdere informazioni sensibili sulla tua workstation.

Consiglio vivamente che nessuno esponga il loro daemon Docker senza l'autenticazione TLS. Il manuale di Docker dice che questo non è raccomandato, e questo è un motivo per cui!

    
risposta data 14.06.2017 - 17:24
fonte
2

In una parola, YES, websockets DO rappresentano un problema di sicurezza sul computer locale.

Prima di tutto, alcuni chiarimenti ci sono delle differenze tra il binding a 127.0.0.1 e 0.0.0.0 ... in quanto uno consentirà solo al tuo computer di connettersi e l'altro permetterà a qualsiasi computer sulla tua rete di connettersi. ENTRAMBI di questi sono pericolosi, tuttavia il collegamento a 127.0.0.1 è leggermente più sicuro.

La maggior parte (tutti?) i browser Web attuali hanno limitazioni su ciò che è noto come cross-site scripting. Ciò significa che se una pagina ospitata da foo.com tenta di effettuare una richiesta ajax su bar.com fallirà a meno che non sia esplicitamente consentita tramite CORS . Ciò detto ... le websocket sono NON limitate da CORS e quindi foo. com potrebbe teoricamente aprire una connessione websocket a 127.0.0.1 ... e prendere il controllo del tuo servizio docker.

Noterò che questo non è un vettore di attacco comune in quanto richiede all'obiettivo di utilizzare attivamente un browser Web su un dispositivo che esegue la finestra mobile con questa opzione abilitata (rara) ... ma è ancora una superficie di attacco.

Letture aggiuntive:

risposta data 14.06.2017 - 17:45
fonte
-1

Scenario 1: Legare il demone docker a 0.0.0.0:2375 è una pessima idea. Un utente malintenzionato può ottenere l'accesso di root sul computer host accedendo alla finestra mobile. Passare alla radice è molto più difficile in questi giorni, ma piuttosto sicuro che dispiaciuto. Altre informazioni qui

Il collegamento a tutte le interfacce consente a un utente malintenzionato di connettersi al demone docker da una macchina remota. Quindi possono

EXPORT DOCKER_HOST=tcp://YOURIP:2376
docker ps
docker stop

Soluzione: L'aggiunta del tuo utente al gruppo docker è una soluzione molto migliore per proteggerti.

Scenario 2: Associazione a localhost: 2375 non consente al browser di accedere alla porta. Come riportato qui: link , questo potrebbe essere possibile Finestre.

Dal link: "L'attacco è a più fasi. Primo passaggio, coinvolge lo sviluppatore che esegue Docker per Windows in una pagina Web controllata dagli aggressori che ospita un JavaScript appositamente predisposto. Tra le altre cose, il JavaScript è in grado di bypassare la sicurezza di Same Origin Policy del browser, una protezione dei dati funzionalità disponibile sui browser moderni. "

Nei miei test, questo è possibile:

curl http://localhost:2375/info

Questo non è:

<!DOCTYPE html>
<html>

<body>
    <button onclick="myFunction()">Click me to get docker info</button>
    <p id="result"></p>

    <script>
function myFunction() {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", 'http://127.0.0.1:2375/info', false ); // false for synchronous request
    xmlHttp.send( null );
    document.getElementById("result").innerHTML = "It did not work";
    document.getElementById("result").innerHTML = xmlHttp.responseText;
}
</script>
</body>
</html>

Il browser restituisce: Richiesta di origine incrociata bloccata: la stessa politica di origine non consente di leggere la risorsa remota al link . (Motivo: manca l'intestazione CORS 'Access-Control-Allow-Origin').

Accesso al daemon docker da Java

Suppongo che tu voglia eseguire docker come utente non root in un plugin Maven o Gradle come docker-maven-plugin . Il modo migliore per farlo è aggiungere l'utente al gruppo docker e quindi non è necessario collegarsi alla porta TCP.

    
risposta data 14.06.2017 - 16:32
fonte

Leggi altre domande sui tag