web-dev-qa-db-ja.com

要するにOpenBSDの誓約は何ですか?

プログラマーではないがIT担当者向けに、誰かが pledge とは何ですか?

例:プログラムがあります。例: "xterm"。どのように誓約すると、より安全になりますか?それはプログラムコードの内側、またはOS自体の外側で誓約しますか?

誓約はどこにありますか?それはプログラムコードにありますか?または、OSにはxy syscallsのみを呼び出すことができるバイナリのリストがありますか?

19
Peter

誓約とは何ですか?

pledgeはシステムコールです。

プログラムでpledgeを呼び出すことは、プログラムが特定のリソースのみを使用することを約束することです。

別の言い方をすると、プログラムの操作をそのニーズに制限することです。たとえば、

「_port 63_以外のポートを使用しないことを誓います」
lseek()およびfork()以外のシステムコールは使用しないことを誓約します」

どのようにしてプログラムをより安全にしますか?

プログラムの動作を制限します。例:

  • xyzシステムコールのみを必要とするreadという名前のプログラムを作成しました。
  • 次に、pledgeを追加して、readのみを使用し、それ以外は使用しません。
  • その後、悪意のあるユーザーは、プログラムにrootシェルを呼び出すことができる脆弱性があることを発見しました。
  • プログラムを利用してrootシェルを開くと、カーネルはSIGABRT(キャッチ/無視できない)でプロセスを強制終了し、ログ(dmesg)。

これは、プログラムの他のコードを実行する前に、最初にpledgereadシステムコール以外を使用しないために発生します。しかし、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)
..........
_
14
muhammad

プログラムは通常、特定のシステムコールまたはライブラリコールのセットのみを使用します。 pledgeを使用すると、許可するシステムコールのセットをこのセットのみに制限できます。たとえば、プログラムがパスワードデータベースを読み取る必要がない場合は、getpwnam()関数の呼び出しを禁止できます。

これはどのように役立ちますか?これは脆弱性に対する追加の防御線です。プログラムにバグが含まれている場合、誰かがそのバグを悪用してプログラムの実行フローを変更したり、プロセスに追加のコードを挿入したりできる可能性があります。バグは、たとえば、ネットワークに面したデーモンのバッファオーバーフローエラーである可能性があります。攻撃者は、プログラムが処理できるよりも多くのデータをプログラムに送信し、プログラムが/etc/passwdネットワーク経由のファイル。

5
Johan Myréen

プログラムは、機能のみを使用することを「誓約」します{A、B、C}

ハッカーが誓約したプロセスにコードを挿入し、機能Dを試みる可能性がある場合、OSがプログラムをクラッシュさせます

たとえば、NTPサーバーがあるとします。DNSおよびCLOCK機能のみを使用することを誓約していますが、リモートコードの実行を許可する欠陥があります。ハッカーがファイルの書き込みを要求します。ただし、pledgeはこれを検出してプログラムをシャットダウンし、エラーを記録します

4
Neil McGuigan