설명
외부 입력으로 NSPredicate(format:)의 포맷 문자열을 만들면 공격자가 조건식을 조작해 의도하지 않은 객체 조회나 필터 우회를 유발할 수 있습니다.
잠재적 영향
- 권한 밖 객체 조회
- 필터 조건 우회
- 앱 로직 우회 또는 데이터 노출
해결 방법
NSPredicate(format:)포맷 문자열은 정적으로 유지합니다.- 값은
%@자리표시자와 별도 인자로 바인딩합니다. - 동적 필드명이나 연산자는 허용 목록에서 선택합니다.
예시
변경 전
swift
let predicate = NSPredicate(format: "name == '\(username)'")
변경 후
swift
let predicate = NSPredicate(format: "name == %@", username)
설명:
- 변경 전: 사용자 입력이 predicate 문법으로 해석됩니다.
- 변경 후: 사용자 입력은 값 인자로만 전달됩니다.