web-dev-qa-db-ja.com

Pythonソケットをローカルホストで使用する場合、セキュリティ上の懸念事項に注意する必要がありますか?

同じマシンで実行されている2つのスクリプト間でデータをやり取りするために、単純な socket in Pythonを実装しています(残念ながら、ソケットは私の唯一の可能なセットアップです状況)。

このデータは、多くの場合、機密性が高くなります(個人のクレジットカード番号など)。

この方法でスクリプト間でデータを渡すと、セキュリティ上の懸念が生じますか?

サーバ側:

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

クライアント側:

import socket

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

コードソース

1
user1318135

これはlocal-machine multi-userシナリオでは完全に安全ではありません。たとえば、システムがWindowsボックスで実行されているとします。ドメインに参加しており、ドメインの任意のメンバーがマシンにログインできるようにするか、他の人がSSHでログインできるLinuxネットワークに接続できます(どちらの構成も企業環境では一般的です)。 admin/rootアクセスなしでも、「公式」リスナーが実行されていない場合、マシンでコードを実行できる人なら誰でもポート8089で独自のソケットリスナーを開くことができます。または、公式リスナーにトラフィックを送信できます。クライアントがすべての接続スロットを使い切っていない場合。これらのシナリオのどちらでも、ネットワークトラフィックが危険にさらされる可能性があります。

ローカルネットワークの攻撃者は、クライアントまたはサーバーを危険にさらしたり、それらをクラッシュさせたり(クラッシュした場合でも、代わりに自分自身で立ち上がる可能性があります)、サービスアカウントとしてコード実行を獲得することもできます(たとえば、一部にコマンドインジェクションの脆弱性がある場合)。これにより、攻撃者はサービスが処理しようとしている情報を盗むだけでなく、実際にシステムにアクセスしているユーザーを隠しながら、他の制限された領域にアクセスできる可能性があります。

ここでの正しいアプローチは、安全なIPCメカニズム、アクセス制御を可能にし、接続の機密性を提供するメカニズムを使用することです。ループバックに最も近い2つTCPソケットは* nixベースのシステムではUnixドメイン(ローカル)ソケット、WindowsベースのシステムではWindows名前付きパイプ多くのソケットベースのライブラリとフレームワークはすでにこれらをサポートしています-たとえば、Nodeのserverモジュールは完全に喜んでリッスンしますローカルソケットまたは名前付きパイプで-予想よりも簡単に変更できる可能性があります。クライアント証明書や事前共有を使用するなど、相互クライアント/サーバー認証をサポートするSSL/TLS接続に切り替えることもできます。キー(もちろん、サーバー証明書が正当なサーバープロセスのみがアクセスできるものであることを検証します)ですが、最初から設計された通信チャネルを使用する場合に比べて、間違いが起こりやすく、より複雑な変更になる可能性がありますセキュリティ。

1
CBHacking