この記事は、SQL インジェクションに対する脆弱性があるアプリのデベロッパーを対象としています。
状況
SQL インジェクションに対する脆弱性があるアプリが 1 つ以上存在します。この脆弱性は修正が必要です。詳しくは Play Console の通知をご覧ください。Play Console に表示されている期限を過ぎた後もセキュリティの脆弱性が修正されていないアプリは、Google Play から削除される場合があります。
必要な対応
- Play Console にログインし、[アラート] セクションで該当するアプリや問題の解決期限を確認します。
- 該当のアプリを更新し、脆弱性を修正します。
- 該当するアプリの更新バージョンを送信します。
再送信すると、アプリは再度審査されます。審査には数時間ほどかかることがあります。アプリが審査に合格して正常に公開された場合は、これ以上の対応は不要です。アプリが審査に不合格となった場合、アプリの更新バージョンは公開されず、メールで通知が届きます。
その他の詳細
エクスポートする ContentProvider
内で query
、update
、delete
を実装している場合、サニタイズされていない入力を SQL ステートメントに渡すと、SQL インジェクションに対して脆弱になる可能性があります。悪質なアプリは巧妙な入力によって、非公開のデータにアクセスしたりデータベースのコンテンツを破壊したりできます。この問題の解決方法は以下のとおりです。
ContentProvider
を他のアプリにエクスポーズする必要がない場合:
- マニフェスト内で、
ContentProvider
の<provider>
タグを変更して、android:exported="false"
に設定します。これにより、他のアプリはContentProvider
にインテントを送信できなくなります。 -
android:permission
属性をandroid:protectionLevel="signature"
のpermission
に設定することで、他のデベロッパーが記述したアプリがContentProvider
にインテントを送信できないようにすることも可能です。
ContentProvider
を他のアプリにエクスポーズする必要がある場合:
- strict モードを projection map と併せて使用すると、
SQLiteDatabase.query
への SQL インジェクションを防止できます。strict モードが悪質な選択句から、projection map が悪質な射影句から保護します。クエリの安全性を確保するには、両方の機能を使用してください。 - 置き換え可能なパラメータと選択引数の分割配列に
"?"
を使用する選択句を使うことで、SQLiteDatabase.update
とSQLiteDatabase.delete
への SQL インジェクションを防止できます。信頼できない入力から選択句を作成しないようご注意ください。
サポートのご案内
脆弱性に関する技術的なご質問については、Stack Overflow にご投稿ください。その際、「android-security」タグをご利用ください。この問題を解決するための手順で不明な点がありましたら、デベロッパー サポートチームにお問い合わせください。