{
 "slug": "account-masking-ap-systems-directly-enables-wire",
 "topic_id": "TOPIC-012",
 "cluster": "B2B Wire, AP & Treasury Payment Release",
 "tier": "Tier B",
 "title": "Why account masking in AP systems directly enables wire fraud",
 "summary": "Truncating account numbers on approval screens was borrowed from consumer banking interfaces. In an approval context it conceals precisely the digits an attacker substitutes.",
 "lede": "There is a user interface convention that migrated from consumer banking into enterprise finance without anyone re-examining why it existed, and it now sits directly on the path of one of the most expensive fraud categories in business.",
 "date": "2024-09-17",
 "category": "Compliance",
 "author_id": "margot-reyes",
 "tags": [
  "account masking",
  "AP systems",
  "user interface",
  "payment approval",
  "wire fraud",
  "total rendering"
 ],
 "image_title": "Account Masking Wire Fraud",
 "schema": "Article",
 "key_takeaways": [
  "Masking protects a customer viewing their own account from shoulder-surfing. An approver verifying a third party's account has the opposite need.",
  "Comparing truncated identifiers is a recognition task performed against memory, and it degrades sharply as the visible portion shrinks.",
  "Total rendering costs nothing, requires no counterparty cooperation, and is the only intervention here that can ship this quarter."
 ],
 "body": [
  {
   "type": "h2",
   "text": "Where the convention came from"
  },
  {
   "type": "diagram",
   "kind": "compare",
   "alt": "The same substitution, shown two ways",
   "caption": "Masking is protective in one context and actively harmful in the other.",
   "nodes": [],
   "left": {
    "title": "Masked (approval screen)",
    "items": [
     "Old:  ****4417",
     "New:  ****9023",
     "Reads as: two accounts",
     "Approver cannot see the change"
    ]
   },
   "right": {
    "title": "Rendered in full, with delta",
    "items": [
     "Old:  021000021 / 1234564417",
     "New:  121000248 / 9988229023",
     "Bank changed: First National → Western",
     "Last changed: today, by import"
    ]
   }
  },
  {
   "type": "p",
   "html": "Masking an account number — showing the last four digits, concealing the rest — originated in consumer contexts for a defensible reason. A customer looking at their own statement in a public place does not need the full number displayed, and concealing it reduces exposure to observation and to screenshots."
  },
  {
   "type": "p",
   "html": "The customer already knows their own account. The masked display is a confirmation aid, not a verification aid, and for that purpose four digits is sufficient."
  },
  {
   "type": "h2",
   "text": "Why the approval context inverts the requirement"
  },
  {
   "type": "p",
   "html": "An accounts payable approver is doing something structurally different. They are verifying an account belonging to someone else, which they do not know from memory, against a change they cannot independently confirm."
  },
  {
   "type": "table",
   "head": [
    "",
    "Consumer viewing own account",
    "Approver verifying a payee"
   ],
   "rows": [
    [
     "Knows the correct value?",
     "Yes, from memory",
     "No"
    ],
    [
     "Purpose of display",
     "Confirm which account",
     "Verify the account is correct"
    ],
    [
     "Threat",
     "Observation by a third party",
     "Substitution by an attacker"
    ],
    [
     "Effect of masking",
     "Reduces exposure",
     "<strong style=\"font-weight:600\">Conceals the substituted portion</strong>"
    ]
   ]
  },
  {
   "type": "p",
   "html": "The same interface pattern serves opposite purposes in the two contexts, and the enterprise context inherited it without the analysis."
  },
  {
   "type": "h2",
   "text": "The comparison task, examined"
  },
  {
   "type": "p",
   "html": "What does an approver actually do when a masked account is displayed? One of three things, and none of them is verification."
  },
  {
   "type": "ol",
   "items": [
    "<strong style=\"font-weight:600\">Nothing.</strong> They review vendor name and amount, which are meaningful, and skip the account because four digits convey no information they can evaluate.",
    "<strong style=\"font-weight:600\">Recognition against memory.</strong> For a frequently paid vendor they may recall the suffix. This works until the attacker substitutes an account whose suffix differs — which it always will — at which point the approver must decide whether the change is legitimate, with no basis for deciding.",
    "<strong style=\"font-weight:600\">Comparison against a prior payment.</strong> Rare, because it requires leaving the approval screen. And a legitimate bank change also produces a mismatch, so a mismatch is not diagnostic."
   ]
  },
  {
   "type": "p",
   "html": "Option two is the interesting failure. A masked display can only ever tell an approver that something changed. It cannot help them evaluate whether the change is legitimate, and evaluation is the entire task."
  },
  {
   "type": "h2",
   "text": "What full rendering makes possible"
  },
  {
   "type": "p",
   "html": "Displaying the complete account number, routing code, beneficiary bank and country makes several judgements available that masking forecloses:"
  },
  {
   "type": "ul",
   "items": [
    "The beneficiary bank has changed from the vendor's historical bank to a different institution.",
    "The bank is in a different country from the vendor's operations.",
    "The routing code belongs to an institution inconsistent with the vendor's profile — a regional bank for a multinational, for instance.",
    "The account is an obvious personal-banking format for a corporate payee.",
    "The legal name on the account differs in a meaningful way from the vendor's registered name."
   ]
  },
  {
   "type": "p",
   "html": "None of these is conclusive on its own. All of them are unavailable when the display is four digits."
  },
  {
   "type": "h2",
   "text": "The objection, and the answer"
  },
  {
   "type": "p",
   "html": "The objection is data protection: displaying full banking details in an application increases exposure if the application or the screen is compromised."
  },
  {
   "type": "p",
   "html": "That objection has force in a consumer context and much less here. The approver is authorised to make a payment to this account; concealing it from them does not reduce their access to it, because the payment executes to the full number regardless. Masking protects the display, not the data, and the data is already in the system the approver is using."
  },
  {
   "type": "p",
   "html": "Where the concern is screenshots or shoulder-surfing in an open office, the proportionate answer is reveal-on-interaction — the full value shown when the approver acts on it — rather than permanent concealment."
  },
  {
   "type": "h2",
   "text": "The change-flag, which matters more than rendering"
  },
  {
   "type": "p",
   "html": "If only one change is made, make this one. When a payee's banking details differ from the last payment, the approval screen should show, prominently and without navigation:"
  },
  {
   "type": "code",
   "text": "  ⚠  BANK DETAILS CHANGED since last payment (14 Jan 2026)\n\n     Previous   Barclays Bank UK   20-00-00   58473920\n     New        Revolut Ltd        04-00-75   99328470\n\n     Changed 2 days ago by: [who made the change in your system]"
  },
  {
   "type": "p",
   "html": "That rendering makes the decision possible. Everything else in this article is a refinement of it."
  },
  {
   "type": "h2",
   "text": "Where masking is right and where it is wrong"
  },
  {
   "type": "table",
   "caption": "Context decides",
   "head": [
    "Context",
    "Mask?",
    "Why"
   ],
   "rows": [
    [
     "Customer statement or receipt",
     "Yes",
     "Protects the account holder from bystanders"
    ],
    [
     "Support agent screen",
     "Yes",
     "Agent does not need the full number"
    ],
    [
     "<strong style=\"font-weight:600\">Payment approval screen</strong>",
     "<strong style=\"font-weight:600\">No</strong>",
     "The approver's task is to detect substitution"
    ],
    [
     "Signed statement",
     "Never lossy",
     "Mask the display, sign the full value"
    ]
   ]
  },
  {
   "type": "p",
   "html": "The rule that follows is narrow: abbreviate for display if you must, but the full value must be inside the signed statement and the verifier must compare the full value. Truncation where nothing sits behind it means a different account could produce the same display."
  },
  {
   "type": "h2",
   "text": "Objections and honest limits"
  },
  {
   "type": "p",
   "html": "<strong style=\"font-weight:600\">“PCI and privacy rules require masking.”</strong> They govern cardholder data and personal data in specified contexts. A vendor's own bank account on an internal approval screen is usually neither, and the requirement is frequently assumed rather than checked."
  },
  {
   "type": "p",
   "html": "<strong style=\"font-weight:600\">“Approvers would not notice the full number anyway.”</strong> Then show the delta rather than the number: what it was, what it is becoming, when it last changed and who changed it. That is three lines and it is what the approver can actually act on."
  }
 ],
 "faq": [
  {
   "q": "Is full rendering a data protection problem?",
   "a": "The approver is already authorised to pay this account and the system already holds the number. Masking protects the display rather than the data. Reveal-on-interaction addresses open-office concerns proportionately."
  },
  {
   "q": "What if our AP system cannot be changed?",
   "a": "Most permit field configuration on approval screens. Where they do not, the change-flag can frequently be surfaced through a report or an adjacent workflow."
  },
  {
   "q": "Does this actually stop fraud?",
   "a": "It makes substitution visible to an attentive approver. It does not verify that a change was requested by the vendor, which requires a signal from the vendor."
  },
  {
   "q": "How do we know if this affects us?",
   "a": "Screenshot your approval screen and count how many of the five material fields are rendered in full. Most organisations find the answer is one or two."
  },
  {
   "q": "Doesn't PCI require masking?",
   "a": "PCI governs cardholder data. A vendor's bank account on an internal approval screen is generally outside it, and the requirement is often assumed rather than verified."
  },
  {
   "q": "What should the approver see instead?",
   "a": "The full account and routing number, the previous value, when it last changed and through which path."
  },
  {
   "q": "Can we mask anywhere?",
   "a": "Yes, for display, provided the full value is inside the signed statement and verification compares the full value."
  }
 ],
 "sources": [
  {
   "t": "FBI IC3 2025 Internet Crime Report",
   "u": "https://www.ic3.gov/AnnualReport/Reports/2025_IC3Report.pdf"
  },
  {
   "t": "AFP — Payments Fraud and Control Survey",
   "u": "https://www.afponline.org/training-resources/resources/survey-research-economic-data"
  },
  {
   "t": "Research on visual comparison and recognition of alphanumeric identifiers."
  },
  {
   "t": "NAIC — life insurance and annuities consumer resources",
   "u": "https://content.naic.org/consumer/life-insurance.htm"
  }
 ],
 "related": [
  {
   "slug": "vendor-bank-account-change-fraud-controls",
   "title": "The vendor invoice scam",
   "category": "Compliance"
  },
  {
   "slug": "homoglyphs-unicode-confusables-wire-payees-cheapest-attack-financial",
   "title": "Homoglyphs in wire payees",
   "category": "Compliance"
  },
  {
   "slug": "erp-dual-authorization-flaw-sox-controls",
   "title": "The four-eyes illusion",
   "category": "Developer"
  },
  {
   "slug": "ethclipper-address-poisoning-defeating-zero-width-space-middle",
   "title": "Address poisoning works because humans check the ends",
   "category": "Crypto"
  }
 ],
 "image": "https://cdn.twc.sh/images/igcache/Account%20Masking%20Wire%20Fraud/1200_630/blog.jpg",
 "wordcount": 1079,
 "url": "/blog/account-masking-ap-systems-directly-enables-wire.html",
 "reading_time": "5 min read",
 "meta_description": "Truncating account numbers on approval screens conceals precisely the digits an attacker substitutes in a beneficiary detail change.",
 "hub": {
  "slug": "topics/payment-release-authorization",
  "title": "Payment release authorization"
 },
 "answer": "Because it hides the digits the attacker changed. Masking was borrowed from consumer banking, where it protects the customer from shoulder-surfing. On an approval screen the approver's whole job is to notice a substitution, and a masked field makes the old and new accounts look identical.",
 "answer_q": "Why is masking account numbers on an approval screen harmful?",
 "glossary": [
  {
   "term": "Masking",
   "def": "Displaying only part of a value. Protective where the risk is disclosure, harmful where the task is detecting change."
  },
  {
   "term": "Delta rendering",
   "def": "Showing what a field was and what it is becoming, rather than only its new value."
  },
  {
   "term": "Lossy truncation",
   "def": "Discarding characters so that different underlying values produce an identical display."
  }
 ],
 "checklist": {
  "title": "Fixing the approval screen",
  "id": "fix",
  "desc": "Four changes, none of which needs a new system.",
  "steps": [
   {
    "name": "Show the full account and routing number.",
    "text": "On the approval screen only."
   },
   {
    "name": "Show the previous value beside it.",
    "text": "A change is far easier to see than a value."
   },
   {
    "name": "Show when it last changed and by what path.",
    "text": "Import, API, portal or support ticket."
   },
   {
    "name": "Sign the full value, mask only the display.",
    "text": "So verification compares the whole thing."
   }
  ]
 },
 "cta": {
  "title": "Where this fits in Manav",
  "html": "Manav renders the full beneficiary details and the delta from what was on file, binds the approver's signature to that exact payload, and has the payment service recompute the digest before it releases funds.",
  "href": "../docs.html",
  "label": "See payment gating"
 }
}