ライブラリ (コンパイル時のヘッダー インクルードとリンク時のライブラリ リンクの両方) を制限しても、信頼できないコードが危険な (セキュリティ関連の) カーネル syscall を直接呼び出すのを止めることはできません。これは、信頼できないコードによって実行される可能性があります。たとえば、インライン アセンブリまたはシェルコード/エクスプロイト手法を使用することによって、たとえば、シェルコードを含む文字列を指すようにスタック上のリターン アドレスを意図的に上書きすることによって行われる可能性があります。
そうは言っても、-nostdlib -nodefaultlibs
リンカーオプションを使用してライブラリへのリンクを防ぐことができます。ただし、これでも libc 全体を使用するか、まったく使用できないかのいずれかしか許可されません。libc の一部のみに選択的にリンクすることはできません (たとえば、 を持っているが、そうではありprintf()
ませんsystem()
)。
特定のインクルードのみを許可することもあまり効果的ではありません。コードは、特定の#include
ステートメントのみを許可するという制限を回避するために、特定のヘッダーをインクルードする代わりにインクルード ファイルから宣言をコピーすることができます。例:
int system(const char *);
int main() {
return system("uname -a");
}
セキュリティで保護する必要がある場合は、安全でないコードがコンパイルされるのを防ぐのではなく、実行時にコードをサンドボックス化することを検討する必要があります。