Series · 5 partsATM Security AssessmentPart 3 · You are here
  1. 1The ATM Was Locked Down. The Transaction Path Was Not.
  2. 2The BIOS Had a Password. The Boot Chain Still Needed Trust.
  3. 3The Desktop Was Hidden. The Execution Boundary Was Not.You are here
  4. 4The Device API Was Standard. Authorization Was Assumed.
  5. 5One ATM Was Contained. The Fleet Trust Path Was Not.

Kiosk containment in 60 seconds

A full-screen ATM application is a presentation decision. It is not proof that the operating system underneath has become a single-purpose appliance. The real boundary is the set of code, identities, files, services, interaction paths, and maintenance states that the platform permits.

The useful pentest question is not “Can I make the desktop appear?” It is:

If the public session reaches an unexpected operating-system function, which independent control prevents that function from becoming code execution, privilege, secrets access, device authority, persistence, or an invisible change?

This methodology uses benign test artifacts and vendor-approved lab states. It does not require weaponised payloads, credential dumping, destructive policy changes, or access to production payment data. A denied process start, a blocked file transition, and a correlated off-host event usually prove the boundary more cleanly than a dramatic kiosk escape.

The shell and the policy are different controls

Windows provides kiosk and restricted-user experiences such as Assigned Access and Shell Launcher. Those features narrow the user experience, but they solve a different problem from application control. A shell can hide entry points while an application-control policy decides which binaries, scripts, installers, libraries, drivers, and interpreters may execute.

An ATM needs both. It also needs least-privileged service identities, protected writable paths, restricted management interfaces, a controlled update channel, and telemetry that survives endpoint compromise. Otherwise a kiosk can look perfectly locked while trusting a path the user never sees.

VISIBLE KIOSK ≠ AUTHORITATIVE EXECUTION BOUNDARY Public surfaceINPUT + UItouch · reader · accessibility SessionKIOSK SHELLrestricted experience AuthorityCODE + IDENTITYallow · deny · constrain HostOS SERVICESleast privilege CapabilityDEVICESnarrow broker

Maintenance + recoveryEQUIVALENT POLICYno general-purpose exception Deployment gateSIGN + APPROVE + TARGETpackage · policy · rollback Independent evidenceOFF-HOST MONITORINGactor · hash · policy · result

FAIL-CLOSED CLAIMUnexpected interaction may expose an entry point; it must not silently acquire execution or a stronger identity.The same assertion must hold during normal use, service, update, failure, and recovery.

The kiosk shell reduces exposure. Code policy and identity policy decide whether an exposed path has authority.

Phase zero: model every operating state

Begin with the states the terminal can legitimately enter: normal customer session, startup, application restart, degraded connectivity, cash or paper service, authorised maintenance, remote support, software deployment, operating-system recovery, and return to service.

For each state, identify the interactive account, shell, allowed processes, effective application- control policy, service identities, writable locations, network policy, telemetry destination, and exit condition. The dangerous gap is often not the production kiosk profile. It is a diagnostic or recovery state that temporarily restores a general-purpose shell, broader network access, or a high-privilege account and never proves that the restriction was reinstated.

Define stop conditions before testing. Use synthetic data, inert files, approved accounts, and a lab device. Do not collect credentials, disable the endpoint protection stack, or use a real device operation to prove local execution. The finding is the unjustified authority transition.

Phase one: separate interaction exposure from execution

Catalogue every public input path: touch, function keys, accessibility features, reader events, printer prompts, external links, help flows, file dialogs, error handlers, and application restart behavior. Also review indirect content such as images, receipts, language packs, configuration, and remotely supplied messages.

An exposed operating-system surface is a hypothesis, not yet a critical finding. Attempt only a benign transition to an organisation-controlled sink or inert artifact. Record which process handled the input, which identity it used, what policy decision occurred, and whether the event reached central monitoring. Stop when the authority decision is known.

This prevents the report from confusing “desktop visible” with “system compromised.” A visible dialog may be serious if it can invoke an ungoverned interpreter or write to a trusted execution path. It may be low impact if code policy, file permissions, network policy, and service boundaries remain authoritative. Evidence decides.

Phase two: make application control authoritative

Application control should convert the terminal from “anything runs unless detected as bad” to “only code selected by policy runs.” On a fixed-workload ATM, the trust set can be narrow, but the assessment must include more than executable files.

Inventory applications, libraries, drivers, scripts, installers, interpreters, plug-ins, COM components, scheduled tasks, and service binaries. Map how each is identified: publisher, certificate, catalog, hash, managed installer, path, or another rule. A broad publisher rule may trust far more code than the baseline intends. A path rule may become unsafe when a lower-privilege identity can write to that path.

Use a set of inert test artifacts representing distinct cases: unknown binary, unknown script, renamed file, allowed publisher outside the approved product, and approved code placed in an unapproved writable location. The expected output is a decision matrix, not execution. Verify enforcement—not merely audit mode—and correlate each denial with policy version, file identity, caller, terminal, and trusted time.

Test the same set after update, during maintenance, and after recovery. A supplemental policy or emergency exception that remains in place can expand the trust set silently. Every exception needs an owner, reason, target group, start, expiry, and regression test.

Phase three: follow identity, not process names

A kiosk application often relies on privileged services to reach hardware or operating-system functions. That is a sound design only if the broker enforces a narrow contract. Process names and local connectivity are not authorization.

Record the identity and privileges of the kiosk account, application process, broker, service, updater, monitoring agent, and remote-support component. Determine which resources each can read, write, start, configure, or impersonate. Review service executable and configuration permissions, named-object permissions, local IPC authorization, token boundaries, and recovery identities.

Use harmless out-of-context requests or test doubles in the lab. A public-session process should not inherit a sensitive capability simply because it can reach a local broker. A service should validate caller identity and policy state, not assume that any local caller belongs to the approved application. Part four follows that device boundary in depth; here the objective is to prove that a UI-layer mistake cannot automatically become SYSTEM-level authority.

Phase four: test writable paths, secrets, and persistence

Build a write map for each identity. Include application directories, data folders, temporary locations, logs, update staging, service configuration, startup locations, policy files, and any path consumed by a privileged component.

The critical condition is not that a low-privilege account can write somewhere. It is that a more trusted component later interprets, loads, executes, or authenticates that content without a separate integrity decision. Test with inert markers and file hashes. Do not replace production binaries or insert executable content.

Handle secrets as another authority path. Determine where service credentials, API material, certificates, recovery data, and configuration secrets originate, which identity can retrieve them, whether they are machine-bound, how they rotate, and whether use is logged. Evidence should record access decisions and metadata, never the secret itself.

Persistence testing should similarly stop at policy. Demonstrate that an unapproved identity can or cannot create a start condition, then remove the inert marker and verify reconciliation. There is no need to install a backdoor to prove that startup policy trusts a writable object.

Phase five: validate update and exception governance

The update system deliberately crosses the application-control boundary. That makes it part of the security architecture: package creation, signing, approval, targeting, staging, installation, rollback, policy refresh, and final inventory all need accountable owners.

Use vendor test packages or metadata to verify rejection of an unsigned, incorrectly targeted, expired, or out-of-policy update. Confirm that the updater itself cannot convert any locally writable file into trusted code. Confirm that an approved package cannot silently expand the application-control policy beyond its change record.

After installation, require agreement between local version, code-policy state, deployment record, endpoint telemetry, and asset inventory. “Job succeeded” is a deployment result, not proof that the ATM returned to a trusted state.

Phase six: prove detection and recovery

Each negative control should produce an off-host event that includes terminal identity, user or service identity, file or object identity, policy version, decision, operating state, and trusted time. The local endpoint cannot be the sole custodian of evidence about its own loss of trust.

Then rehearse containment. Can the operator isolate the terminal’s service and transaction paths without losing the evidence trail? Can they distinguish a policy false positive from an actual integrity failure? Can they restore a known-good image, reapply the correct kiosk and application- control policies, rotate exposed authority, and reconcile the device before it handles another customer session?

The recovery gate should be machine-verifiable. The terminal returns only when boot trust, application policy, versions, identities, monitoring, network policy, and operational state agree.

Evidence matrix

SignalWhat it provesSafe negative controlDefender verification
A public interaction opens an unexpected OS surfaceThe shell exposes an entry point; impact is not yet knownNavigate only to an inert local artifact or controlled sinkCorrelate handler process, identity, code-policy result, network result, and alert
Unknown binary is blocked but script, library, installer, or interpreter paths are not governedApplication control covers only part of the execution modelPresent inert artifacts for each code class without payload behaviorVerify enforced policy, policy version, caller, hash or signer, and off-host denial
A low-privilege identity writes content later consumed by a privileged serviceFile integrity becomes an authority escalation pathPlace a non-executable marker and observe the privileged consumption decisionFix ACLs, validate content integrity, and regression-test the boundary
Maintenance or recovery uses a broader code policy without expiryA temporary operating state creates a persistent exceptionCompare the same inert test set across normal and service statesRequire scoped exception, approval, expiry, policy rollback, and reconciliation
Update job succeeds while local policy, version, and inventory disagreeDeployment success is being treated as trustApply an approved lab package and compare all sources of truthGate return to service on code policy, version, telemetry, and inventory agreement
Execution denial remains only in local logsEndpoint compromise can erase detection evidenceTrigger one approved denial on a lab terminalRequire off-host delivery with actor, terminal, policy, object, result, and time

What a finding should look like

The lab kiosk account could write an inert marker into a directory consumed by the privileged maintenance service at startup. Application control denied an unknown executable in the public session, but the service’s data-consumption path was not integrity-checked and no central event identified the lower-privilege writer. No payload, credential, device command, payment data, or persistence mechanism was used. The boundary therefore relies on path location rather than producer identity and content integrity. Restrict write access, authenticate the consumed object, record producer and decision off-host, and regression-test the same transition in normal, maintenance, and recovery states.

That finding names the authority transition and the missing invariant. “Kiosk escape achieved” does neither.

What I would not call proof

  • A hidden desktop or disabled key combination presented as application control.
  • Audit-mode events presented as enforced denial.
  • A blocked executable with no coverage for scripts, libraries, drivers, and interpreters.
  • A privileged service account described as safe because the service is vendor-supplied.
  • An EDR agent shown as healthy without an off-host test event and response path.
  • A successful update without final-state reconciliation.
  • A screenshot of local secrets or customer data collected to make the finding look serious.

Defender priority order

First, make code policy authoritative. Cover every executable code class and every operating state, then protect the policy from local weakening.

Second, reduce broker authority. Give kiosk and service identities only the resources and device operations their contracts require; validate the caller at every local boundary.

Third, remove writable-to-trusted transitions. Privileged components must not consume lower- trust content without integrity and producer checks.

Fourth, govern updates and exceptions as security changes. Scope them, approve them, expire them, and reconcile the terminal afterward.

Fifth, test recovery as often as prevention. A known-good image and policy baseline are useful only if the organization can restore and verify them without losing the audit trail.

Closing thought

The ATM does not become an appliance because the desktop is hidden. It becomes appliance-like when every code path, identity, writable object, update, and recovery state is constrained by an explicit policy that produces independent evidence.

A strong assessment can acknowledge a kiosk escape without stopping there. The decisive result is what the next control did.

Public sources and standards context

The exact kiosk and application-control technologies vary by ATM generation and operating system. Test the implemented control and its vendor-supported lifecycle; do not infer production behavior from a generic desktop build.

Sources & freshness

How current is this note?

Sources checkedAugust 30, 2026

The latest source-review, content-update, or publication date is shown.

ReviewPublic sources reviewed

Primary public records were checked. Environment-specific behavior remains outside the claim unless separately reproduced.