SwiftのNSPredicateインジェクション

SwiftのNSPredicateインジェクション

説明

外部入力から NSPredicate(format:) の書式文字列を組み立てると、攻撃者に条件式を変更され、意図しないオブジェクトの取得やフィルターの回避につながるおそれがあります。

想定される影響

  • アクセス権限のないオブジェクトの取得
  • フィルター条件の回避
  • アプリケーションの処理の回避やデータの漏えい

対処方法

  1. NSPredicate(format:) の書式文字列は固定します。
  2. 値は %@ のプレースホルダーに対応する別の引数として渡します。
  3. 動的なフィールド名や演算子は許可リストから選びます。

例

変更前

swift
let predicate = NSPredicate(format: "name == '\(username)'")

変更後

swift
let predicate = NSPredicate(format: "name == %@", username)

説明:

  • 変更前: ユーザー入力が述語の構文として解釈されます。
  • 変更後: ユーザー入力を値の引数としてだけ渡します。

参考資料