1

特定の非常に特殊なコマンドをルートとして実行する C++ プログラムがあります。これが必要な理由は、Node.js で実行されている別のプログラムが、システム時刻の設定、タイム ゾーンの設定などを実行する必要があるためです。これには root 権限が必要です。setuid コマンドを使用した後、root 権限でシステム コールを行うために、C++ で関数 execve を使用しています。環境変数の脆弱性を作成しないように環境を壁で囲みたいので、具体的には execve コマンドを選択します。

 setuid(0);
 execve(acExeName, pArgsForExec2, pcEnv);

私がやりたいことは、プログラムが必要とするプログラムを実行するための環境変数リストである pcEnv を正確に見つけることです。たとえば、ツール time-admin をコンソールから実行しているかのように実行したい場合、必要な環境変数をどのように把握すればよいでしょうか。コマンドprintenvを使用して環境変数を出力できることは知っていますが、それですべてが得られます。それらすべてを必要とせず、できるだけ小さなサブセットが必要だと確信しています。

それらをすべて使用してから、ゆっくりとそれぞれをコメントアウトして、それが機能し続けるかどうかを確認できることはわかっていますが、実際にはそこまで行きたくありません.

プログラムで使用されている環境変数を特定する賢い方法を知っている人はいますか? Ubuntu 12.04 LTSのインストールでこれを行っていることを追加する必要があります。

助けてくれてありがとう。

4

1 に答える 1

2

一部のプログラムで使用される環境変数を把握する一般的な方法はありません。たとえば、プログラムに環境変数の名前を与える構成ファイルがいくつかあると想像できます。

実際、多くのシェルのようなプログラム (またはスクリプト インタープリター) がそれを行っています。

より一般的には、getenv(3)への引数を計算できます。したがって、理論的には、可能な値を推測することはできません。(私が間違っているかもしれませんが、一部の非常に古いバージョンのlibcと はbashそのようなトリックを実行していました。残念ながら詳細を忘れてしまいましたが、名前に pid 番号を含む環境変数が使用されることがありました)。

そして、他の人がコメントしたように、 を使用するltrace(またはLD_PRELOADトリックをする) かgdb、 を使用して、 がどのように呼び出されるかを調べることができますgetenv...

また、アプリケーションは、environ変数 ( environ(7)main ... を参照) または...の 3 番目の引数を使用する場合もあります。

ただし、実際には、適切に作成されたプログラムは、使用しているすべての環境変数を明確に文書化する必要があります....

プログラムのソース コードにアクセスできる場合は、GCC でコンパイルされている場合は、MELT プラグイン(リリースされたばかりのバージョン 1.0) を使用できます。MELT は GCC を拡張するためのドメイン固有言語であり、プログラムのコンパイル中に GCC によって処理される内部 Gimple 表現を調査するために使用できます。特に新しいfindgimpleモードgetenvでは、1 つのコマンドですべての呼び出しを定数文字列で見つけることができます。

于 2013-10-29T17:42:01.813 に答える