2012-04-29 16 views
3

AndroidアプリでFacebook Android SDKを実装しています。このAndroidアプリでは、Facebookからの呼び出しが有効になるようにFacebookのアプリ署名を保存する必要があります。私たちは、私は、次の質問を持って、それが唯一の我々のアプリで使われていることを確認するために私たち自身のバックエンドのためにこのシステムを使用したいとこれに係るたい:Android facebook-sdk署名セキュリティ

(関連するクラスを見つけることがhttps://github.com/facebook/facebook-android-sdk/tree/master/facebook/src/com/facebook/androidを参照してください)

  1. 明らかに、署名を照合して呼び出しを検証するには、アプリケーションの署名をサーバーに送信する必要があります。 sdk内で、これがどこで行われたのかわからないのですか?
  2. httpsが使用されていないようですが、それは間違いありませんか? (Util.java)
  3. このシステム全体を無意味にするために署名を盗聴することはできませんでしたか?
  4. Facebook.javaは、ファイルの最後にFacebookのアプリケーションの署名を保持します。これを変更するのは簡単ではないようです。しかし、インテントを送信するアプリのシグネチャは、そのインテントを通じて解決することができます。 Androidシステムがこれを管理しているため、署名を捏造することはできません。しかし、AndroidシステムがURLを呼び出すと、プロトコルに署名が追加されますが、それは不変です。私は、上記の質問に私が不思議に思うのではないでしょうか。

[nitzanへの返信で編集& zapl]

私は何を達成しようとしているが、FacebookのSDKはそのサーバー上の署名を保存する必要が理由と同じです。私たちのバックエンドへの呼び出しは、私たちのアプリから送られ、何も送っていないことを確認します。ボットや他のアプリがサーバーAPIにアクセスすることを許可したくありません。 facebook sdkには、インテントがFacebookアプリケーションから発信されたかどうかをチェックするメソッドがあります。これは、Androidシステムによる署名とインテントの管理が閉じられているため安全です。これを妥協する唯一の方法は、変更されたAndroidバージョンを実行することです。これにより、アプリ署名を無効にすることはできますが、ビルドと実行は無視できません。しかし、アプリケーションを実行すると、非httpsプロトコルを介して送信されたシグネチャを傍受し、このシグネチャをAPI呼び出しで使用するアプリケーションを構築することはできません。そのようなシステムを動作させる唯一の方法は、httpsを使用することだと思われます。これは、facebook sdkにはないようです。

上記のインテント検証方法は、FacebookのサーバーへのURL呼び出しとは異なります。インテントは、デバイス上のFacebookアプリをSDKを実装するアプリと通信させるために使用されます。 Androidシステムは、入ってくるIntentと共に送信されたFacebookアプリの署名が偽造されないようにして、Facebookアプリ - アプリ通信システムが安全であることを保証します。この内部システムとは対照的に、私の質問は、サーバーに送信される外部呼び出しシステムのことです。署名が呼び出しに不変で送信される可能性がある場合、基本的にIntentシステムと同じシステムを実装します。我々は仮定したものとしては対向

[編集2]

、それはアプリ署名が容易に取り出されるが判明しました。アプリは非公開の開発者キーを使用して署名する必要がありますが、これはAndroidのアプリに関するセキュリティを脅かすことはありませんが、明らかにAPIの呼び出しをサーバサイドで検証するためには使用できません。

これは、多くの質問につながる:それは簡単に妥協している間

  1. はなぜFacebookはこのシステムを実装していますか?
  2. サーバーAPIのアクセスを特定のアプリに限定する他の既知の実装はありますか?(難読化以外)
+0

あなたは正確に何かを保護しようとしていますか? –

+0

こんにちは、私の更新された質問 –

+0

を参照してくださいそれは私が望むサーバーに何かを返すようにFacebookのアプリケーション/ APIを変更することができますので安全ではありません。誰も私がフェイスブックサーバーに私が偽者だと言うように強制しません。 – zapl

答えて

1
  1. 私は分かりません。
  2. はい、fbconnect:// Uriをhttp://に置き換えているようですが、このコードを使用した接続では暗号化がないことを意味します。
  3. 私はそう思う、それを確認するためにそれを試してみてください。
  4. これを変更することは問題ありません。apkをデコンパイルしていくつかのコードを変更し、必要に応じてコンパイルすることができます。あなたができない唯一のことは、apkに再度署名することです(あなたはそれに必要な秘密鍵がありません)。または、独自のコードで署名を使用することもできます。
    インストール時にアプリケーションの署名チェックが行われ、署名が要件と一致しない場合は、マニフェストで要求する権限が削除されます。 apkを更新すると、新しいapkの署名が古い既存のapkと照合され、署名が一致しないとアップグレードが失敗します。しかし、あなたは古いものを削除し、あなたの偽のものをインストールすることができます。
    あなたのアプリからインテントを送信した場合、システムにはおそらく送信者のパッケージが含まれており、あなたはそれを変更するアクセス権がありません。

また、サーバーを認証するための全体的なポイントは、アプリを認証するための防弾方法がないため、最終的にセキュリティの問題ではありません。他の人がAPIを悪用することをより困難にするために使用され、誰がAPIを使用しているかを追跡するために使用されます。

認証メカニズムでは、apk内に何らかの種類の秘密鍵が必要です。しかし、あなたは潜在的に邪悪な顧客にそのAPKを発送するので、あなたはそれ以上のコントロールを持っておらず、キーを抽出して悪用することは可能です。キーを難読化して入手するのが難しいだけです。しかし、それは最終的に不可能です。


ここで、バックエンドサーバーと通信するアプリがあり、自分のアプリをデバイスにダウンロードしているとしましょう。私は.apkを私のデバイスから取り出し、逆コンパイルして、サーバとの通信がどのように動作するかを見つけ出すことができます。これはhttpsが作成される前の平文です。私はまた、あなたのアプリの署名が、デバイス上とapk内のxmlファイルに格納されていることを確認することもできます。それから、私はあなたのアプリを変更するか、あなたのアプリではないことを除いて、あなたのものとまったく同じようにその情報を使用する新しいものを作成します。 httpsを使用することは問題ありませんし、あなたの期待する署名を送ることもできます。

これを防ぐことはできません。あなたはそれをするのが難しいだけです。

+0

こんにちはZapl、これは当てはまりません。そのアプリの非コンパイルバージョンから元のアプリの署名を取得することはできません。署名は、Androidシステム内のメソッドを通じて取得され、Androidシステム内では、開発者キーで作成された署名を参照します。逆コンパイルするユーザーはこのキーを持っていないため、元の署名を返すような方法でアプリに署名することはできません。 –

+0

私は逆コンパイルで取得できない場合、あなたのアプリはそれを送ることができません - デバイスは、あなたがそれを送ることができないように署名を作成するために使用された秘密鍵に到達する方法がありません。署名されたapkファイルを解凍し、 'META-INF'を見て、あなたのサーバーに送る鍵があることを確認してください。 – zapl

+0

META-INFフォルダには3つのファイルがあり、それぞれの資産に対してSHA1-Digestハッシュを定義しているようです。アプリケーションの署名はどこで見つけられますか? –

0

信頼できないデバイスで実行されているアプリケーションを検証するには、アプリケーションからの通信に、そのアプリケーションだけが保持する鍵でデジタル署名する必要があります。

アプリの作成者は、詐欺師に使用するために抽出するのが比較的難しいように、アプリ内でキーを隠匿する必要があります。しかし、それを抽出することは不可能にすることはできません。

アプリの抽出された鍵で武装している詐欺師は、それだけに基づいて任意のユーザーであることをふりかえるべきではありませんが、実際のパスワードを持つ実際のユーザーが(ふつうまたは無意識のうちに)アプリケーションのバージョン。サーバーに実際にログインできるということは、無意識のユーザーからのパスワードを単純に盗むように設計された偽のアプリの要件ではないことに注意してください。

SSLは、壊れたSSLがあるプラットフォームにインストールするか、インターセプトを達成するために内部SSL実装を破るためにパッチを当てることができるため、アプリ自体を保護するためにはほとんど価値がありません。ただし、効果的なSSLは、妥協のないデバイスでアプリのユーザーを保護するのに役立ちます。

+0

android-facebook-sdkに続いて、この「アプリだけが保持する鍵」がアプリの署名になります。しかし、zaplが指摘するように、このシグネチャは逆コンパイルによって公開されているようです。我々は、アプリケーションを保護しようとしていないが、私たちのアプリへのサーバーのAPIアクセスを制限したいと思っていることに注意してください。 –

+0

jarsignerの結果を意味する場合、逆コンパイルはほとんど必要ありません。すべてのzipfileツールがそれを行います。それはただばかだ。 –

関連する問題