3

python SimpleXMLRPC Serverの python docsでは、次のように言及されています。

警告 allow_dotted_names オプションを有効にすると、侵入者がモジュールのグローバル変数にアクセスできるようになり、侵入者がマシン上で任意のコードを実行できるようになる可能性があります。このオプションは、安全な閉じたネットワークでのみ使用してください。

今、私は次のコードを持つサーバーを持っています:

from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler


server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)
server.register_introspection_functions()

server.register_function(pow)

def adder_function(x,y):
    return x + y
server.register_function(adder_function, 'add')

class MyFuncs:
    def mul(self, x, y):
        return x * y

server.register_instance(MyFuncs(), allow_dotted_names=True)

server.serve_forever()

この脆弱性を悪用して、サーバーに任意のコードを挿入する方法を説明してください。上記のコードに脆弱性がない場合は、悪用される可能性のある例とそのクライアント コードを示してください。

4

1 に答える 1

0

MyFuncs().mulは単なる呼び出し可能な関数ではなく、(すべての Python 関数と同様に) 独自のプロパティを持つファーストクラスのオブジェクトです。

__xxx__一連のマジック メソッド (SimpleXMLRPCServer は で始まるものへのアクセスをブロックするためアクセスできません) とは別に、 (クラス オブジェクトを指す)、(インスタンスを指す)、および(関数定義を指す)_内部メソッド メンバーがあります。用)。その関数オブジェクト自体には、多数のアクセス可能なプロパティがあります。最も顕著なのは、含まれているファイルの変数スコープ ディクショナリへのアクセスを提供するものです。im_classim_selfMyFuncs()im_funcmulfunc_globals

mul.im_func.func_globals.getそのため、攻撃者を呼び出すことで、スクリプトで設定した任意のグローバル変数を読み取ったりupdate()、辞書で使用してそれらを変更したりできます。上記の例では、グローバル変数に機密情報がないため、悪用できません。しかし、それはおそらく、常に真実であり続けることに依存したいものではありません.

完全な「任意のコードを実行する」ということはほとんどありませんが、書き込み可能なグローバルcodeToExecute変数をeval後で編集する、またはモジュール全体を に登録してregister_instance、インポートしたすべてのモジュールにアクセスできるようにする (典型的な例:osおよびos.system

Python 3 では、関数/メソッドの内部プロパティの名前が二重下線付きのバージョンに変更され、ブロックされるため、この特定の攻撃には到達できなくなりました。しかし、一般的に、名前だけに基づいてインスタンスの任意のプロパティへの外部アクセスを許可し、「デフォルトで開く」ことは悪い考えのように思えます - 他の非下線の名前が将来存在しないという保証はありません。何らかの方法で悪用される可能性のあるプロパティのアクセス可能な組み込み型 (tuple、dict) には追加されません。

@rpc_accessible入れ子になったプロパティ アクセスが本当に必要な場合は、何を表示するかを定義するための装飾のようなものを必要とするバージョンの SimpleXMLRPCServer を考え出す方が安全に思えます。

于 2013-03-17T16:19:37.030 に答える