2

コマンドまたはファイルのリストを受け取り、それをディスクに保存し、gnuplotにpngにレンダリングするように指示する一種のgnuplot Webインターフェイスを作成する必要があります(「setterminalpng; setoutput ...」)。

ユーザーがそれを使ってできる厄介なことや愚かなことは何ですか(たとえば、CPUまたはRAMの過負荷、ファイルシステムへのアクセス...)?どうすればそれらを回避できますか?コードをgnuplotに渡す前に、どのような潜在的に悪意のある行を削除する必要がありますか?

subprocess.Popendjangoからgnuplotを実行しています。

4

3 に答える 3

5

免責事項-このリストは不完全であるとされています

(少なくとも)無効にしたいことがいくつかあります。

gnuplotで、見てみましょうhelp shell-これらは、ユーザーがインタラクティブシェルを生成することを可能にします(間shelllogoutあるものはすべて破棄する必要があります)。!また、シェルコマンドを呼び出すため、またはで始まる行system(および行の継続)を削除する必要があります。次に行うべき潜在的に危険なことのリストは、バックティック置換を使用することです。

#homeless1.gp
mysring="`rm -rf ~`"

ホームディレクトリをクリアします。もちろん、これらすべてのことを実行すれば、スクリプトが完全に安全になるとは主張しません。ユーザーに1つのファイルのアップロードのみを許可している場合は、無効loadにするcallこともできます。それ以降、ユーザーが別の悪意のあるスクリプトをアップロードして最初からロードすることを心配する必要はありません。

別の考え-gnuplotはパイプを使用してプログラムを呼び出すことを可能にします-例えば

plot "<awk -F, '{print $0}' mydata.txt" #runs system command awk

<空白の後にまたは-が続く文字列は、ほとんど無効にする必要があります|。gnuplotは、何もエスケープしていない場合、それらをサイレントに破棄する可能性があるため、エスケープシーケンスも含まれている可能性があります。

#homeless2.gp
MYSTRING="<rm -rf ~"
plot MYSTRING  #removes $HOME -- And doesn't even give you a plot :-(

そして別の..。

#homeless3.gp
set output "| rm -rf ~"

また、次のコマンドを使用すると、スクリプトを非常に簡単に無限ループに陥らせることができます。rereadこのスクリプトの長さは1行だけです。

#inifite_loop.gp
reread   #Suckers!!!

これは、スクリプトを実行するためにchroot jailを作成した場合でも、おそらく無効にしたいと思うでしょう(私は何も知らないのですが、UNIXでスクリプトを安全に実行する方法をグーグルで調べているときにのみ用語を学びました...)- -上記の方法を使用すると思いますが、ユーザーは別のプログラミング言語で無限ループを構築し、それをgnuplotから実行することで、CPUの1つのコアをペグすることができます-同じことがメモリにも当てはまります...

#infinite_mem.gp
!python -c "a=[]; while True: a.append('Suckers!!! '*10000000))" #You'll probably hit swap pretty fast with this...

考えれば考えるほど、これを安全に行うには、gnuplotパーサーを最初から書き直して、すべてをチェックする必要があります(または、サンドボックスとモニター-消費されるリソースに注意深い制限を設定します)。

(申し訳ありませんが、これはあなたが聞きたいものではないと確信しています)。

(私には)あなたの最善の策は、gnuplotコマンドの小さな(しかし有用な)サブセットのみを受け入れ、そのコマンドのセットからgnuplotスクリプトを構築する独自のミニ言語を作成することであるように思われます...

プログレス編集

少し遊んだ後、gnuplotで配管を無効にすることができます-

./configure --program-suffix=safer

次に、configure...によって生成されたものを編集する必要がありconfig.hます。次の行をコメントアウトします。

#define HAVE_PCLOSE 1

#define HAVE_POPEN 1

#define PIPES 1

(たとえば/*#define HAVE_PCLOSE 1*/、Cコメントに精通していない場合)。

次にmake; [sudo] make install、私が設定した方法で接尾辞を付けて、「より安全な」バージョンのgnuplotをとして呼び出すことができますgnuplotsafer

これにより、パイプから生じる不安が無効になります(、、、さらにはバックティックを含む文字列の問題は|安全<になりました)。シェルシステムそれでも安全ではありません。スクリプトを解析して無効にする必要がありますが、ユーザーが悪意のあるパイプを設定していないことを確認するよりもはるかに簡単です。

また、システムをオンラインにする前に、パイプやバックティックなどで何もできないことを確認することをお勧めします。それでも、可能な限りすべてをサンドボックス化するように努めます。

于 2012-06-07T18:34:21.503 に答える
3

mgilsonが上記で述べていることはすべて、理解することが非常に重要です。これは非常に危険です。ただし、慎重なサンドボックス化とリソース使用量の監視により、安全に実行できるはずです。

http://www.plotshare.com/をご覧ください。彼らはしばらく前から存在しているので、これを安全に行う方法を見つけたに違いありません。多分あなたは彼らと話すことができます。

于 2012-06-08T01:16:25.543 に答える