10 points par GN⁺ 2024-07-25 | 1 commentaires | Partager sur WhatsApp
  • Sur GitHub, il est possible d’accéder aux données de forks supprimés, de dépôts supprimés, et même de dépôts privés
  • GitHub est au courant de ce comportement et il s’agit d’un fonctionnement volontaire
    • Comme cela constitue un énorme vecteur d’attaque pour toute organisation utilisant GitHub, un nouveau terme est proposé : « référence d’objet inter-fork croisée (CFOR) »
  • Une vulnérabilité CFOR se produit lorsqu’un fork d’un dépôt peut accéder à des données sensibles d’un autre fork, y compris des données issues de forks privés ou supprimés

Accéder aux données d’un fork supprimé

  • Si l’on considère un workflow courant sur GitHub, on peut forker un dépôt public, valider du code dans ce fork, puis supprimer le fork
  • Le code validé dans le fork reste accessible, et le restera indéfiniment
  • On pourrait penser qu’il est protégé tant qu’il faut connaître le hash du commit, mais ce hash peut être découvert
  • Retrouver des données dans un fork supprimé se produit assez fréquemment

Accéder aux données d’un dépôt supprimé

  • Si l’on prend le scénario où un dépôt public existe sur GitHub, qu’un utilisateur le fork, y valide des données après le fork, puis supprime entièrement le dépôt,
  • le code validé après le fork reste toujours accessible
  • GitHub stocke les dépôts et leurs forks dans un réseau de dépôts, le dépôt « upstream » d’origine jouant le rôle de nœud racine
  • Si le dépôt public « upstream » forké est « supprimé », GitHub réattribue le rôle de nœud racine à l’un des forks en aval
  • Cependant, tous les commits du dépôt « upstream » continuent d’exister et restent accessibles via n’importe lequel des forks

Accéder aux données d’un dépôt privé

  • Si l’on considère un workflow courant d’open source d’un nouvel outil sur GitHub,
  • il peut arriver qu’on crée un dépôt privé destiné à devenir public, qu’on en crée une version interne privée (via un fork), qu’on y valide du code supplémentaire pour des fonctionnalités qui ne seront pas publiées, puis qu’on rende le dépôt « upstream » public tout en gardant le fork privé
  • Les fonctionnalités privées et le code associé (à l’étape 2), s’ils sont visibles publiquement ou non, sont accessibles depuis le dépôt public
  • Tout ce qui est validé dans le fork privé après la publication du dépôt « upstream » n’est pas visible

Comment accéder concrètement aux données ?

  • En accédant directement aux commits
  • Dans le réseau de dépôts de GitHub, les opérations destructrices (comme les trois scénarios mentionnés ci-dessus) suppriment les références aux données de commit dans l’interface standard de GitHub et dans les opérations git habituelles
  • Cependant, ces données existent toujours et restent accessibles si l’on connaît le hash du commit
  • Un hash de commit est une valeur SHA-1, et si un utilisateur connaît le hash SHA-1 du commit précis qu’il veut consulter, il peut accéder directement à ce commit via l’endpoint https://github.com/<user/org>/…;
  • Les hashes de commit peuvent être bruteforcés via l’interface de GitHub
  • Il est également possible d’interroger les hashes de commit via l’endpoint public events API de GitHub

La politique de GitHub

  • Ces résultats ont récemment été soumis via le programme VDP de GitHub, et GitHub a clairement indiqué que les dépôts sont conçus pour fonctionner ainsi
  • Après examen de la documentation, il apparaît que GitHub documente clairement ce à quoi les utilisateurs doivent s’attendre dans les cas décrits ci-dessus

Impact

  • Tant qu’il existe au moins un fork, tous les commits de ce réseau de dépôts (qu’ils proviennent du dépôt « upstream » ou d’un fork « downstream ») existeront pour toujours
  • L’architecture des dépôts de GitHub nécessite ce défaut de conception, et la majorité des utilisateurs de GitHub ne comprennent pas réellement comment fonctionne le réseau de dépôts, ce qui les rend moins en sécurité
  • À mesure que le secret scanning évolue et devient capable de scanner tous les commits d’un réseau de dépôts, il deviendra possible d’être alerté sur des secrets qui ne sont pas les siens
  • Ces trois scénarios sont choquants, mais ne couvrent pas toutes les façons dont GitHub peut conserver des données supprimées dans un dépôt

L’avis de GN⁺

  • Cet article soulève un problème de sécurité important pour les organisations qui utilisent GitHub. Le fait que les données de dépôts supprimés ou rendus privés restent accessibles est choquant. Cela semble être un défaut de conception fondamental lié à l’architecture du réseau de dépôts de GitHub
  • Les développeurs doivent être conscients de ce problème et faire preuve de prudence lorsqu’ils valident des données sensibles ou des secrets sur GitHub. Une fois poussés vers un dépôt public, ils peuvent rester accessibles indéfiniment. En cas de fuite de secrets importants, seule une rotation des clés permet d’y remédier complètement
  • GitHub rend ce problème public de manière transparente et le documente, mais la majorité des utilisateurs ne comprendront probablement pas complètement le fonctionnement du réseau de dépôts. GitHub devrait faire davantage d’efforts pour sensibiliser et former ses utilisateurs à ce sujet
  • Des problèmes similaires peuvent exister dans d’autres systèmes de gestion de versions. Les développeurs et les organisations doivent bien comprendre l’architecture et les limites des outils qu’ils utilisent lorsqu’ils gèrent des données sensibles
  • Pour éviter les fuites de données sensibles, il faut mettre en place des mesures de sécurité à plusieurs niveaux, comme des contrôles d’accès stricts, l’application du principe du moindre privilège, un secret scanning régulier et une surveillance continue. Plus que tout, un niveau élevé de sensibilisation à la sécurité chez les développeurs est essentiel

1 commentaires

 
GN⁺ 2024-07-25
Avis Hacker News
  • Signalé à HackerOne en 2018, mais GitHub n’a pas corrigé le problème en affirmant qu’il s’agissait d’un comportement intentionnel. Conclusion : mieux vaut copier le dépôt plutôt que d’utiliser un fork privé
  • GitHub est obsédé par le fait de tout rendre public et immuable. Par exemple, pour supprimer un commentaire, il faut envoyer par e-mail une véritable pièce d’identité au propriétaire du dépôt
  • Les utilisateurs ne devraient pas avoir à connaître ce genre de problème lié à la fonctionnalité « privée », et le fait que GitHub considère cela comme une fonctionnalité plutôt qu’un bug montre un manque d’intérêt pour la sécurité. Il serait plus juste d’appeler les dépôts privés des dépôts « non listés »
  • Si l’on utilise un dépôt privé et des forks privés puis que l’on rend le dépôt public, les forks deviennent eux aussi publics. GitHub peut prétendre que c’est intentionnel, mais il devrait obliger à rendre le dépôt et les forks publics en même temps
  • Ce comportement ressemble à un dark pattern, et malgré le fait que les moyens de subsistance des gens puissent être en jeu, GitHub ne semble pas s’en soucier. C’est parce que la négation plausible et des conditions d’utilisation floues valent davantage, pour l’entreprise, qu’un préjudice de réputation
  • Je suis surpris par les commentaires qui minimisent ce problème. J’utilise GitHub depuis longtemps, mais je n’aurais pas anticipé une telle conséquence, et cela m’inquiète. Je recommande de lire l’article directement
  • Ce problème n’est pas nouveau. Beaucoup de gens l’avaient déjà découvert auparavant
  • L’OSPO de GitHub développe une GitHub App open source pour maintenir un miroir privé de forks publics. Une version bêta est prévue cette semaine
  • La véritable vulnérabilité vient de la manière dont l’archive GitHub Events expose les hachages SHA1 des dépôts vulnérables. En recherchant dans tout le réseau, il est possible d’accéder à des dépôts privés supprimés
  • Le problème vient de la manière dont des données privées peuvent dépendre de données publiques. Par exemple, si un commit privé dépend d’un commit public C et que C est supprimé du dépôt public, GitHub doit le conserver. Sinon, le commit privé est cassé
  • Tous les commits survivent pour toujours après avoir été envoyés à GitHub, et un commit rendu public une fois reste toujours accessible via son hash de commit