12

SO_PEERCREDは、接続されたAF_UNIXストリームソケットのpid / uid / gidを取得する簡単な方法です。SCM_CREDENTIALSはほぼ同じですが、より複雑です(さまざまな補助メッセージ)。両方の方法を示す例へのリンク

  1. 多かれ少なかれ同じ情報を取得する2つの方法があるのはなぜですか?
  2. より快適なSO_PEERCREDがunix(7)のマンページにリストされていないのはなぜですか?
  3. 実際のアプリケーションでより多く使用されるのはどれですか?

何を使うべきですか?

4

2 に答える 2

11
  1. 私が正しく理解していれば、2つの間に微妙な違いがあります。SO_PEERCREDピアプロセスからの対話を必要とせずに、ピアプロセスのクレデンシャルを取得します。対照的に、SCM_CREDENTIALSはピアプロセスのクレデンシャルを送受信するメカニズムであり、カーネルによってチェックされます。この微妙な違いは、プロセスがUID 0として実行されている場合に問題になる可能性があります。これSCM_CREDENTIALSにより、プロセスがUID 0として実行され、特権が低いと宣言できるようになります(たとえば、UID 50)SO_PEERCRED

  2. 上記を参照。SCM_CREDENTIALS使用が推奨されておりSO_PEERCRED、互換性のためにのみサポートされていると思います。

  3. dbusデーモンはとを使用SO_PEERCREDしているようgetpeereid()です。クレデンシャルを移植可能に取得するには、コードをコピーするのが最善だと思います。

http://cgit.freedesktop.org/dbus/dbus/tree/dbus/dbus-sysdeps-unix.c?id=edaa6fe253782dda959d78396b43e9fd71ea77e3

于 2012-06-26T18:16:24.467 に答える
3

SO_PEERCREDソケットピアのクレデンシャルを返します。SCM_CREDENTIALS特権を持つ資格情報を渡すことができます。カーネルがIDを変換するため、これは特に価値があります。そのため、あるpid名前空間のタスクは別の名前空間のプロセスにpidを送信でき、受信したpidが意図したのと同じプロセスを参照することが保証されます。

ピアのクレデンシャルが必要な場合は、を使用しますSO_PEERCREDSCM_CREDENTIAL呼び出し元が指定した資格情報(特権を持っている必要がありました)であり、必ずしもピアの資格情報である必要はありません。

于 2017-05-18T02:59:23.197 に答える