私はプログラミングコンテストのグレーダーを開発しています。基本的に、グレーダーはソリューションプログラムを「分離された」プロセスで実行する必要があります。だから、システムコール(system()、fork()など)を呼び出さないようにしたい。それを達成するためにptrace()を使用できますか?UNIXのptrace()ブロックの子供のシステムコール
3
A
答えて
1
私は2つの可能な解決策があると思います。システムを置き換えるために「シム」を作成するために、LD_PRELOADメカニズムを使用して
- を停止したい呼び出します。
-
setrlimit()を使用して、呼び出し元のプロセスが実行できるものを制限します。残念ながら、これらの制限は、プロセス単位ではなく、ユーザー単位であるように見えます。これにより、正しい値を計算するのが非常に困難になります。
編集:私は最初の選択肢があり、以下に必要なコードが含まれています。 make all
を使用してバイナリをビルドした後、make runtests
でテスト:
$ make all
gcc -fPIC -shared -Wl,-soname,libmy.so.1 -o libmy.so.1.0 lib.c
ln -sf libmy.so.1.0 libmy.so.1
ln -sf libmy.so.1 libmy.so
gcc -o test test.c
$ make runtests
Without LD_PRELOAD:
./test
in child: retval=9273
in parent: retval=0
With LD_PRELOAD:
LD_PRELOAD=./libmy.so ./test
libmy.so fork!
fork error: error=Operation not permitted (1)
のMakefile:
all: libs test
runtests:
@echo Without LD_PRELOAD:
./test
@echo With LD_PRELOAD:
LD_PRELOAD=./libmy.so ./test
libs: lib.c
gcc -fPIC -shared -Wl,-soname,libmy.so.1 -o libmy.so.1.0 lib.c
ln -sf libmy.so.1.0 libmy.so.1
ln -sf libmy.so.1 libmy.so
test: test.c
gcc -o test test.c
clean:
rm -f test libmy.so.1.0 libmy.so.1 libmy.so lib.o
lib.c:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
pid_t fork()
{
printf("libmy.so fork!\n");
errno = EPERM;
return (pid_t)-1;
}
test.cの:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(int argc, char **argv)
{
int retval = fork();
if (retval == 0)
printf("in parent: retval=%d\n", retval);
else if (retval > 0)
printf("in child: retval=%d\n", retval);
else
printf("fork error: error=%s (%d)\n", strerror(errno), errno);
return 0;
}
0
はい]を使える ptrace()は、PTRACE_SYSCALLオプションを使用して特定のシステムコールをブロックします。あなたが唯一のLinuxをターゲットとした場合、私はホワイトリスト/ブラックリスト、特定のシステムコールに、より高速な技術である、代わりにseccompを示唆またはその引数を制限するでしょう
https://github.com/t00sh/p-sandbox/blob/master/p-sandbox.c
: は、ここでは、この機能を使用するプロジェクトです。
代わりに、GoogleのNative Clientとなります。 このプロジェクトは、アプリケーションサンドボックスのクロスプラットフォーム実装を提供します。
ダッカーやLXCなどのコンテナ内で特権のないユーザーとしてアプリケーションを実行して、ダメージを制限することもできます。
LD_PRELOAD
を単独で使用すると、実行可能ファイルが独自のsyscall実装に付属し、基礎となるlibcをバイパスする可能性があるため、安全ではありません。
関連する問題
- 1. ptraceを使ったシステムコールのトレース
- 2. UNIXシステムコールのリスティング?
- 3. UNIXコマンドの暗黙のシステムコール
- 4. Unix selectシステムコール
- 5. Unix fork()システムコール
- 6. Unix - 子ブロックからソート
- 7. 複数の子供との読書と書くC++ Unix
- 8. Javafx8 Stackpane子供がマウスイベントをブロックする
- 9. Jquery子供の子供elemnt
- 10. iOS 8のptrace
- 11. 別の子供の中の子供Firebase
- 12. フレックスボックスの子供の子供のオーバーフロー
- 13. Magento:すべての子供のunsetChildをブロックしますか?
- 14. UNIXの子プロセスグループID
- 15. 子供の子供を選択する
- 16. UNIXシステムコールの例題または練習問題?
- 17. fcntl Unix/Linuxシステムコールのフルネームは何ですか
- 18. Ptraceを使用して、システムコールの引数が何を意味するのかを確認します。
- 19. Ptraceでシステムコールを取得し、最初の呼び出しの後に停止する
- 20. ファイル記述子とシステムコール
- 21. Railsの子供の3人のActiveRecordの子供たちは
- 22. Firebaseの子供の子供のデータをチェックする方法
- 23. Divの親と2人の子供、他の子供の1人の子供のIDを取得
- 24. 子供のFirebaseデータキャップ
- 25. XMLのDTD子供
- 26. WPF MDIの子供
- 27. のXpath子供が
- 28. Excel親の子供
- 29. Angular2:子供のルート
- 30. CCSpriteBatchNode子供のアニメーション
ありがとうございますが、「LD_PRELOADメカニズム」についてもう少し説明できますか? – fushar
$ LD_PRELOAD環境変数を共有ライブラリを指すように設定すると、そのライブラリは実行可能ファイル内で設定されたものよりも優先されて使用されます。私はそれがシステムレベルの機能のために働くかどうかわからない。 – trojanfoe
それでは、2番目のオプション:システムコールを防ぐためにsetrlimit()のどのリソースを設定する必要がありますか? – fushar