回答:
誓約とは何ですか?
pledge システムコールです。
pledgeプログラムを呼び出すことは、プログラムが特定のリソースのみを使用することを約束することです。
別の言い方は、プログラムの動作をそのニーズに制限することです。例えば、
「私は除いて、他のポートを使用しないことを誓う
port 63」
私は除いて、他のシステム・コールを使用しないように誓う「lseek()とfork()」
プログラムをより安全にする方法は?
プログラムの動作を制限します。例:
xyzのみが必要な名前のプログラムを作成しましたread。pledge、使用するだけでread、他には何も追加しません。rootシェルを起動できる脆弱性があることを発見しました。rootシェルを開くと、カーネルはSIGABRT(キャッチ/無視できない)プロセスを強制終了し、ログ(で見つけることができます)を生成しますdmesg。これは、プログラムの他のコードを実行する前に、最初にシステムコールpledge以外を使用しないことが原因readです。ただし、rootシェルを開くと他のいくつかのシステムコールが呼び出されますが、すでに他のシステムコールを使用しないことが約束されているため禁止されていreadます。
誓約はどこですか?
通常はプログラム内にあります。OpenBSD 6.5 manページからの使用法:
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
サンプルコード:cat.ccatからのコマンドのサンプルコード
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........
プログラムは通常、特定のシステムコールまたはライブラリコールのセットのみを使用します。ではpledge、あなただけこのセットに許可されるシステムコールのセットを制限することができます。たとえば、プログラムがパスワードデータベースを読み取る必要がない場合、getpwnam()関数の呼び出しを禁止できます。
これはどのように役立ちますか?これは、脆弱性に対する追加の防御ラインです。プログラムにバグが含まれている場合、誰かがバグを悪用してプログラムの実行フローを変更したり、プロセスに余分なコードを挿入したりする可能性があります。バグは、たとえば、デーモンに直面しているネットワークのバッファオーバーフローエラーである可能性があり/etc/passwdます。通信網。