mythsthe appsGitHub OAuth tokens2022developer tooling

everyone assumed:

an integration only touches what we connected it to

what was actually true:

An OAuth token is reach. The relationship behind it can end while the reach stays.

how it happened

  1. whoattackersstole integration tokens
  2. the gapOAuth tokensreach beyond the job
  3. thenprivate repositoriesan AWS key inside
  4. the resultdozens of organisationsincluding npm
the gap that let it happen the result

what everyone assumed

When an integration is approved, the scope feels bounded to its stated purpose: this tool, that pipeline. The assumption is that the connection reaches only what it was set up to reach, and that a vendor’s token is the vendor’s concern.

what happened

Attackers stole those OAuth tokens and used them to clone private repositories across dozens of organizations. From one set of repos they pulled an AWS API key and pivoted further. The tokens, not anyone’s password, were the keys, and they opened more than the integration’s nominal job.

step by step

  1. Heroku and Travis-CI hold OAuth tokens to GitHubGranted for integration work.
  2. attackers steal the tokensThe tokens open more than the integration's job.the assumption breaks here
  3. private repos cloned across dozens of organisationsOne repo yields an AWS key and a further pivot.
  4. April 2022GitHub disclosesnpm source is among what was downloaded.

how it surfaced

In April 2022 GitHub disclosed the campaign: stolen Heroku and Travis-CI OAuth tokens used to download private repos from dozens of organizations, including npm source.

An OAuth token is reach. The relationship behind it can end while the reach stays.

Whatever a vendor’s integration can touch, a thief holding its token can touch, and the scope is usually wider than the feature it was added for.

picture it at a company like yours

The company here is made up. The other two paths are not: they happened, and each links to the story.

your company
a normal dayYour code repository is connected to a couple of handy deployment tools.
the gap nobody seesEach connection holds a key with broad access to all your code.a connected app with standing access
  1. in this story
    the day it mattersOne of those tool vendors is breached and the keys are stolen.
    what it costs youYour private code is copied, and a password found inside it opens the next door.
  2. or it goes like this
    howA chat tool's key into your CRM is stolen from the vendor.
    what leavessupport tickets, including passwords pasted into themwho ends up with itan extortion group working through hundreds of companies
    it happenedSalesloft / Drift, 2025
  3. or it goes like this
    howAn analytics vendor is breached and the keys it holds to your systems are copied.
    what leavesconnections straight into your datawho ends up with itwhoever holds the vendor's keys
    it happenedSisense, 2024

sources

  1. The GitHub Blog, 2022

← all myths

your turn

what you can do about it

  1. this week

    Read your connected-app list and the scope beside each entry.

    Your IdP's connected-app list shows integration tokens you approved for narrow reasons, each holding whatever scope it requested. If the vendor is breached, those scopes become the attacker's. The list, and the scopes beside each entry, is the GitHub lesson made checkable.

  2. go deeper

  3. if you're not sure where to start

    Run the offboarding checklist on one leaver. It covers every account and token to close when someone leaves.

    open the checklist →

the letter · every two weeks

one access gap in your inbox, with the fix.

Every issue takes one way access creeps in, shows a real incident where it went wrong, and ends with one thing to check that week. Written for the people who run the tools, without a security team behind them.

  • 1one mechanism, explained plainly
  • 2one real incident, taken apart
  • 3one step you can take on Monday

get the next issue

One email every two weeks. Your address stays here and is never passed to vendors. One click to unsubscribe. Privacy.