以下を通じて、HIDデバイスをシミュレートするアプリケーションを構築しました。/dev/uhid
Linuxで。私の申し込みは2つのプログラムに分かれています。まず、/dev/uhid
デバイスを開いてエミュレートし、デバイスを呼び出すプログラムにメッセージを送受信する非常に簡単なsetuidルートバイナリです。第二に、アプリケーションは実際にはすべてのデバイスロジックを含み、他のバイナリを使用してuhid_event
メッセージをカプセル化し、カーネルと通信します。
コンソールにアクセスできる人は誰でもハードウェアUSBデバイスを接続できますが、セキュリティ上の理由からsetuidプログラムがコンソールではなくユーザーに代わって実行されることを拒否したいと思います。
私の質問:setuid rootアプリケーションがコンソールユーザーによって呼び出されたことを確認し、そうでない場合は宝石を払うか、最初にコンソールユーザーにプログラムの実行を制限する最も簡単で信頼性の高い方法は何ですか?
ベストアンサー1
コンソールとは、ハードウェアコンソール、システムコンソール、またはVTを意味しますか?後者を意味する場合、本当に簡単な解決策は、STD * _FILENOが各ttyに関連付けられているかどうかをテストし、isatty()を呼び出してVTに関連付けられているストリームがあるかどうかを確認することです。その場合は、PIDがプロセスグループIDと同じであることを確認してください。標準ストリームの1つがttyに関連付けられていて、現在のプロセスがプロセスグループリーダーである場合、プログラムはVTの種類でユーザーによって実行される可能性が高くなります。
編集1:より明確にするために、元の質問は仮想端末ではなく、他のすべてではなくローカル/リモートログインに関するものでした。上記の答えは意味がありません。
私が知る限り、User Accounting Database UTMP / UTMPX APIはリモートログインに言及する唯一のAPIなので、これはおそらく最善の解決策です。ユーザーアカウントデータベースのut_hostフィールドを検索して、有効なIPアドレスがユーザーログインに関連付けられていることを確認してください。