プログラマーではなく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
、これを検出してプログラムを閉じてエラーを記録します。