In this article
Androidアプリケーションセキュリティ — 開発者のためのAndroidアプリ保護
悪意ある攻撃からAndroidアプリを守る方法
Androidアプリケーションセキュリティとは?
Androidアプリケーションセキュリティとは、Androidアプリへの不正なアクセスや悪用、改変、破壊を防ぐための対策です。スマートフォンやタブレットなどのモバイル端末が広く普及したことで、Androidはモバイルアプリの開発・配布に人気のプラットフォームとなりました。しかし、そのオープンな性質ゆえに、さまざまなセキュリティリスクにさらされています。モバイルセキュリティ対策を講じることで、ハッキングやマルウェア、データ窃取などのサイバー脅威からユーザーを守ることができます。
Androidアプリのセキュリティが重要な理由
AndroidはモバイルOS市場で圧倒的なシェアを占めており、AppleのiOSが約27.6%であるのに対し、市場シェアは71.8%に達しています。そのためAndroid端末は、メールやソーシャルメディアなど多様なデータソースへのアクセス、マイクやカメラ、位置情報など端末の機能、さらには認証プロセス(2FA)での役割を理由に、価値の高い標的と見なされることが少なくありません。開発者は、Android端末に保存される個人情報や金融情報などの機密データを守るため、セキュリティを最優先する必要があります。モバイルへの攻撃は以前から問題でしたが、攻撃者がますます巧妙なマルウェアを開発するにつれて、脅威は急速に進化しています。
攻撃者は、完全なリモートアクセス機能やモジュール設計、ワームのような特性を備え、Android端末に深刻な被害を与えるマルウェアを積極的に展開しています。こうしたマルウェアファミリーの中には、定期的なアップデートでより悪質化するものもあります。また、サイバー犯罪者は、公式アプリストアの審査をすり抜けて悪意のあるコードを侵入させる手口を巧妙化させています。
開発者が警戒すべきモバイルマルウェアの手口には、次のようなものがあります。
デバイス上での不正行為(ODF):モバイルマルウェアは、被害者の端末から直接、不正行為を実行できるようになっています。ODFはモバイル攻撃の大きな転換点となるもので、ビジネスアカウントやコミュニケーションツールを標的にする可能性があります。
電話の転送:マルウェアは、銀行にかけた電話を攻撃者が管理する別の番号に転送できます。通話画面には正規の電話番号が表示されるため、被害者は転送に気づきません。
通知からの直接返信の悪用:FluBotスパイウェア、Medusa、Sharkbotは、Androidの通知から直接返信する機能を悪用して不正な取引に署名したり、プッシュ通知を変更したり、マルウェアを拡散させたりします。この機能を使ったプッシュメッセージによるフィッシングで、ワームのように被害者の連絡先へマルウェアを広げることもできます。
ドメイン生成アルゴリズム:Sharkbotは、ドメイン生成アルゴリズム(DGA)を使って新しいドメイン名とIPアドレスを絶えず作成し、コマンド&コントロールサーバーの検知を回避します。そのため、セキュリティチームがマルウェアを検知してブロックするのは困難です。
アプリストアの検知回避:犯罪者は、AppleのベータテストプラットフォームTestFlightやGoogle Playのセキュリティ審査プロセスを悪用したり、開発者に報酬を支払ってアプリに悪意のあるSDKを組み込ませたりすることで、アプリストアの検知を回避する方法を見つけています。
開発手法の高度化:XenomorphなどのAndroidトロイの木馬は、今や高度なアップデート機能を備えて開発されています。今後、さらに多くのモバイルマルウェアファミリーがアップデートプロセスを改善し、侵害した端末に高度な機能や新しい機能を追加していくでしょう。
Androidのセキュリティ機能
攻撃者の侵入を防ぐため、Androidには、開発者がアプリを保護するためのセキュリティ機能が用意されています。主な機能は次のとおりです。
アプリケーションサンドボックス:アプリはサンドボックス環境で実行され、ユーザーデータやシステムリソースへの不正なアクセスを防ぎます。
権限:Androidプラットフォームには、アプリがアクセスできるデータやリソースをユーザーが制御できる権限システムが備わっています。
SELinux:AndroidはSecurity-Enhanced Linux(SELinux)を使用して強制アクセス制御ポリシーを適用し、悪意のあるアプリからシステムを保護します。
コード署名:Androidでは、すべてのアプリにデジタル証明書による署名が必要です。これにより、アプリが信頼できる提供元から入手されたものであり、改ざんされていないことを確認できます。
Google Play Protect:Google Play Protectは、Google Play上のアプリをスキャンしてマルウェアなどのセキュリティ脅威を検出する、組み込みのセキュリティ機能です。
実行時の権限:Android 6.0(Marshmallow)以降では、インストール時ではなく実行時に、特定のデータやリソースへのアクセス権をアプリに付与する必要があります。
ネットワークセキュリティ構成:Androidでは、SSL/TLS証明書のピンニングなどのセキュリティ設定を含め、アプリのネットワークセキュリティを開発者が構成できます。
セキュアなIPC:Androidのプロセス間通信(IPC)機構により、同じ端末上で動作するアプリやサービス間の通信を安全に行えます。
Verified Boot:Android端末には、端末のソフトウェアの完全性を確認し、不正な改変を防ぐVerified Bootプロセスが備わっています。
ハードウェアセキュリティ:Android端末には、機密データを保護するため、Trusted Execution Environment(TEE)やハードウェアで保護された鍵ストレージなどのハードウェアセキュリティ機能が備わっています。
プロのヒント:利用できる機能や最適な使い方はAndroidのバージョンや端末のハードウェアによって大きく異なります。ベストプラクティスとして、(1)関連する機能について常に最新情報を把握する、(2)アプリの対象市場を理解する、(3)それに応じて機能の使い方を設計することが重要です。OSのサービスは、できる限り活用しましょう。
Android開発で使われる言語とセキュリティ上の課題
Androidでは、Kotlin、Java、C++など複数のプログラミング言語を使ってモバイルアプリを開発できます。それぞれの言語には長所と短所、開発者が考慮すべきセキュリティ上の課題があります。
Kotlin
Kotlinは比較的新しい言語で、Android開発の標準になりつつあります。Javaよりも優れたサンドボックス機能を備えているため、Kotlinアプリがユーザー端末上のほかのアプリとやり取りする可能性は低くなります。その結果、悪意のあるアプリが機密データやリソースにアクセスするリスクを抑えられます。
Kotlinの主なセキュリティ上の課題は、比較的新しい言語であることです。Javaよりも安全だと考えられていますが、脆弱性やその他のセキュリティ問題がまだ発見されていない可能性があります。セキュリティ侵害のリスクを抑えるため、開発者は最新のセキュリティベストプラクティスを把握し、ライブラリやフレームワークを最新の状態に保つ必要があります。
Java
Javaは、Androidアプリ開発を含む幅広い用途で使われている人気のプログラミング言語です。C++より高水準の言語であるため、コードの記述や理解が容易です。一方で、より高い階層に位置するため、パフォーマンスやバッテリー駆動時間ではC++ほど効率的でない場合があります。
Javaにおける主なセキュリティ上の課題の一つは、ライブラリやフレームワークに脆弱性が存在する可能性です。一般的なセキュリティ問題であるSQLインジェクションやクロスサイトスクリプティングを防ぐため、開発者はライブラリやフレームワークを最新の状態に保ち、セキュアコーディングの実践に従う必要があります。
C++
C++は、Androidでシステムレベルのプログラミングによく使われる低水準言語です。ハードウェアに近いため、JavaやKotlinよりも高いパフォーマンスと長いバッテリー駆動時間を実現できる場合があります。しかし、WebKitやメディアフレームワーク、グラフィックレイヤーなど、さまざまなアプリで共有されるため、効果的なサンドボックス化はより困難です。
C++における主なセキュリティ上の課題の一つは、バッファオーバーフローやポインターエラーなど、メモリに関連する脆弱性が発生する可能性です。攻撃者に悪用されるおそれがあるため、開発者はC++を扱う際にこうした脆弱性を避けるよう注意する必要があります。また、C++が共有される性質を理解し、自分のコードが意図せずほかのアプリやサービスとやり取りしないよう対策することも重要です。
Snyk CodeはKotlin、Java、C++に対応しており、Androidアプリケーションのセキュリティ対策に最適です。
Androidアプリケーションセキュリティのベストプラクティス
Androidのメンテナンスを担うGoogleは、セキュリティとプライバシーのフレームワークを継続的に改善しています。一方で、Androidのバージョンごとにセキュリティ要件が異なるため、複数のバージョンで動作するアプリの開発は難しくなっています。バージョンによってAndroidの動作は異なるため、開発者は開発の初期段階から、アプリに必要な権限やプライバシー要件を考慮する必要があります。
Androidのセキュリティに関する主なベストプラクティスは次のとおりです。
安全な通信を徹底する:アプリとサーバー間のデータ通信を暗号化するため、HTTPSなどの安全なプロトコルを使用しましょう。また、証明書のピンニングを実装し、既知の公開鍵とサーバーの証明書を照合することで、信頼できるサーバーとのみ通信するようにします。
適切な権限を付与する:アプリが正常に動作するために必要な権限だけを要求し、それ以外は要求しないようにしましょう。不要な権限を要求すると、ユーザーにアクセスを拒否されたり、さらにGoogle Playからアプリが削除されたりする可能性があります。また、特定の機能をユーザーが使おうとしたときなど、必要なタイミングでのみ権限を要求しましょう。
データを安全に保管する:アプリがローカルに保存する機密データは、暗号化して保護しましょう。また、不正なアクセスができない安全な場所に保管する必要があります。たとえば、SDカードなどの外部ストレージにはデータを保存しないでください。ほかのアプリやユーザーが簡単にアクセスできるためです。
サービスと依存関係を最新の状態に保つ:既知のセキュリティ問題やバグの影響を受けないよう、アプリの依存関係やライブラリを定期的に更新しましょう。また、新たなセキュリティ脅威に関する情報を常に把握し、できるだけ早くアプリにパッチを適用してください。攻撃対象領域を最小限に抑えるため、使用していない依存関係や古い依存関係も削除しましょう。
Androidアプリケーションセキュリティチェックリスト
Androidアプリの開発で最高水準のセキュリティを確保するために、次の8項目のチェックリストを活用してください。
セキュリティと権限管理が重要:開発プロセス全体を通じて、セキュリティを最優先事項とする必要があります。プロジェクトの開始時に潜在的なセキュリティリスクや脅威を特定し、それに応じたセキュリティプロトコルを確立しましょう。ユーザー権限の管理についても検討し、アプリがアクセスするデータをユーザーが明確に理解できるようにしてください。
モバイルアプリとバックエンド間の通信:モバイルアプリとバックエンド間の通信は安全である必要があり、双方で強固なセキュリティ対策を実施しましょう。アプリとバックエンド間のすべてのデータ通信を暗号化し、HTTPSなどの安全なプロトコルを使用してください。また、証明書のピンニングを実装して、アプリが信頼できるサーバーとのみ通信するようにします。
モバイル特有の脅威シナリオ:モバイルアプリは危険な環境で動作するため、機密データが危険にさらされるおそれがあります。モバイル端末に保存する重要なセキュリティデータの量を検討し、ローカルに保存する機密データを暗号化して保護しましょう。また、盗み見などの潜在的な脅威にも注意し、適切な対策を講じてください。
Android OSで利用できるセキュリティ機能をすべて活用する:Androidには、安全なストレージや鍵管理、サンドボックス化など、さまざまなセキュリティ機能が用意されています。これらの機能を活用して、アプリのセキュリティを強化しましょう。
アプリに必要な権限を検討する:開発者はアプリに必要な権限を慎重に検討し、必要最小限の権限のみを要求する必要があります。必要な権限を扱えるようアプリを設計するには、早い段階で計画を立てることが重要です。また、アプリがどのデータにアクセスするのか、なぜそのアクセスが必要なのかをユーザーに明確に伝えましょう。
自動化を活用してサービスと依存関係を最新の状態に保つ:開発者は、自動化ツールを使ってアプリの依存関係やライブラリを管理しましょう。これにより、アプリを常に最新の状態に保ち、既知のセキュリティ問題やバグに対して脆弱な状態になるのを防げます。
サポートするOSのバージョンを明確にする:開発者は、アプリがサポートするAndroidのバージョンを明確にする必要があります。多くのバージョンをサポートするのは困難なため、ユーザーへの対応やデバイスのカバー範囲とセキュリティのバランスを取りましょう。また、ユーザーにはアプリを最新バージョンに更新し、最も安全なバージョンを利用するよう促しましょう。
テストが重要:潜在的なセキュリティリスクや脅威を検出するには、テストが欠かせません。開発者は、侵入検知やその他のホワイトハッキング手法を使ってアプリのセキュリティをテストしましょう。また、アプリの安全性を確保するため、すべてのセキュリティテストと評価のプロセスにモバイルアプリを含めてください。
Androidアプリケーションのセキュリティツール
潜在的なセキュリティ脅威を特定して防ぐには、開発者がセキュリティツール一式を導入する必要があります。Androidのアプリケーションセキュリティで一般的に使われているツールをいくつか紹介します。
SAST(静的アプリケーションセキュリティテスト):コードを実行せずに、アプリケーションのソースコードやバイナリを分析するセキュリティテストの一種です。SASTツールは、パターンマッチング、制御フロー分析、データフロー分析などの手法を使い、開発の早い段階で脆弱性を特定します。
SCA(ソフトウェア構成分析):SCAツールは、アプリケーションのオープンソースおよびサードパーティ製の依存関係を分析し、セキュリティ上の脆弱性やライセンスコンプライアンスの問題を特定します。コードをスキャンして既知の脆弱性を検出し、新たな脆弱性を監視するとともに、その修正方法を提案します。
ファジング:無効なデータ、予期しないデータ、またはランダムなデータをアプリケーションに入力し、バグや脆弱性を検出するテスト手法です。ファジングツールは大量のテストデータを生成し、アプリケーションの入力検証に潜む潜在的な脆弱性を特定します。
DAST(動的アプリケーションセキュリティテスト):アプリケーションの実行中に分析を行い、潜在的な脆弱性を特定するセキュリティテストの一種です。DASTツールは攻撃をシミュレートし、アプリケーションの応答を分析して、インジェクションの欠陥、クロスサイトスクリプティング(XSS)、認証の問題などの脆弱性を特定します。
IAST(対話型アプリケーションセキュリティテスト):IASTツールはSASTとDASTの要素を組み合わせ、アプリケーションの実行中に潜在的なセキュリティ脆弱性に関するリアルタイムのフィードバックを提供します。SQLインジェクション、クロスサイトスクリプティング、バッファオーバーフローなどの脆弱性を検出します。
監視と検知:これらのツールは、本番環境のアプリケーションを継続的に監視し、潜在的なセキュリティインシデントを特定します。ログ、ネットワークトラフィック、システムイベントを監視して、異常や潜在的なセキュリティ脅威を検出します。また、インシデント発生時にセキュリティチームへアラートや通知を送信し、迅速な対応を可能にします。
Snykで実現するAndroidアプリケーションのセキュリティ
Snykは、Androidアプリケーションのセキュリティ対策として、Snyk CodeとSnyk Open Sourceの2つのセキュリティツールを提供しています。
Snyk CodeのSAST分析は、SQLインジェクションやクロスサイトスクリプティング(XSS)攻撃など、潜在的なセキュリティ脆弱性を検出します。Androidアプリケーションの開発で一般的に使われるKotlin、Java、C++に対応しています。
Snyk Open SourceのSCAは、Androidアプリケーションのサードパーティ製依存関係に含まれる既知のセキュリティ脆弱性を検出して報告します。アプリケーションで使用されているオープンソースのライブラリやフレームワークをスキャンし、既知のセキュリティ脆弱性をレポートします。これにより、セキュリティ侵害のリスクを軽減するための適切な対策を講じられます。
モバイルアプリは単独で動作するものではなく、APIやバックエンドサービスなど、他のサービスや依存関係と連携します。Androidアプリケーションを取り巻くエコシステム全体を確実に保護できるよう、SnykはSnyk ContainerやSnyk IaCなどのセキュリティツールも提供しています。
Snyk Containerはコンテナセキュリティ分析を実施し、コンテナ化された環境の脆弱性を検出して修正します。Snyk IaCはインフラストラクチャをスキャンし、設定ミスやコンプライアンス違反などのセキュリティ脆弱性を検出します。
Snykの開発者向けセキュリティツール群を活用すれば、Androidアプリケーションを徹底的にスキャンして脆弱性を検出し、潜在的な脅威から保護できます。安心してデプロイできる状態に整えましょう。詳しくはライブデモを今すぐお申し込みください。