Informations de base GitHub
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Structure de base
La structure de base de lâenvironnement GitHub dâune grande company est de possĂ©der un enterprise qui possĂšde several organizations et chacune dâelles peut contenir several repositories et several teams. Les entreprises plus petites peuvent simplement own one organization and no enterprises.
Du point de vue dâun utilisateur, un user peut ĂȘtre member de different enterprises and organizations. Au sein de celles-ci, lâutilisateur peut avoir different enterprise, organization and repository roles.
De plus, un utilisateur peut faire part of different teams avec différents rÎles au niveau enterprise, organization ou repository.
Et enfin, repositories may have special protection mechanisms.
PrivilĂšges
Enterprise Roles
- Enterprise owner : Les personnes ayant ce rĂŽle peuvent manage administrators, manage organizations within the enterprise, manage enterprise settings, enforce policy across organizations. Cependant, elles cannot access organization settings or content sauf si elles sont nommĂ©es owner dâune organisation ou reçoivent un accĂšs direct Ă un repository appartenant Ă lâorganisation.
- Enterprise members : Les membres des organizations détenues par votre enterprise sont automatically members of the enterprise.
Organization Roles
Dans une organisation, les utilisateurs peuvent avoir différents rÎles :
- Organization owners : Les organization owners ont complete administrative access to your organization. Ce rĂŽle doit ĂȘtre limitĂ©, mais Ă pas moins de deux personnes dans votre organisation.
- Organization members : Le rÎle default, non-administratif pour les people in an organization est organization member. Par défaut, les organization members have a number of permissions.
- Billing managers : Les billing managers sont des utilisateurs qui peuvent manage the billing settings for your organization, comme les informations de paiement.
- Security Managers : Câest un rĂŽle que les organization owners peuvent assigner Ă nâimporte quelle Ă©quipe dans une organisation. Lorsquâil est appliquĂ©, il donne Ă chaque membre de lâĂ©quipe les permissions pour manage security alerts and settings across your organization, as well as read permissions for all repositories dans lâorganisation.
- Si votre organisation dispose dâune Ă©quipe de sĂ©curitĂ©, vous pouvez utiliser le rĂŽle security manager pour donner aux membres de lâĂ©quipe le minimum dâaccĂšs nĂ©cessaire Ă lâorganisation.
- Github App managers : Pour permettre à des utilisateurs supplémentaires de manage GitHub Apps owned by an organization, un owner peut leur accorder des permissions de GitHub App manager.
- Outside collaborators : Un outside collaborator est une personne qui a access to one or more organization repositories but is not explicitly a member de lâorganisation.
Vous pouvez compare the permissions de ces rĂŽles dans ce tableau : https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles
Members Privileges
Dans https://github.com/organizations/<org_name>/settings/member_privileges vous pouvez voir les permissions users will have just for being part of the organisation.
Les paramĂštres configurĂ©s ici indiqueront les permissions suivantes des membres de lâorganisation :
- Ătre admin, writer, reader ou nâavoir aucune permission sur tous les repos de lâorganisation.
- Si les membres peuvent créer des repositories private, internal ou public.
- Si le forking des repositories est possible.
- Si lâinvitation dâoutside collaborators est possible.
- Si des sites public ou private peuvent ĂȘtre publiĂ©s.
- Les permissions que les admins ont sur les repositories.
- Si les membres peuvent créer de nouvelles teams.
Repository Roles
Par défaut les repository roles sont créés :
- Read : Recommandé pour les non-code contributors qui veulent voir ou discuter votre projet.
- Triage : Recommandé pour les contributors who need to proactively manage issues and pull requests sans accÚs en écriture.
- Write : Recommandé pour les contributors qui actively push to your project.
- Maintain : Recommandé pour les project managers who need to manage the repository sans accÚs à des actions sensibles ou destructrices.
- Admin : Recommandé pour les personnes qui ont full access to the project, y compris les actions sensibles et destructrices comme gérer la sécurité ou supprimer un repository.
Vous pouvez compare the permissions de chaque rĂŽle dans ce tableau https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role
Vous pouvez aussi create your own roles dans https://github.com/organizations/<org_name>/settings/roles
Teams
Vous pouvez list the teams created in an organization dans https://github.com/orgs/<org_name>/teams. Notez que pour voir les teams qui sont enfants dâautres teams, vous devez accĂ©der Ă chaque parent team.
Users
Les users dâune organisation peuvent ĂȘtre listed dans https://github.com/orgs/<org_name>/people.
Dans les informations de chaque user, vous pouvez voir les teams the user is member of, et les repos the user has access to.
Github Authentication
GitHub propose diffĂ©rentes façons de sâauthentifier sur votre compte et dâeffectuer des actions en votre nom.
Web Access
En accédant à github.com vous pouvez vous connecter en utilisant votre username and password (et potentiellement un 2FA).
SSH Keys
Vous pouvez configurer votre compte avec une ou plusieurs clĂ©s publiques permettant Ă la private key associĂ©e dâeffectuer des actions en votre nom. https://github.com/settings/keys
GPG Keys
Vous cannot impersonate the user with these keys mais si vous ne les utilisez pas il peut ĂȘtre possible que vous get discover for sending commits without a signature. En savoir plus sur le vigilant mode ici.
Personal Access Tokens
Vous pouvez gĂ©nĂ©rer des personal access token pour donner Ă une application lâaccĂšs Ă votre compte. Lors de la crĂ©ation dâun personal access token, lâuser doit specify les permissions que le token aura. https://github.com/settings/tokens
Oauth Applications
Les Oauth applications peuvent vous demander des permissions to access part of your github information or to impersonate you pour effectuer certaines actions. Un exemple courant de cette fonctionnalité est le bouton login with github que vous pouvez trouver sur certaines plateformes.
- Vous pouvez create vos propres Oauth applications sur https://github.com/settings/developers
- Vous pouvez voir toutes les Oauth applications that has access to your account sur https://github.com/settings/applications
- Vous pouvez voir les scopes that Oauth Apps can ask for sur https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps
- Vous pouvez voir lâaccĂšs tiers des applications dans une organization sur https://github.com/organizations/<org_name>/settings/oauth_application_policy
Quelques recommandations de sécurité :
- Une OAuth App devrait toujours act as the authenticated GitHub user across all of GitHub (par exemple, pour fournir des notifications utilisateur) et nâavoir accĂšs quâaux scopes spĂ©cifiĂ©s.
- Une OAuth App peut ĂȘtre utilisĂ©e comme fournisseur dâidentitĂ© en activant un âLogin with GitHubâ pour lâutilisateur authentifiĂ©.
- Donât construire une OAuth App si vous voulez que votre application agisse sur un single repository. Avec le scope
repo, les OAuth Apps peuvent act on _all_** of the authenticated userâs repositorie**s. - Donât construire une OAuth App pour agir en tant quâapplication pour votre team or company. Les OAuth Apps sâauthentifient en tant que single user, donc si une personne crĂ©e une OAuth App pour que la sociĂ©tĂ© lâutilise, et quâelle quitte la sociĂ©tĂ©, personne dâautre nây aura accĂšs.
- More ici : https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-oauth-apps.
Github Applications
Les Github applications peuvent demander des permissions pour access your github information or impersonate you afin dâeffectuer des actions spĂ©cifiques sur des ressources spĂ©cifiques. Dans les Github Apps, vous devez spĂ©cifier les repositories auxquels lâapp aura accĂšs.
- Pour installer un GitHub App, vous devez ĂȘtre organisation owner or have admin permissions dans un repository.
- Le GitHub App devrait connect to a personal account or an organisation.
- Vous pouvez créer votre propre Github application sur https://github.com/settings/apps
- Vous pouvez voir toutes les Github applications that has access to your account sur https://github.com/settings/apps/authorizations
- Voici les API Endpoints for Github Applications https://docs.github.com/en/rest/overview/endpoints-available-for-github-app. Selon les permissions de lâApp, elle pourra accĂ©der Ă certains dâentre eux.
- Vous pouvez voir les apps installées dans une organization sur https://github.com/organizations/<org_name>/settings/installations
Quelques recommandations de sécurité :
- Un GitHub App devrait take actions independent of a user (sauf si lâapp utilise un user-to-server token). Pour sĂ©curiser davantage les access tokens user-to-server, vous pouvez utiliser des access tokens qui expirent aprĂšs 8 heures, et un refresh token qui peut ĂȘtre Ă©changĂ© contre un nouvel access token. Pour plus dâinformations, voir âRefreshing user-to-server access tokensâ.
- Assurez-vous que le GitHub App sâintĂšgre avec specific repositories.
- Le GitHub App devrait connect to a personal account or an organisation.
- Nâattendez pas du GitHub App quâil sache et fasse tout ce quâun user peut faire.
- Donât use a GitHub App if you just need a âLogin with GitHubâ service. Mais un GitHub App peut utiliser un user identification flow pour connecter les users and faire dâautres choses.
- Ne crĂ©ez pas un GitHub App si vous souhaitez only agir en tant quâutilisateur GitHub et faire tout ce que cet utilisateur peut faire.
- Si vous utilisez votre app avec GitHub Actions et que vous souhaitez modifier des fichiers de workflow, vous devez vous authentifier au nom de lâutilisateur avec un OAuth token qui inclut le scope
workflow. Lâutilisateur doit avoir la permission admin ou write sur le repository contenant le fichier workflow. Pour plus dâinformations, voir âUnderstanding scopes for OAuth appsâ. - More ici : https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps.
Github Actions
Ce nâest pas une mĂ©thode dâauthentification dans github, mais une action malveillante via GitHub Action pourrait obtenir un unauthorised access to github et, depending des privileges donnĂ©s Ă lâAction, plusieurs different attacks pourraient ĂȘtre menĂ©es. Voir ci-dessous pour plus dâinformations.
Git Actions
Git actions permettent dâautomatiser lâexĂ©cution de code when an event happen. Habituellement le code exĂ©cutĂ© est somehow related to the code of the repository (par exemple construire un container docker ou vĂ©rifier que le PR ne contient pas de secrets).
Configuration
Dans https://github.com/organizations/<org_name>/settings/actions il est possible de vĂ©rifier la configuration of the github actions pour lâorganisation.
Il est possible dâinterdire complĂštement lâutilisation des github actions, allow all github actions, ou nâautoriser que certaines actions.
Il est aussi possible de configurer who needs approval to run a Github Action et les permissions of the GITHUB_TOKEN dâune Github Action lors de son exĂ©cution.
Git Secrets
Les Github Action ont généralement besoin de secrets pour interagir avec GitHub ou des applications tierces. Pour éviter de les mettre en clair dans le repo, GitHub permet de les stocker comme Secrets.
Ces secrets peuvent ĂȘtre configurĂ©s pour le repo ou pour toute lâorganisation. Ensuite, pour que lâAction puisse accĂ©der au secret vous devez le dĂ©clarer comme :
steps:
- name: Hello world action
with: # Set the secret as an input
super_secret:${{ secrets.SuperSecret }}
env: # Or as an environment variable
super_secret:${{ secrets.SuperSecret }}
Exemple utilisant Bash
steps:
- shell: bash
env: SUPER_SECRET:${{ secrets.SuperSecret }}
run: |
example-command "$SUPER_SECRET"
Warning
Les secrets ne peuvent ĂȘtre accĂ©dĂ©s que depuis les Github Actions qui les ont dĂ©clarĂ©s.
Une fois configurés dans le repo ou dans les organizations, users of github ne pourront plus y accéder, ils pourront seulement les modifier.
Par consĂ©quent, la seule façon de voler des secrets github est dâaccĂ©der Ă la machine qui exĂ©cute la Github Action (dans ce scĂ©nario vous ne pourrez accĂ©der quâaux secrets dĂ©clarĂ©s pour lâAction).
Git Environments
Github permet de crĂ©er des environments oĂč vous pouvez stocker des secrets. Ensuite, vous pouvez donner Ă la github action lâaccĂšs aux secrets contenus dans lâenvironment avec quelque chose comme :
jobs:
deployment:
runs-on: ubuntu-latest
environment: env_name
Vous pouvez configurer un environnement pour quâil soit accessible par toutes les branches (par dĂ©faut), seulement les branches protĂ©gĂ©es ou spĂ©cifier quelles branches peuvent y accĂ©der.
De plus, les protections dâenvironnement incluent :
- Examinateurs requis : bloquent les jobs ciblant lâenvironnement jusquâĂ approbation. Activez Prevent self-review pour appliquer un vĂ©ritable principe des quatreâyeux sur lâapprobation elleâmĂȘme.
- Branches et tags de dĂ©ploiement : restreindre quelles branches/tags peuvent dĂ©ployer vers lâenvironnement. PrĂ©fĂ©rez sĂ©lectionner des branches/tags spĂ©cifiques et assurezâvous que ces branches sont protĂ©gĂ©es. Remarque : lâoption âProtected branches onlyâ sâapplique aux protections classiques de branches et peut ne pas se comporter comme prĂ©vu si vous utilisez des rulesets.
- Temporisateur dâattente : retarder les dĂ©ploiements pendant une pĂ©riode configurable.
Il est Ă©galement possible de dĂ©finir un nombre dâapprobations requis avant dâexĂ©cuter une action utilisant un environment ou dâattendre un certain temps avant dâautoriser la poursuite des dĂ©ploiements.
Git Action Runner
Une Github Action peut ĂȘtre exĂ©cutĂ©e Ă lâintĂ©rieur de lâenvironnement github ou peut ĂȘtre exĂ©cutĂ©e dans une infrastructure tierce configurĂ©e par lâutilisateur.
Plusieurs organisations autorisent lâexĂ©cution des Github Actions dans une infrastructure tierce car cela a tendance Ă ĂȘtre moins cher.
Vous pouvez lister les runners self-hosted dâune organisation sur https://github.com/organizations/<org_name>/settings/actions/runners
La façon de trouver quelles Github Actions sont exĂ©cutĂ©es dans une infrastructure nonâgithub est de rechercher runs-on: self-hosted dans le YAML de configuration de la Github Action.
Il nâest pas possible dâexĂ©cuter une Github Action dâune organisation Ă lâintĂ©rieur dâune machine self-hosted dâune autre organisation parce quâun token unique est gĂ©nĂ©rĂ© pour le Runner lors de sa configuration pour indiquer Ă quelle organisation il appartient.
Si le Github Runner personnalisĂ© est configurĂ© sur une machine dans AWS ou GCP par exemple, lâAction pourrait avoir accĂšs Ă lâendpoint metadata et voler le token du service account avec lequel la machine sâexĂ©cute.
Git Action Compromise
Si toutes les actions (ou une action malveillante) sont autorisĂ©es, un utilisateur pourrait utiliser une Github Action malveillante qui compromettrait le container oĂč elle est exĂ©cutĂ©e.
Caution
Un run de Github Action malveillant pourrait ĂȘtre abusĂ© par un attaquant pour :
- Voler tous les secrets auxquels lâAction a accĂšs
- Se dĂ©placer latĂ©ralement si lâAction est exĂ©cutĂ©e dans une infrastructure tierce oĂč le token SA utilisĂ© pour exĂ©cuter la machine est accessible (probablement via le service metadata)
- Abuser du token utilisĂ© par le workflow pour voler le code du repo oĂč lâAction est exĂ©cutĂ©e ou mĂȘme le modifier.
Branch Protections
Les branch protections sont conçues pour ne pas donner le contrĂŽle complet dâun repository aux utilisateurs. Lâobjectif est de mettre en place plusieurs mĂ©thodes de protection avant de pouvoir Ă©crire du code dans une branche.
Les branch protections dâun repository se trouvent sur https://github.com/<orgname>/<reponame>/settings/branches
Note
Il nâest pas possible de dĂ©finir une branch protection au niveau de lâorganisation. Elles doivent donc toutes ĂȘtre dĂ©clarĂ©es sur chaque repo.
DiffĂ©rentes protections peuvent ĂȘtre appliquĂ©es Ă une branche (comme master) :
- Vous pouvez exiger une PR avant de merger (ainsi vous ne pouvez pas fusionner du code directement dans la branche). Si ceci est sĂ©lectionnĂ©, dâautres protections peuvent ĂȘtre en place :
- Exiger un nombre dâapprobations. Il est trĂšs courant dâexiger 1 ou 2 personnes supplĂ©mentaires pour approuver votre PR afin quâun seul utilisateur ne puisse pas merger du code directement.
- Annuler les approbations quand de nouveaux commits sont poussés. Sinon, un utilisateur peut approuver du code légitime puis ajouter du code malveillant et merger.
- Exiger lâapprobation du push revue le plus rĂ©cent. Garantit que tout nouveau commit aprĂšs une approbation (y compris les pushes par dâautres collaborateurs) dĂ©clenche une nouvelle revue afin quâun attaquant ne puisse pas pousser des modifications postâapprobation et merger.
- Exiger des revues des Code Owners. Au moins 1 code owner du repo doit approuver la PR (ainsi des utilisateurs âalĂ©atoiresâ ne peuvent pas approuver).
- Restreindre qui peut annuler les revues de pull request. Vous pouvez spécifier des personnes ou équipes autorisées à annuler les revues.
- Autoriser certains acteurs à contourner les exigences de pull request. Ces utilisateurs pourront bypasser les restrictions précédentes.
- Exiger que des checks de statut passent avant de merger. Certains checks doivent rĂ©ussir avant de pouvoir merger le commit (comme une GitHub App rapportant des rĂ©sultats SAST). Astuce : liez les checks requis Ă une GitHub App spĂ©cifique ; sinon nâimporte quelle app pourrait usurper le check via la Checks API, et beaucoup de bots acceptent des directives de skip (ex. â@bot-name skipâ).
- Exiger la rĂ©solution des conversations avant de merger. Tous les commentaires sur le code doivent ĂȘtre rĂ©solus avant que la PR puisse ĂȘtre mergĂ©e.
- Exiger des commits signĂ©s. Les commits doivent ĂȘtre signĂ©s.
- Exiger un historique linĂ©aire. EmpĂȘche les merge commits dâĂȘtre poussĂ©s vers les branches correspondantes.
- Inclure les administrateurs. Si cela nâest pas activĂ©, les admins peuvent contourner les restrictions.
- Restreindre qui peut pusher sur les branches correspondantes. Restreindre qui peut envoyer une PR.
Note
Comme vous pouvez le voir, mĂȘme si vous parvenez Ă obtenir les identifiants dâun utilisateur, les repos peuvent ĂȘtre protĂ©gĂ©s et vous empĂȘcher de pousser du code sur master par exemple pour compromettre le pipeline CI/CD.
Tag Protections
Les tags (comme latest, stable) sont mutables par dĂ©faut. Pour appliquer un flux Ă quatreâyeux sur les mises Ă jour de tags, protĂ©gez les tags et chaĂźnez les protections via les environments et les branches :
- Sur la rÚgle de protection des tags, activez Require deployments to succeed et exigez un déploiement réussi vers un environment protégé (ex. prod).
- Dans lâenvironnement cible, restreignez Deployment branches and tags Ă la branche de release (ex. main) et configurez Ă©ventuellement Required reviewers avec Prevent self-review.
- Sur la branche de release, configurez les protections de branche pour Require a pull request, définissez approvals ℠1, et activez à la fois Dismiss approvals when new commits are pushed et Require approval of the most recent reviewable push.
Cette chaĂźne empĂȘche un seul collaborateur de retagger ou de forcer la publication de releases en modifiant le YAML du workflow, puisque les gates de dĂ©ploiement sont appliquĂ©s en dehors des workflows.
References
- https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization
- https://docs.github.com/en/enterprise-server@3.3/admin/user-management/managing-users-in-your-enterprise/roles-in-an-enterprisehttps://docs.github.com/en/enterprise-server
- https://docs.github.com/en/get-started/learning-about-github/access-permissions-on-github
- https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-user-account/managing-user-account-settings/permission-levels-for-user-owned-project-boards
- https://docs.github.com/en/actions/security-guides/encrypted-secrets
- https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions
- https://securitylab.github.com/resources/github-actions-untrusted-input/
- https://docs.github.com/en/rest/checks/runs
- https://docs.github.com/en/apps
- GitHub Actions: A Cloudy Day for Security - Part 1
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

