Skip to content

Repository files navigation

Printer Simulator — Public Full Disclosure

Report metadata Value
Generated 2026-07-17T03:33:47Z
Public disclosure 2026-08-21
Vendor Apple
Researcher Jon "GainSec" Gaines
Target / binary PrinterSimulatorServer
Bundle version 95
Architectures x86_64 + arm64
Code signing ID com.apple.PrinterSimulatorServer
Binary SHA-256 ec6efec8db2f1643bc5caaf6e4d266091b3d4374037458f745c4921bf484c7b1
Test OS macOS 26.5.2 (25F84)
Test hardware Mac16,11 / Apple M4 Pro
Xcode 26.6 (17F113)

Executive Summary

This public full disclosure documents three validated technical weaknesses in Apple Printer Simulator's PrinterSimulatorServer component and publishes the complete reproduction source, requests, outputs, crash evidence, and browser evidence. Apple closed all three Security Research cases as not security issues. Current publication severities are Low for both denial-of-service findings and Informational for the local-context stored XSS. Historical technical CVSS estimates remain visible for traceability and are not the current severity ratings.

Apple Security Research disposition update — August 21, 2026. Apple closed all three portal cases as unable to identify a security issue. Current report severities are Low for both denial-of-service weaknesses and Informational for the Add-Printer stored XSS. Original CVSS values are retained only as historical technical estimates. Apple's disposition and the supporting portal screenshots are recorded within each finding.

Finding Current severity CWE Historical technical estimate Supported impact
Stack buffer overflow via document-password null terminator write LOW CWE-787 7.5 HIGH (historical) document-password crash DoS
Unbounded URF raster width causes multi-GB memory allocation DoS LOW CWE-400 7.5 HIGH (historical) URF multi-GB allocation DoS
Stored HTML attribute injection with browser execution via Add-Printer printer name INFORMATIONAL CWE-79 6.1 MEDIUM (historical) stored web UI script execution

Public Reproduction Files

These are the exact individual files used to reproduce and validate each finding. No ZIP archive is required. Complete PoCs and evidence are copied into this repository and linked below.

Document Password

File MIME Bytes SHA-256
APPLE_REPORT_BODY.md text/markdown 2,064 2834ebe17b1527cc3980ff58b5d61ad9d77e7a1c82866c697981e20ea00f9e8e
SHA256SUMS.txt text/plain 621 b91f52e2e03de93b2b8e5ea7e963eae3215a2de96d6a6e1e3eef648efd0ea00c
artifacts/PrinterSimulatorServer-2026-07-16-175506.ips application/json 9,950 03db44a751e2c660ffa6786d961f9e3ae07c3c443168f428cbb318dd793fc216
artifacts/document-password-encrypted.pdf application/pdf 1,059 93bfa0e187d9b16aaeca212953b109cd7a996649331635fb68c864f2546a2cd4
artifacts/document-password-plain.pdf application/pdf 581 b4eb791c70b3da46201e4a6c07590f0f0e9ff81d1d478d45b8bebccddaaef895
artifacts/impact-escalation-report.md text/markdown 4,919 44ca072b56374b7cc1546ec8fc9dc4fc043f097fe92358422571752cc80ffb1a
printer_sim_poc.py text/x-python 31,576 bd6d410ecdd510dfd862b66a67fb86e5f203fa410de65b4697155eda9cdb9187

URF Max Width

File MIME Bytes SHA-256
APPLE_REPORT_BODY.md text/markdown 1,844 3a0831f11382c638fd2e600c511674533dc139741e382b36566ba8415a972e93
SHA256SUMS.txt text/plain 585 ab13f73bc79a61968d5da24c59d665aafa63ee454f6f9afcf000210221a78d38
artifacts/impact-escalation-report.md text/markdown 4,827 6707c5af846695b8079e945757642d1385d542475c70f2d1647dfe644022bc99
artifacts/urf-max-width.stderr.txt text/plain 0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
artifacts/urf-max-width.stdout.txt text/plain 837 0d92fcfc47b11913ba054c25786f7e1428886005596897f0101a4e2804ada2ae
artifacts/urf-max-width.test application/octet-stream 307 f39bdc40bc89bf2e4066ac9058ff1d5b237d82f6fb7568345666d6ed0fad9a0b
printer_sim_poc.py text/x-python 31,576 bd6d410ecdd510dfd862b66a67fb86e5f203fa410de65b4697155eda9cdb9187

Add Printer XSS

File MIME Bytes SHA-256
APPLE_REPORT_BODY.md text/markdown 2,581 0f4dbe815d50408dedc6b1a3ab46c47c8cf6ad265b9a431f471e4b635532ff7c
SHA256SUMS.txt text/plain 886 56abb629ae2fbdabde254d38a529d85b81a7108c08ebffde2a7a227fe978fb20
artifacts/add-printer-attr-alert-proof-devtools-dialog.json application/json 339 7bb0581ece5b8dfe53332e2be4910130290875ce01bda79301146610fcd2de14
artifacts/add-printer-attr-alert-proof-screenshot.png image/png 14,154 70b060b6add61000ec5d1cc03a34c3b7836b43f654ead448e7c89b1d3680a3f6
artifacts/add-printer-attr-alert-proof.payload.txt text/plain 223 82a4cc2cc6745f3e02d3dfa1b9c3ab87b2f76371fd217731b1c5109e5c7068ab
artifacts/add-printer-attr-alert-proof.response.bin application/octet-stream 751 101c6e21165225804344578e8face350a9fe45f2051913ba5fd8955cd82c5dbf
artifacts/add-printer-attr-alert-proof.web-index.raw-http message/http 4,747 f9cd2ce7083d50dd867fd9c63d1abd2d33923d4e8b1b63408dd60a84074e44aa
artifacts/impact-report.md text/markdown 3,962 892bca1ad34155560d59cd678001debf8c824ba578e433606e4255332867ffc5
printer_sim_poc.py text/x-python 31,745 c72ef628f60bbdfe7b848187085aa3330c72ee7ef98ad921ef3fbc571db4ec7b

Intentional exclusions. urf-max-width/artifacts/urf-max-width.bin is a deterministic 128 MiB payload regenerated by the published PoC. add-printer-attr/__pycache__/printer_sim_poc.cpython-314.pyc is generated Python interpreter cache and is not source or evidence.

Public-data sanitization. Machine-specific crash identifiers, local filesystem paths, private hostnames, and ephemeral browser session identifiers are redacted. Technical exception, stack, payload, response, and browser-execution evidence is retained.

Scope, Environment, And Integrity

Target Identity

Product/component: Apple Printer Simulator / PrinterSimulatorServer App bundle: Printer Simulator.app Bundle identifier: com.apple.PrinterSimulator Bundle version: 95 Server code signing ID: com.apple.PrinterSimulatorServer TeamIdentifier: 59GAB85EFG Signed Time: Sep 17, 2025 02:08:46 CDHash: b1e9a715e2ce3bbf5e889dd7b738f7de091f4f4f Binary architectures: x86_64 + arm64 Binary SHA-256: ec6efec8db2f1643bc5caaf6e4d266091b3d4374037458f745c4921bf484c7b1

Test Environment

Test OS: macOS 26.5.2 (25F84) Hardware: Mac16,11 / Apple M4 Pro Installed Xcode: 26.6 (17F113) App build metadata: DTXcode=2610, DTXcodeBuild=17B5025c, DTSDKName=macosx26.0.internal Install source: Apple Printer Simulator app bundle from Additional Tools / Xcode tooling installation Target Flags: not applicable for all three issues Submission model: submit the three findings separately; no exploit chain is claimed

Service Exposure / CVSS Assumption

Direct repro command: PrinterSimulatorServer -T -W -R none -p <port> Observed listener under those flags: IPv4 *:<port> and IPv6 *:<port> Binary help: default listen port is 631; test printers require -T; web interface requires -W. The suggested AV:N vectors assume the explicitly launched simulator server is reachable over the network in this configuration. This report does not claim that the GUI exposes the service remotely by default; Apple should adjust severity if its supported/default launch model is local-only or developer-only.

Validated Findings

Stack buffer overflow via document-password null terminator write

Finding overview Value
Current severity LOW
Affected artifact PrinterSimulatorServer / document-password IPP path
CWE CWE-787
Supported impact Unauthenticated crash / denial of service
Authentication / interaction None / none
Validation Runtime confirmed
Historical estimate 7.5 HIGH — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

Apple Security Research Disposition

Disposition field Value
Case: OE11068641577017
Reported: July 17, 2026, 1:55 AM
Apple response: Brent | Product Security
August 3, 2026, 4:52 PM
Portal status: Unable to identify a security issue
Current severity: Low

Disposition summary: Apple stated that it did not consider the reported crash behavior a security issue and passed the report along for possible future enhancements to the platform.

Apple Security Research case OE11068641577017 showing the document-password crash report and Apple disposition

1. Impact and Security Boundary

Unauthenticated remote crash / denial of service. A crafted IPP Print-Job with an encrypted PDF, page-ranges, and a document-password octetString of length 0x80 reaches the PDF password path and triggers a stack-smashing protection abort in PrinterSimulatorServer. The current exploitability cycle did not produce evidence of code execution, saved return-address control, arbitrary write, or command execution.

2. Root Cause and Vulnerable Code

In sym.func.100010a10 (PDF page-ranges handler), document-password is fetched as an IPP octetString and copied into a 128-byte stack buffer at sp+0x88 with __memcpy_chk(dest_size=0x80). For length 0x80, the checked copy fills the buffer exactly; the following instruction at 0x100010b18 writes a NUL terminator to [sp+0x88+len], producing an off-by-one stack write at sp+0x108. Runtime evidence shows this is detected by macOS stack-smashing protection and terminates the process with SIGABRT.

Affected code anchor

  • PrinterSimulatorServer:sym.func.100010a10@0x100010b18

3. Runtime Verification

Confirmed reliable remote DoS via off-by-one NUL write in the document-password path. The crafted IPP request causes macOS libsystem_c stack-smashing protection to abort PrinterSimulatorServer with SIGABRT. Static review for this cycle found no evidence of PC/LR control, arbitrary write, command execution, or a controllable RCE primitive; the client-ready impact is crash-only denial of service.

Crash report excerpt

{ "incident_id": "REDACTED", "timestamp": "2026-07-16 17:55:06.00 -0400", "exception": { "codes": "0x0000000000000000, 0x0000000000000000", "rawCodes": [ 0, 0 ], "type": "EXC_CRASH", "signal": "SIGABRT" }, "termination": { "flags": 0, "code": 6, "namespace": "SIGNAL", "indicator": "Abort trap: 6", "byProc": "PrinterSimulatorServer", "byPid": "REDACTED" }, "asi": { "libsystem_c.dylib": [ "stack buffer overflow" ] }, "top_frames": [ { "imageOffset": 38376, "symbol": "__pthread_kill", "symbolLocation": 8, "imageIndex": 1 }, { "imageOffset": 26840, "symbol": "pthread_kill", "symbolLocation": 296, "imageIndex": 4 }, { "imageOffset": 493288, "symbol": "__abort", "symbolLocation": 152, "imageIndex": 5 }, { "imageOffset": 493504, "symbol": "__stack_chk_fail", "symbolLocation": 96, "imageIndex": 5 }, { "imageOffset": 60508, "imageIndex": 0 }, { "imageOffset": 18260, "imageIndex": 0 }, { "imageOffset": 14656, "imageIndex": 0 } ] }

4. Reproduction and PoC

Run from reproduction/document-password/:

python3 printer_sim_poc.py \
  --case document-password \
  --start-server \
  --bin "/path/to/PrinterSimulatorServer" \
  --host 127.0.0.1 \
  --port 6340 \
  --printer laser \
  --pdf-file artifacts/document-password-encrypted.pdf \
  --document-password-length 128 \
  --timeout 20 \
  --out-dir out-document-password

Expected proof: the unauthenticated IPP Print-Job terminates PrinterSimulatorServer through stack-protector detection. The staged request and crash report are linked above.

5. Evidence Assessment

Impact escalation analysis completed via manager-verified static binary analysis and runtime crash validation. Confirmed primitive: document-password length 0x80 fills a 128-byte stack buffer, then 0x100010b18 writes a NUL byte one byte past the buffer. Crash evidence: macOS .ips report records EXC_CRASH/SIGABRT, Abort trap 6, libsystem_c "stack buffer overflow", and __stack_chk_fail on the crashing stack. RCE assessment: not proven in this cycle. No direct evidence of saved LR/PC control, arbitrary write, function-pointer overwrite, command execution, or Calculator/Safari-style exploit effect was produced. Use impact as reliable unauthenticated remote crash/DoS.

6. Remediation

Check attacker_length < 0x80 before the memcpy at 0x100010b14, or ensure null terminator write at 0x100010b18 uses min(attacker_length, 0x7f) to stay within bounds.

Unbounded URF raster width causes multi-GB memory allocation DoS

Finding overview Value
Current severity LOW
Affected artifact PrinterSimulatorServer / URF raster decoder
CWE CWE-400
Supported impact Unauthenticated memory exhaustion / denial of service
Authentication / interaction None / none
Validation Runtime confirmed
Historical estimate 7.5 HIGH — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

Apple Security Research Disposition

Disposition field Value
Case: OE11068645181618
Reported: July 17, 2026, 2:02 AM
Apple response: Apple Product Security
August 20, 2026, 10:38 AM
Portal status: Unable to identify a security issue
Current severity: Low

Disposition summary: Apple acknowledged the clear and accurate resource-exhaustion characterization, declined to track the behavior as a security issue, forwarded it to the appropriate team, and directed future non-security reporting to Feedback Assistant.

Apple Security Research case OE11068645181618 overview showing the URF raster memory-exhaustion report status

Apple Product Security response for URF raster memory exhaustion

1. Impact and Security Boundary

Unauthenticated remote resource exhaustion / denial of service. A crafted image/urf Print-Job with extreme but accepted URF dimensions can drive PrinterSimulatorServer RSS into multi-GB territory while the job completes successfully. This cycle did not produce evidence of controlled crash, heap corruption, arbitrary write, PC/LR control, command execution, or RCE.

2. Root Cause and Vulnerable Code

In sym.func.100023684, URF page width is loaded from the attacker-controlled Apple Raster page header and multiplied by bytes-per-pixel to produce a line-buffer size. The function rejects zero dimensions but does not enforce an upper bound before malloc/realloc. A valid image/urf document with width=0xffffffff is accepted by the production IPP surface and forces PrinterSimulatorServer into multi-GB memory allocation. The reviewed ARM64 instruction is umull x20,w9,w8, a widening 32x32-to-64-bit multiply, so the current evidence supports resource exhaustion rather than a proven integer-wrap-to-undersized heap overflow.

Affected code anchor

  • PrinterSimulatorServer:sym.func.100023684@0x1000237ec

3. Runtime Verification

Runtime-confirmed availability impact only: an unauthenticated image/urf Print-Job is accepted and can drive PrinterSimulatorServer RSS into multi-GB territory, with the fresh baseline rising from 6,032 KB to 7,042,496 KB. No controlled crash, corruption, allocator misuse, PC/LR control, arbitrary write, command execution, or RCE was found. Static review also weakens the original heap-overflow theory because the cited ARM64 umull writes a full 64-bit product, not a truncated 32-bit allocation size.

4. Reproduction and PoC

Run from reproduction/urf-max-width/ on an isolated host; the proof intentionally consumes multiple gigabytes of memory:

python3 printer_sim_poc.py \
  --case urf-max-width \
  --start-server \
  --bin "/path/to/PrinterSimulatorServer" \
  --host 127.0.0.1 \
  --port 6341 \
  --printer laser \
  --timeout 120 \
  --out-dir out-urf-max-width

Expected proof: ipptool reports successful-ok, the job completes, and the runner records multi-gigabyte server RSS. The 128 MiB payload is regenerated by the PoC.

5. Evidence Assessment

Impact escalation verdict: DOS_ONLY_CONFIRMED. Manager-verified radare2 review of sym.func.100023684 shows URF width and bytes-per-pixel reach an unchecked large allocation, but umull x20,w9,w8 is a widening 32x32->64 multiply; allocation failure clears the line buffer pointer and line-size fields. Fresh runtime baseline returned successful-ok/job-completed-successfully and server_rss_kb_min=6032 max=7042496, with no crash/corruption/RCE evidence.

6. Remediation

Reject URF jobs whose width, height, bytes-per-pixel, computed line size, or aggregate raster allocation exceeds a sane product limit. Use checked 64-bit arithmetic and enforce maximum supported raster dimensions before malloc/realloc or downstream decode/copy work.

Stored HTML attribute injection with browser-confirmed script execution via Add-Printer printer name

Finding overview Value
Current severity INFORMATIONAL
Affected artifact PrinterSimulatorServer / Add-Printer web renderer
CWE CWE-79
Supported impact Local-context stored browser script execution
Authentication / interaction None / user must view simulator UI
Validation Runtime and browser confirmed
Historical estimate 6.1 MEDIUM — CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N

Apple Security Research Disposition

Disposition field Value
Case: OE11068642356318
Reported: July 17, 2026, 2:26 AM
Apple response: Jason | Product Security
July 17, 2026, 12:15 PM
Researcher closure: July 20, 2026, 9:40 PM
Portal status: Unable to identify a security issue
Current severity: Informational

Disposition summary: Apple confirmed that the missing double-quote escaping and injected browser handler were documented, but found that the same local operator submitted the crafted printer name and viewed the result. Apple found no demonstrated remote, cross-user, native-code, privilege-escalation, production-printing, or other security-boundary impact. The researcher accepted the self-XSS classification and requested closure.

Apple Security Research case OE11068642356318 overview showing the stored XSS report status

Apple Product Security response explaining the local self-XSS security-boundary assessment

Researcher response accepting self-XSS classification and requesting case closure

1. Impact and Security Boundary

Stored browser-side JavaScript execution in the printer simulator web interface. The proof shows attacker-controlled attributes stored by Add-Printer and rendered into the web UI without quote escaping; Chrome then executed the injected onerror handler and opened a JavaScript alert dialog. Browser-side impact requires a user to view the affected simulator UI; no native code execution or platform compromise is claimed.

2. Root Cause and Vulnerable Code

The Add-Printer path in sym.func.100007b80 accepts the attacker-controlled printer-uri suffix (/ipp/print/<name>) into a 0x400 httpSeparateURI path buffer and passes path+10 as arg1 to sym.func.100016a60, which stores it with strdup at printer object offset 0x10. The web index renderer sym.func.10001ffcc later loads [printer+0x10] and passes it to sym.func.100020e60 with the template at 0x10002efca: hidden PRINTER VALUE="%s" and img alt="%s". The string writer sym.func.100021360 only escapes '<' to &lt; and '&' to &amp;; it does not escape double quotes, so a printer name containing a quote can break out of the attribute and inject HTML/JavaScript into the web UI.

Affected code anchors

  • PrinterSimulatorServer:sym.func.100007b80@0x100007d28
  • PrinterSimulatorServer:sym.func.100016a60@0x100016b14
  • PrinterSimulatorServer:sym.func.10001ffcc@0x1000203bc
  • PrinterSimulatorServer:sym.func.100020e60@0x1000212fc
  • PrinterSimulatorServer:sym.func.100021360@0x1000213bc

3. Runtime Verification

Runtime confirmed on macOS Printer Simulator via the PoC runner, Chrome DevTools, and a visible Chrome screenshot. The crafted Add-Printer request caused the web index to contain a raw quote-breakout onerror handler. Chrome loaded the affected simulator web UI, the image error handler executed, and Chrome opened a JavaScript alert dialog with the message REFALL XSS EXECUTED from injected onerror JavaScript.

4. Reproduction and PoC

Run from reproduction/add-printer-attr/:

python3 printer_sim_poc.py \
  --case add-printer-attr \
  --start-server \
  --bin "/path/to/PrinterSimulatorServer" \
  --host 127.0.0.1 \
  --port 6342 \
  --printer-name "refall-alert-fixed\" onerror=\"alert('REFALL XSS EXECUTED from injected onerror JavaScript');window.refallAlertProof=true;document.body.textContent='JS handler executed; window.refallAlertProof='+window.refallAlertProof\" x=\"" \
  --timeout 20 \
  --out-dir out-add-printer-attr

Open the simulator web index in a browser. Expected proof: the stored printer name breaks out of the HTML attribute and the injected onerror handler executes. The browser dialog record and screenshot are linked above.

5. Evidence Assessment

VISUAL TRACE: attacker-controlled printer name in Add-Printer/Modify-Printer request -> printer-uri/name parser -> stored printer name field -> web index renderer -> HTML attribute context -> unescaped double quote breaks out into attacker-controlled attributes. STATIC EVIDENCE: prior r2 trace showed the name is strdup'd into the printer object and later rendered through the web index HTML formatter; the escape routine handles '<' and '&' but not double quotes. RUNTIME EVIDENCE: the PoC sent the crafted request, the server returned 200 OK, the follow-up web index contained the injected onerror handler, Chrome opened a JavaScript alert dialog, and post-alert DevTools evaluation confirmed window.refallAlertProof=true. Verdict: browser_execution_confirmed.

6. Remediation

HTML-escape all context-sensitive characters before writing attacker-controlled strings into HTML attributes, including double quotes and single quotes; alternatively reject unsafe characters in printer names at creation time.

About

GainSec's MacOS Printer Simualtor Security Research Publication. Covers 3 issues found in current MacOS Versions.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages