ElBlo
Persistir acceso a repositorios privados de Github
En el 2019 encontré un bug en GitHub que te permitía acceder a repositorios privados después de que te sacaran los accesos, pudiendo ver nuevos commits. Lo reporté mediante Hacker One y no me dieron bola.
Cuando estaba mirando forks de u-boot, aprendí de casualidad que los forks de GitHub en realidad pertenecían todos a un mismo mega repositorio, y que era posible referenciar los commits de un fork en el repositorio principal, y viceversa.
Por ejemplo, si el usuario Bob hace un fork del repositorio P
creado por
Alice, y luego Alice crea un commit con hash X
, Bob puede acceder a ese
commit mediante la URL: https://github.com/Bob/P/tree/X
.
En el caso de un repositorio público, esto no es mucho problema, ya que los datos son públicos y Bob podía acceder al repositorio de todas maneras.
Lo que es más interesante es que esto también vale para repositorios privados.
Suponiendo entonces que Alice tiene un repositorio privado P
, y le da acceso
a Bob a este repositorio, Bob podría hacer un fork de ese repositorio, y ver
los commits que Alice hace usando la url https://github.com/Bob/P/tree/X
donde X
es un prefijo del hash. Hasta acá todo normal, total Bob sigue
teniendo acceso al repositorio.
¿Qué pasa si Alice decide sacar a Bob del proyecto? Alice puede simplemente sacarle los permisos. En ese caso, si Bob tenía un fork del proyecto hecho, GitHub se lo va a borrar.
Problema resuelto, ¿no? Bueno, casi. Resulta que Bob puede crear una organización y clonar el repositorio en esta organización. En este caso, cuando Alice le quita los permisos a Bob, el fork del repositorio que está en la organización no se borra, permitiéndole a Bob acceder a los nuevos commits mediante prefijos de su hash.
Un problema un poco menor es el inverso. Si Bob forkea el repositorio de Alice y le saca el acceso, por ejemplo, hasta tanto ella no pague. Alice puede ver los commits que Bob realiza usando la misma técnica. En este caso el problema no es tan grave porque se considera que el repositorio sigue siendo de Alice.
Formas de encontrar prefijos de hashes de commits en GitHub no es tan difícil. Por ejemplo, podes crear un issue o comentario en tu fork que tenga cientos de prefijos de alguna longitud particular (5 caracteres por ejemplo), y la interfaz web se va a encargar de linkearlos por vos si es que existen.
La gente de GitHub me dio el visto y bueno en su momento para hacer público el bug, ya que para ellos no era un problema. Acá está el post en reddit, que enlaza a un gist de github con más detalles.
Después me enteré que hubieron otros bugs mucho más importantes relacionados a los forks de github.