2016-01-12 11 views
5

いくつかの秘密データを含む共有メモリセグメントを作成する必要があります。私はshmgetshmat関数を使用して、権利でセグメントにアクセスします。私はこのメモリセグメントをフォークされたプロセスだけで共有したいと思います。私はこのセグメントにアクセスしようとした別のアプリケーションを作成しようとしましたが、失敗してしまいました。非分岐プロセスからの共有メモリへのアクセスを拒否する

しかし、私は再びセグメントを作成したアプリケーションを実行すると、セグメントにアクセスすることができます。どのように可能ですか?秘密のデータを共有メモリに保存することをお勧めしますか?

答えて

4

共有されたsegはプロセスに属しておらず、ユーザーに属しています。効果的な設定0600では、そのユーザーにはRW(およびルート)のみが許可されますが、このユーザーとして実行されている他のプロセスは同じアクセス権を持ちます。

この目的でのみ「使用」(ログイン)する特定のユーザーを作成します。

共有メモリセグメントに秘密のデータを格納することをお勧めしますか?

セグメントがファイルであると考えてください(IPCを知る必要があります)。システムがシャットダウンしたときに消えます。

秘密をファイルに保存することをお勧めしますか?データがクリアテキストの場合はそうではないかもしれません。

ファイルまたは共有memセグメントでは、データの暗号化が改善されます。

shmemセグメントの制御方法の詳細については、this pageを参照してください。


OTOHあなたが必要とするのは、プロセスが子供と情報を交換することだけであれば、 processes pipingを参照してください。この場合、秘密のデータはプロセスヒープ/スタックメモリ内に格納され、同じユーザが所有する外部プロセスによって到達することがより困難になります。しかし、プロセスを「所有している」ユーザはプロセスメモリを読み込み(例えば、コアダンプを介して)、秘密データを検索することもできる。ずっと簡単ですが、それでも可能です。

この場合、fork()を実行する前に親プロセスで秘密データを利用できる場合、子プロセスは自動的に継承します。

もう一度、とにかく、暗号化を考えてください。

+0

は、一般的に、暗号化は大丈夫だと思うが..しかし、私は(ファイルから)最初でデータを暗号化していると、ファイルが非常に大きいです。 。そしてクリーンなデータを読みたい複数のプロセスがあるので、私は共有メモリにデータを解読したかったのです。 –

6

親プロセスにMAP_SHAREDMAP_ANONYMOUSフラグを指定することで、mmap()共有メモリ領域と匿名メモリ領域にすることができます。そのメモリは、そのプロセスとその子にのみアクセス可能です。メモリセグメントが匿名であるため、他のプロセスだけでアクセスが/それをマッピングしてみましょう、それを参照することができなくなります。

void *shared_mem = mmap(NULL, n_bytes, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 

親プロセスはmmap()を使用して共有メモリ・セグメントを作成する必要があります。そのメモリセグメントは、fork()によって作成された子プロセスによって継承されます。子プロセスは、単純にそのメモリ・セグメントを参照するために親から継承shared_memポインタを使用することができます

#include <sys/mman.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() 
{ 
    void *shared_mem = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 

    pid_t pid = fork(); 
    if (pid > 0) { 
     // parent 
     // use shared_mem here 

    } else if (pid == 0) { 
     // child 
     // use shared_mem here 

    } else { 
     // error 
    } 
    return 0; 
} 
+0

私はこれを試しましたが、おそらく私は何か間違っていました。開始直後の最初のプロセスは 'mmap'を使って共有メモリセグメントを作成し、' shmget'と 'shmat'によってアクセスされる共有メモリにポインタの値が保存されます。次のプロセス(最初からフォークされたもの)は "mmap"ポインタを読みますが、アクセスしようとするとsegfaultにつながります: - /アプリケーションはおそらく 'fork'の後に' execve'を呼び出します深く)、私は共有メモリにアクセスできません。 –

+0

いいえ、 'shmget'と' shmat'をまったく使用する必要はありません。私は私の答えを更新します。 –

+0

私はあなたに何を教えようとしているのですか?私の場合、2回の 'main'関数が実行されています。 'fork'が' execve'と呼ばれた後、変更された引数を持つ同じアプリケーションを実行するように見えます。したがって、新しいプロセスでは 'shared_mem'変数を読み取ることができません。そのため、私は共有メモリにポインタを保存しました。 –

関連する問題