Incidente · Sênior
Heroku/Travis 2022: tokens OAuth roubados
Incidente real. Pontos centrais: autenticação e autorização.
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.
No desenho, o usuário conecta a própria conta do GitHub a um aplicativo OAuth do integrador.
O integrador guarda num banco os tokens OAuth de integração com o GitHub de seus clientes.
Com um token, o aplicativo chama a API do GitHub em nome do usuário.
A API dá acesso aos repositórios privados que o token cobre.
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.
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.
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.
O atacante obteve acesso a um banco de dados da Heroku e baixou os tokens OAuth guardados dos clientes.
Com os tokens roubados, o atacante autenticou-se na API do GitHub.
Para a maioria dos usuários, listou as organizações, escolheu alvos e listou os repositórios privados das contas de interesse.
Em seguida, clonou alguns desses repositórios privados.
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
| Quem | Ação descrita na fonte |
|---|---|
| GitHub, com os integradores | Pediu que investigassem, revogassem todos os tokens OAuth de usuário dos aplicativos afetados e avisassem seus usuários |
| GitHub, uso interno | Revogou os tokens associados ao uso interno do GitHub e do npm dos aplicativos comprometidos |
| Heroku | Revogou todos os tokens existentes da integração do Dashboard com o GitHub e impediu a criação de novos |
| Clientes do GitHub | Revisar 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.