4

インジェクションを検出するためにコードを強化している人はいますか? たとえば、誰かが NSUrlConnection を介してユーザー名/パスワードを傍受しようとしている場合、LD_PRELOAD/DYLD_LIBRARY_PATH.

Ali は以下に優れた情報を提供してくれましたが、私は、電話が脱獄される可能性がある敵対的な環境に対してどのような対策を講じるべきかを判断しようとしています. ほとんどのアプリケーションは気にする必要はありませんが、あるクラスのアプリは気にする必要があります - 高整合性ソフトウェアです。

硬化している場合、どのような方法を使用していますか? Mac と iPhone でインジェクションを検出する標準的な方法はありますか? フレームワーク インジェクションをどのように打ち負かしていますか?

4

2 に答える 2

1

iOS / CocoaTouch の場合、動的ライブラリのロードは許可されていません* (システム フレームワークを除く)。アプリケーションをビルドして AppStore 経由で配布するには、静的ライブラリとシステム フレームワークのみをリンクできます。動的ライブラリはリンクできません。

したがって、iOS ではコード インジェクションにそれを使用することはできずLD_PRELOAD、もちろん使用することもできません (iOS ではそのような環境変数にアクセスできないため)。

ジェイルブレイクされた iPhone はおそらく例外ですが、iPhone をジェイルブレイクしている人は、定義上、ジェイルブレイクとは、iOS によって提供されるすべてのセキュリティを解除して、注射などを回避することであると自負する必要があります。あなたの鍵を使ってください…それでも、家を強盗する泥棒から守られていることを期待してください;-))

これが、iOS での Sandboxing + CodeSigning + No dylib 制約の利点です。コード インジェクションはできません。

(OSXでは、特にLD_PRELOADを使用して、とにかく可能です)


[編集] iOS8 以降、iOS は動的フレームワークも許可します。ただし、それはまだサンドボックス化されているため (アプリケーション バンドル内にあるコード署名されたフレームワークのみを読み込むことができ、アプリ バンドルの外部からのフレームワークを読み込むことはできません)、インジェクションはまだ不可能です*

*ただし、ユーザーが電話を脱獄した場合を除きますが、それは、ユーザーがすべての保護と目的を取り除くことを選択したため、電話を危険にさらすことを意味します — 電話のセキュリティを破ることはできず、それでもすべての保護を提供することを期待しています提供有価証券

于 2012-09-05T19:27:29.397 に答える
0

これは、オペレーティング システムのような UNIX に固有の回答です。質問の意味をなさない場合は申し訳ありませんが、プラットフォームはよくわかりません。動的にリンクされた実行可能ファイルを作成しないでください。

これを行うには2つの方法が考えられます。方法 2 がおそらく最適です。どちらも似ています。

両方にとって重要です。実行可能ファイルは、ビルド時に使用して静的にコンパイルする必要があります-static

  1. 方法 1 - 静的な exe、信頼できるフル パスによる共有ライブラリの手動ロード

dlopenフルパスを介して必要な各ライブラリを手動dlsymで実行し、実行時に関数アドレスを取得し、それらを関数ポインターに割り当てて使用します。使用するすべての外部関数に対してこれを行う必要があります。再入可能で安全でない関数はこれを好まないので、静的変数を使用する場合は、再入可能で安全なバージョンを使用する必要があります。これらは「_r」で終わります。つまり、strtok_r代わりに使用しますstrtok

これは、アプリの機能と使用している機能の数によって、難しい場合と簡単な場合があります。

  1. 方法 2 - 実行可能ファイルを静的にリンクする、ピリオド

動的ライブラリをまったく使用しないように静的実行可能ファイルをリンクするだけで、Subversion の問題を解決できます。dlopen()/dlsym()これにより、メソッドよりもはるかに大きな exe が生成されます。compile フラグを使用してビルドし、使用する-static代わりに、たとえばgcc bah.c -o bah lssl使用gcc -static bah.c -o bah /usr/lib/libssl.aして、動的共有ライブラリの代わりに必要なライブラリの静的にコンパイルされたバージョンを使用します。つまり、ビルド中に使用する場合と使用-staticしない場合-l

どちらの方法でも:

  1. ビルドしたらfile bah、実行可能ファイルが静的にリンクされていることを確認するために使用します。または、実行lddして確認します
  2. システムに存在する、リンクしているすべてのライブラリの静的にコンパイルされたバージョンが必要になることに注意してください。これらのファイルは、.a代わりに.so)で終わります
  3. また、システム ライブラリをアップグレードしても、実行可能ファイルは更新されないことに注意してください。OpenSSL に新しいセキュリティ バグがある場合は、最新の libssl.a を入手して再コンパイルする必要があります。この方法を使用すると、dlopen()/dlsym()この問題は発生しませんが、異なるバージョンでシンボルが変更された場合、移植性の問題が発生します

各方法には、ニーズに応じて長所と短所があります。

方法 1dlopendlsymアプローチを使用すると、コードがより「難読化」されて小さくなりますが、ほとんどの場合、移植性が犠牲になるため、おそらくあなたが望むものではありません。利点は、セキュリティ バグがシステム全体で修正された場合に役立つ可能性があることです。

于 2017-04-09T15:33:41.300 に答える