OpenBSDの誓約とは何ですか?


18

プログラマーではないがIT担当者のために、誓約とは何ですか?

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

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

回答:


13

誓約とは何ですか?

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)
..........

5

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

これはどのように役立ちますか?これは、脆弱性に対する追加の防御ラインです。プログラムにバグが含まれている場合、誰かがバグを悪用してプログラムの実行フローを変更したり、プロセスに余分なコードを挿入したりする可能性があります。バグは、たとえば、デーモンに直面しているネットワークのバッファオーバーフローエラーである可能性があり/etc/passwdます。通信網。


4

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.