Apple Security Updates Connector
Feed contract
The Apple Software Lookup Service (https://gdmf.apple.com/v2/pmv) publishes JSON payloads describing every public software release Apple has shipped. Each AssetSet entry exposes:
- ProductBuildVersion,- ProductVersion, and channel flags (e.g.,- RapidSecurityResponse)
- Timestamps for PostingDate,ExpirationDate, andPreInstallDeadline
- Associated product families/devices (Mac, iPhone, iPad, Apple TV, Apple Watch, VisionOS)
- Metadata for download packages, release notes, and signing assets
The service supports delta polling by filtering on PostingDate and ReleaseType; responses are gzip-compressed and require a standard HTTPS client.citeturn3search8
Apple’s new security updates landing hub (https://support.apple.com/100100) consolidates bulletin detail pages (HT articles). Each update is linked via an HT identifier such as HT214108 and lists:
- CVE identifiers with Apple’s internal tracking IDs
- Product version/build applicability tables
- Mitigation guidance, acknowledgements, and update packaging notesciteturn1search6
Historical advisories redirect to per-platform pages (e.g., macOS, iOS, visionOS). The HTML structure uses <section data-component="security-update"> blocks with nested tables for affected products. CVE rows include disclosure dates and impact text that we can normalise into canonical AffectedPackage entries.
Change detection strategy
- Poll the Software Lookup Service for updates where PostingDateis within the sliding window (lastModified - tolerance). CacheProductID+PostingDateto avoid duplicate fetches.
- For each candidate, derive the HT article URL from DocumentationURLor by combining theHTidentifier with the base path (https://support.apple.com/{locale}/). Fetch with conditional headers (If-None-Match,If-Modified-Since).
- On HTTP 200, store the raw HTML + metadata (HT id, posting date, product identifiers). On304, re-queue existing documents for mapping only.
Unofficial Apple documentation warns that the Software Lookup Service rate-limits clients after repeated unauthenticated bursts; respect 5 requests/second and honour Retry-After headers on 403/429 responses.citeturn3search3
Parsing & mapping notes
- CVE lists live inside <ul data-testid="cve-list">items; each<li>contains CVE, impact, and credit text. Parse these into canonicalAlias+AffectedPackagerecords, using Apple’s component name as the packagenameand the OS build as the range primitive seed.
- Product/version tables have headers for platform (Platform,Version,Build). Map the OS name into our vendor range primitive namespace (apple.platform,apple.build).
- Rapid Security Response advisories include an Rapid Security Responsesbadge; emitpsirt_flagswithapple.rapid_security_response = true.
Outstanding questions
- Some HT pages embed downloadable PDFs for supplemental mitigations. Confirm whether to persist PDF text via the shared PdfTextExtractor.
- Vision Pro updates include deviceFamilyidentifiers not yet mapped inRangePrimitives. Extend the model withapple.deviceFamilyonce sample fixtures are captured.
Fixture maintenance
Deterministic regression coverage lives in src/StellaOps.Concelier.Connector.Vndr.Apple.Tests/Apple/Fixtures. When Apple publishes new advisories the fixtures must be refreshed using the provided helper scripts:
- Bash: ./scripts/update-apple-fixtures.sh
- PowerShell: ./scripts/update-apple-fixtures.ps1
Both scripts set UPDATE_APPLE_FIXTURES=1, touch a .update-apple-fixtures sentinel so test runs inside WSL propagate the flag, fetch the live HT articles referenced in AppleFixtureManager, sanitise the HTML, and rewrite the paired .expected.json DTO snapshots. Always inspect the resulting diff and re-run dotnet test src/StellaOps.Concelier.Connector.Vndr.Apple.Tests/StellaOps.Concelier.Connector.Vndr.Apple.Tests.csproj without the environment variable to ensure deterministic output before committing.