権限のないユーザーとしてサービスを実行したかったのですが、システムのポート番号(1024未満など)にバインドする必要があるため、そのサービスを提供し、setcap 'cap_net_bind_service=+ep' <path for service>
すべてが良かったです。
問題は、起動時にサービスが環境変数を読み、何らかの理由でcap_net_bind_service
。cap_net_bind_service
環境変数を読み取ることができる基本機能セットがあるのと同じですが、これを提供すると、exeはその機能を失いますcap_net_bind_service
。そうですか、それとも別のことが起こっていますか?環境変数を読み取れるように、このサービスにどのような追加機能を提供する必要がありますか?中には何もない能力.h「環境変数の読み取りを許可」ポップアップが表示されます。
答え1
私はその底に達しました。つまり、バイナリは以下を使用しています。secure_getenv
環境変数にアクセスします。バイナリが「安全な実行」モード()で実行されると、変数にnull
アクセスする代わりに返されます。AT_SECURE=1
機能を設定すると、このモードで実行されます。
バイナリが使用されていることを確認secure_getenv
してくださいreadelf
。
readelf -a <path for service> | grep getenv
00000040ac28 004b00000007 R_X86_64_JUMP_SLO 0000000000000000 secure_getenv@GLIBC_2.17 + 0
00000040ad90 007a00000007 R_X86_64_JUMP_SLO 0000000000000000 getenv@GLIBC_2.2.5 + 0
75: 0000000000000000 0 FUNC GLOBAL DEFAULT UND secure_getenv@GLIBC_2.17 (6)
122: 0000000000000000 0 FUNC GLOBAL DEFAULT UND getenv@GLIBC_2.2.5 (2)
LD_DEBUG=all
環境変数(どのように皮肉なのか!)および/またはLD_SHOW_AUXV
(参照)を使用して、安全な実行モードで実行されていることを確認してください。man ld.so
)。
それ以外の場合は、LD_SHOW_AUXV
ゼロに設定された出力が生成されます。セーフモードで実行すると出力はありませんAT_SECURE
。LD_SHOW_AUXV
LD_DEBUG
通常、セーフランモードで実行されている場合と実行されていない場合でも、出力の有無はありません。ただし、/etc/suid-debug
存在する場合(タッチで生成された空のファイル)、セーフモードLD_DEBUG
で実行すると出力が生成されます。
バラよりman getauxval
AT_SECURE
セーフランモードの詳細