2011-01-24 19 views
0

私はデータを暗号化するためにシェル上でopensslを使い、後でObjC/C/C++プログラムで実行時にデータを解読したいと思います。 opensslライブラリを使って動作させることができなかったので、私は "コンソール上"のプログラムからopensslを呼び出し、popen()などを使って暗号化された結果をパイプに戻します。これは完全に動作しますが、それを「内部的に」使用しています。コメントやヒントについてopensslをパイプ経由で使用するのは安全ですか?

おかげで、私はまだウェブ上で有益なものを発見していないよう...
マティアス

+0

私は、Kjetilの答えに記載されている理由で_not_を行うことをお勧めします。おそらく、あなたは別の質問を開いて、図書館で働くことの困難を記述することができますか? –

+0

すぐにお返事ありがとうございます!新しい質問をこのスレッドにリンクするにはどうすればよいですか?単に答えるだけで、おそらくOTの議論に終わるでしょう。 – Matthias

+0

さて、私はより多くの背景情報とコードサンプルで新しい質問を開きました。http://stackoverflow.com/q/4783905/399763 – Matthias

答えて

2

あなたが潜在的にそれはないということを超えて、より多くの攻撃ベクトルのカップルに自分をさらすしていますOpenSSLライブラリとのリンクやOpenSSLライブラリを使用するよりもはるかに安全です。

popenから実行しているプログラムとその引数は、コマンドラインで直接キー材料を指定できれば、/ proc/<pid>で公開されます。/cmdline(およびps/top/etc)。これは、別のプロセスを介して復号化し、パイプを介して別のアプリケーションに渡す場合、私が最も心配することです。 root権限を持っていれば、環境に合わせて鍵素材を渡すと、/ proc/< pid & gt/environも読めるようになります。ルートになっていれば、他のすべてのこともできます。 openssl(ライブラリ/バイナリ+パイプ)を使う方法に関係なく、あなたのものを保持してください。

opensslバイナリを悪意のあるものに置き換えるか、popen/shellにpops/shellに使用させるopensslバイナリを決定させる場合は、PATHに先に注入するなど、いくつかの方法があります。 key-materialとciphertextをより簡単な手段で保持することができます(あるいは、opensslに対する動的なリンクもきちんと無効になる、悪意のあるopensslライブラリを置き換えるかLD_PRELOADすることができます)。同じことがパイプ上のスヌーピングのために行われ、ルートまたはユーザーとして実行する必要があります。

つまり、argvで敏感なものを公開することなくポップできれば、OpenSSLライブラリを使用するよりもはるかに安全です。はい、あなたのものを手に入れる方法はいくつかありますが、とにかくあなたのものを掴むことができるユーザーとして実行する必要があります(おそらくもう少し努力する必要があります) 。

+0

これはあらかじめ予想以上に少し複雑に思えます。私は機密情報を外部呼び出しに渡すことを回避できるのではないかと疑うので、統合されたソリューションに戻ってください。 – Matthias

関連する問題