SwiftのRealm NoSQLインジェクション

SwiftのRealm NoSQLインジェクション

説明

Realmの filter の条件文字列にユーザー入力を連結すると、条件式を変更され、権限のないデータの取得やフィルター条件の回避につながるおそれがあります。

想定される影響

  • ローカルデータベースのフィルターの回避
  • アクセス権限のないRealmオブジェクトの取得
  • 機密情報の漏えい

対処方法

  1. Realmのフィルター文字列は固定します。
  2. ユーザーの値は %@ のプレースホルダーに対応する別の引数として渡します。
  3. フィールド名や並べ替えの基準は許可リストから選びます。

例

変更前

swift
let matches = users.filter("name == '\(username)'")

変更後

swift
let matches = users.filter("name == %@", username)

説明:

  • 変更前: ユーザー入力がRealmの条件式の一部になります。
  • 変更後: ユーザーの値を条件式の構造から分離します。

参考資料