Basic Github Information
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
A estrutura básica do ambiente do github de uma grande empresa é possuir uma empresa que possui várias organizações e cada uma delas pode conter vários repositórios e várias equipes. Empresas menores podem possuir apenas uma organização e nenhuma empresa.
Do ponto de vista do usuário, um usuário pode ser um membro de diferentes empresas e organizações. Dentro delas, o usuário pode ter diferentes funções de empresa, organização e repositório.
Além disso, um usuário pode ser parte de diferentes equipes com diferentes funções de empresa, organização ou repositório.
E finalmente, os repositórios podem ter mecanismos de proteção especiais.
Proprietário da empresa: Pessoas com essa função podem gerenciar administradores, gerenciar organizações dentro da empresa, gerenciar configurações da empresa, impor políticas entre organizações. No entanto, eles não podem acessar configurações ou conteúdo da organização a menos que sejam feitos proprietários da organização ou tenham acesso direto a um repositório de propriedade da organização.
Membros da empresa: Membros de organizações de propriedade da sua empresa também são automaticamente membros da empresa.
Em uma organização, os usuários podem ter diferentes funções:
Proprietários da organização: Proprietários da organização têm acesso administrativo completo à sua organização. Essa função deve ser limitada, mas não a menos de duas pessoas, em sua organização.
Membros da organização: A função padrão, não administrativa, para pessoas em uma organização é o membro da organização. Por padrão, os membros da organização têm um número de permissões.
Gerentes de cobrança: Gerentes de cobrança são usuários que podem gerenciar as configurações de cobrança da sua organização, como informações de pagamento.
Gerentes de Segurança: É uma função que os proprietários da organização podem atribuir a qualquer equipe em uma organização. Quando aplicada, dá a cada membro da equipe permissões para gerenciar alertas e configurações de segurança em sua organização, bem como permissões de leitura para todos os repositórios na organização.
Se sua organização tiver uma equipe de segurança, você pode usar a função de gerente de segurança para dar aos membros da equipe o menor acesso que eles precisam à organização.
Gerentes de Aplicativos do Github: Para permitir que usuários adicionais gerenciem Aplicativos do GitHub de propriedade de uma organização, um proprietário pode conceder a eles permissões de gerente de Aplicativos do GitHub.
Colaboradores externos: Um colaborador externo é uma pessoa que tem acesso a um ou mais repositórios da organização, mas não é explicitamente um membro da organização.
Você pode comparar as permissões dessas funções nesta tabela: https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles
Em https://github.com/organizations/<org_name>/settings/member_privileges você pode ver as permissões que os usuários terão apenas por serem parte da organização.
As configurações aqui configuradas indicarão as seguintes permissões dos membros da organização:
Ser admin, escritor, leitor ou sem permissão sobre todos os repositórios da organização.
Se os membros podem criar repositórios privados, internos ou públicos.
Se o fork de repositórios é possível.
Se é possível convidar colaboradores externos.
Se sites públicos ou privados podem ser publicados.
As permissões que os administradores têm sobre os repositórios.
Se os membros podem criar novas equipes.
Por padrão, as funções de repositório são criadas:
Leitura: Recomendado para contribuidores não de código que desejam visualizar ou discutir seu projeto.
Triagem: Recomendado para contribuidores que precisam gerenciar proativamente problemas e pull requests sem acesso de escrita.
Escrita: Recomendado para contribuintes que enviam ativamente para seu projeto.
Manutenção: Recomendado para gerentes de projeto que precisam gerenciar o repositório sem acesso a ações sensíveis ou destrutivas.
Admin: Recomendado para pessoas que precisam de acesso total ao projeto, incluindo ações sensíveis e destrutivas, como gerenciar segurança ou excluir um repositório.
Você pode comparar as permissões de cada função nesta tabela https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role
Você também pode criar suas próprias funções em https://github.com/organizations/<org_name>/settings/roles
Você pode listar as equipes criadas em uma organização em https://github.com/orgs/<org_name>/teams. Observe que, para ver as equipes que são filhas de outras equipes, você precisa acessar cada equipe pai.
Os usuários de uma organização podem ser listados em https://github.com/orgs/<org_name>/people.
Nas informações de cada usuário, você pode ver as equipes das quais o usuário é membro e os repositórios aos quais o usuário tem acesso.
O Github oferece diferentes maneiras de autenticar sua conta e realizar ações em seu nome.
Acessando github.com, você pode fazer login usando seu nome de usuário e senha (e um 2FA potencialmente).
Você pode configurar sua conta com uma ou várias chaves públicas permitindo que a chave privada relacionada realize ações em seu nome. https://github.com/settings/keys
Você não pode se passar pelo usuário com essas chaves, mas se você não as usar, pode ser possível que você seja descoberto por enviar commits sem uma assinatura. Saiba mais sobre modo vigilante aqui.
Você pode gerar um token de acesso pessoal para dar a um aplicativo acesso à sua conta. Ao criar um token de acesso pessoal, o usuário precisa especificar as permissões que o token terá. https://github.com/settings/tokens
Aplicações Oauth podem pedir permissões para acessar parte das suas informações do github ou para se passar por você para realizar algumas ações. Um exemplo comum dessa funcionalidade é o botão de login com github que você pode encontrar em algumas plataformas.
Você pode criar suas próprias aplicações Oauth em https://github.com/settings/developers
Você pode ver todas as aplicações Oauth que têm acesso à sua conta em https://github.com/settings/applications
Você pode ver os escopos que as Aplicações Oauth podem solicitar em https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps
Você pode ver o acesso de terceiros de aplicações em uma organização em https://github.com/organizations/<org_name>/settings/oauth_application_policy
Algumas recomendações de segurança:
Um App OAuth deve sempre agir como o usuário autenticado do GitHub em todo o GitHub (por exemplo, ao fornecer notificações ao usuário) e com acesso apenas aos escopos especificados.
Um App OAuth pode ser usado como um provedor de identidade ao habilitar um "Login com GitHub" para o usuário autenticado.
Não construa um App OAuth se você quiser que seu aplicativo atue em um único repositório. Com o escopo repo
, os Apps OAuth podem agir em _todos_** os repositórios do usuário autenticado**.
Não construa um App OAuth para atuar como um aplicativo para sua equipe ou empresa. Os Apps OAuth se autenticam como um único usuário, então, se uma pessoa criar um App OAuth para uma empresa usar, e depois ela deixar a empresa, ninguém mais terá acesso a ele.
Mais em aqui.
As aplicações do Github podem pedir permissões para acessar suas informações do github ou se passar por você para realizar ações específicas sobre recursos específicos. Nas Aplicações do Github, você precisa especificar os repositórios aos quais o aplicativo terá acesso.
Para instalar um App do GitHub, você deve ser um proprietário da organização ou ter permissões de administrador em um repositório.
O App do GitHub deve conectar-se a uma conta pessoal ou a uma organização.
Você pode criar sua própria aplicação do Github em https://github.com/settings/apps
Você pode ver todas as aplicações do Github que têm acesso à sua conta em https://github.com/settings/apps/authorizations
Estes são os Endpoints da API para Aplicações do Github https://docs.github.com/en/rest/overview/endpoints-available-for-github-app. Dependendo das permissões do App, ele poderá acessar alguns deles.
Você pode ver aplicativos instalados em uma organização em https://github.com/organizations/<org_name>/settings/installations
Algumas recomendações de segurança:
Um App do GitHub deve tomar ações independentemente de um usuário (a menos que o aplicativo esteja usando um token de usuário para servidor). Para manter os tokens de acesso de usuário para servidor mais seguros, você pode usar tokens de acesso que expiram após 8 horas e um token de atualização que pode ser trocado por um novo token de acesso. Para mais informações, veja "Atualizando tokens de acesso de usuário para servidor."
Certifique-se de que o App do GitHub se integre com repositórios específicos.
O App do GitHub deve conectar-se a uma conta pessoal ou a uma organização.
Não espere que o App do GitHub saiba e faça tudo o que um usuário pode.
Não use um App do GitHub se você só precisa de um serviço de "Login com GitHub". Mas um App do GitHub pode usar um fluxo de identificação de usuário para fazer login de usuários e fazer outras coisas.
Não construa um App do GitHub se você apenas quiser agir como um usuário do GitHub e fazer tudo o que esse usuário pode fazer.
Se você estiver usando seu aplicativo com GitHub Actions e quiser modificar arquivos de fluxo de trabalho, deve se autenticar em nome do usuário com um token OAuth que inclua o escopo workflow
. O usuário deve ter permissão de administrador ou escrita para o repositório que contém o arquivo de fluxo de trabalho. Para mais informações, veja "Entendendo escopos para aplicativos OAuth."
Mais em aqui.
Isso não é uma maneira de autenticar no github, mas uma ação maliciosa do Github poderia obter acesso não autorizado ao github e dependendo dos privilégios dados à Ação, vários ataques diferentes poderiam ser realizados. Veja abaixo para mais informações.
As ações do Git permitem automatizar a execução de código quando um evento acontece. Normalmente, o código executado está de alguma forma relacionado ao código do repositório (talvez construir um contêiner docker ou verificar se o PR não contém segredos).
Em https://github.com/organizations/<org_name>/settings/actions é possível verificar a configuração das ações do github para a organização.
É possível proibir completamente o uso de ações do github, permitir todas as ações do github, ou apenas permitir certas ações.
Também é possível configurar quem precisa de aprovação para executar uma Ação do Github e as permissões do GITHUB_TOKEN de uma Ação do Github quando ela é executada.
As Ações do Github geralmente precisam de algum tipo de segredos para interagir com o github ou aplicativos de terceiros. Para evitar colocá-los em texto claro no repositório, o github permite colocá-los como Segredos.
Esses segredos podem ser configurados para o repositório ou para toda a organização. Então, para que a Ação possa acessar o segredo, você precisa declará-lo como:
Segredos só podem ser acessados a partir das Github Actions que os têm declarados.
Uma vez configurados no repositório ou nas organizações, os usuários do github não poderão acessá-los novamente, eles só poderão alterá-los.
Portanto, a única maneira de roubar segredos do github é conseguir acessar a máquina que está executando a Github Action (nesse cenário você só poderá acessar os segredos declarados para a Action).
O Github permite criar ambientes onde você pode salvar segredos. Então, você pode dar à ação do github acesso aos segredos dentro do ambiente com algo como:
Você pode configurar um ambiente para ser acessado por todos os ramos (padrão), apenas ramos protegidos ou especificar quais ramos podem acessá-lo. Também é possível definir um número de revisões necessárias antes de executar uma ação usando um ambiente ou aguardar algum tempo antes de permitir que as implantações prossigam.
Uma Github Action pode ser executada dentro do ambiente github ou pode ser executada em uma infraestrutura de terceiros configurada pelo usuário.
Várias organizações permitirão a execução de Github Actions em uma infraestrutura de terceiros, pois costuma ser mais barato.
Você pode listar os runners auto-hospedados de uma organização em https://github.com/organizations/<org_name>/settings/actions/runners
A maneira de descobrir quais Github Actions estão sendo executadas em infraestrutura não github é procurar por runs-on: self-hosted
na configuração yaml da Github Action.
Não é possível executar uma Github Action de uma organização dentro de uma caixa auto-hospedada de uma organização diferente porque um token único é gerado para o Runner ao configurá-lo para saber a qual runner pertence.
Se o Github Runner personalizado estiver configurado em uma máquina dentro da AWS ou GCP, por exemplo, a Action pode ter acesso ao endpoint de metadados e roubar o token da conta de serviço com a qual a máquina está sendo executada.
Se todas as ações (ou uma ação maliciosa) forem permitidas, um usuário pode usar uma Github action que é maliciosa e irá comprometer o container onde está sendo executada.
Uma Github Action maliciosa executada pode ser abusada pelo atacante para:
Roubar todos os segredos aos quais a Action tem acesso
Mover lateralmente se a Action for executada dentro de uma infraestrutura de terceiros onde o token SA usado para executar a máquina pode ser acessado (provavelmente via o serviço de metadados)
Abusar do token usado pelo workflow para roubar o código do repositório onde a Action é executada ou até mesmo modificá-lo.
As proteções de ramo são projetadas para não dar controle total de um repositório aos usuários. O objetivo é implementar vários métodos de proteção antes de poder escrever código dentro de algum ramo.
As proteções de ramo de um repositório podem ser encontradas em https://github.com/<orgname>/<reponame>/settings/branches
Não é possível definir uma proteção de ramo em nível de organização. Portanto, todas elas devem ser declaradas em cada repositório.
Diferentes proteções podem ser aplicadas a um ramo (como ao master):
Você pode exigir um PR antes de mesclar (então você não pode mesclar código diretamente no ramo). Se isso for selecionado, outras proteções podem estar em vigor:
Exigir um número de aprovações. É muito comum exigir que 1 ou 2 pessoas adicionais aprovem seu PR, para que um único usuário não consiga mesclar código diretamente.
Desconsiderar aprovações quando novos commits são enviados. Caso contrário, um usuário pode aprovar código legítimo e, em seguida, o usuário poderia adicionar código malicioso e mesclá-lo.
Exigir revisões de Proprietários de Código. Pelo menos 1 proprietário de código do repositório precisa aprovar o PR (para que usuários "aleatórios" não possam aprová-lo)
Restringir quem pode desconsiderar revisões de pull request. Você pode especificar pessoas ou equipes autorizadas a desconsiderar revisões de pull request.
Permitir que atores especificados contornem os requisitos de pull request. Esses usuários poderão contornar restrições anteriores.
Exigir que verificações de status sejam aprovadas antes de mesclar. Algumas verificações precisam ser aprovadas antes de poder mesclar o commit (como uma ação do github verificando se não há nenhum segredo em texto claro).
Exigir resolução de conversas antes de mesclar. Todos os comentários sobre o código precisam ser resolvidos antes que o PR possa ser mesclado.
Exigir commits assinados. Os commits precisam ser assinados.
Exigir histórico linear. Impedir que commits de mesclagem sejam enviados para ramos correspondentes.
Incluir administradores. Se isso não estiver definido, os administradores podem contornar as restrições.
Restringir quem pode enviar para ramos correspondentes. Restringir quem pode enviar um PR.
Como você pode ver, mesmo que você consiga obter algumas credenciais de um usuário, os repositórios podem estar protegidos, evitando que você envie código para o master, por exemplo, para comprometer o pipeline de CI/CD.
Aprenda e pratique Hacking na AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking na GCP: HackTricks Training GCP Red Team Expert (GRTE)