3

私は現在、サンドボックス化されたPyPyを使用してPythonサンドボックスを作成しています。基本的に、サンドボックスは、代わりにシステムライブラリ呼び出しを指定された関数にマップする「コントローラー」を提供することによって機能します。(セットアッププロセスをウォークスルーする)codespeakにある指示に従った後、デフォルトのコントローラーにはの代替が含まれていないためos.fstat()、を呼び出すとクラッシュすることに気付きましたopen()。具体的には、インクルードにpypy/translator/sandbox/sandlib.pyはの定義が含まれていませんdo_ll_os__ll_os_fstat

これまでのところ、私はそれを次のように実装しました:

def do_ll_os__ll_os_fstat(self, fd):
    return os.fstat(fd)

これはうまくいくようです。これは安全ですか?これにより、サンドボックスに穴ができますか?

4

2 に答える 2

4

fstat呼び出しは、秘密にしておきたい、またはしたくない特定の情報を明らかにすることができます。とりわけ:

  • 2つのファイル記述子が同じファイルシステム上にあるかどうか
  • 基盤となるファイルシステムのブロックサイズ
  • ファイル所有者の数値UID/GID
  • ファイルの変更/アクセス時間

ただし、何も変更されないため、この(比較的マイナーな)情報漏えいを気にしないのであれば問題ありません。一部の結果を変更して、非表示にする情報をマスクすることもできます(たとえば、所有者のUID / GIDを0に設定します)。

于 2011-07-07T15:38:05.257 に答える
3

bdonlanの答えは良いですが、ここには賞金があるので、一体何ですか:-)

struct statfstatの POSIX 仕様を読むことで、どのような情報が提供されるかを自分で正確に確認できます。

これは間違いなく「読み取り専用」操作です。また、原則として、Unix ファイル記述子は、それらが参照する単一のオブジェクトへのアクセスのみを提供します。たとえば、ディレクトリを参照する (読み取り可能な) ファイル記述子を使用すると、ディレクトリ内のファイルを一覧表示できますが、ディレクトリ内のファイルにアクセスすることはできません。open()そのためには、権限チェックを実行するファイルが必要です。

fstatディレクトリやソケットなどのファイル以外で呼び出すことができることに注意してください。ただし、ここでも、表示される情報のみが提供され、struct stat何も変更されません。(ソケットの場合、ほとんどのフィールドは無意味です。)

于 2011-07-09T05:04:41.617 に答える