私は次の質問を読んだ(シェルスクリプトmktemp、一時的な名前付きパイプを作成する最良の方法は何ですか?)しかし、プログラム間で機密データを転送するために一時的な名前付きパイプを使用することが、名前付き/匿名シェルパイプを使用するよりも良いかどうか疑問に思います。
特に私はこのタイプのアプローチに興味があります。http://blog.kdecherf.com/2012/11/06/mount-a-luks-partition-with-a-password-protected-gpg-encrypted-key-using-systemd/)は安全です:
# Open the encrypted block device
gpg --batch --decrypt $key_file 2>/dev/null | sudo $CRYPTSETUP -d - luksOpen $mount_device $key >& /dev/null || exit 3
どのような状況でLuksキーファイルをハイジャックできますか?
答え1
提案したコマンドラインは安全です。
他のすべての条件が同じ場合、「一般的な」匿名パイプ(システムpipe(2)
コールまたはシェルの使い慣れた|
構文を使用して生成されます)は、名前付きパイプよりも安全です。これは、システム外の他の項目がパイプの端に到達する方法が少ないためです。通常の匿名パイプを使用すると、パイプのファイル記述子をすでに所有している場合にのみ、パイプから読み書きできます。つまり、パイプを作成したプロセスであるか、そのパイプからパイプを(直接または間接的に)継承する必要があることを意味します。プロセスまたはファイル記述子を持つ一部のプロセスは、意図的にソケットを介してそれを送信します。名前付きパイプの場合、パイプのファイル記述子がまだない場合は、名前で開いてパイプのファイル記述子を取得できます。
Linuxなどのオペレーティングシステムでは、他の/proc
プロセスが他のプロセスに属するアクセスされたファイル記述子を垣間見る可能性が常にありますが、/proc/pid/fd
これはパイプ(すべてのタイプ)に固有ではなく、その時点まで垣間見ることができます。空間もそう。 Peeperはテーマまたはルートと同じユーザーとして実行する必要があるため、これはセキュリティ上の問題ではありません。
答え2
Linuxのパイプは、/proc/$pid/fd/$thePipeFd
まるでパイプ作成者が作成した接続解除されたfifoであるかのように傍受することができます(umaskが適用されていると思いますか?)。
ルートではなくシェルで実行している場合は、パイプの読み取りの終わりにfdを見つけてデータを取得してから、データを書き換えて垣間見えないようにすることができます。
/proc/sys/kernel/yama/ptrace_scope
プロセスが個人データを保存するためにファイルシステムを使用していない場合でも、プロセスは同じuidを持つプロセスからプライバシーを期待します(無関係なプロセスが許可するptrace添付ファイルを渡さない限り)。
残念ながら、Linuxのパイプは、リンクされていないファイルを含むファイルシステムを使用するのと同じように見えます。
socketpair
私はより安全な選択肢が必要だと思いますpipe()
。公開されますが、ファイルへのアクセス/proc/$pid/fd/$sockeFd
はファイルを介して機能しますが、ソケットは使用できません(再生成された未接続の名前のunixソケットを介して接続すると、未接続のソケット接続へのバインダーは提供されません)。/proc/$pid/fd/
open
open
(セキュリティを強化するには、socketpair
メッセージと一緒にpidをセカンダリ資格情報に送信して、親と子間の通信をさらに強化する必要がありますが、これは必須ではありません。IMOです。)
あるいは、共有匿名メモリも機能する必要がありますが、これはシェルにうまくマッピングされません(これを実行できるバイナリを作成できます./socketline 'command0 ...' \| 'command1 ...' \| 'command 2...'
)。