How OpenClear could be attacked, and what stops it. It's kept as code with
OWASP pytm (threat_model/openclear.py) so it changes in the
same pull request as the system it describes, and a test fails when this page falls behind.
Terms are as in CONTEXT.md. It isn't legal advice, and it doesn't replace
each bank's own assessment of how it runs OpenClear.
Data flows
flowchart LR
subgraph b0["Internet"]
n0["Bank staff"]
n1["Customer user"]
n2["Platform staff"]
end
subgraph b1["Bank's network"]
n3["Embedding host (online banking)"]
n4["Bank core and API clients"]
n5["Teller platform (branches)"]
n6["Identity provider (OIDC / SAML)"]
n7["Directory (SCIM client)"]
n8["SIEM"]
n9["Webhook receiver"]
end
subgraph b2["Edge (WAF / CDN)"]
n15["Edge / WAF"]
end
subgraph b3["OpenClear installation (service provider)"]
n13["ClamAV daemon (optional)"]
n16["OpenClear web and API"]
n17["Background worker"]
n18["Plugins (in process)"]
end
subgraph b4["Data stores (service provider)"]
n19["Database (Postgres, row-level security)"]
n20["File storage (local, S3, Azure)"]
n21["Redis (rate limits, optional)"]
n22["Keys and secrets (files / environment)"]
end
subgraph b5["Outside services"]
n10["Email and SMS providers"]
n11["Cloud OCR (optional)"]
n12["Release feed (GitHub)"]
n14["VirusTotal (optional, hashes only)"]
end
n0 -->|"Bank staff use the web UI"| n15
n1 -->|"Customer users use the web UI"| n15
n2 -->|"Platform staff use the operator view"| n15
n3 -->|"Embedded session launched from online banking"| n15
n4 -->|"Core and API clients call the API"| n15
n5 -->|"A check verified before cash is paid at a branch, then recorded cashed"| n15
n6 -->|"SSO sign-in responses (browser-relayed)"| n15
n7 -->|"SCIM provisioning"| n15
n15 -->|"Edge forwards to the origin"| n16
n16 -->|"OIDC discovery, token and JWKS requests"| n6
n16 -->|"Queries, scoped to one bank"| n19
n16 -->|"Uploads, images and exports"| n20
n16 -->|"Rate-limit counters"| n21
n16 -->|"Signing and encryption keys read at start"| n22
n16 -->|"Plugin hooks"| n18
n17 -->|"Jobs read and write, per bank"| n19
n17 -->|"Exports, archives, OCR input"| n20
n17 -->|"Security events (HEC, syslog over TLS)"| n8
n17 -->|"Signed webhooks"| n9
n17 -->|"Decisions delivered to the core"| n4
n17 -->|"Email and SMS"| n10
n17 -->|"Incident notices emailed to each bank's incident contacts"| n10
n17 -->|"Check images for OCR (if configured)"| n11
n16 -->|"Release check"| n12
n16 -->|"Every upload streamed for a malware scan (if configured)"| n13
n16 -->|"Each upload's SHA-256 looked up, never the file (if configured)"| n14
n17 -->|"Hashes it couldn't answer for, asked again"| n14
| Flow | From → to | Protocol | Data |
|---|---|---|---|
| Bank staff use the web UI | Bank staff → Edge / WAF | HTTPS | Accounts, issued items and ACH data, Exceptions and pay / return decisions, Passwords and security-key assertions, Session tokens |
| Customer users use the web UI | Customer user → Edge / WAF | HTTPS | Accounts, issued items and ACH data, Exceptions and pay / return decisions, Passwords and security-key assertions, Session tokens |
| Platform staff use the operator view | Platform staff → Edge / WAF | HTTPS | Passwords and security-key assertions, Session tokens |
| Embedded session launched from online banking | Embedding host (online banking) → Edge / WAF | HTTPS | SSO assertions and ID tokens, Session tokens |
| Core and API clients call the API | Bank core and API clients → Edge / WAF | HTTPS | API client secrets and signed assertions, Accounts, issued items and ACH data, Exceptions and pay / return decisions, Payment files (X9.37, NACHA, CSV, Excel, zip) |
| A check verified before cash is paid at a branch, then recorded cashed | Teller platform (branches) → Edge / WAF | HTTPS | API client secrets and signed assertions, Accounts, issued items and ACH data |
| SSO sign-in responses (browser-relayed) | Identity provider (OIDC / SAML) → Edge / WAF | HTTPS | SSO assertions and ID tokens |
| SCIM provisioning | Directory (SCIM client) → Edge / WAF | HTTPS | API client secrets and signed assertions, People and group memberships |
| Edge forwards to the origin | Edge / WAF → OpenClear web and API | HTTPS | Accounts, issued items and ACH data, Exceptions and pay / return decisions, Passwords and security-key assertions, Payment files (X9.37, NACHA, CSV, Excel, zip), Session tokens |
| OIDC discovery, token and JWKS requests | OpenClear web and API → Identity provider (OIDC / SAML) | HTTPS | SSO assertions and ID tokens |
| Queries, scoped to one bank | OpenClear web and API → Database (Postgres, row-level security) | SQL | Accounts, issued items and ACH data, Action log, Exceptions and pay / return decisions, People and group memberships |
| Uploads, images and exports | OpenClear web and API → File storage (local, S3, Azure) | HTTPS | Check images, Payment files (X9.37, NACHA, CSV, Excel, zip) |
| Rate-limit counters | OpenClear web and API → Redis (rate limits, optional) | RESP | — |
| Signing and encryption keys read at start | OpenClear web and API → Keys and secrets (files / environment) | file | — |
| Plugin hooks | OpenClear web and API → Plugins (in process) | in-process | Accounts, issued items and ACH data, Exceptions and pay / return decisions |
| Jobs read and write, per bank | Background worker → Database (Postgres, row-level security) | SQL | Accounts, issued items and ACH data, Action log, Exceptions and pay / return decisions |
| Exports, archives, OCR input | Background worker → File storage (local, S3, Azure) | HTTPS | Action log, Check images, Payment files (X9.37, NACHA, CSV, Excel, zip) |
| Security events (HEC, syslog over TLS) | Background worker → SIEM | HTTPS | Security events |
| Signed webhooks | Background worker → Webhook receiver | HTTPS | Exceptions and pay / return decisions |
| Decisions delivered to the core | Background worker → Bank core and API clients | HTTPS | Exceptions and pay / return decisions |
| Email and SMS | Background worker → Email and SMS providers | HTTPS | Notifications |
| Incident notices emailed to each bank's incident contacts | Background worker → Email and SMS providers | HTTPS | Incident notices and contacts |
| Check images for OCR (if configured) | Background worker → Cloud OCR (optional) | HTTPS | Check images |
| Release check | OpenClear web and API → Release feed (GitHub) | HTTPS | — |
| Every upload streamed for a malware scan (if configured) | OpenClear web and API → ClamAV daemon (optional) | clamd | Check images, Payment files (X9.37, NACHA, CSV, Excel, zip) |
| Each upload's SHA-256 looked up, never the file (if configured) | OpenClear web and API → VirusTotal (optional, hashes only) | HTTPS | — |
| Hashes it couldn't answer for, asked again | Background worker → VirusTotal (optional, hashes only) | HTTPS | — |
Threats specific to OpenClear
Positive pay's own threats, by STRIDE category (Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege). Evidence names OpenClear's controls, code and ASVS 5.0 requirements. "CUEC" means the protection depends on the service provider or the bank (CUECs).
| Id | STRIDE | Boundary | Threat | Mitigation | Evidence | Status |
|---|---|---|---|---|---|---|
| OC-T01 | E | Bank ↔ bank | One bank's people or data reach another bank. | Every query runs in one bank's context; Postgres row-level security enforces it under a non-superuser role. | OC-AC-09; db/tenancy.py; tests/test_postgres/test_rls_*.py; ASVS 8.4.1 | Mitigated |
| OC-T02 | E | Customer ↔ customer | A customer's people see another customer's accounts, items or images. | Customer- and account-scoped repositories on every query; per-account access. | OC-AC-03, OC-AC-04; repositories/; db/account_scope.py; ASVS 8.2.2 | Mitigated |
| OC-T03 | S | Bank ↔ bank | A session from one organization's sign-in is used to enter another organization the same person belongs to, without that organization's sign-on rules. | Sessions record how they were signed in; switching is allowed only where that sign-in is accepted. | web/routers/tenant_switch.py::switch_refusal; 1.21.2; ASVS 6.3.4, 6.8.1 | Mitigated |
| OC-T04 | S | Identity provider | A bank's or customer's identity provider asserts someone it doesn't vouch for. | A provider links only people already members in its own scope, matched by its stable subject; groups are re-read on every sign-in; a customer's sign-on is confined to that customer. | OC-IA-03, OC-IA-05; services/sso_service.py; SECURITY_REVIEW.md R2; ASVS 6.8.1, 10.5.2 | Mitigated |
| OC-T05 | S | Internet | Password guessing and credential stuffing. | Lockout, per-person and per-IP rate limits, the bank's password policy (15 characters for new banks), breached and context-word checks, passwords re-checked at sign-in, the same answer for unknown and locked accounts, and security keys a bank or customer can require. | OC-IA-01, OC-IA-02, OC-SC-06; auth/breached_passwords.py; auth/security_key_policy.py; ASVS 6.2.4, 6.2.12, 6.3.3, 6.3.8 | Mitigated |
| OC-T06 | S | Internet | A stolen session cookie is replayed. | HttpOnly, Secure, SameSite cookies; idle and absolute timeouts; server-side revocation; token version bump on password change. | OC-AC-10, OC-SC-04; services/session_service.py; ASVS 7.x | Mitigated |
| OC-T07 | T | Customer ↔ bank | One person issues and approves the same payment decision, or weakens a protection alone. | Segregation of duties; dual control on decisions; two people for settings changes, at bank, customer and service provider. | OC-AC-05, OC-AC-06, OC-AC-07, OC-AC-13; DUAL_CONTROL_PLAN.md | Mitigated |
| OC-T08 | T | Bank's network | A forged or altered payment file (X9.37, NACHA, CSV) creates false issued items or presentments. | Uploads only by permitted people or API clients; hardened parsers; every file kept with its SHA-256 and a signature; row-by-row results. | OC-SI-01, OC-SI-02, OC-SC-03 | Mitigated |
| OC-T09 | T | Data stores | The action log is altered to hide a decision or a settings change. | Chained, signed entries; verified daily; archived to signed files; the provider's own log likewise. | OC-AU-01, OC-AU-02, OC-AU-03 | Mitigated |
| OC-T10 | R | Customer ↔ bank | Someone denies having decided an exception or changed a setting. | Every change in the action log with who, when, from where and the request id; signed evidence export. | OC-AU-01, OC-AU-05 | Mitigated |
| OC-T11 | I | Internet | Account numbers or check images leak through the browser, caches or URLs. | no-store on the UI and API; CSP; no third-party scripts; access limited by customer and account. | OC-SC-04; web/security_headers.py; ASVS 14.2, 14.3 | Partly (issues #13, #14) |
| OC-T12 | I | Outside services | Data sent to an outside service (cloud OCR, email, SMS, SIEM, webhooks) is exposed or sent somewhere unintended. | Each service is off unless configured, reviewed per bank; outbound connections only to public addresses; webhooks signed; no secrets in events. | OC-SC-07, OC-AU-04; services/outside_services.py | Mitigated |
| OC-T13 | I | Outside services | A webhook, SIEM or SSO URL is pointed at an internal address (SSRF). | The address is checked on the connection itself, so DNS rebinding doesn't get past it. | OC-SC-07; auth/outbound_http.py; ASVS 1.3.6 | Mitigated |
| OC-T14 | E | Service provider | Platform staff read or change a bank's data. | Support access only through a time-limited grant the bank makes; platform sign-in always needs a security key; two people at the service provider for provider actions; the provider's own signed log. | OC-AC-08, OC-AC-13; ADR 0004 | Mitigated |
| OC-T15 | E | Installation | A plugin misbehaves or is malicious. | Plugins are installed and enabled by the service provider and each bank; they run in process, so they are trusted code; what's enabled is in the evidence export. | OC-CM-03; docs/PLUGINS.md | Service provider's (CUEC) |
| OC-T16 | T | Data stores | A swapped ML model file runs code or skews decisions. | Model files are checked against a signed digest before loading; activation needs two people. | ml/registry.py; OC-AC-13; SR 11-7 page | Mitigated |
| OC-T17 | D | Internet | Large or malicious uploads (zip bombs, huge images) exhaust the server. | Request size, declared and actual zip size, and image pixel limits; long work runs as jobs with time limits. | OC-SI-01; bulk_import/zip_import.py, bulk_import/images.py; ASVS 5.2 | Mitigated |
| OC-T18 | D | Bank's network | Decisions miss the return deadline because OpenClear or the core is down. | Deadlines shown with reminders; an outbox delivers decisions with retries; health and job status reported. | OC-SI-05, OC-SI-06, OC-CA-02 | Mitigated |
| OC-T19 | S | Edge | Requests bypass the WAF by reaching the origin directly, or forge the caller's address. | The caller's address is taken only from the configured edge; an edge secret; the edge guide. | OC-SC-05; docs/guides/edge.md; scripts/edge_check.py | Partly (service provider locks the origin) |
| OC-T20 | I | Data stores | Keys or secrets leak from the server. | Production refuses checked-in keys; secrets in the database are encrypted with a rotatable key; keys rotated on the bank's schedule. | OC-CM-01, OC-SC-01; auth/crypto.py; issue #10 | Service provider's (CUEC) |
| OC-T21 | T | Bank's network | An ACH debit from an unauthorized originator is paid. | Debits checked against the customer's authorized originators; unauthorized debits go to exception with a Written Statement of Unauthorized Debit, which the bank collects on its own form. | OC-AC-12, OC-SI-07; docs/compliance/nacha.md | Mitigated |
| OC-T22 | I | Embedding host | OpenClear is framed by a site that isn't the bank's online banking (clickjacking) or leaks messages to it. | frame-ancestors limited to the bank's configured origin; messages posted only to that origin. | web/security_headers.py; static/js/app.js; ASVS 3.4.6 | Mitigated |
| OC-T23 | I | Bank's network | A teller platform's credentials are used to probe for valid check numbers, or the same check is cashed at two branches. | check:verify can only verify and record a cash-out, never list issued items; what was issued is returned only to explain a decline; every call is logged, rate-limited, and many not-issued answers raise a high security event; a verification is cashed once, within 15 minutes, under the issued check's lock, and the paid check is a duplicate anywhere after. | OC-SI-09; services/teller_service.py; TELLER_PLAN.md | Mitigated |
| OC-T24 | R | Service provider ↔ bank | An incident at the host doesn't reach the bank in time, or the bank's contacts are changed so notices go somewhere else, and the bank misses its own deadline to its regulator. | Notices emailed to the bank's named contacts whatever their settings (the CEO and CIO, then administrators, if none), shown to administrators until acknowledged; sending, acknowledging and changing contacts are logged and raised as security events; a control check warns on no contacts, an unacknowledged notice, or a year unconfirmed. | OC-IR-01, OC-IR-02; services/incident_service.py; docs/compliance/incident-notification.md | Mitigated |
| OC-T25 | D | Service provider | A bank's data is deleted by mistake, by one rogue operator, or while a regulator or a court needs it kept; or deleted without proof, so the bank can't show it was disposed of. | Two operators to start offboarding and two to delete; the bank told and given a wait for its final export; deletion refused without that export unless a reason is given, while on legal hold, or for the demo and sandboxes; the slug typed and a preview approved; a day's delay in which it can still be stopped; critical security events; a signed certificate of what was deleted. | OC-SI-12, OC-AC-13; services/offboarding_service.py; plans/OFFBOARDING_PLAN.md | Mitigated |
| OC-T26 | D | Customer ↔ bank | A customer's data is deleted by mistake or too soon, another customer's with it, or a customer that has left keeps signing in or having its items reviewed. | Two bank administrators set the last service day, and the customer is told; after it, sign-in ends and its accounts' items are refused; deletion waits 90 days and a legal hold; it follows the schema's foreign keys from that one customer, within its bank, and keeps the bank's action log; a signed certificate. | OC-SI-13; services/customer_offboarding_service.py; plans/CUSTOMER_OFFBOARDING_PLAN.md | Mitigated |
| OC-T27 | I | Customer ↔ bank | A bank's internal custom field (an officer code) reaches a customer's people, or the service provider's reference on a bank reaches the bank; or a field's value lands in a core file or a spreadsheet as a formula. | A customer's session reads values through one function that joins its own records and keeps only fields marked shown to the customer, under row-level security and per-account access; the provider's values are in tables with no tenant policy, read only by the provider's code and shown to a bank only when marked; values reach a decision destination only when it names them; every CSV cell is formula-escaped. | services/custom_field_service.py; db/account_scope.py; plans/CUSTOM_FIELDS_PLAN.md CF-D3, CF-D7, CF-D13 | Mitigated |
| OC-T28 | T | Bank's network | An automation's credential, or a file dropped in the bank's folder, rewrites custom-field values across many records (an aggregation id the core groups by, an officer code), and nobody can tell what they were. | Setting values in bulk needs custom_field:write, its own permission, never in a customer's session; an update never creates a record and refuses a customer whose service has ended; every file and batch call is stored, signed and malware-checked like any bulk upload, each row keeps its values before and after, and the upload is one action-log entry; the drop folder for fields is the bank's own, never a customer's. | services/bulk_import_service.py (updates); services/dropbox_import_service.py; api/v1/custom_fields.py; plans/CUSTOM_FIELDS_PLAN.md CF-D10 | Mitigated |
Generic threats (pytm's library)
pytm matches every element and flow against its threat library (based on CAPEC). These are the threats it raises for this model, most severe first. Most are answered by the controls above and by the ASVS assessment; they're listed so that a change to the model that raises a new one shows up in review.
264 findings across 76 threats.
| pytm id | Threat | Severity | Elements |
|---|---|---|---|
| AC06 | Using Malicious Files | Very High | Edge / WAF |
| AC14 | Catching exception throw/signal from privileged block | Very High | Plugins (in process) |
| AC17 | Session Hijacking - ServerSide | Very High | Edge / WAF |
| AC18 | Session Hijacking - ClientSide | Very High | Background worker, Plugins (in process) |
| AC21 | Cross Site Request Forgery | Very High | Background worker, Plugins (in process) |
| DS06 | Data Leak | Very High | A check verified before cash is paid at a branch, then recorded cashed, Bank staff use the web UI, Check images for OCR (if configured), Core and API clients call the API, Customer users use the web UI, Decisions delivered to the core, Edge forwards to the origin, Email and SMS, Embedded session launched from online banking, Every upload streamed for a malware scan (if configured), Exports, archives, OCR input, Incident notices emailed to each bank's incident contacts, Jobs read and write, per bank, OIDC discovery, token and JWKS requests, Platform staff use the operator view, Plugin hooks, Queries, scoped to one bank, SCIM provisioning, SSO sign-in responses (browser-relayed), Security events (HEC, syslog over TLS), Signed webhooks, Uploads, images and exports |
| HA01 | Path Traversal | Very High | Edge / WAF |
| INP02 | Overflow Buffers | Very High | Background worker, Plugins (in process) |
| INP05 | Command Line Execution through SQL Injection | Very High | Edge / WAF |
| INP07 | Buffer Manipulation | Very High | Background worker, Plugins (in process) |
| INP23 | File Content Injection | Very High | Background worker, Plugins (in process) |
| SC02 | XSS Targeting Non-Script Elements | Very High | Edge / WAF |
| AA03 | Exploitation of Trusted Credentials | High | Edge / WAF |
| AA04 | Exploiting Trust in Client | High | Edge / WAF |
| AC12 | Privilege Escalation | High | Background worker, Plugins (in process) |
| AC15 | Schema Poisoning | High | Plugins (in process) |
| AC16 | Session Credential Falsification through Prediction | High | Edge / WAF |
| AC20 | Reusing Session IDs (aka Session Replay) - ClientSide | High | Background worker, Plugins (in process) |
| CR01 | Session Sidejacking | High | OpenClear web and API |
| CR03 | Dictionary-based Password Attack | High | Background worker, Edge / WAF, Plugins (in process) |
| CR06 | Communication Channel Manipulation | High | A check verified before cash is paid at a branch, then recorded cashed, Bank staff use the web UI, Check images for OCR (if configured), Core and API clients call the API, Customer users use the web UI, Decisions delivered to the core, Each upload's SHA-256 looked up, never the file (if configured), Edge forwards to the origin, Email and SMS, Embedded session launched from online banking, Every upload streamed for a malware scan (if configured), Exports, archives, OCR input, Hashes it couldn't answer for, asked again, Incident notices emailed to each bank's incident contacts, Jobs read and write, per bank, OIDC discovery, token and JWKS requests, Platform staff use the operator view, Plugin hooks, Queries, scoped to one bank, Rate-limit counters, Release check, SCIM provisioning, SSO sign-in responses (browser-relayed), Security events (HEC, syslog over TLS), Signed webhooks, Signing and encryption keys read at start, Uploads, images and exports |
| DE04 | Audit Log Manipulation | High | Database (Postgres, row-level security), File storage (local, S3, Azure), Keys and secrets (files / environment), Redis (rate limits, optional) |
| DR01 | Unprotected Sensitive Data | High | Every upload streamed for a malware scan (if configured), Plugin hooks |
| INP03 | Server Side Include (SSI) Injection | High | Edge / WAF |
| INP08 | Format String Injection | High | Background worker, Edge / WAF, Plugins (in process) |
| INP09 | LDAP Injection | High | Edge / WAF |
| INP11 | Relative Path Traversal | High | Edge / WAF |
| INP12 | Client-side Injection-induced Buffer Overflow | High | Background worker, Plugins (in process) |
| INP13 | Command Delimiters | High | Background worker, Plugins (in process) |
| INP16 | PHP Remote File Inclusion | High | Edge / WAF |
| INP20 | iFrame Overlay | High | Background worker, Plugins (in process) |
| INP22 | XML Attribute Blowup | High | Edge / WAF |
| INP24 | Filter Failure through Buffer Overflow | High | Background worker, Plugins (in process) |
| INP25 | Resource Injection | High | Background worker, Plugins (in process) |
| INP26 | Code Injection | High | Background worker, Plugins (in process) |
| INP28 | XSS Targeting URI Placeholders | High | Background worker, Edge / WAF, Plugins (in process) |
| INP31 | Command Injection | High | Background worker, Plugins (in process) |
| INP32 | XML Injection | High | Background worker, Plugins (in process) |
| INP33 | Remote Code Inclusion | High | Background worker, Plugins (in process) |
| INP34 | SOAP Array Overflow | High | Edge / WAF |
| INP35 | Leverage Alternate Encoding | High | Background worker, Plugins (in process) |
| INP37 | HTTP Request Smuggling | High | Edge / WAF |
| INP41 | Argument Injection | High | Background worker, Plugins (in process) |
| SC03 | Embedding Scripts within Scripts | High | Edge / WAF |
| SC04 | XSS Using Alternate Syntax | High | Edge / WAF |
| SC05 | Removing Important Client Functionality | High | Edge / WAF, OpenClear web and API |
| AA01 | Authentication Abuse/ByPass | Medium | Background worker, Edge / WAF, Plugins (in process) |
| AA02 | Principal Spoof | Medium | Background worker, Edge / WAF, Plugins (in process) |
| AC01 | Privilege Abuse | Medium | Background worker, Database (Postgres, row-level security), Edge / WAF, File storage (local, S3, Azure), Keys and secrets (files / environment), Plugins (in process), Redis (rate limits, optional) |
| AC05 | Content Spoofing | Medium | A check verified before cash is paid at a branch, then recorded cashed, Bank staff use the web UI, Check images for OCR (if configured), Core and API clients call the API, Customer users use the web UI, Decisions delivered to the core, Each upload's SHA-256 looked up, never the file (if configured), Edge forwards to the origin, Email and SMS, Embedded session launched from online banking, Every upload streamed for a malware scan (if configured), Exports, archives, OCR input, Hashes it couldn't answer for, asked again, Incident notices emailed to each bank's incident contacts, Jobs read and write, per bank, OIDC discovery, token and JWKS requests, Platform staff use the operator view, Plugin hooks, Queries, scoped to one bank, Rate-limit counters, Release check, SCIM provisioning, SSO sign-in responses (browser-relayed), Security events (HEC, syslog over TLS), Signed webhooks, Signing and encryption keys read at start, Uploads, images and exports |
| AC07 | Exploiting Incorrectly Configured Access Control Security Levels | Medium | Edge / WAF |
| AC08 | Manipulate Registry Information | Medium | Edge / WAF |
| AC09 | Functionality Misuse | Medium | Edge / WAF |
| AC11 | Session Credential Falsification through Manipulation | Medium | Edge / WAF |
| AC13 | Hijacking a privileged process | Medium | Background worker, Plugins (in process) |
| CR08 | Client-Server Protocol Manipulation | Medium | Every upload streamed for a malware scan (if configured), Plugin hooks, Signing and encryption keys read at start |
| DE01 | Interception | Medium | A check verified before cash is paid at a branch, then recorded cashed, Bank staff use the web UI, Check images for OCR (if configured), Core and API clients call the API, Customer users use the web UI, Decisions delivered to the core, Each upload's SHA-256 looked up, never the file (if configured), Edge forwards to the origin, Email and SMS, Embedded session launched from online banking, Every upload streamed for a malware scan (if configured), Exports, archives, OCR input, Hashes it couldn't answer for, asked again, Incident notices emailed to each bank's incident contacts, Jobs read and write, per bank, OIDC discovery, token and JWKS requests, Platform staff use the operator view, Plugin hooks, Queries, scoped to one bank, Rate-limit counters, Release check, SCIM provisioning, SSO sign-in responses (browser-relayed), Security events (HEC, syslog over TLS), Signed webhooks, Signing and encryption keys read at start, Uploads, images and exports |
| DE02 | Double Encoding | Medium | Background worker, Edge / WAF, Plugins (in process) |
| DE03 | Sniffing Attacks | Medium | A check verified before cash is paid at a branch, then recorded cashed, Bank staff use the web UI, Check images for OCR (if configured), Core and API clients call the API, Customer users use the web UI, Decisions delivered to the core, Each upload's SHA-256 looked up, never the file (if configured), Edge forwards to the origin, Email and SMS, Embedded session launched from online banking, Every upload streamed for a malware scan (if configured), Exports, archives, OCR input, Hashes it couldn't answer for, asked again, Incident notices emailed to each bank's incident contacts, Jobs read and write, per bank, OIDC discovery, token and JWKS requests, Platform staff use the operator view, Plugin hooks, Queries, scoped to one bank, Rate-limit counters, Release check, SCIM provisioning, SSO sign-in responses (browser-relayed), Security events (HEC, syslog over TLS), Signed webhooks, Signing and encryption keys read at start, Uploads, images and exports |
| DO01 | Flooding | Medium | Background worker, Edge / WAF, OpenClear web and API, Plugins (in process) |
| DO02 | Excessive Allocation | Medium | Database (Postgres, row-level security), File storage (local, S3, Azure), Keys and secrets (files / environment), Plugins (in process), Redis (rate limits, optional) |
| DS01 | Excavation | Medium | Edge / WAF |
| DS04 | XSS Targeting Error Pages | Medium | Edge / WAF |
| INP10 | Parameter Injection | Medium | Edge / WAF |
| INP14 | Input Data Manipulation | Medium | Background worker, Edge / WAF, Plugins (in process) |
| INP17 | XSS Using MIME Type Mismatch | Medium | Edge / WAF, OpenClear web and API |
| INP19 | XML External Entities Blowup | Medium | Edge / WAF |
| INP21 | DTD Injection | Medium | Edge / WAF |
| INP27 | XSS Targeting HTML Attributes | Medium | Background worker, Plugins (in process) |
| INP29 | XSS Using Doubled Characters | Medium | Background worker, Edge / WAF, Plugins (in process) |
| INP30 | XSS Using Invalid Characters | Medium | Background worker, Plugins (in process) |
| INP36 | HTTP Response Smuggling | Medium | Edge / WAF |
| CR05 | Encryption Brute Forcing | Low | Database (Postgres, row-level security), Edge / WAF, File storage (local, S3, Azure), Keys and secrets (files / environment), OpenClear web and API, Redis (rate limits, optional) |
| HA03 | Web Application Fingerprinting | Low | Edge / WAF |
| INP18 | Fuzzing and observing application log data/errors for application mapping | Low | Edge / WAF |
| DS03 | Footprinting | Very Low | Edge / WAF |
Privacy (LINDDUN GO)
A pass over the LINDDUN GO cards, by category:
| Category | OpenClear | Where |
|---|---|---|
| Linking | Records link to a bank, a customer and a person by design; nothing links people across banks except one person's own memberships, which only that person and each bank's admins see. | db/tenancy.py::memberships_elsewhere |
| Identifying | Check images and payee names identify people; access is by customer and account scope, and every view of an item is permission-checked. | OC-AC-03, OC-AC-04 |
| Non-repudiation | Decisions are deliberately attributable (the action log); that's a requirement of the bank's records, disclosed to its staff and customers. | OC-AU-01 |
| Detecting | Security events reveal sign-in patterns; they go only to the bank's own SIEM and carry no passwords, tokens or account numbers. | SIEM_PLAN.md, "What's never in an event" |
| Data disclosure | Outside services (cloud OCR, email, SMS) are off unless the bank turns them on and reviews them. No decisions are pooled across banks: a bank's fraud model, off until the bank turns it on, learns only from its own decisions. | services/outside_services.py, OC-AC-09 |
| Unawareness | Customers' people see what's kept about their decisions in the action log their admins can read; the fraud score shown on an item is labelled advisory. | OC-AU-01 |
| Non-compliance | Retention periods are installation settings (finished jobs, notifications, upload results, exports, security events); the action log is kept and archived to signed files. Removing a departing bank's data is the service provider's job: there's no in-app offboarding yet. | config.py retention_*; OC-AU-03 |
Built from docs/security/threat-model.md in the OpenClear repository. Last changed October 28, 2026.