免責事項-このリストは不完全であるとされています
(少なくとも)無効にしたいことがいくつかあります。
gnuplotで、見てみましょうhelp shell
-これらは、ユーザーがインタラクティブシェルを生成することを可能にします(間shell
にlogout
あるものはすべて破棄する必要があります)。!
また、シェルコマンドを呼び出すため、またはで始まる行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
。
これにより、パイプから生じる不安が無効になります(、、、さらにはバックティックを含む文字列の問題は|
安全<
になりました)。シェル、システム、!それでも安全ではありません。スクリプトを解析して無効にする必要がありますが、ユーザーが悪意のあるパイプを設定していないことを確認するよりもはるかに簡単です。
また、システムをオンラインにする前に、パイプやバックティックなどで何もできないことを確認することをお勧めします。それでも、可能な限りすべてをサンドボックス化するように努めます。