簡単に言えば、OpenBSDの約束は何ですか?

簡単に言えば、OpenBSDの約束は何ですか?

プログラマーではなくIT担当者に説明できる人はいますか?保証する

例:「xterm」などのプログラムがあります。ステーキングをどのように安全にすることができますか?プログラムコードの内部にありますか、オペレーティングシステム自体の外部にありますか?

約束はどこにありますか?プログラムコードにありますか?それとも、オペレーティングシステムにxyシステムコールのみを呼び出すことができるバイナリのリストはありますか?

答え1

誓約とは何ですか?

pledgeシステムコールです。

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

これを別の方法で表現することは、プログラムの動作を必要に応じて制限することです。

"私は、port 63"
"を除いて他のシステムコールを使用しないことを約束します。lseek()fork()

プログラムをより安全にする方法は?

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

  • システムxyzコールのみが必要なプログラムを作成します。read
  • その後、pledge目的だけを追加しread、他は追加しません。
  • rootその後、悪意のあるユーザーがシェル呼び出しを許可するプログラムの脆弱性を発見します。
  • プログラムでシェルを開くと、カーネルはrootプロセスを終了しSIGABRT(キャッチまたは無視できません)、ログを生成します(を使用して見つけることができますdmesg)。

これは、プログラムコードの残りの部分を実行する前に、最初にシステムコール以外のものを使用しないpledgeために発生します。readただし、rootシェルを開くと他のいくつかのシステムコールが呼び出されますread

約束はどこにありますか?

通常、プログラム内にあります。以下で使用OpenBSD 6.5 マニュアルページ:

#include <unistd.h>

int pledge(const char *promises, const char *execpromises);

サンプルコード:コマンドのサンプルコードはcat以下に提供されています。cat.c

........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
    err(1, "pledge");

while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........

答え2

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

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

答え3

あなたのプログラムは{A、B、C}関数のみを使用することを「約束」します。

ハッカーがコミットされたプロセスにコードを挿入して機能Dを試みると、オペレーティングシステムはプログラムを中断させる可能性があります。

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

関連情報