3

特定のコマンド ライン引数を受け入れる実行可能ファイルがあります。マシン上のすべてのユーザーは、ps (Unix) または procexp (Windows) を実行して引数を見つけることができます。これらの引数の一部は、パスワードのようなものです。そのようなパスワードを渡すべきではないことはわかっています。

実行可能ファイルのコードを変更して、ps/procexp を実行している他のユーザーが実行可能ファイルの起動に使用されたコマンド ライン引数を認識できないようにする方法はありますか?

これを行うためのプラットフォームに依存しない方法はないと確信していますが、これを行うための各プラットフォーム固有の API があったとしても、それは良い出発点になります。コメント/提案や考えをお待ちしております。

よろしく、

4

8 に答える 8

6

安全でないソリューションを少し安全にしようとしています。なぜそれをより安全にしないのですか?

簡単なハックは、制限されたアクセス許可に設定されているファイルにパスワードを書き込み、呼び出された実行可能ファイルによって読み取られた直後に削除することです。ファイルがディスクに書き込まれる場合でも、ビットがハード ドライブにまだ存在するリスクがあります。ただし、RAM ディスクを使用することで、この問題を解消できます。

または、実行可能ファイルに秘密鍵を与え、対応する公開鍵を使用してパスワードを暗号化することもできます。これは少し手間がかかりますが、はるかに安全です。もちろん、鍵管理の問題もあります。

于 2010-09-28T19:09:22.077 に答える
3

argv出力に示されているものをクリアすることに依存するメソッドはps競合状態になるため、安全ではありません。つまり、プロセスが開始されてから、公開されている引数をクリアできるようになるまでに、一定の時間がかかります。

この機能が必要な場合 (コマンド ラインでパスワードを渡すことは非常に悪い考えです)、コマンド ライン引数の読み取りを完全に無効にするか、機能を完全に無効にすることさえできる強化されたカーネルを使用する必要がありますps。これを行うための安価な方法の 1 つ (ただし、問題が発生する可能性があります) は、 unmounting/procです。

于 2010-09-28T19:21:21.660 に答える
2

そのinit例では、セグメンテーション違反が発生します

ただし、これは機能します。

int main(int argc, char *argv[])
{
    char * argv0 = argv[0];
    int i;
    size_t len;
    for (i = 0; i <argc; ++i)
    {
        len = strlen(argv[i]);
        memset(argv[i], 0, len);
    }
    strcpy(argv0, "Hey, can you see me?");
    for (;;);
    return 0;
}
于 2010-09-28T20:16:49.683 に答える
2

基本的な答えは、おそらくコマンドラインでデータを渡さず、代わりに RPC を使用することだと思います。stdin は、後で削除するファイルへの書き込みと同様に、貧弱な RPC であり、より洗練された方法があります。

たとえば、Windows でセキュリティが本当に心配なら、名前付きパイプを使用することをお勧めします。必要に応じて、セキュリティ アクセス許可を適用し、データを暗号化できます。より移植性の高いアプローチのために、おそらく共有メモリを使用することもできます。

ただし、どの RPC ソリューションでも、通信の両側を変更する必要があることは明らかです。ただし、OS を変更して通常の操作を防止したり、文書化されていない実行時の動作に依存したりして、データを難読化しようとすることは、セキュリティ的には悪い考えのように思えます。

それが役立つことを願っています。

于 2010-09-29T00:44:05.900 に答える
2

パスワードを読み取り保護されたファイルに書き込み、引数として渡すのではなく、新しい実行可能ファイルからパスワードにアクセスできます。 psミーガーのコメントから明らかなように、あなたの唯一の敵ではありません。

于 2010-09-28T19:07:38.603 に答える
1

の一部のバージョンでは、リストinitに表示されるようにコマンド ラインが上書きされます。initps

int main(int argc, char * argv[]) {
   // process the arguments or make a copy of them
   // and then

   char * argv0 = argv[0];
   while (*argv++) {
      size_t len = strlen(*argv);
      memset(*argv, 0, len);
   }
   strcpy(argv0, "init");

この種のものが使用されているのを見て、また *nix が機能するように設計できることに驚きました。ところで、それが機能するかどうかをテストしていませんが、引数が含まれているのは実際のメモリである必要があり、ポインター配列だけをそれらの引数にコピーしても機能しないことを読みました。

コマンドライン (またはLinux/proc/<pid>/environで argv があるのと同じように環境変数にアクセスできるため) を介して機密情報を渡すことは、依然として壊れた方法です。/proc/<pid>/cmdline

于 2010-09-28T19:21:48.737 に答える
0

パスワード コマンド ラインを使用すると、プログラム自体を再実行し、情報を 2 番目のインスタンスに渡し、最初のインスタンスを強制終了して、コマンド ライン情報が存在する時間を短縮できます。

唯一の良い答えは、コマンドラインで情報を渡さないことです。

于 2010-09-28T19:23:55.240 に答える
0

私は通常、すべての機密データを stdin から読み取ります。たとえば、Linux の isql (Sybase SQL シェル) では、次のようなことを行います。

isql -U username <<EOD
password
select * from whatever
go
于 2010-09-28T20:23:14.917 に答える