This is a sharp shard in a phone app, not a hole in your front door
CVE-2026-10885 is a reported use-after-free in Chrome for iOS affecting versions before 149.0.7827.53. The advertised impact is remote arbitrary code execution after a user is lured into attacker-controlled content, but on iOS that code lands in the context of the Chrome app, not a broadly reachable server or unmanaged desktop browser estate.
Google's HIGH 8.8 score reflects the technical ceiling of a memory-corruption bug, but it overstates patch urgency for most enterprises. Real-world pressure comes down because this is client-side, user-interaction dependent, limited to the Chrome-on-iOS install base, and further constrained by iOS app sandboxing and usually decent MDM app-update hygiene.
4 steps from start to impact.
Deliver the lure
- Target uses Chrome on iOS
- Installed version is earlier than 149.0.7827.53
- User opens attacker-controlled content
- Many enterprises do not standardize on Chrome for iOS
- Mobile phishing success rates are lower than scanner-visible server exposure
- Link protections, Safe Browsing, mail filtering, and mobile threat defense can disrupt delivery
Trigger the dangling pointer
- Reachable vulnerable code path in Chrome for iOS
- Reliable trigger for the specific use-after-free
- Sufficient exploit stability on the target iOS build
- Mobile browser exploitation is brittle across device models and iOS releases
- Apple memory protections and browser hardening reduce exploit reliability
- Restricted bug details delay turnkey exploit development
Execute in the app context
- Successful memory-corruption exploitation
- No intervening mitigation blocks the payload
- iOS sandboxing sharply limits host blast radius
- No evidence in reviewed sources of an accompanying iOS privilege-escalation chain
- Enterprise value is usually confined to browser-resident tokens, content, and active sessions
Monetize the browser foothold
- Valuable browser session or credentials present
- No strong re-authentication or conditional access barriers
- Modern IdP controls, device binding, short-lived tokens, and re-auth can limit payoff
- There is no internet-reachable service to mass exploit at scale
- Blast radius is usually one user and one device at a time
- External vulnerability scanning does not help; this is a mobile client application issue, not a listening network service.
- WAF rules do not solve the core problem because the exploit can be delivered from arbitrary attacker-controlled content over normal browsing paths.
- Traditional endpoint EDR assumptions do not translate well to iOS; process-level exploit visibility is limited, so do not count on host telemetry to prove absence of exploitation.
The supporting signals.
| In-the-wild status | No active exploitation evidence located in reviewed sources, and not KEV-listed at time of assessment. |
|---|---|
| KEV status | Not listed in CISA KEV; no CISA due date applies. |
| PoC availability | No public PoC found in reviewed search results, GitHub-adjacent references, or vendor release notes. That lowers immediate attacker utility. |
| EPSS | No public EPSS value located for this exact CVE in reviewed sources. FIRST's public EPSS service exists, but I did not find a returned score tied to this ID in the sources reviewed. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H — the key realism anchor is UI:R. This is not self-propagating or scanner-reachable. |
| Affected versions | Chrome for iOS before 149.0.7827.53. |
| Fixed version | 149.0.7827.53 or later. Because this is an App Store app, remediation depends on MDM/App Store update uptake, not OS package managers or distro backports. |
| Exposure/scanning reality | Not meaningfully internet-scannable. Shodan/Censys/FOFA-style exposure data is largely irrelevant because the vulnerable surface is a mobile client app, not a listening service. |
| Disclosure date | 2026-06-04. |
| Researcher / reporting | Not named in the provided intel, and no authoritative public attribution was confirmed in reviewed sources. |
Sources.
Why this verdict
- Downgraded for attacker position: the exploit starts from a lure, not unauthenticated service reachability; that immediately cuts enterprise-wide exploitability versus a server bug.
- Downgraded for population size: only devices running Chrome on iOS and still below 149.0.7827.53 are in scope; that is a much smaller slice than "Chrome" generically implies.
- Downgraded for blast radius: on iOS, successful exploitation is constrained by app sandboxing and usually pays off as session theft or app-context abuse, not domain-wide compromise.
Why not higher?
There is no reviewed evidence of active exploitation, no KEV listing, and no public PoC lowering time-to-weaponization. Just as important, the vulnerable surface is not internet-scannable and does not create mass-exploitation conditions across a fleet the way Exchange, VPN, or edge device bugs do.
Why not lower?
It is still a browser memory-corruption issue with remote delivery and potentially severe impact for the individual user who clicks. If your workforce uses managed iPhones heavily for SSO, SaaS admin access, or privileged email, a single-device browser compromise can still expose real business data and active sessions.
Crowdsourced verification payload.
Run this on an auditor workstation or CI job against an MDM-exported CSV of mobile apps or device inventory — not on the iPhone itself. Invoke it as python3 check_chrome_ios_cve_2026_10885.py inventory.csv with a CSV containing at least a device identifier plus either app_name/bundle_id and version; no elevated privileges are needed.
#!/usr/bin/env python3\n# check_chrome_ios_cve_2026_10885.py\n# Exit codes:\n# 0 = all identified Chrome for iOS installs are patched\n# 1 = one or more vulnerable installs found\n# 2 = unknown / input problem / no matching records\n\nimport csv\nimport sys\nfrom typing import List\n\nTARGET_VERSION = [149, 0, 7827, 53]\nIOS_HINTS = {"ios", "iphone", "ipad", "ipados"}\nCHROME_NAME_HINTS = {"chrome", "google chrome"}\nCHROME_BUNDLE_HINTS = {"com.google.chrome.ios", "com.google.chrome.ios.beta", "com.google.chrome"}\n\ndef normalize(s: str) -> str:\n return (s or "").strip().lower()\n\ndef parse_version(v: str) -> List[int]:\n if not v:\n return []\n parts = []\n for token in v.strip().split('.'):\n num = ''\n for ch in token:\n if ch.isdigit():\n num += ch\n else:\n break\n if num == '':\n break\n parts.append(int(num))\n return parts\n\ndef cmp_versions(a: List[int], b: List[int]) -> int:\n max_len = max(len(a), len(b))\n a = a + [0] * (max_len - len(a))\n b = b + [0] * (max_len - len(b))\n if a < b:\n return -1\n if a > b:\n return 1\n return 0\n\ndef is_ios_row(row: dict) -> bool:\n hay = ' '.join([\n normalize(row.get('platform', '')),\n normalize(row.get('os', '')),\n normalize(row.get('os_family', '')),\n normalize(row.get('device_type', ''))\n ])\n return any(h in hay for h in IOS_HINTS)\n\ndef is_chrome_ios_row(row: dict) -> bool:\n app_name = normalize(row.get('app_name', ''))\n bundle_id = normalize(row.get('bundle_id', ''))\n package_name = normalize(row.get('package_name', ''))\n app_id = normalize(row.get('app_id', ''))\n\n chrome_name_match = app_name in CHROME_NAME_HINTS or ('chrome' in app_name and 'google' in app_name)\n bundle_match = bundle_id in CHROME_BUNDLE_HINTS or package_name in CHROME_BUNDLE_HINTS or app_id in CHROME_BUNDLE_HINTS\n\n return is_ios_row(row) and (chrome_name_match or bundle_match)\n\ndef device_label(row: dict, idx: int) -> str:\n for key in ('device_name', 'hostname', 'serial', 'udid', 'asset_tag', 'user', 'email'):\n val = row.get(key)\n if val:\n return str(val)\n return f'row_{idx}'\n\ndef main() -> int:\n if len(sys.argv) != 2:\n print('UNKNOWN: usage: python3 check_chrome_ios_cve_2026_10885.py <inventory.csv>')\n return 2\n\n path = sys.argv[1]\n try:\n fh = open(path, newline='', encoding='utf-8-sig')\n except Exception as e:\n print(f'UNKNOWN: cannot open file: {e}')\n return 2\n\n vulnerable = []\n patched = []\n unknown = []\n matched = 0\n\n with fh:\n reader = csv.DictReader(fh)\n if not reader.fieldnames:\n print('UNKNOWN: CSV has no header row')\n return 2\n\n for idx, row in enumerate(reader, start=2):\n if not is_chrome_ios_row(row):\n continue\n matched += 1\n label = device_label(row, idx)\n version = row.get('version') or row.get('app_version') or row.get('installed_version') or ''\n parsed = parse_version(version)\n if not parsed:\n unknown.append((label, version or ''))\n continue\n if cmp_versions(parsed, TARGET_VERSION) < 0:\n vulnerable.append((label, version))\n else:\n patched.append((label, version))\n\n if matched == 0:\n print('UNKNOWN: no Chrome for iOS records matched the CSV filters')\n return 2\n\n for label, version in vulnerable:\n print(f'VULNERABLE: {label} -> {version}')\n for label, version in patched:\n print(f'PATCHED: {label} -> {version}')\n for label, version in unknown:\n print(f'UNKNOWN: {label} -> {version}')\n\n print(f'SUMMARY: matched={matched} vulnerable={len(vulnerable)} patched={len(patched)} unknown={len(unknown)} target>=149.0.7827.53')\n\n if vulnerable:\n return 1\n if patched and not unknown:\n return 0\n return 2\n\nif __name__ == '__main__':\n sys.exit(main())