Pular para o conteúdo

Incidente · Sênior

Heroku/Travis 2022: tokens OAuth roubados

Incidente real. Pontos centrais: autenticação e autorização.

14 min de leitura · Incidente em 2022, durou · Fonte: Heroku · Conteúdo revisado em 23 de outubro de 2026

Resposta curta

Incidente real. Pontos centrais: autenticação e autorização. Em abril de 2022, o GitHub identificou que tokens OAuth de usuário, emitidos a dois integradores de terceiros (Heroku e Travis CI), tinham sido roubados e usados para baixar dados de dezenas de organizações, entre elas o npm.

01 · CONTEXTO

Tokens de terceiros guardados num banco

Em abril de 2022, o GitHub identificou que tokens OAuth de usuário, emitidos a dois integradores de terceiros (Heroku e Travis CI), tinham sido roubados e usados para baixar dados de dezenas de organizações, entre elas o npm. O caso é um estudo de autenticação e autorização em integrações: as fontes são o relatório de incidente da Heroku e o alerta de segurança do GitHub.

Segundo a Heroku, um atacante obteve acesso a um banco de dados da empresa e baixou os tokens OAuth de integração com o GitHub guardados de seus clientes. Cada um desses tokens era a credencial de integração de um cliente com o GitHub.

  1. No desenho, o usuário conecta a própria conta do GitHub a um aplicativo OAuth do integrador.

    Diagrama da arquitetura: Integração OAuth guardando tokens de clientes
    CLUsuário
    CPAplicativo OAuth do integrador
    DBBanco de tokens
    NWAPI do GitHub
    DBRepositórios privados
  2. O integrador guarda num banco os tokens OAuth de integração com o GitHub de seus clientes.

    Diagrama da arquitetura: Integração OAuth guardando tokens de clientes
    CLUsuário
    CPAplicativo OAuth do integrador
    DBBanco de tokens
    NWAPI do GitHub
    DBRepositórios privados
  3. Com um token, o aplicativo chama a API do GitHub em nome do usuário.

    Diagrama da arquitetura: Integração OAuth guardando tokens de clientes
    CLUsuário
    CPAplicativo OAuth do integrador
    DBBanco de tokens
    NWAPI do GitHub
    DBRepositórios privados
  4. A API dá acesso aos repositórios privados que o token cobre.

    Diagrama da arquitetura: Integração OAuth guardando tokens de clientes
    CLUsuário
    CPAplicativo OAuth do integrador
    DBBanco de tokens
    NWAPI do GitHub
    DBRepositórios privados

O GitHub afirma que não acredita que o atacante tenha obtido os tokens por um comprometimento do GitHub ou de seus sistemas, porque os tokens em questão não são guardados pelo GitHub em seu formato original e utilizável.

02 · O ATAQUE

Do repositório arquivado aos repositórios dos clientes

A investigação da Heroku apontou que o acesso inicial veio de um token comprometido de uma conta de máquina. O atacante obteve esse acesso a partir de um repositório privado arquivado com código-fonte da Heroku, e a empresa avaliou que ele chegou ao repositório por meio de uma integração de terceiros. A Heroku diz não ter conseguido confirmar de modo definitivo qual integração foi a origem do ataque.

  1. Segundo a avaliação da Heroku, o atacante chegou a um repositório privado arquivado com código-fonte da empresa por meio de uma integração de terceiros.

    Diagrama da arquitetura: Cadeia do ataque com tokens roubados
    CLAtacante
    DBRepositório privado arquivadoorigem
    CPConta de máquina
    DBBanco de tokens da Heroku
    NWAPI do GitHub
    DBRepositórios privados de clientes
  2. A partir desse repositório, o atacante obteve acesso a uma conta de máquina; um token comprometido dela foi o acesso inicial ao ambiente.

    Diagrama da arquitetura: Cadeia do ataque com tokens roubados
    CLAtacante
    DBRepositório privado arquivado
    CPConta de máquinatoken comprometido
    DBBanco de tokens da Heroku
    NWAPI do GitHub
    DBRepositórios privados de clientes
  3. O atacante obteve acesso a um banco de dados da Heroku e baixou os tokens OAuth guardados dos clientes.

    Diagrama da arquitetura: Cadeia do ataque com tokens roubados
    CLAtacante
    DBRepositório privado arquivado
    CPConta de máquina
    DBBanco de tokens da Herokutokens baixados
    NWAPI do GitHub
    DBRepositórios privados de clientes
  4. Com os tokens roubados, o atacante autenticou-se na API do GitHub.

    Diagrama da arquitetura: Cadeia do ataque com tokens roubados
    CLAtacante
    DBRepositório privado arquivado
    CPConta de máquina
    DBBanco de tokens da Heroku
    NWAPI do GitHub
    DBRepositórios privados de clientes
  5. Para a maioria dos usuários, listou as organizações, escolheu alvos e listou os repositórios privados das contas de interesse.

    Diagrama da arquitetura: Cadeia do ataque com tokens roubados
    CLAtacante
    DBRepositório privado arquivado
    CPConta de máquina
    DBBanco de tokens da Heroku
    NWAPI do GitHub
    DBRepositórios privados de clientes
  6. Em seguida, clonou alguns desses repositórios privados.

    Diagrama da arquitetura: Cadeia do ataque com tokens roubados
    CLAtacante
    DBRepositório privado arquivado
    CPConta de máquina
    DBBanco de tokens da Heroku
    NWAPI do GitHub
    DBRepositórios privados de clientesclonados

03 · O USO DOS TOKENS

O que os tokens roubados permitiram

O GitHub descreve o padrão do atacante com os tokens roubados: autenticou-se na API e, para a maioria dos usuários afetados, listou as organizações e escolheu alvos com base nessa lista. Em seguida listou os repositórios privados das contas de interesse e clonou alguns deles.

No caso do npm, a detecção inicial foi um acesso não autorizado à infraestrutura de produção, feito com uma chave de API da AWS comprometida. O GitHub acredita que essa chave foi obtida quando o atacante baixou repositórios privados do npm com um token OAuth roubado, e avalia que ele não modificou pacotes nem acessou dados ou credenciais de contas de usuário.

A Heroku confirmou ainda que, no mesmo dia em que o atacante exfiltrou os tokens OAuth, ele baixou dados de outro banco, que guarda variáveis de configuração em nível de pipeline para Review Apps e Heroku CI.

04 · A RESPOSTA

Revogar tudo tem um custo

QuemAção descrita na fonte
GitHub, com os integradoresPediu que investigassem, revogassem todos os tokens OAuth de usuário dos aplicativos afetados e avisassem seus usuários
GitHub, uso internoRevogou os tokens associados ao uso interno do GitHub e do npm dos aplicativos comprometidos
HerokuRevogou todos os tokens existentes da integração do Dashboard com o GitHub e impediu a criação de novos
Clientes do GitHubRevisar periodicamente os aplicativos OAuth autorizados e remover o que não é mais necessário

A própria Heroku reconhece que cortar a integração com o GitHub e rotacionar credenciais afetou seus clientes, e registra que considerou essas ações um passo crítico para proteger os dados.

05 · PARA O SEU DESENHO

Menos poder por token, menos estrago

Depois do incidente, a Heroku disse acreditar que mTLS baseado na RFC-8705 e proteção de chave privada para OAuth, junto com paridade entre a integração OAuth e o modelo de GitHub App, dão privilégios de acesso mais modulares aos repositórios conectados, e que pretende explorar esses caminhos com o GitHub.

Um token OAuth vale para quem o apresenta. Por isso, algumas perguntas de desenho pesam mais do que a esperança de nunca vazar: o escopo do token é o mínimo necessário? Ele expira ou pode ser revogado rapidamente e em massa? Quem consegue ler o banco onde ele fica?

Entre os conselhos da Heroku aos clientes está revisar as integrações conectadas aos repositórios e garantir que sejam confiáveis.

Perguntas frequentes

O que é Heroku/Travis 2022: tokens OAuth roubados?

Incidente real. Pontos centrais: autenticação e autorização.

O que o design de Heroku/Travis 2022: tokens OAuth roubados cobre?

Ele está organizado nestas seções: Tokens de terceiros guardados num banco, Do repositório arquivado aos repositórios dos clientes, O que os tokens roubados permitiram, Revogar tudo tem um custo e Menos poder por token, menos estrago.

Quanto tempo leva Heroku/Travis 2022: tokens OAuth roubados e qual é o nível?

Leva cerca de 14 minutos para ler e tem nível Sênior.

Agora projete você mesmo

Rode este caso como uma entrevista na escola de System Design: você toma as decisões, o tutor as questiona e você vê a nota do seu desenho.