Linuxには環境変数を読み取る機能がありますか?

Linuxには環境変数を読み取る機能がありますか?

権限のないユーザーとしてサービスを実行したかったのですが、システムのポート番号(1024未満など)にバインドする必要があるため、そのサービスを提供し、setcap 'cap_net_bind_service=+ep' <path for service>すべてが良かったです。

問題は、起動時にサービスが環境変数を読み、何らかの理由でcap_net_bind_servicecap_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_SECURELD_SHOW_AUXV

LD_DEBUG通常、セーフランモードで実行されている場合と実行されていない場合でも、出力の有無はありません。ただし、/etc/suid-debug存在する場合(タッチで生成された空のファイル)、セーフモードLD_DEBUGで実行すると出力が生成されます。

バラよりman getauxvalAT_SECUREセーフランモードの詳細

関連情報