モバイルアプリケーション診断

iOS / Androidのスマホアプリに対してリバースエンジニアリングなどを行い、セキュリティ上のリスクを洗い出します。

診断フロー

01. ヒアリング・お見積もり

お客様の環境のシステム構成などをヒアリングさせていただき、診断対象のリクエスト数(通信の種類の数)を確認いたします。
その後、リクエスト数をもとにお見積りを発行いたします。
まだ開発途中などでリクエスト数が未確定の場合は、システム構成や設計をもとにおおよその概算見積もりを発行可能です。
予算策定や相見積もり時などにご利用いただき、発注確定後に再度正式なお見積りを実施いたします。

02. 診断の実施

実施前に「お問合せはメールが飛ぶので触らないで欲しい」「平日の午前のみ実施して欲しい」などのご要望を整理し、お客様と最終確認をいたします。
その後、実際に診断対象に対して、攻撃者の視点からさまざまな手法で脆弱性を洗い出します。

03. 診断結果のご報告

診断対象の総合結果や検出された脆弱性の詳細、各脆弱性の再現方法、各脆弱性の修正案などをまとめた診断結果レポートをお渡しします。
また、ご希望に合わせて診断結果の報告会を実施することも可能です。(オプション)

04. 再診断(無料)などのアフターサポート

診断結果のご報告後、脆弱性の改修に対しても全力でサポートいたします。
診断の実施後3ヶ月以内であれば、無料で検出された脆弱性の修正が完了できているか再診断を実施いたしますのでお気軽にお申し付けください。

検査項目

OWASP MASVS (Mobile Application Security Verification Standard) の内容に準拠した診断を実施いたします。

MASVS-STORAGE

機密データの安全でないストレージパスワード、トークン、個人情報等の機密データが端末の内部ストレージや外部ストレージに平文で保存されていないかを検証します。SharedPreferences(Android)や plist(iOS)への平文保存を含みます。
SharedPreferences / UserDefaults の不適切な使用Android の SharedPreferences や iOS の UserDefaults に機密データ(パスワード、トークン、暗号鍵等)が保存されていないかを検証します。これらの保存領域は暗号化されていないため、ルート化/Jailbreak された端末では容易にアクセス可能です。
Keychain / Keystore の未使用パスワード、認証トークン、暗号鍵等の機密データが iOS Keychain または Android Keystore を利用して安全に保管されているかを検証します。適切なアクセス制御属性(kSecAttrAccessible 等)の設定も確認します。
ログへの機密データ出力NSLog(iOS)、Log.d/Log.v(Android)、console.log 等のログ出力にパスワード、トークン、個人情報等の機密データが含まれていないかを検証します。リリースビルドではデバッグログが無効化されているかも確認します。
クリップボードへの機密データ漏洩パスワードフィールドやクレジットカード番号等の機密入力フィールドでクリップボードへのコピーが制限されているかを検証します。クリップボードの内容は他のアプリからアクセス可能なため漏洩リスクがあります。
バックアップからの機密データ漏洩Android の android:allowBackup=”false” 設定や iOS のバックアップ除外設定により、端末バックアップから機密データが漏洩しないかを検証します。iTunes/iCloud バックアップからのデータ抽出リスクを含みます。
キーボードキャッシュからのデータ漏洩テキスト入力フィールドでオートコレクト/予測変換機能により機密データがキーボードキャッシュに保存されないかを検証します。secureTextEntry(iOS)や inputType=”textPassword”(Android)の設定を確認します。
スクリーンショット/タスクスイッチャーからのデータ漏洩アプリがバックグラウンドに移行した際、タスクスイッチャーのサムネイルに機密情報が表示されないかを検証します。FLAG_SECURE(Android)やアプリスナップショットのぼかし処理(iOS)の実装を確認します。
WebView キャッシュへの機密データ残存WebView でアクセスしたページのキャッシュ、Cookie、フォーム入力データに機密情報が残存しないかを検証します。WebView のキャッシュクリア処理やキャッシュモードの設定を確認します。
SQLite データベースの非暗号化ローカルの SQLite データベースに保存される機密データが SQLCipher 等で暗号化されているかを検証します。暗号化されていないデータベースファイルはルート化端末から直接閲覧可能です。
テンポラリファイルの残存一時ファイルに書き込まれた機密データが使用後に確実に削除されているかを検証します。アプリのキャッシュディレクトリに残留する一時ファイルからの情報漏洩リスクを確認します。
アプリケーションのサンドボックス外へのデータ漏洩アプリケーションのサンドボックス外(外部ストレージ、共有ディレクトリ等)に機密データが書き出されていないかを検証します。他のアプリケーションからアクセス可能な領域へのデータ保存を検出します。

MASVS-CRYPTO

非推奨暗号アルゴリズムの使用DES、RC4、MD5、SHA-1 等のセキュリティ強度が不十分な暗号アルゴリズムが使用されていないかを検証します。AES-256、SHA-256 以上の安全なアルゴリズムへの移行を推奨します。
ハードコードされた暗号鍵/シークレットソースコード、リソースファイル、アセット内に暗号鍵、API キー、シークレットがハードコードされていないかを検証します。リバースエンジニアリングにより容易に抽出可能です。
安全でない乱数生成java.util.Random(Android)、Math.random()、arc4random 等の非暗号学的乱数生成器が暗号用途やトークン生成に使用されていないかを検証します。SecureRandom や SecRandomCopyBytes の使用を確認します。
安全でない暗号モード安全でない ECB モードの使用を排除し、認証付き暗号化モード(GCM、CCM)が使用されているかを検証します。CBC モード使用時はパディングオラクル攻撃対策が講じられているかも確認します。
不十分な鍵長暗号鍵の長さが十分であるかを検証します。AES は 256 ビット、RSA は 2048 ビット以上、楕円曲線暗号は 256 ビット以上の鍵長を推奨します。
IV/Nonce の固定値使用・再利用暗号化の初期化ベクトル(IV)やノンスが暗号化のたびにランダムに生成され、固定値や以前使用した値の再利用が行われていないかを検証します。IV の再利用は暗号文の解読リスクにつながります。
鍵導出関数のパラメータ不備PBKDF2 のイテレーション回数(10万回以上推奨)、Argon2 のメモリコスト、scrypt のパラメータが十分な強度に設定されているかを検証します。
鍵管理の不備(Keystore/Keychain 未使用)暗号鍵がハードウェアバックドセキュリティ(Android Keystore の StrongBox、iOS Secure Enclave)を活用して保管されているかを検証します。ソフトウェアのみの鍵管理との差異を確認します。
安全でないパスワードハッシュローカルに保存されるパスワードやPINが bcrypt、argon2、PBKDF2 等の適切なアルゴリズムで十分なコストファクターを指定してハッシュ化されているかを検証します。
カスタム暗号実装独自の暗号化アルゴリズムや暗号プロトコルが実装されておらず、十分にレビューされた標準暗号ライブラリが使用されているかを検証します。カスタム実装は脆弱性を含むリスクが極めて高くなります。

MASVS-AUTH

ローカル認証のバイパス生体認証(指紋、顔認証)がバイパス可能でないかを検証します。生体認証失敗時のフォールバック(PIN/パスワード)が安全に実装され、Frida 等のフッキングツールで迂回できないかを確認します。
安全でないバイオメトリクス認証生体認証が暗号操作(Crypto オブジェクト)と連携しており、単なるブール値の判定ではなく、認証成功時にのみ暗号鍵にアクセスできる実装になっているかを検証します。
API トークンの管理不備API 認証トークン(JWT、OAuth トークン等)が Keychain/Keystore に安全に保管され、適切な有効期限が設定され、リフレッシュトークンメカニズムが正しく実装されているかを検証します。
パスワード/PIN のローカル検証バイパスパスワードや PIN のチェックがクライアントサイドのみで行われ、ローカルの検証ロジックを改ざんすることでバイパスできないかを検証します。サーバーサイドでの検証が必須です。
安全でない OAuth2/OIDC フローOAuth2 の認可コードフロー(PKCE 付き)が使用され、Implicit Flow の使用が避けられているかを検証します。redirect_uri の厳密な検証、state パラメータの使用も確認します。

MASVS-NETWORK

TLS/証明書検証の不備TLS 1.2 以上(推奨 1.3)が使用され、証明書チェーンの検証が正しく行われているかを検証します。脆弱な暗号スイートの無効化と Perfect Forward Secrecy の有効化を確認します。
証明書ピンニングの欠如サーバー証明書の公開鍵ピンニングまたは証明書チェーンピンニングが実装され、不正な CA による中間者攻撃が防止されているかを検証します。ピンのバックアップと更新メカニズムも確認します。
クリアテキスト通信アプリケーションがHTTP(非暗号化)通信を行っていないかを検証します。Android の usesCleartextTraffic=”false” 設定や iOS の ATS(App Transport Security)有効化を確認します。
WebView の TLS 設定不備WebView でのコンテンツ表示において HTTPS が強制され、混在コンテンツ(HTTP リソースの読み込み)が防止されているかを検証します。onReceivedSslError の適切な処理も確認します。
安全でないカスタム TrustManagerカスタム TrustManager や SSLSocketFactory の実装において、全ての証明書を信頼する(checkServerTrusted が空実装等)危険なコードが存在しないかを検証します。
Network Security Configuration の不備Android の Network Security Configuration XML が適切に設定され、クリアテキスト通信の禁止、信頼する CA の制限、証明書ピンニングが定義されているかを検証します。
ATS 設定の不備iOS の App Transport Security が有効であり、NSAllowsArbitraryLoads や NSExceptionDomains で不必要な例外が設定されていないかを検証します。

MASVS-PLATFORM

WebView のセキュリティ設定不備WebView で JavaScript が有効化されている場合、その必要性が確認されているかを検証します。不要な JavaScript 有効化は XSS 等の攻撃面を増大させます。
WebView のファイルアクセスWebView からローカルファイルシステムへのアクセス(setAllowFileAccess、setAllowFileAccessFromFileURLs 等)が制限されているかを検証します。
安全でない WebView JavaScript インターフェースaddJavascriptInterface(Android)の使用において、公開されるメソッドが最小限に制限され、機密情報へのアクセスや危険な操作が許可されていないかを検証します。targetSdkVersion に応じた @JavascriptInterface アノテーションの使用も確認します。
ディープリンク / URL スキームの入力検証不備カスタム URL スキームやディープリンクで受け取ったパラメータが適切に検証され、オープンリダイレクトや意図しない画面遷移、データアクセスが発生しないかを検証します。
IPC(プロセス間通信)の脆弱性Binder(Android)、XPC(iOS)等のプロセス間通信が適切な権限チェックで保護され、悪意のあるアプリからの不正なメッセージ送信が防止されているかを検証します。
Intent / Scheme の検証不備Android の暗黙的 Intent の使用時に意図しないアプリによる受信(Intent Spoofing/Hijacking)が防止されているかを検証します。明示的 Intent の使用やパーミッションの設定を確認します。
UI 保護の不備スクリーンショット防止(FLAG_SECURE、UITextField.isSecureTextEntry)が機密画面に設定され、タスクスイッチャーのプレビューから情報が漏洩しないかを検証します。
Content Provider のアクセス制御不備Android の Content Provider が exported=false に設定され、外部アプリからのアクセスが制限されているかを検証します。必要に応じたパーミッション設定やパス別の権限制御を確認します。
Broadcast Receiver のアクセス制御不備Broadcast Receiver が不要に exported されておらず、受信する Intent のアクション・送信元が適切に制限されているかを検証します。LocalBroadcastManager の使用を推奨します。
カスタムパーミッションの不備アプリ独自のカスタムパーミッションが定義されている場合、protection level が適切に設定され(signature 以上)、他のアプリからの不正利用が防止されているかを検証します。
ペーストボード/クリップボードからのデータ漏洩コピーされた機密データがペーストボードに残留せず、一定時間後に自動クリアされるか、または機密フィールドでのコピーが制限されているかを検証します。
オーバーレイ攻撃(タップジャッキング)他のアプリのオーバーレイ表示による画面の覆い隠し(タップジャッキング)攻撃が防止されているかを検証します。filterTouchesWhenObscured の設定を確認します。

MASVS-CODE

デバッグコードの残存リリースビルドに android:debuggable=”true”、NSLog、console.log、Log.d 等のデバッグ用コードやフラグが残存していないかを検証します。デバッグ可能な状態ではアプリの動作を詳細に分析されるリスクがあります。
入力検証の不備ネイティブコード(C/C++)における入力データのバリデーションが適切に行われ、バッファオーバーフローやフォーマット文字列攻撃が防止されているかを検証します。
WebView JavaScript 実行の脆弱性evaluateJavascript、loadUrl(“javascript:…”) 等の WebView からの JavaScript 実行において、ユーザー入力が適切にサニタイズされ、XSS 攻撃が防止されているかを検証します。
サードパーティライブラリの脆弱性使用しているサードパーティライブラリに既知の CVE(共通脆弱性識別子)が報告されていないか、定期的に更新されているかを検証します。依存関係の SCA スキャンを推奨します。
例外ハンドリングの不備未処理の例外によりアプリがクラッシュした際に、スタックトレースや内部情報がユーザーに表示されたりログに記録されたりしないかを検証します。
セキュリティ機能のエラーハンドリング不備暗号化処理、認証処理、認可チェック等のセキュリティ機能でエラーが発生した場合、安全側に倒れる(フェイルセキュア)設計になっているかを検証します。
未使用コード/デッドコード使用されていないコード、テストコード、デバッグ用の機能がリリースビルドから除去されているかを検証します。不要なコードは攻撃面を増大させます。

MASVS-PRIVACY

過剰な個人情報収集アプリが要求するパーミッション(カメラ、位置情報、連絡先等)が機能に必要な最小限に限定されているかを検証します。未使用のパーミッション要求はプライバシーリスクとストア審査への影響があります。
不適切なトラッキングiOS の ATT(App Tracking Transparency)フレームワークが適切に実装され、広告 ID(IDFA/GAID)の利用がユーザーの同意に基づいて制御されているかを検証します。
位置情報の過剰な利用位置情報の権限が「使用中のみ」「常時」等の適切な粒度で要求され、バックグラウンドでの位置情報取得が必要最小限に制限されているかを検証します。
カメラ/マイク権限の過剰な利用カメラやマイクのパーミッションが本当に必要な機能でのみ要求され、使用後に適切にリリースされているかを検証します。バックグラウンドでの不正な使用を防止します。
センシティブデータへの過剰なアクセス連絡先、カレンダー、写真等のセンシティブなデータへのアクセスが適切に制御され、必要な範囲のみの読み取りに制限されているかを検証します。
データの匿名化/仮名化の不備サーバーに送信されるデータが可能な限り匿名化・仮名化され、個人を特定可能な情報の送信が最小限に抑えられているかを検証します。

報告書サンプル

セキュリティ診断の報告書サンプルは、下記よりお問い合わせください。
また、最終報告書の内容についての報告会なども実施可能ですので、お気軽にご相談ください。

資料請求はこちら