Photo library permission limited to selected photos on iOS 14+
Why it matters
iOS 14 introduced photo library limited access: users can grant access to a specific selection of photos rather than their entire library. An app that requests full photo library access for a feature that only needs one photo — such as a profile picture upload — forces users to choose between granting access to their entire camera roll or denying the feature entirely. This is a GDPR Art. 5(1)(c) data-minimisation violation. Apple's App Store reviewers check whether apps use the full library permission when limited access would suffice; requesting more than necessary is grounds for a guideline violation. CWE-272 (Least Privilege Violation) applies when an app acquires more access than its operation requires.
Severity rationale
Low because the over-permission is scoped to photo access rather than more sensitive data types, but it remains a GDPR Art. 5(1)(c) data-minimisation violation and a common App Store Review guideline failure.
Remediation
Use expo-image-picker with default settings for features that need one or a few photos — it automatically uses the limited access picker on iOS 14+. Only declare NSPhotoLibraryUsageDescription for features that browse the full library.
import * as ImagePicker from 'expo-image-picker'
// Profile photo upload: limited access is appropriate
async function pickProfilePhoto() {
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ImagePicker.MediaTypeOptions.Images,
allowsEditing: true,
aspect: [1, 1],
quality: 0.8,
// On iOS 14+, this presents the limited-access picker by default
})
if (!result.canceled) {
uploadProfilePhoto(result.assets[0].uri)
}
}
In app.json, only add NSPhotoLibraryUsageDescription if a feature genuinely browses the full library. Use NSPhotoLibraryAddOnlyUsageDescription for save-only operations (e.g., saving generated images). Remove NSPhotoLibraryUsageDescription if all photo access goes through the picker.
DetectionPro
The detection method for this pattern is part of AuditBuffet Pro.
The full method (what to look for, pass and fail conditions, and how results get reported) ships inside the Mobile Permissions & Privacy Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
External references
- cwe · CWE-272 — Least Privilege Violation
- gdpr · Art. 5(1)(c) — Data minimisation
- external · apple-photo-limited-access — Apple: Supporting Limited Photos Library in Your App (iOS 14+)
Taxons
History
- 2026-04-18·v1.0.0·Initial import from mobile-permissions-privacy·automated