プログラマーではないがIT担当者向けに、誰かが pledge とは何ですか?
例:プログラムがあります。例: "xterm"。どのように誓約すると、より安全になりますか?それはプログラムコードの内側、またはOS自体の外側で誓約しますか?
誓約はどこにありますか?それはプログラムコードにありますか?または、OSにはxy syscallsのみを呼び出すことができるバイナリのリストがありますか?
誓約とは何ですか?
pledge
はシステムコールです。
プログラムでpledge
を呼び出すことは、プログラムが特定のリソースのみを使用することを約束することです。
別の言い方をすると、プログラムの操作をそのニーズに制限することです。たとえば、
「_
port 63
_以外のポートを使用しないことを誓います」
「lseek()
およびfork()
以外のシステムコールは使用しないことを誓約します」
どのようにしてプログラムをより安全にしますか?
プログラムの動作を制限します。例:
xyz
システムコールのみを必要とするread
という名前のプログラムを作成しました。pledge
を追加して、read
のみを使用し、それ以外は使用しません。root
シェルを呼び出すことができる脆弱性があることを発見しました。root
シェルを開くと、カーネルはSIGABRT
(キャッチ/無視できない)でプロセスを強制終了し、ログ(dmesg
)。これは、プログラムの他のコードを実行する前に、最初にpledge
read
システムコール以外を使用しないために発生します。しかし、root
Shellを開くと、他のいくつかのシステムコールが呼び出されますが、read
以外は使用しないことがすでに約束されているため禁止されています。
誓約書はどこにありますか?
通常はプログラム内にあります。 OpenBSD 6.5 manページからの使用法 :
_#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
_
コード例:cat.c からのcat
コマンドのコード例
_........
#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
ネットワーク経由のファイル。
プログラムは、機能のみを使用することを「誓約」します{A、B、C}
ハッカーが誓約したプロセスにコードを挿入し、機能Dを試みる可能性がある場合、OSがプログラムをクラッシュさせます
たとえば、NTPサーバーがあるとします。DNSおよびCLOCK機能のみを使用することを誓約していますが、リモートコードの実行を許可する欠陥があります。ハッカーがファイルの書き込みを要求します。ただし、pledge
はこれを検出してプログラムをシャットダウンし、エラーを記録します