回答:
誓約とは何ですか?
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
ます。通信網。