Basic Github Information

从零到英雄学习 AWS 黑客技术 htARTE (HackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

基本结构

一个大型公司的基本 github 环境结构是拥有一个企业,该企业拥有几个组织,每个组织可能包含几个仓库几个团队。较小的公司可能只拥有一个组织而没有企业

从用户的角度看,一个用户可以是不同企业和组织的成员。在这些组织中,用户可能有不同的企业、组织和仓库角色

此外,用户可能是不同团队的一部分,拥有不同的企业、组织或仓库角色。

最后,仓库可能有特殊的保护机制

权限

企业角色

  • 企业拥有者:拥有此角色的人可以管理管理员,管理企业内的组织,管理企业设置,跨组织执行政策。然而,他们无法访问组织设置或内容,除非他们被任命为组织拥有者或直接访问组织拥有的仓库

  • 企业成员:您企业拥有的组织的成员也自动成为企业的成员

组织角色

在一个组织中,用户可以有不同的角色:

  • 组织拥有者:组织拥有者对您的组织拥有完全的管理访问权限。这个角色应该是有限的,但在您的组织中不应少于两个人。

  • 组织成员:组织中人员的默认,非管理角色是组织成员。默认情况下,组织成员拥有许多权限

  • 账单管理员:账单管理员是可以管理您组织的账单设置的用户,例如支付信息。

  • 安全经理:它是组织拥有者可以分配给组织中任何团队的角色。应用后,它赋予团队中每个成员权限来管理您组织的安全警报和设置,以及对组织中所有仓库的读取权限

  • 如果您的组织有一个安全团队,您可以使用安全经理角色给予团队成员他们需要的最少访问权限。

  • Github 应用管理员:为了允许额外的用户管理组织拥有的 Github 应用,拥有者可以授予他们 Github 应用管理员权限。

  • 外部合作者:外部合作者是一个拥有对一个或多个组织仓库的访问权限但不是组织明确成员的人。

您可以在此表中比较这些角色的权限https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles

成员权限

https://github.com/organizations/<org_name>/settings/member_privileges 您可以看到仅仅因为是组织的一部分而拥有的权限

这里配置的设置将指示组织成员的以下权限:

  • 成为所有组织仓库的管理员、编写者、读者或没有权限。

  • 成员是否可以创建私有、内部或公共仓库。

  • 是否可以复制仓库。

  • 是否可以邀请外部合作者。

  • 是否可以发布公共或私有站点。

  • 管理员对仓库的权限。

  • 成员是否可以创建新团队。

仓库角色

默认情况下创建仓库角色:

  • 读取:推荐给想要查看或讨论您的项目的非代码贡献者

  • 整理:推荐给需要积极管理问题和拉取请求但没有写入权限的贡献者

  • 写入:推荐给积极推送到您项目的贡献者

  • 维护:推荐给需要管理仓库但没有访问敏感或破坏性操作权限的项目经理

  • 管理员:推荐给需要完全访问项目的人,包括敏感和破坏性操作,如管理安全或删除仓库

您可以在此表中比较每个角色的权限 https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role

您也可以在 https://github.com/organizations/<org_name>/settings/roles 创建您自己的角色

团队

您可以在 https://github.com/orgs/<org_name>/teams 列出组织中创建的团队。请注意,要查看其他团队的子团队,您需要访问每个父团队。

用户

可以在 https://github.com/orgs/<org_name>/people 列出组织的用户。

在每个用户的信息中,您可以看到用户是哪些团队的成员,以及用户可以访问哪些仓库

Github 认证

Github 提供了不同的方式来认证您的账户并代表您执行操作。

网页访问

访问 github.com,您可以使用您的用户名和密码(可能还有两因素认证)登录。

SSH 密钥

您可以为您的账户配置一个或多个公钥,允许关联的私钥代表您执行操作。 https://github.com/settings/keys

GPG 密钥

不能用这些密钥冒充用户,但如果您不使用它,可能会因为发送未签名的提交被发现。了解更多关于警戒模式的信息

个人访问令牌

您可以生成个人访问令牌来授权应用程序访问您的账户。创建个人访问令牌时,用户需要指定令牌将拥有的权限https://github.com/settings/tokens

Oauth 应用程序

Oauth 应用程序可能会请求权限访问您的 GitHub 信息或冒充您执行某些操作。一个常见的例子是您可能在一些平台上找到的使用 GitHub 登录按钮

一些安全建议

  • OAuth 应用程序应始终作为经过身份验证的 GitHub 用户在 GitHub 的所有地方行动(例如,提供用户通知),并且只能访问指定的范围。

  • OAuth 应用程序可以通过启用“使用 GitHub 登录”作为身份提供者。

  • 不要构建OAuth 应用程序,如果您希望您的应用程序仅在单个仓库上行动。使用 repo OAuth 范围,OAuth 应用程序可以对所有经过身份验证用户的仓库行动

  • 不要构建 OAuth 应用程序作为您的团队或公司的应用程序。OAuth 应用程序作为单个用户进行身份验证,因此如果一个人为公司创建了一个 OAuth 应用程序,然后他们离开了公司,其他人将无法访问它。

  • 更多信息在这里

Github 应用程序

Github 应用程序可以请求权限访问您的 Github 信息或冒充您,以对特定资源执行特定操作。在 Github 应用程序中,您需要指定应用程序将有权访问的仓库。

一些安全建议:

  • GitHub 应用程序应该独立于用户采取行动(除非应用程序使用用户到服务器令牌)。为了使用户到服务器访问令牌更安全,您可以使用将在 8 小时后过期的访问令牌,以及可以交换新访问令牌的刷新令牌。更多信息,请参阅“刷新用户到服务器访问令牌。”

  • 确保 GitHub 应用程序与特定仓库集成。

  • GitHub 应用程序应该连接到个人账户或组织

  • 不要期望 GitHub 应用程序知道并做用户可以做的一切。

  • 如果您只需要“使用 GitHub 登录”服务,不要使用 GitHub 应用程序。但是,GitHub 应用程序可以使用用户识别流程来登录用户_并_做其他事情。

  • 如果您_只是_想作为 GitHub 用户行动并做用户可以做的一切,不要构建 GitHub 应用程序。

  • 如果您要将应用程序与 GitHub Actions 一起使用,并希望修改工作流文件,则必须代表用户使用包含 workflow 范围的 OAuth 令牌进行身份验证。用户必须对包含工作流文件的仓库拥有管理员或写权限。更多信息,请参阅“了解 OAuth 应用程序的范围。”

  • 更多信息在这里

Github Actions

不是一种在 github 上进行身份验证的方式,但是恶意的 Github Action 可能会获得未经授权的访问 github,并且根据赋予 Action 的权限,可能会进行多种不同的攻击。更多信息请见下文。

Git Actions

Git actions 允许在发生事件时自动化执行代码。通常执行的代码与仓库的代码有关(可能是构建一个 docker 容器或检查 PR 是否包含秘密)。

配置

https://github.com/organizations/<org_name>/settings/actions 可以检查组织的GitHub Actions 配置

可以完全禁止使用 GitHub Actions,允许所有 GitHub Actions,或者只允许某些 Actions。

还可以配置谁需要批准才能运行 GitHub Action以及运行时 GitHub Action 的 GITHUB_TOKEN权限

Git Secrets

GitHub Action 通常需要一些秘密来与 GitHub 或第三方应用程序交互。为了避免在仓库中明文放置,GitHub 允许将它们设置为Secrets

这些秘密可以为仓库或整个组织配置。然后,为了让 Action 能够访问秘密,你需要声明它,像这样:

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 }}

使用 Bash 示例

steps:
- shell: bash
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "$SUPER_SECRET"

密钥只能从声明了它们的 Github Actions 中访问

一旦在仓库或组织中配置,github 的用户将无法再次访问它们,他们只能更改它们

因此,窃取 github 密钥的唯一方法是能够访问执行 Github Action 的机器(在该场景中,您将只能访问为 Action 声明的密钥)。

Git 环境

Github 允许创建环境,您可以在其中保存密钥。然后,您可以使用类似以下方式授予 github action 访问环境中的密钥:

jobs:
deployment:
runs-on: ubuntu-latest
environment: env_name
您可以配置环境以被**所有分支**(默认)、**仅受保护**分支访问或**指定**哪些分支可以访问它。
它还可以设置在使用**环境**执行**操作**之前所需的**审查数量**,或在允许部署继续之前**等待**一段**时间**

### Git Action Runner

Github Action 可以在**github 环境内执行**,也可以在用户配置的**第三方基础设施**中执行。

许多组织会允许在**第三方基础设施**中运行 Github Actions,因为这通常会更**便宜**

您可以在 _https://github.com/organizations/\<org\_name>/settings/actions/runners_ 列出组织的自托管运行器

找出哪些**Github Actions 在非 github 基础设施中执行**的方法是在 Github Action 配置 yaml 中搜索 `runs-on: self-hosted`

**不可能在不同组织的自托管盒子内运行组织的 Github Action**,因为配置 Runner 时会生成**唯一的令牌**以知道 Runner 属于哪里。

如果自定义的**Github Runner 配置在 AWS 或 GCP 内的机器上**,例如,Action **可能访问元数据端点****窃取机器正在使用的服务帐户的令牌**

### Git Action Compromise

如果允许所有操作(或恶意操作),用户可以使用**恶意的 Github action**,将**危害**正在执行的**容器**

<div data-gb-custom-block data-tag="hint" data-style='danger'>

恶意 Github Action 运行可能被攻击者**滥用**来:

* **窃取 Action 可访问的所有秘密**
* **横向移动**,如果 Action 在可以访问用于运行机器的 SA 令牌的**第三方基础设施**内执行(可能通过元数据服务)
* **滥用工作流**使用的**令牌****窃取执行 Action 的仓库的代码****甚至修改它**

</div>

## 分支保护

分支保护旨在**不完全控制用户对仓库的控制**。目标是在能够在某些分支内编写代码之前**设置几种保护方法**

可以在 _https://github.com/\<orgname>/\<reponame>/settings/branches_ 找到**仓库的分支保护**

<div data-gb-custom-block data-tag="hint" data-style='info'>

**不可能在组织级别设置分支保护**。因此,所有这些都必须在每个仓库中声明。

</div>

可以对分支应用不同的保护(如 master):

* 您可以**要求在合并前提出 PR**(因此您不能直接在分支上合并代码)。如果选择了这个,可以放置不同的其他保护:
* **要求批准数量**。通常要求 1 或 2 个以上的人批准您的 PR,这样单个用户就不能直接合并代码。
* **推送新提交时解除批准**。如果不这样做,用户可能会批准合法代码,然后用户可能会添加恶意代码并合并它。
* **要求代码所有者审查**。至少需要 1 个代码所有者批准 PR(因此“随机”用户不能批准它)
* **限制谁可以解除拉取请求审查。** 您可以指定允许解除拉取请求审查的人员或团队。
* **允许指定的参与者绕过拉取请求要求**。这些用户将能够绕过以前的限制。
* **要求状态检查在合并前通过。** 在能够合并提交之前,需要通过一些检查(如 github action 检查是否有任何明文秘密)。
* **要求在合并前解决对话**。在 PR 可以合并之前,需要解决代码上的所有评论。
* **要求签名提交**。提交需要签名。
* **要求线性历史。** 防止将合并提交推送到匹配的分支。
* **包括管理员**。如果没有设置,管理员可以绕过限制。
* **限制谁可以推送到匹配的分支**。限制谁可以发送 PR。

<div data-gb-custom-block data-tag="hint" data-style='info'>

如您所见,即使您设法获得了某个用户的一些凭据,**仓库可能受到保护,避免您将代码推送到 master**,例如危害 CI/CD 管道。

</div>

## 参考资料

* [https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization](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-enterprise](https://docs.github.com/en/enterprise-server@3.3/admin/user-management/managing-users-in-your-enterprise/roles-in-an-enterprise)[https://docs.github.com/en/enterprise-server](https://docs.github.com/en/enterprise-server@3.3/admin/user-management/managing-users-in-your-enterprise/roles-in-an-enterprise)
* [https://docs.github.com/en/get-started/learning-about-github/access-permissions-on-github](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/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/security-guides/encrypted-secrets)

<details>

<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> 从零开始学习 AWS 黑客攻击!</strong></summary>

支持 HackTricks 的其他方式:

* 如果您想在 HackTricks 中看到您的**公司广告****下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。

</details>

Last updated