Phishing-Grade Identity Spoofing on icloud.com — Public Disclosure MAILDROP-01
Independent Security Research — Whitby, North Yorkshire, United Kingdom
icloud.com. The
URLs it generates contain three unsigned, client-controlled parameters: f= (filename),
sz= (file size), and uk= (user key). Any party with a Maildrop URL can rewrite
f= and sz= to any values they like. The spoofed link still works, still lives on
icloud.com, still shows Apple’s interface, and serves the underlying file with a
Content-Disposition header bearing the fake filename. This is a phishing primitive hosted on
Apple’s own domain. It was first reported to Apple Security Bounty on 7 July 2023. At publication
(34 months later) it remains unpatched.
| Field | Value |
|---|---|
| Affected product | Apple iCloud Mail / Maildrop attachment service |
| Surface | *.icloud.com Maildrop landing pages & cvws.icloud-content.com CDN download path |
| Vendor reference | Apple Security Bounty case OE1950888220 |
| First reported | 2023-07-07 (original submission); 2026-04-04 (refreshed PoC + CDN-injection analysis); 2026-04-06 (video PoC) |
| Vendor status at publication | “Prioritised for review” (since 8 April 2026). No remediation deployed. |
| Time elapsed | ~34 months (~10× a standard 90-day coordinated-disclosure window) |
| CVSS 3.1 vector | AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:L/A:N — 5.4 Medium |
| Date | Event |
|---|---|
| 2023-07-07 | Initial report filed with Apple Security Bounty (OE1950888220). Title: “Maildrop URL arbitrary manipulation of parameters (icons, filesize)”. |
| 2023-07-07 | Apple Product Security acknowledged the report and asked for a video PoC and clarification of attack vectors. |
| 2023 – 2026 | No state change visible in the bounty portal. Bug remained unpatched and continuously exploitable on production iCloud. |
| 2026-04-04 | Author re-submitted a refreshed write-up with the additional finding that f= is interpolated as a template variable ${f} in the CDN URL itself, making it more than display-only deception. PoC script attached. |
| 2026-04-06 | Video PoC submitted at Apple’s earlier request. |
| 2026-04-08 | Apple set status to “Prioritised for review”. |
| 2026-04 – 05 | No further communication. No remediation deployed. |
| 2026-05-13 | Public disclosure (this document). Published 34 months after initial report — approximately ten standard 90-day coordinated-disclosure windows. |
Apple’s Maildrop attachment service hosts mail attachments up to 5 GiB and presents recipients
with a download page on icloud.com. The per-attachment URLs it generates contain three
client-controlled, unsigned parameters:
| Parameter | Purpose | Server-side validation? |
|---|---|---|
f= | Filename on landing page; interpolated as ${f} into CDN download path | No |
sz= | File size displayed on landing page | No |
uk= | User key (opaque token, used in CDN path) | Used as identity; no binding to other params |
Any party in possession of a valid Maildrop URL can rewrite f= and sz= and obtain a
fully functional Maildrop URL that: displays the fake filename and file-type icon on the landing
page; displays the fake file size; and causes the CDN to serve the file with
Content-Disposition: attachment; filename="<fake name>", so the browser saves it under the
fake name regardless of the file’s actual MIME type or extension. The URL remains on
icloud.com throughout. There is no visual indicator that displayed metadata is
sender-controlled rather than server-attested.
A canonical Maildrop URL has the shape:
https://www.icloud.com/attachment/?u=<percent-encoded inner CDN URL>
&uk=<user key>
&f=<filename>
&sz=<file size in bytes>
The inner u= value, once decoded, is the CDN URL the browser fetches when the user
clicks “Download”. Its shape is approximately:
https://cvws.icloud-content.com/B/<content hash>/${f}?o=...&k=${uk}&...
The two ${...} tokens in the CDN URL are template substitutions. The ${f} token
is replaced with whatever value is in the outer f= parameter at request time. The
${uk} token is replaced with uk=.
This means f= is not a cosmetic landing-page label. It is also part of the path
the CDN serves, and the CDN echoes it back via the Content-Disposition response
header. Modifying f= changes what the recipient’s browser names the downloaded file.
Table 2. What is signed and what is not in a Maildrop URL.
| Component | Signed? | Notes |
|---|---|---|
| Content hash in CDN path | Yes | Identifies the actual stored file |
uk user key | (Server-side identity token) | Used by CDN to authorise access |
f filename | No | Trivially modifiable; affects landing page and Content-Disposition |
sz file size | No | Trivially modifiable; display only |
| Outer URL query string as a whole | No HMAC | No detectable signature parameter on the outer URL |
The structural deficiency is the absence of an HMAC over the outer query string. A short keyed signature parameter would prevent the attack class entirely.
A short Python script captures the entire primitive. Given any valid Maildrop URL, the script parses the four parameters, prints the detected template variables, and produces a spoofed URL with operator-chosen filename and size:
# maildrop_spoof.py — public PoC
import sys
from urllib.parse import urlparse, parse_qs, urlencode, urlunparse, unquote
def analyse(url):
p = urlparse(url)
q = parse_qs(p.query, keep_blank_values=True)
inner = unquote(q.get('u', [''])[0])
print('[Analysis]')
print(f' f= : {q.get("f", ["(missing)"])[0]}')
print(f' sz= : {q.get("sz",["(missing)"])[0]}')
print(f' uk= : {q.get("uk",["(missing)"])[0]}')
print(f' CDN URL embeds ${{f}} : {"${f}" in inner}')
print(f' CDN URL embeds ${{uk}} : {"${uk}" in inner}')
def spoof(url, name, size):
p = urlparse(url)
q = parse_qs(p.query, keep_blank_values=True)
q['f'] = [name]
q['sz'] = [str(size)]
return urlunparse(p._replace(
query=urlencode({k: v[0] for k, v in q.items()})))
if __name__ == '__main__':
if len(sys.argv) < 2:
print('usage: maildrop_spoof.py <maildrop-url> [fake-name] [fake-size]')
sys.exit(1)
url = sys.argv[1]
name = sys.argv[2] if len(sys.argv) > 2 else 'Invoice_Q1_2026.pdf'
size = int(sys.argv[3]) if len(sys.argv) > 3 else 204800
analyse(url)
print()
print('[Spoofed URL]')
print(spoof(url, name, size))
Run against a real Maildrop URL, the script reports which template tokens the CDN URL embeds
and produces a rewritten link. Opening the original and spoofed links side-by-side in a
browser shows: original landing page with real filename, real size, real icon; spoofed
landing page with attacker-chosen filename, size, and icon — all inferred from the
operator-chosen f= value. Both URLs reside on icloud.com; both produce a
working download. The Content-Disposition header on the downloaded file bears the
spoofed filename.
The attack requires nothing beyond a text editor and a browser. Three realistic operator positions:
The attacker uploads a payload (malware archive, malicious document, fake invoice) via
Apple Mail and obtains a Maildrop URL. They rewrite f= to a trustworthy filename
— Invoice_Q1_2026.pdf, MarketingSlideDeck.pptx, CV_J_Smith.docx — and
sz= to a size matching the social pretext.
The victim receives a link on icloud.com, sees an Apple-rendered landing page
presenting a PDF named “Invoice_Q1_2026.pdf” weighing 204 KB, and clicks “Download”.
The browser save-as prompt shows “Invoice_Q1_2026.pdf”. The actual file content is
whatever the attacker uploaded. This is the dominant case. It is trivial.
A legitimate Maildrop URL is forwarded to a wider audience — common in corporate
environments where shared files traverse multiple mailing lists. An attacker on that
audience-list path can modify f= and sz= before re-sharing, producing a spoofed
link pointing to content they did not upload.
Maildrop URLs leak by ordinary means — chat logs, screenshots, copy/paste into ticketing systems, accidental wider cc’ing. Any exposed URL is rewritable for the remainder of its 30-day window. No upload step required; the attacker only needs to have observed the URL.
Table 3. Impact assessment — MAILDROP-01.
| Dimension | Assessment |
|---|---|
| Attack complexity | Low — URL parameter manipulation |
| Authentication required | None beyond possessing a Maildrop URL |
| User interaction | Required (victim must visit the link and download) |
| Confidentiality | None — the underlying file is unchanged |
| Integrity (file) | Unchanged — served content matches what was uploaded |
| Integrity (presentation) | High — filename, icon, size all attacker-controlled on an Apple-branded domain |
| Phishing utility | High — Apple branding + icloud.com domain + matching metadata defeats most user training |
| Defensive bypass | Content-Disposition-based filename overrides OS extension-warning heuristics keyed on the saved filename |
| Persistence | 30 days per Maildrop URL lifetime |
| CVSS 3.1 base score | 5.4 Medium — AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:L/A:N (understates social-engineering value) |
There is no published CVSS scoring framework that captures phishing-aid bugs cleanly. A score of 5.4 Medium understates the social-engineering value because the standard does not weight Apple-branded presentation. In an enterprise threat model the bug ranks materially higher than the base score implies.
Because the bug is server-side, there is no patch end-users can apply. Practical defensive guidance for individuals and security teams:
https://www.icloud.com/attachment/ and cvws.icloud-content.com at the
proxy unless the workflow specifically requires Maildrop. Most organisations do not.No mitigation removes the attack surface; only a server-side fix at Apple does.
Three options, in increasing order of architectural cleanliness:
Option 1 — HMAC the outer query string. Append a sig= parameter computed by
Apple’s Maildrop service over the canonical concatenation of u, uk, f, sz.
Reject requests where the signature does not match. Implementation: one HMAC computation
per URL generation, one per download request. Backward compatibility: accept unsigned URLs
for the remainder of their 30-day life; sign all newly-generated URLs.
Option 2 — Derive f and sz from the server-side record keyed by uk.
The Maildrop service already knows the canonical filename and size for each uk. Ignore
the URL-supplied f and sz values; resolve them server-side at request time. The CDN
template substitution for ${f} should resolve from the server record, not the request
query string. This is the most defensible option: it removes the entire attack class without
requiring callers to retain or transmit a signature.
Option 3 — Remove the ${f} and ${uk} template substitution from the CDN URL
entirely. The CDN path can be made canonical and content-hash-addressed, with filename
presentation handled by the landing page from server-side metadata.
This document is published after 34 months of vendor exclusivity. The author considers this appropriate because:
This disclosure does not include credentials, account-specific URLs, or any non-public Apple infrastructure detail. The technical content is reproducible from any Maildrop URL the reader generates themselves.
This document is licensed CC BY 4.0; reuse, citation, and redistribution are permitted
with attribution. The PoC requires Python 3 and a Maildrop URL generated by sending a
small file to oneself via Apple Mail. No credentials, no API keys, no proprietary tooling.
The maildrop_spoof.py script is reproduced in full in §2.4 above and is also
available separately on request.
Vendor case OE1950888220 was originally filed on 2023-07-07; refreshed PoC and analysis filed 2026-04-04; vendor status as of 2026-05-13 is “Prioritised for review”.
Stuart Thomas is an independent security researcher with prior contributions accepted into the OpenBSD and FreeBSD projects and submissions accepted into the Apple Security Bounty pipeline. Contact information available on request. This disclosure represents the author’s own work and does not represent the position of any employer.