2

Java main()スルーを呼び出し、popen()コマンドライン引数としていくつかのデータを送信する必要がある C プログラムを開発しています。Javaただし、本質的にやや機密性の高いデータを送信する必要があるデータがいくつかありCます (ただし、パスワードの種類ではありません)。

この余分なデータを C から Java に送信するための暗号化以外のオプションがあるかどうかを確認しようとしています。データは暗号化するほど機密性が高くないため、オーバーヘッドを回避しようとしていますが、この点に関する提案は受け付けています。

この余分なデータは、popen() を通じて表示されるため、送信できませんps -f

tcpdump同様に、ソケットの使用は、その情報も明らかにする可能性があるため、実行可能ではないようです。

共有の使用を検討しましmem (/dev/shm)たが、それも表示または隠しファイルを使用できます。これには、呼び出しごとにファイルを作成するオーバーヘッドも伴うため、私は完全に賛成しているわけではありません。

ファイルマッピングを見ましたANONが、Java側では使用できないと思います。同様に、fmemopen()Java では参照を使用できないようです。FIFOパイプはより良い選択肢でしょうか?それとも簡単に読めますか?

プレーンに頼ってmmap()データを書き込むだけで(ディスク上に作成しない-オープンコールでO_CREATなし)、実行しないと、msynch完全にメモリに残りますか?それからJavaで読むことはできますか?

暗号化は私の唯一のオプションですか、それとも基本的なものが欠けていますか?

このリンクでは、C から Java にプレーン データを送信する方法について説明しています。

4

2 に答える 2

2

ユーザーが tcpdump を使用できる場合、ユーザーは root アクセス権を持っています。このユーザーは、データが暗号化される前であっても、Java プログラムにデバッガーを配置して、その動作を正確に確認することもできます。必要なものを実現する唯一の方法は、Skype クライアントが行うように、完全な難読化技術と暗号化を使用することです1

しかし、あなたは同時に、データはそれほど機密ではないと言っているので、やり過ぎのように思えます。おそらく単純な難読化手法で、出力がカジュアルなオブザーバーに見えないようにするだけで十分でしょうか? (ロッカーが提案したように。)それか、システム(Java + Cプログラム)が実行されているサーバーで「信頼できない」ユーザーがルートアクセス権を持っていないことを確認してください。

まともな2難読化とおそらく良いトレードオフは、通信に mmap() (または System V共有 mem ) を使用することです。

MAP_LOCKEDオプションとMAP_ANONYMOUSを使用すると、メモリ領域がディスク上に配置されなくなります。MAP_LOCKEDはスワップを防止し、MAP_ANONYMOUSは OS にバッキング ファイルを使用しないように指示します。

また、代わりにJNIを使用して C コードにアクセスすることを検討しましたか? そうすれば、C コードは Java プロセスの一部になり、信頼できないユーザーは何が起こっているのかをスパイするためにデバッガーを必要とします。


1 Skype クライアントをスパイすることは不可能ではありませんが、非常に困難です。ただし、これには代償が伴います。難読化手法をそのまま維持しながら、そのコードを維持するには、余分なコストがかかるはずです。それはまた、Skype のプログラマーと、それがどのように機能するかを解明しようとする研究者との間の軍拡競争でもあります。

2それは長い間私を止めさせ、何が起こっているかを理解する前にデバッグ技術について多くのことを読まなければならず、その後、2 つのプログラムの間で何が「話された」のかを理解するために多くの作業をしなければなりませんでした。もっと才能のある人なら、せいぜい午後ですべてを解読するでしょう。

于 2013-09-23T06:22:54.133 に答える