Skip to content

The offboarded account that tried to log in eleven months later

Anomaly monitoring flagged an access attempt from a departed employee's still-active account before anything was touched, and the access review that followed closed nine other stale permissions nobody had noticed.

Identity watch
Nightly feed · identity provider audit logs · 09/02 18:00 → 09/03/2026 07:00
All applications Thu, 09/03/2026NK
Ordinary sign-ins9,418Within each account's baseline
Out of pattern1 blockedt.hollis · 02:14:06 · no app opened
Time to flagUnder 4 minPaged 02:14:17 · acknowledged 02:17:52
Detection rules9 armed4 fired on one sign-in tonight

Sign-ins by hour Within baseline Blocked

Hourly · 13 buckets
1,720
18:00
1,290
19:00
1,010
20:00
820
21:00
640
22:00
470
23:00
310
00:00
230
01:00
170
02:14
02:00
150
03:00
210
04:00
640
05:00
1,758
06:00

Feed around the flag

9 of 9,419 events · sorted by time
TimeAccountApplicationLocationScoreResult
02:13:12k.oseiMatter workspaceHome metro6Allowed
02:13:41svc-backupStorage APIData center0Allowed
02:13:58l.moreauTime entryHome metro9Allowed
02:14:06t.hollisDocument vaultNew country94Blocked
02:14:19p.ngClient portalTravel · known14Allowed
02:14:33svc-billingBilling syncData center0Allowed
02:14:50d.achebeMatter workspaceHome metro11Allowed
02:15:07k.oseiDocument vaultHome metro7Allowed
02:15:26j.rheeMailSecond office3Allowed

Blocked sign-in

02:14:06
THt.hollis@pendryvale.comDormant 11 months · last 10/02/2025 17:48
Dormant, then active+40Last sign-in 10/02/2025 17:48First sign-in in 336 days
Geography+222 locations, one metro areaNew country · hosting network
Hours+18Weekdays 07:40–19:10Thu 02:14
Applications+14Matter workspace · Time entryDocument vault · export
Score 94 · page at 70weights illustrative

Who, what, and how long

Industry

Professional Services

Duration

Ongoing retainer

Cooperation model

Ongoing retainer

Services
Log & anomaly monitoringAccess reviewCVE triage & patching
Integrations
HubSpotDocuSignXeroGoogle Workspace
Technologies
SIEMLog aggregationAnomaly detectionIdentity provider audit logsCVE feedsPatch automation
Team
1 Project lead1 Product designer2 Frontend engineers1 Backend engineer1 QA engineer

Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.

The problem

What went wrong, and when

A departing employee's account had been deactivated in the HR system but never removed from the platform's own access list, and nobody would have known until it was used.

The HR system and the platform's access list were never connected, so deactivating a leaver in one had no effect on the other. Eleven months after that employee left, someone tried to sign in to their account with the right password. Monitoring refused the session before any application opened; without it, the next signal available to anyone would have been whatever was subsequently done with it, which is a kind of discovery no organization wants to be first to make.

We wired up access and log monitoring that flagged the login attempt from the stale account as an anomaly within minutes, then ran a full access review that surfaced nine other orphaned or over-broad permissions accumulated over two years, alongside a CVE triage process to keep dependency patching on a cadence going forward.

Process

Phase by phase

  1. Phase 1: Instrument

    Logs worth watching

    Wired continuous log and access-pattern monitoring across the platform so behavior could be compared against a norm.

    • Log pipeline
    • Baseline patterns
  2. Phase 2: Detect

    The stale account's attempt

    Flagged the offboarded account's login attempt as an anomaly in real time, before anything was accessed.

    • Detection rules
    • Alert routing
  3. Phase 3: Review access

    What else was still open

    Ran a full access review, surfacing nine other stale or over-broad permissions accumulated over two years.

    • Access review report
    • Revocation list
  4. Phase 4: Sustain

    Keep the window short

    Set up CVE triage and a patch cadence so exposure doesn't quietly re-accumulate.

    • Triage process
    • Patch schedule
Incident LK-2291 · dormant account sign-in
09/03/2026 · t.hollis@pendryvale.com · closed
Closed 02:30:44 Thu, 09/03/2026NK

That night, in order

Recorded anchors marked ◆
  1. 02:14:06T+0sSign-in blocked◆Password accepted, session refused by policy before any application opened
  2. 02:14:09T+3sAudit event in the watchIdentity provider log shipped and scored against the account's baseline
  3. 02:14:17T+11sAnalyst paged◆Score over the page threshold · on-call analyst paged
  4. 02:17:52T+3m 46sPage acknowledged◆Inside four minutes · incident LK-2291 opened
  5. 02:22:35T+8m 29sLeaver confirmedHR record shows last day 10/02/2025 · no application touched
  6. 02:27:10T+13m 04sSessions and tokens revokedRefresh tokens and app passwords invalidated
  7. 02:30:44T+16m 38sAccount disabled◆Removed from the platform access list, grant path recorded

Elapsed from the attempt

Seconds after 02:14:06
Paged11sAcknowledged3m 46sDisabled16m 38s
Shaded: the first four minutes · ack at 02:17:5202:30:44

What the account reached

From the audit trail
SessionRefused by policy at sign-in
Applications openedNone
OriginNew country · hosting network

What it prompted

Next morning
Access review opened · AR-2026-09Every identity against the HR leaver list
9 more grants found and closedLeavers, contractors, migration admin
Grant paths documentedHow each one was issued, for the runbook
On screen

That night in order: blocked at 02:14:06, an analyst paged eleven seconds later, acknowledged inside four minutes, the account disabled by 02:31, with nothing opened and a full access review opened the next morning.

Outcome

The numbers, before and after

Under 4 minutes

Time to flag the anomaly

10 accounts

Stale permissions closed

100% triaged weekly

Known CVEs now on patch cadence

Time to flag is measured from the authentication attempt to the alert being raised. Ten accounts is the one caught plus the nine the subsequent review found. The CVE figure describes the process now in place (feeds triaged weekly against the real dependency inventory), not a count of vulnerabilities closed.

Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.

Introduction

The engagement

There was no continuous security monitoring in place. Access was granted on hire and, in practice, rarely revisited, with offboarding a manual checklist that occasionally got missed.

A professional services firm with access granted on hire and, in practice, revisited only when someone remembered. Offboarding was a manual checklist covering the systems the leaver's manager knew about. There was no continuous monitoring at all, so the first sign of trouble would have been a consequence, not an alert.

Security Monitoring & Access Review

How it was handled

  1. 01

    Wired continuous log and access-pattern monitoring across the platform

    Monitoring went in before any access review, which is why the review happened at all: the caught attempt is what prompted anyone to look.

  2. 02

    Flagged the offboarded account's login attempt as an anomaly in real time

    A dormant account authenticating after eleven months is an unambiguous deviation, which is why it surfaced in minutes instead of at the next quarterly review.

  3. 03

    Ran a full access review, surfacing nine other stale or over-broad permissions

    Every identity was reconciled against the HR leaver list and every grant against its business justification, which turned up nine more standing permissions.

  4. 04

    Set up CVE triage and a patch cadence to keep exposure windows short going forward

    CVE feeds are now triaged weekly against the real dependency inventory and scored on exploitability in this environment, not on severity in the abstract.

Real-time anomaly flags

An out-of-pattern login surfaced within minutes, long before the next quarterly review.

Identity provider audit logs were shipped into the SIEM and scored against each account's own baseline (usual hours, usual geography, usual applications), so an out-of-pattern authentication raises an alert in minutes instead of waiting for a quarterly review to notice the account shouldn't exist. The stale account that triggered this had been dormant for eleven months, which made the deviation unambiguous.

What shipped
  • Identity provider logs streamed into the SIEM
  • Scored per account against its own behavioral baseline
  • Dormant-then-active flagged in minutes, well ahead of any review
Detection rules
What counts as out of pattern · every rule compares an account with its own history
Baselines Thu, 09/03/2026NK

Baseline · t.hollis@pendryvale.com

Built from activity up to 10/02/2025 · compared at 02:14:06
Usual hours · share of sign-ins● 02:14 attempt
0006121823
Dormant, then active+40Usual · Last sign-in 10/02/2025 17:48Seen · First sign-in in 336 days
Geography+22Usual · 2 locations, one metro areaSeen · New country · hosting network
Hours+18Usual · Weekdays 07:40–19:10Seen · Thu 02:14
Applications+14Usual · Matter workspace · Time entrySeen · Document vault · export

Nine rules

Weights feed one score per sign-in · illustrative
RuleOut of pattern whenCompares againstWeightFired tonightState
R1Dormant account authenticatesAccount's last successful sign-inHight.hollis 02:14Armed
R2Sign-in outside usual hoursAccount's 60-day hour-of-week profileMediumt.hollis 02:14Armed
R3New geographyLocations this account has usedMediumt.hollis 02:14Armed
R4Application never usedApplications this account opensMediumt.hollis 02:14Armed
R5Impossible travelPrevious sign-in location and timeHigh—Armed
R6MFA method changed, then usedAccount's registered methodsHigh—Armed
R7Privilege granted out of windowApproved change windowsHigh—Armed
R8Burst of failed sign-insAccount's failure rateLow—Armed
R9Export above the account's normAccount's 30-day export volumeMedium—Armed
Step 1 · score Under 40Recorded, nothing raised
Step 2 · score 40–69Logged for the morning review
Step 3 · score 70+Session blocked · analyst paged
Step 4 · score No ack in 15 minSecurity lead paged
On screen

What counts as out of pattern: the departed account's baseline of usual hours, places and applications against what arrived at 02:14, the nine rules and what each compares against, and the escalation ladder underneath.

Access review · AR-2026-09
Every identity against the HR leaver list · every grant against its business justification
Export review Thu, 09/03/2026NK
Grants closed10Stale or over-broad
Caught by the watch1t.hollis · 02:14:06
Found by the review9Once the first prompted a look
Grant paths recorded10 of 10How each was issued

Ten grants

Sorted: caught first, then by kind
AccountKindAccessIssuedHow it was grantedDormantOutcome
t.hollisLeaver · caughtPlatform user · Transactions11/2024Hire ticket HR-1184 → Transactions-Users336 dDisabled 02:30
j.farrantLeaverDocument vault · editor02/2025Manager request → Vault-Editors214 dRemoved
m.adeyemiLeaverBilling exports06/2025Month-end cover → Billing-Export158 dRemoved
s.lindqvistLeaverClient portal · admin01/2025Portal launch → Portal-Admins97 dRemoved
ctr-northbeam-01ContractorPlatform user · Tax03/2025SOW NB-07 → Contractors-Tax281 dRemoved
ctr-northbeam-02ContractorPlatform user · Tax03/2025SOW NB-07 → Contractors-Tax281 dRemoved
ctr-kestrel-qaContractorProduction read04/2025Release testing → Prod-Read190 dRemoved
svc-migrateMigration adminPlatform admin · standing09/2024Data migration CHG-412 → Admins690 dRevoked
a.whitcombeMigration adminPlatform admin · standing09/2024Data migration CHG-412 → Admins671 dReduced to editor
r.baptisteMigration adminDatabase read-write09/2024Data migration CHG-412 → DB-RW684 dRevoked

By kind

Ten grants
Leaver4Left in HR, never removed from the platform list
Contractor3Engagement ended, account left standing
Migration admin3Granted for a migration, never withdrawn

Removal record · svc-migrate

Revoked · path documented
ChangeCHG-412 data migrationGroupAdminsGranted09/2024, standingLast used10/2024
Standing admin rights issued for a migration two years ago and never withdrawn. No offboarding checklist listed it, because nobody had left.
On screen

The review that followed: ten grants, the one caught and nine found, with how each was originally issued, how long it had been dormant and what was done with it, down to the migration admin rights never withdrawn.

A full access review

Nine further stale or over-broad permissions found once the first one prompted a look.

One orphaned account is rarely alone. A full review reconciled every identity against the HR leaver list and every permission grant against its business justification, and turned up nine more: leavers never deprovisioned, contractor accounts left standing, and standing admin rights granted for a migration two years earlier and never withdrawn. Each was removed with the grant path that created it documented.

What shipped
  • Every identity reconciled against the HR leaver list
  • Nine further stale or over-broad grants found
  • Each removal documented with the grant path that created it
Advisory triage · week 36
CVE feeds against the real dependency inventory · scored on exploitability here, not CVSS alone
Inventory Thu, 09/03/2026NK
Triaged this week100%8 of 8 advisories · Tue 09/01
Reachable here5Loaded by code that actually runs
Not reachable3Set aside with the reason recorded
Critical findingsInside windowPatched within the stated window

Advisories

Window measured from triage to patch in production
AdvisoryComponentIn inventoryCVSSReachable fromPriority hereStateOpen
ADV-36-01XML parser2.9.14 → 2.9.169.1YesEngagement letter importCriticalPatched1d 04h
ADV-36-02Image resizer8.14.09.8NoNot loaded by any routeNot reachableSet aside—
ADV-36-03HTTP client1.6.2 → 1.6.47.5YesBank feed sync workerHighPatched2d 11h
ADV-36-04Template engine3.1.3 → 3.1.56.1YesClient portal emailsHighScheduled0d 19h
ADV-36-05ZIP extractor4.0.18.2NoDev tooling onlyNot reachableSet aside—
ADV-36-06JWT library9.0.0 → 9.0.25.3YesAPI session tokensHighPatched1d 22h
ADV-36-07Date library2.29.4 → 2.30.17.5YesTime entry parsingLowScheduled0d 06h
ADV-36-08PDF renderer0.23.14.3NoBehind disabled feature flagNot reachableSet aside—

Same week, two scores

CVSS in the abstract → priority here
Image resizerADV-36-02CVSS9.8Not reachableNot loaded by any route
Template engineADV-36-04CVSS6.1HighReachable · Client portal emails

The cadence

Every week, on a schedule
MonPull feedsMatch to inventoryTueTriageReachable or notWed →PatchCritical inside window
W29W30W31W32W33W34W35W36

A patch cadence

On screen

The weekly advisory triage: each exposure marked reachable or not from the code actually running, priority set by exploitability here instead of CVSS alone, and the window measured from triage to patch.

CVE triage on a schedule, so exposure windows stay short by default.

Dependency patching moved from ad hoc to a cadence: CVE feeds are triaged weekly against the actual dependency inventory, scored on exploitability in this environment instead of on CVSS alone, and anything critical is patched inside a stated window. The point is a short exposure window by default, so there's no scramble whenever a vulnerability makes the news.

What shipped
  • Weekly CVE triage against the real dependency inventory
  • Scored on exploitability here, not CVSS in the abstract
  • Stated patch window for critical findings

Working inside their operation

A cross-functional team of 5 worked on an ongoing retainer, covering Log & anomaly monitoring, Access review, CVE triage & patching. We ran daily standups with their own lead in the room, and a demo at the end of every sprint. Scope changed twice during the engagement, and both times the change was priced and agreed before work started.

An ongoing retainer, not a project, because access decays continuously and a one-off review is correct for about a week. The full access review was triggered by the single anomaly, not scheduled, which is the argument for the monitoring: one caught attempt is what prompted the look that found the other nine.

What it settled

What changed in the runbook

  1. 01

    Offboarding that revokes the obvious accounts still leaves the ones nobody remembers issuing.

    The checklist covered what the manager knew about. The standing admin grant from a migration two years earlier wasn't on anyone's list to revoke.

  2. 02

    The single caught attempt paid for the monitoring; the nine findings behind it paid for the review.

    One anomaly is worth the monitoring and is also the prompt for the review. Nobody schedules an access audit; they run one after something makes it necessary.

  3. 03

    Access decays. Without a cadence it decays back to where it started within a year.

    A cadence is the only durable answer: grants accumulate through ordinary work, so a cleaned-up access list decays back within a year without one.

02:14, replayed

The password was right. Everything around it was eleven months out of pattern.

The one blocked sign-in among 9,418 ordinary ones: how it was detected, the page and what the analyst checked, the ten grants the review closed, and the account disabled by 02:31. Switch tabs, or use the arrow keys once one is focused.

Incident LK-2291 · t.hollis@pendryvale.comFinal score 94 · paged 11s after the attempt
Seconds after the attempt · 02:14:06 → 02:30:44Shaded: the first four minutes
0s4 min16m 38s

The password was right. What was wrong was everything around it. Each signal compares t.hollis@pendryvale.com with its own history, not with everyone else’s, so a sign-in that looks ordinary for the firm is plainly out of pattern for this account. 9,418 other sign-ins that night scored under the log line.

Dormant, then activeUsual · Last sign-in 10/02/2025 17:48Seen · First sign-in in 336 days+40
GeographyUsual · 2 locations, one metro areaSeen · New country · hosting network+22
HoursUsual · Weekdays 07:40–19:10Seen · Thu 02:14+18
ApplicationsUsual · Matter workspace · Time entrySeen · Document vault · export+14
Score for this sign-in94log 40block + page 70100Session refused before any application opened. Analyst paged.Weights and thresholds illustrative. Dormancy alone carries the most, because eleven months of silence is unambiguous.

Recorded: 02:14:06, paged eleven seconds later, acknowledged inside four minutes, disabled by 02:31. Seconds between those points, weights and thresholds are illustrative.

Architecture

From an audit event to a person looking at it

Monitoring went in before any access review, which is why the review happened at all. The caught attempt is what prompted anyone to look.

  1. 01 · Source
    Identity provider audit logsEvery authentication is logged, including one whose password is right for an account that should no longer exist.
  2. 02 · Ingestion
    Continuous log streamLogs are shipped into the watch as they happen, never pulled for a quarterly review.
  3. 03 · Engine
    Per-account baseline scoringEach sign-in is compared with that account's usual hours, geography and applications, so dormant-then-active stands out in minutes.
  4. 04 · State
    Access list and grant pathsIdentities reconciled against the HR leaver list; every removal stored with the grant path that created it.
  5. 05 · Delivery
    Alert routing to an analystAn out-of-pattern authentication pages a person. The one caught here was flagged in under four minutes.

What a forgotten account can reach

Offboarding gaps & standing access

A leaver's account can't sign in unnoticed

Audit logs are scored against each account's own baseline, so a dormant account authenticating raises an alert in minutes. The one that did was flagged in under four minutes, before anything was touched.

Access is reconciled, never left to memory

Every identity is checked against the HR leaver list and every grant against its business justification, which reaches the standing admin rights no offboarding checklist would list.

Exposure windows stay short by default

CVE feeds are triaged weekly against the real dependency inventory, scored on exploitability in this environment, with critical findings patched inside a stated window.

Would you know tonight if a leaver’s account signed in? Scope your build in 3 minutes.

Scope your build
Have a project?

Let's talk

Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.