1

私はUNIXサーバーで作業しています。

クライアントからの入力としてacファイルを取得しています。これをコンパイルします。

c ファイルは非常に基本的なもので、 stdio 、 stdlib 、 math 、 string の関数のみが含まれている必要があります。

GCC コンパイラには、他のライブラリの使用を許可せず、他のライブラリが使用された場合にコンパイル エラーをスローするフラグはありますか?

GCC を含まない解決策があればそれも良いかもしれませんが、ファイルを検査したくありません。

ありがとう。

4

3 に答える 3

6

ライブラリ (コンパイル時のヘッダー インクルードとリンク時のライブラリ リンクの両方) を制限しても、信頼できないコードが危険な (セキュリティ関連の) カーネル syscall を直接呼び出すのを止めることはできません。これは、信頼できないコードによって実行される可能性があります。たとえば、インライン アセンブリまたはシェルコード/エクスプロイト手法を使用することによって、たとえば、シェルコードを含む文字列を指すようにスタック上のリターン アドレスを意図的に上書きすることによって行われる可能性があります。

そうは言っても、-nostdlib -nodefaultlibsリンカーオプションを使用してライブラリへのリンクを防ぐことができます。ただし、これでも libc 全体を使用するか、まったく使用できないかのいずれかしか許可されません。libc の一部のみに選択的にリンクすることはできません (たとえば、 を持っているが、そうではありprintf()ませんsystem())。

特定のインクルードのみを許可することもあまり効果的ではありません。コードは、特定の#includeステートメントのみを許可するという制限を回避するために、特定のヘッダーをインクルードする代わりにインクルード ファイルから宣言をコピーすることができます。例:

int system(const char *);
int main() {
    return system("uname -a");
}

セキュリティで保護する必要がある場合は、安全でないコードがコンパイルされるのを防ぐのではなく、実行時にコードをサンドボックス化することを検討する必要があります。

于 2012-04-21T20:08:49.970 に答える
1

stdlib.h を含めることを許可することがどれほど安全でないかを説明するために、マシン上で任意のコードを実行できる小さなプログラムを作成します。

#include <stdlib.h>

int main() {
    system("`which python` -c \"print 'hello word'\"");
    // instead of simply printing hello world i could open a socket back to the 
    // attacker's machine and start reading in abitrary code and executing it.
    return 0;
}
于 2012-04-21T20:13:19.843 に答える
1

-nodefaultlibsオプションor-nostdlibを gcc に渡し、許可されたライブラリのみを含めるオプション (-lm数学ライブラリなど) を含めます。これらのオプションの詳細については、 gcc のマニュアルを確認してください。

-nodefaultlibs
リンク時に標準システム ライブラリを使用しないでください。指定したライブラリのみがリンカーに渡されます。

于 2012-04-21T19:59:50.460 に答える