12 KiB
Executable File
title, tags, created, updated
| title | tags | created | updated | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Mapping Apple OS builds to WebKit source releases |
|
2026-10-06 | 2026-10-06 |
Mapping Apple OS builds to WebKit source releases
Purpose
This document explains how to map a WebKit crash on macOS or iOS to:
- the exact Apple OS build;
- the exact system WebKit binary by Mach-O UUID;
- its
CFBundleVersionand WebKitFULL_VERSION; - the closest public WebKit source tag;
- the presence or absence of a source change.
The DuckDuckGo Apple browsers currently support macOS 12.3+ and iOS 15.0+. The deployment targets are defined in macOS/Configuration/Common.xcconfig and iOS/DuckDuckGo-iOS.xcodeproj/project.pbxproj in the Apple browsers repository.
Short answer
Use this chain for an exact mapping:
OS version + OS build
-> WebKit Mach-O UUID from the crash report
-> matching binary and UUID in Ravel
-> WebKit CFBundleVersion from the OS or app telemetry
-> remove the platform SYSTEM_VERSION_PREFIX
-> WebKit FULL_VERSION
-> public source tag or release branch
-> inspect the released code for the fix
An OS major version identifies only a WebKit release train. It does not identify the exact WebKit revision because Apple updates WebKit in OS point and security releases.
Version fields
| Field | Example | Meaning |
|---|---|---|
| OS version | macOS 27.0.1 |
Marketing version |
| OS build | 26A434 |
Exact Apple OS build; use this in Ravel |
| Mach-O UUID | 70BEE322-... |
Exact WebKit binary identity for one architecture |
CFBundleVersion |
22625.1.29.11.28 |
System framework build version |
SYSTEM_VERSION_PREFIX |
22 |
Platform/OS prefix added by Apple's production build |
WebKit FULL_VERSION |
625.1.29.11.28 |
Release version without the system prefix |
| Source tag | WebKit-7625.1.29.11.28 |
Candidate public source release |
| HTTP User-Agent | AppleWebKit/605.1.15 |
Frozen compatibility token; not usable for this mapping |
Supported OS release trains
These tables map each supported OS major to its initial Safari/WebKit release train. Always use the exact-build workflow for a crash or API-availability decision.
macOS 12.3+
| macOS | DDG support | Safari release | WebKit base FULL_VERSION |
macOS prefix | Production bundle base | Public source-tag family |
|---|---|---|---|---|---|---|
| 12 Monterey | 12.3+ | 15 | 612.1.27 |
17 |
17612.1.27 |
Safari-612.1.27.* |
| 13 Ventura | Yes | 16 | 614.1.25 |
18 |
18614.1.25 |
WebKit-7614.1.25.* |
| 14 Sonoma | Yes | 17 | 616.1.27 |
19 |
19616.1.27 |
WebKit-7616.1.27.* |
| 15 Sequoia | Yes | 18 | 619.1.26 |
20 |
20619.1.26 |
WebKit-7619.1.26.* |
| 26 Tahoe | Yes | 26 | 622.1.22 |
21 |
21622.1.22 |
WebKit-7622.1.22.* |
| 27 Golden Gate | Yes | 27 | 625.1.29 |
22 |
22625.1.29 |
WebKit-7625.1.29.* |
iOS 15.0+
WebKit uses SYSTEM_VERSION_PREFIX = 8 for iPhone-family SDKs. Therefore the iOS production bundle version is 8 concatenated with FULL_VERSION.
| iOS | DDG support | Safari release | WebKit base FULL_VERSION |
iOS prefix | Production bundle base | Public source-tag family |
|---|---|---|---|---|---|---|
| 15 | 15.0+ | 15 | 612.1.27 |
8 |
8612.1.27 |
Safari-612.1.27.* |
| 16 | Yes | 16 | 614.1.25 |
8 |
8614.1.25 |
WebKit-7614.1.25.* |
| 17 | Yes | 17 | 616.1.27 |
8 |
8616.1.27 |
WebKit-7616.1.27.* |
| 18 | Yes | 18 | 619.1.26 |
8 |
8619.1.26 |
WebKit-7619.1.26.* |
| 26 | Yes | 26 | 622.1.22 |
8 |
8622.1.22 |
WebKit-7622.1.22.* |
| 27 | Yes | 27 | 625.1.29 |
8 |
8625.1.29 |
WebKit-7625.1.29.* |
iOS versions 19–25 do not exist; Apple changed the public version number from 18 to 26.
Exact builds verified in Ravel
Ravel is currently incomplete. A missing build means that Ravel does not index it, not that the OS lacks WebKit.
macOS examples
| macOS | Build | WebKit UUID | CFBundleVersion |
FULL_VERSION |
|---|---|---|---|---|
| 26.5.2 | 25F84 |
49B21D99-8716-31B8-8686-71B287325F1D |
21624.2.5.11.8 |
624.2.5.11.8 |
| 26.6 | 25G72 |
B090AABF-9A3B-3110-9DA9-F0F40FCEC972 |
21624.4.5.11.5 |
624.4.5.11.5 |
| 26.6.1 | 25G76 |
B090AABF-9A3B-3110-9DA9-F0F40FCEC972 |
21624.4.5.11.5 |
624.4.5.11.5 |
| 26.6.2 | 25G83 |
844AF253-CAF6-3623-9DAD-A055C5274E62 |
21624.5.1.11.3 |
624.5.1.11.3 |
| 27.0.1 | 26A434 |
70BEE322-37EE-3B22-8012-4F76BA105C29 |
22625.1.29.11.28 |
625.1.29.11.28 |
| 27.2 beta | 26B5086k |
6F6AB57E-1492-3950-9962-85B6AFD430A3 |
22625.2.4.1 |
625.2.4.1 |
| 27.2 beta 2 | 26B5091g |
56B4AA44-CB66-3641-8B22-723C39B5BC6E |
22625.2.5.11.1 |
625.2.5.11.1 |
| 27.2 beta 3 | 26B5101f |
B32D7081-AE42-3A2E-ACBB-CF4D4BE4F296 |
22625.2.7.1 |
625.2.7.1 |
macOS 26.6 and 26.6.1 contain the same WebKit binary: both UUID and CFBundleVersion match.
iOS examples
Ravel identifies iOS WebKit binaries and UUIDs, but its dyld-cache page does not expose the framework Info.plist value. Read CFBundleVersion at runtime or from an extracted IPSW before claiming an exact source release.
| iOS | Build | WebKit UUID |
|---|---|---|
| 26.6 | 23G71 |
7627FDAB-129E-32BB-A2AC-F0DC02853D4E |
| 26.6.1 | 23G83 |
C39BD22C-3475-38AF-91BD-0B7574081011 |
| 26.6.2 | 23G90 |
C39BD22C-3475-38AF-91BD-0B7574081011 |
| 27.0.1 | 24A446 |
D12A79A6-98CB-323C-8F72-613AD0983BBC |
| 27.2 beta | 24B5084k |
1FD67A57-D91B-3B26-9F4F-91AB8299B6E7 |
| 27.2 beta 2 | 24B5089g |
509D51AD-2CF9-3982-BFD5-81221D1B903D |
| 27.2 beta 3 | 24B5099f |
0566BF55-2DC4-34F6-B211-96FFAA0A37A4 |
iOS 26.6.1 and 26.6.2 contain the same WebKit binary UUID.
Exact mapping procedure
1. Read the OS build and WebKit UUID
From an Apple crash report, record the OS version/build and the WebKit image UUID. Compare UUIDs without case or dashes, and match the architecture.
rg 'OS Version:|WebKit.*<' crash-report.crash
2. Find the binary in Ravel
Use the OS build and the correct binary path:
macOS: /System/Library/Frameworks/WebKit.framework/Versions/A/WebKit
iOS: /System/Library/Frameworks/WebKit.framework/WebKit
Ravel URL pattern:
https://ravel.dbg.re/binary?build=<OS_BUILD>&domain=dyld_cache&path=<URL_ENCODED_BINARY_PATH>
The Ravel UUID must equal the crash-report UUID. A matching version string without a matching UUID is weaker evidence.
3. Read CFBundleVersion
From app code on either platform:
import WebKit
let webKitBundleVersion = Bundle(for: WKWebView.self)
.object(forInfoDictionaryKey: "CFBundleVersion") as? String
On macOS, it can also be read without app changes:
defaults read /System/Library/Frameworks/WebKit.framework/Resources/Info CFBundleVersion
For iOS, log the runtime value on a test device or include it in crash/pixel metadata. Do not infer an exact iOS value from the same-numbered macOS release.
4. Remove SYSTEM_VERSION_PREFIX
Apple production builds concatenate the prefix and the WebKit version:
CFBundleVersion = SYSTEM_VERSION_PREFIX + FULL_VERSION
| Platform | OS | Prefix |
|---|---|---|
| iOS | All supported versions | 8 |
| macOS | 12 | 17 |
| macOS | 13 | 18 |
| macOS | 14 | 19 |
| macOS | 15 | 20 |
| macOS | 26 | 21 |
| macOS | 27 | 22 |
Example:
22625.1.29.11.28 - prefix 22 -> 625.1.29.11.28
5. Resolve the public source release
For modern release trains, candidate tags use:
WebKit-7<FULL_VERSION>
Example:
625.1.29.11.28 -> WebKit-7625.1.29.11.28
The 612 train is an older naming exception:
612.1.27.* -> Safari-612.1.27.*
Check exact public tags and release branches:
git ls-remote --tags https://github.com/WebKit/WebKit.git 'WebKit-7625.1.29*'
git ls-remote --heads https://github.com/WebKit/WebKit.git 'safari-7625*'
An adjacent tag is only a bound, not an exact match. Apple may publish a binary before publishing the corresponding source tag.
6. Verify the fix in released source
Inspect the changed code in the candidate tag. This is stronger than checking one commit SHA because Apple may cherry-pick the change under a different SHA.
For the certificate-info crash discussed below:
git show <TAG>:Source/WebKit/UIProcess/WebFrameProxy.h \
| rg 'commitCertificateInfo'
Old signature:
void commitCertificateInfo(const URL&);
Fixed signature from 318982@main:
void commitCertificateInfo(const URL&, bool hasCertificateInfo);
7. When the exact source tag is unavailable
Record the evidence level explicitly:
- UUID +
CFBundleVersion: exact binary and release version are known. - Symbols or disassembly: a specific ABI or behavior can be proven in the binary.
- Reproduction on the exact OS build: the bug can be proven present or absent.
Safari Technology Preview is a separate build. Its version does not prove the version of system WebKit.
Current certificate-info crash
The crash on macOS 27.0.1 maps as follows:
macOS: 27.0.1 (26A434)
Crash UUID: 70BEE322-37EE-3B22-8012-4F76BA105C29
Ravel UUID: 70BEE322-37EE-3B22-8012-4F76BA105C29
CFBundleVersion: 22625.1.29.11.28
Prefix: 22
FULL_VERSION: 625.1.29.11.28
Candidate tag: WebKit-7625.1.29.11.28
The exact .11.28 source tag is not public as of 2026-10-06; .11.27 is public. The crash symbol and the WebKit-7625.1.29 source family both show the old one-argument signature. Therefore the fix is absent from macOS 27.0.1.
Ravel identifies macOS 27.2 beta binaries as 625.2.4.1, 625.2.5.11.1, and 625.2.7.1. Public WebKit-7625.2.* tags are not available as of 2026-10-06. The fix landed in 318982@main and Safari Technology Preview 251, so macOS 27.2 is a candidate for the first fixed system release, but source inclusion is not yet proven.
DuckDuckGo telemetry gap
Current pixels do not include the exact system WebKit CFBundleVersion. The HTTP User-Agent cannot fill this gap because Apple returns the frozen AppleWebKit/605.1.15 compatibility token.
Add one field to relevant crash and WebKit failure telemetry:
webkit_build=22625.1.29.11.28
Populate it from Bundle(for: WKWebView.self).CFBundleVersion. This makes OS-build-to-WebKit correlation deterministic on both macOS and iOS.
Sources
- WebKit source repository
- Current WebKit version configuration
- Safari 15 / WebKit 612 version configuration
- Safari 16 / WebKit 614 version configuration
- Safari 17 / WebKit 616 version configuration
- Safari 27 / WebKit 625 version configuration
- Ravel binary catalogue
- MDN Safari release metadata
- Safari release notes
- WebKit commit 318982@main
- Safari Technology Preview 251
Limits
- One OS major contains multiple WebKit updates; use the exact OS build for conclusions.
- Ravel is in beta and does not index every historical Apple build.
- Intel and Apple Silicon binaries may have different UUIDs.
- An exact public tag may appear after Apple ships the binary.
- Verify released code, not only commit ancestry, because fixes can be cherry-picked.