Androidセキュリティ-クライアントセキュリティのポイント


一、前言:
最近のフェイスブックのプライバシー流出事件は再びプライバシーへの関心を呼び起こし、プライバシーをますます重視する時代には、セキュリティはすでに避けられない話題となっている.
開発者として、安全意識を備え、基礎的な安全知識を身につけ、より安全な応用を築くために努力しなければならない.本文はAndroidクライアントのセキュリティ問題について簡単に述べ、コンポーネント、WebView、ストレージ、転送、ログ、混同、応用強化などのセキュリティホールと防護戦略に関連し、より合理的な配置と防護措置を運用して応用のセキュリティレベルを高める.
二、コンポーネントの安全:
Android標準コンポーネント(Activity、Service、Receiver、Provider)へのアクセス権を指定します.
ここで述べたコンポーネントアクセス権限とは、主にアプリケーション間のプロセス間通信(IPC,Inter-Process Communication)を指し、開発者はアプリケーション内のコンポーネントが他のアプリケーションによって呼び出されることを許可するか、外部アプリケーションからのデータを受信するか、または私たちのデータにアクセスするかを制限することができる.外部からの攻撃を避けるために、外部アプリケーションからのデータを検証処理しなければならない.悪意のある呼び出しコンポーネント、ブロードキャストデータ攻撃、悪意のあるアクセスデータなど.
  • 権限オープン属性の設定:android:exported=["true"|"false"]
  • exportedプロパティは、4つのコンポーネントの共有プロパティであり、意味は大きく異なります.デフォルト値は、含まれるかどうかによって決まります.含まれていない場合はfalseがデフォルトで、少なくとも1つが存在する場合はtrueがデフォルトです.
    Activity:外部アプリケーションコンポーネントの起動を許可するかどうかを示します.「false」の場合、Activityは同じアプリケーションまたは同じユーザーIDの異なるアプリケーションでのみ起動できます.
    Serviceでは、外部アプリケーションコンポーネントがサービスを呼び出すことを許可するか、またはそれと対話するかを示します.「false」の場合、Activityは同じアプリケーションまたは同じユーザーIDの異なるアプリケーションでのみ起動できます.
    Receiverでは、システムまたは他のアプリケーションからのブロードキャストなど、アプリケーション以外のメッセージを受信できるかどうかを示します.「false」の場合、ブロードキャスト受信機は、同じユーザIDを有する同じアプリケーションまたはアプリケーションのコンポーネントから送信されるメッセージのみを受信することができる.
    Provider:他のアプリケーションがコンテンツプロバイダにアクセスできるかどうかを示します.「false」の場合、Providerと同じユーザーID(UID)を持つアプリケーションがアクセスできます.他のアプリケーションにコンテンツを提供する必要がある場合は、読み書き権限を制限する必要があります.
  • カスタム権限
  • の構成
    1、AndroidManifest.xmlでcomという名前を定義します.fedming.demo.ACCESSの権限:
    "string resource"
                android:icon="drawable resource"
                android:label="string resource"
                android:name="com.fedming.demo.ACCESS"
                android:permissionGroup="string resource"
                android:protectionLevel=["normal" | "dangerous" | "signature" | ...] />
    2、android:protectionLevel="signature"は署名保護レベルを表し、「署名」レベルの権限の内容はユーザーに完全に透明で開放的であり、権限検査を実行するアプリケーションの開発者が署名したアプリケーションのみがこれらのコンテンツにアクセスできる.
    3、4つのコンポーネントまたはアプリケーションに適用するandroid:permission="com.fedming.demo.ACCESS」は、同一でない署名アプリケーションへの制限的なアクセスを実現します.一般的に、一部の内部アプリケーション間で共有されるプライベートコンポーネントに使用されます.
    より安全で効率的なLocalBroadcastManagerの使用
    BinderベースのBroadcastReceiverとは異なり、LocalBroadcastManagerはHandlerベースで実現され、より高い効率とセキュリティを備えています.セキュリティは主にデータがアプリケーションの内部伝送に限られていることに現れ、放送がブロックされ、偽造され、改ざんされるリスクを避ける.使い方を簡単に理解します.
  • カスタムBroadcastReceiver
  • public class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
     //Do SomeThing Here
        }
    }
  • 登録Receiver
  • MyReceiver myReceiver = new MyReceiver();
    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
    IntentFilter filter = new IntentFilter();
    filter.addAction("MY_ACTION");
    localBroadcastManager.registerReceiver(myReceiver, filter);
    
  • ローカルブロードキャスト
  • を送信する.
    Bundle bundle = new Bundle();
    bundle.putParcelable("DATA", content);
    Intent intent = new Intent();
    intent.setAction("MY_ACTION");
    intent.putExtras(bundle);
    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
  • Activity破棄時に登録を取り消す
  • @Override  
    protected void onDestroy() {   
       super.onDestroy();  
       localBroadcastManager.unregisterReceiver(myReceiver);    
    }   
    アプリケーション関連属性の構成
  • debugable属性android:debuggable=["true"|"false"]
  • 多くの人が公開時に手動でfalseに設定すると言っていますが、実際には公式ドキュメントの説明によると、デフォルト値はfalseです.
  • allowBackupプロパティandroid:allowBackup=["true"|"false"]
  • バックアップをサポートするかどうかを設定します.デフォルト値はtrueです.このプロパティを慎重にサポートし、アプリケーション内のデータがバックアップを通じて漏洩する問題を回避する必要があります.
    三、WebView安全
  • JS機能を慎重にサポートし、不要なトラブルを回避します.
  • Android 4について言及する.2以下のJS任意コード実行脆弱性、Android 4.2以下?応援する必要はないでしょう.
  • httpsのリンクを使用してください.第一に安全です.第二に、気持ち悪いキャリアにハイジャックされたり、広告を挿入したりして、ユーザーの体験に影響を与えることを避けることです.
  • fileプロトコルセキュリティホール
  • を処理する
    //     ,      file   
    setAllowFileAccess(false);
    setAllowFileAccessFromFileURLs(false);
    setAllowUniversalAccessFromFileURLs(false);
  • パスワード明文保存脆弱性
  • WebViewではパスワード保存機能がデフォルトでオンになっているため、ユーザーがパスワードを入力するとプロンプトボックスがポップアップされ、ユーザーに保存するかどうかを尋ねます.保存を選択すると、パスワードは/data/data/comに明文で保存されます.package.name/databases/webview.dbでは、パスワードを盗まれる危険があります.ウェブページのパスワードの保存を禁止してsetSavePassword(false)
  • セキュリティブラウズモード
  • がオン
    
        "android.webkit.WebView.EnableSafeBrowsing"
               android:value="true" />
         
         ... 
        
    
    セキュリティブラウズモードを有効にすると、WebViewはセキュリティブラウズの悪意のあるソフトウェアと釣りサイトのデータベースを参照してアクセスしたURLをチェックし、ユーザーが開く前に危険なヒントを与え、Chromeブラウザのような体験をします.
    四、データストレージの安全;
  • 鍵及び機密情報
  • このような構成は、クラス内で機密情報をハードコーディングしないように適切に保存され、JNIを使用して機密情報をNativeレイヤに書き込むことができます.
  • SharePreferences
  • まず、SharePreferencesを使用して機密情報を保存する必要はありません.一部の構成情報を格納する場合も、プライベートアクセスMODE_などのアクセス権を構成する必要があります.PRIVATEは、構成情報の改ざんを避ける.
  • 署名構成signingConfigs
  • 署名パスワードを明示的に保存しないで、バージョン管理システムをアップロードする必要がなく、パスワードをローカルに保存できます.
    appディレクトリの下でバージョン制御システムに参加しないgradleを確立する.propertiesファイル:
    STORE_PASSWORD = qwer1234
    KEY_PASSWORD = demo1234
    KEY_ALIAS = demokey
    gradleはgradleに自動的に導入する.propertiesファイル、buldに直接使用できます.gradleファイルで使用する:
    signingConfigs {
     release {
         try {
             storeFile file("E:\FDM\Key\demo.jks")
             storePassword STORE_PASSWORD 
             keyAlias KEY_ALIAS 
             keyPassword KEY_PASSWORD
         }catch (ex) {
             throw new InvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")
         }
     }
    }
    五、データ転送の安全
  • HTTPSプロトコル
  • を使用
    HTTPSの主な考え方は、安全でないネットワーク上に安全なチャネルを作成し、適切な暗号化パケットとサーバ証明書を使用して検証され、信頼される場合、盗聴と仲介者攻撃に合理的な防護を提供することである.非常に基本的なセキュリティレベルと言えるでしょう.
  • Androidネットワークセキュリティ構成
  • この機能により、アプリケーションは、アプリケーションコードを変更することなく、より高いセキュリティ要件を満たすために、セキュリティ宣言プロファイルでネットワークセキュリティ設定を柔軟にカスタマイズできます.
    AndroidManifestでxmlでnetworkSecurityConfigを構成するには:
    "1.0" encoding="utf-8"?>
    ... >
        "@xml/network_security_config"
                        ... >
            ...
        
    
    network_security_configファイルは次のとおりです.
    
    <network-security-config>
        <domain-config>
            <domain includeSubdomains="true">example.comdomain>
            <trust-anchors>
                <certificates src="@raw/my_ca"/>
            trust-anchors>
        domain-config>
    network-security-config>
    PEMまたはDER形式でres/raw/my_に自己署名または非公開CA証明書を追加ca.年前に浸透テストの結果を聞いたときの恐怖を思い出す.いいやつ、自分で証明書を入れた.
    詳細、機能については、公式ドキュメントのネットワークセキュリティ構成を参照してください.
    六、その他の安全問題
  • ログ出力
  • ログは、開発デバッグに不可欠な部分ですが、機密情報を漏洩しやすい場所でもあります.したがって、アプリケーションをパブリッシュするときは、ログ出力をオフにしたり、削除したりする必要があります.
  • 混同、補強
  • コードを混同することで、反コンパイル解読の難易度を高めることができます.しかし,混同機能を使用する場合も,実体クラス,JSとのインタラクションの方法,サードパーティ混同構成などの問題に注意する.
    応用補強も近年人気のある応用安全ソリューションであり、各メーカーには独自の補強案があり、テンセント楽固、360補強などよく見られる.
  • 脆弱性検出ツール
  • プロジェクトのコード量が膨大になると,履歴コードが多く蓄積され,人工的にコードを検出する作業量が大きい.このとき,脆弱性チェックツールが役に立つ.中国語の脆弱性検出ツールで有名なのが360のFireLineです.
    参考資料:
    Security for Android Developers
    Android Intent Scheme URLs攻撃
    Javaコードは安全ですか?それとも露出しますか?
    Android WebView詳細、一般的な脆弱性詳細、セキュリティソース
    原文住所:https://www.jianshu.com/p/7f2202c18012