私が開発しているプログラム(Linux)では、非常に単純なテキストベースのIPCが必要です。これには、標準の入出力パイプを使用するのが非常に簡単です。プロセスのstdinに送信されたメッセージは誰にも読めないことを信頼できますか?また、パイプをstdoutに保持した場合、出力内容を読み取ることができるのは私だけであると信頼できますか?これらから読み取ることができるprocfsベースのトリックがないことを確認したいだけです。
4 に答える
正直なところ、アプリケーションに必要なセキュリティの程度に依存すると思います。stdinでGPGキーのパスワードを入力しました。私はいつも「許容できるリスクは何か」という質問をします。
とはいえ、カーネル空間のルートキットからアプリケーションを保護するものは何もありません。std入力/出力端子だけでなく、実行時にプロセスメモリ全体を読み取ることができます。そして、おそらくあなたが実施しているいくつかの保護を無効にします。
SELinuxサンドボックスを現在行っていることと組み合わせて使用することを検討するかもしれません。そのレベルの保護が本当に必要な場合は、 http://danwalsh.livejournal.com/で詳細をお読みください。libselinuxを使用すると、保護が存在するかどうかを確認するために、libselinuxとインターフェイスできます。
私の知る限り、「トリック」はなく、他のユーザーはあなたのstdin/stdoutを読み取ることができません。覚えておいてください:
- 同じユーザーとして実行されている他のプロセスは、プロセスのメモリを読み取ることができます。これは、セキュリティが他のユーザーからあなたを保護するためです。
- スーパーユーザーとして実行されているプロセスは、すべてを実行できます。
とはいえ、機密データを扱っている場合は、mlockをご覧ください。
isredirected
トリックはありません。stdoutが他の場所にリダイレクトされているかどうかを検出することに関して私が考えることができるのは、メッセージが安全に保たれるようにする責任があることを除いて、ここに示す単純なC関数のようにこれを行うことだけです。 ...もう1つは、procfsトリックを使用するには、特定のprocfs機能にアクセスするためにroot権限が必要です...そのため、rootとして実行されていないことを確認するために、そこにチェックを入れてください...
int isredirected(void){
if (!isatty(fileno(stdin))) return 1;
return 0;
}
これがお役に立てば幸いです、よろしく、トム。
私自身の限定的なテスト(実行uniq | sort
してからを介してパイプの両端をスヌープしようとする/proc/XXX/fd
)では、パイプに送信されるものを読み取ることができないようですが、パイプにデータを挿入することはできます。
言い換えれば、あなたができることとできないことを確認するためにあなた自身のテストをしてください。:-)