Se utilizzo un socket Python su localhost, ci sono dei problemi di sicurezza di cui devo essere a conoscenza?

1

Sto implementando un semplice socket in Python per passare i dati avanti e indietro tra due script in esecuzione su la stessa macchina (sfortunatamente, una presa è l'unica configurazione possibile per la mia situazione).

Questi dati, in molti casi, saranno estremamente sensibili (cioè i numeri delle carte di credito personali).

Il trasferimento dei dati tra gli script in questo modo mi consente di risolvere eventuali problemi di sicurezza?

Lato server:

import socket

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8089))
serversocket.listen(5) # become a server socket, maximum 5 connections

while True:
    connection, address = serversocket.accept()
    buf = connection.recv(64)
    if len(buf) > 0:
        print buf
        break

Lato client:

import socket

clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8089))
clientsocket.send('hello')

Sorgente del codice.

    
posta user1318135 25.10.2017 - 18:14
fonte

1 risposta

1

Questo è completamente insicuro negli scenari multi-utente locale . Ad esempio, supponiamo che il tuo sistema sia eseguito su una casella Windows che è unificata al dominio e consente a qualsiasi membro del dominio per accedere alla macchina o una rete Linux che consente ad altre persone di accedere a SSH (entrambe le configurazioni sono comuni negli ambienti aziendali). Anche senza accesso amministratore / root , chiunque possa eseguire il codice sulla macchina può aprire il proprio listener di socket sulla porta 8089 se il listener "ufficiale" non è in esecuzione o può inviare traffico al listener ufficiale se il client non sta utilizzando tutti gli slot di connessione. Ciascuno di questi scenari apre il sistema fino al compromesso del traffico di rete.

Un attaccante della rete locale può anche tentare di compromettere il client o il server, bloccandoli (il che può quindi lasciarli in posizione autonoma al suo posto, anche solo con un arresto anomalo) o addirittura ottenere l'esecuzione di codice come account di servizio ( ad esempio, se una parte presenta una vulnerabilità di iniezione di comando). Ciò potrebbe potenzialmente consentire all'utente malintenzionato non solo di rubare le informazioni che il servizio è destinato a gestire, ma anche di accedere ad altre aree riservate mentre maschera chi sta effettivamente accedendo al sistema.

L'approccio corretto qui consiste nell'utilizzare un meccanismo IPC sicuro, uno che consente i controlli di accesso e fornisce la riservatezza della connessione. I due più vicini ai socket TCP di loopback sono socket di dominio Unix (locali) su sistemi basati su * nix e pipe denominate Windows su sistemi basati su Windows. Molte librerie e framework basati su socket già supportano questi - ad esempio, il modulo server del nodo è perfettamente felice di ascoltare su un socket locale o named pipe - quindi potrebbe essere un cambiamento più semplice di quanto ti aspetti. È anche possibile passare a una connessione SSL / TLS che supporti l'autenticazione reciproca client-server, come l'utilizzo di un certificato client o una chiave precondivisa (e ovviamente la convalida del fatto che il certificato del server sia uno solo a cui il processo legittimo del server ha accesso ), ma è probabilmente un cambiamento più complicato che è più facile da sbagliare, rispetto all'uso di un canale di comunicazione progettato sin dall'inizio per la sicurezza.

    
risposta data 26.10.2017 - 23:37
fonte

Leggi altre domande sui tag