Что такое vesta?
Vesta – это статический анализ уязвимостей, инструментарий для обнаружения конфигурации кластеров Docker и Kubernetes.
Он проверяет в Kubernetes и Docker конфигурации кластерных подов и контейнеров на соответствие безопасным практикам.
Он также анализирует компоненты образа или контейнера с помощью дополнительного модуля python и сканирования node npm.
Кроме того, это гибкий и быстрый инструментарий, который может работать на физических машинах в различных типах систем (Windows, Linux, macOS).
Vesta доступна по адресу https://github.com/kvesta/vesta.
Vesta обладает следующими возможностями:
- Сканирование уязвимостей в контейнере или образе, vesta сканирует образ через чтение файла, таким образом, она может обнаружить определенные компоненты, такие как node npm, grafana и т.д.
- Анализ опасных конфигураций кластеров Docker и Kubernetes. Отсылки для анализа берутся с ведущих конференций по кибербезопасности, таких как BlackHat, Defcon, KubeCon и др.
Vesta может быть запущена локально с помощью команды go build .
Для статического анализа vesta может анализировать контейнер и образ через sha или tar файл.
Например, используя Vulnhub Django.
Для анализа конфигураций vesta поддерживает следующие элементы.
Docker
| Supported | Check Item | Description | Severity |
|-----------|-----------------------|---------------------------------------------------------------------------------------------|--------------------------|
| ✔ | PrivilegeAllowed | Privileged module is allowed. | critical |
| ✔ | Capabilities | Dangerous capabilities are opening, such as SYS_ADMIN, CAP_SYS_PTRACE etc. | critical |
| ✔ | Volume Mount | Mount dangerous location. | critical |
| ✔ | Docker Unauthorized | 2375 port is opening and unauthorized. | critical |
| ✔ | Kernel version | Kernel version is under the escape version such as Dirty Cow, Dirty Pipe, CVE-2022-0492 etc.| critical |
| ✔ | Network Module | Net Module is `host` and containerd version less than 1.41. | critical |
| ✔ | Docker Server version | Server version is included the vulnerable version such as CVE-2019-5736 etc. | critical/high/medium/low |
| ✔ | Image tag check | Image is not tagged or `latest`. | low |
| Pending | docker-compose | Some dangerous configuration. | - |
| Pending | Container env | Check Unauthorized database and weak password, such as `MySQL`, `Redis`, `Memcache` etc. | - |
Kubernetes
| Supported | Check Item | Description | Severity |
|-----------|---------------------------------------------------------|-----------------------------------------------------------------|--------------------------|
| ✔ | PrivilegeAllowed | Privileged module is allowed. | critical |
| ✔ | Capabilities | Dangerous capabilities are opening. | critical |
| ✔ | PV and PVC | PV is mounted the dangerous location and is actived. | critical/medium |
| ✔ | ClusterRoleBinding | Permissions with default server account. | high/medium |
| ✔ | Kubernetes-dashborad | Checking `-enable-skip-login` and account permission. | critical/high/low |
| ✔ | Kernel version (k8s versions is less than v1.24) | Kernel version is under the escape version. | critical |
| ✔ | Docker Server version (k8s versions is less than v1.24) | Server version is included the vulnerable version. | critical/high/medium/low |
| ✔ | Kubernetes certification expiration | Certification is expired after 30 days. | medium |
| ✔ | ConfigMap and Secret check | Check weak password in ConfigMap or Secret. | high/medium |
| ✔ | Auto Mount ServiceAccount Token | Mounting `/var/run/secrets/kubernetes.io/serviceaccount/token`. | low |
| ✔ | NoResourceLimits | No resource limits are set. | low |
| ✔ | Job and Cronjob | No seccomp or seLinux are set in Job or CronJob. | low |
| ✔ | Envoy admin | Envoy admin is opening and listen to `0.0.0.0`. | high/medium |
| Pending | CVE-2022-29179 | CVE-2022-29179 with cilium installed | critical |
| Pending | Kubelet 10255 and Kubectl proxy | 10255 port is opening or Kubectl proxy is opening. | - |
| Pending | Trampoline attack | RBAC is vulnerable to Trampoline attack. | - |
| Pending | IaC scan | IaC scan | - |
Учитывая, что Docker-Desktop использует виртуальную машину в качестве основного движка docker, vesta получает версию ядра через запуск контейнера и чтение содержимого файла/proc/version, а не напрямую с хост-машины.
Теперь используем команду analyze от vesta.
Анализ Vesta
Согласно анализу конфигураций кластера Kubernetes, vesta собрала распространенные опасные конфигурации, созданные разработчиками, и продвинутые проникновения в k8s, такие как неавторизованный дашборд k8s с ролью кластера с высокими правами, cilium с CVE-2022-29719, Trampoline pods и т. д.
Пример анализа Kubernetes приведен ниже.
$ ./vesta analyze k8s
2022/12/08 00:38:13 Start analysing
2022/12/08 00:38:13 Geting docker server version
2022/12/08 00:38:13 Geting kernel version
Detected 6 vulnerabilities
Pods:
+----+--------------------+------------------------------+-------------------+-----------------------+----------+--------------------------------+
| ID | POD DETAIL | PARAM | VALUE | TYPE | SEVERITY | DESCRIPTION |
+----+--------------------+------------------------------+-------------------+-----------------------+----------+--------------------------------+
| 1 | Name: vulntest | test-volume | /etc | Directory | critical | Mounting '/etc' is suffer |
| | Namespace: default | | | | | vulnerable of container |
| | | | | | | escape. |
+ + +------------------------------+-------------------+-----------------------+----------+--------------------------------+
| | | Privileged | true | Pod | critical | There has a potential |
| | | | | | | container escape in privileged |
| | | | | | | module. |
+ + +------------------------------+-------------------+-----------------------+----------+--------------------------------+
| | | AllowPrivilegeEscalation | true | Pod | critical | There has a potential |
| | | | | | | container escape in privileged |
| | | | | | | module. |
+ + +------------------------------+-------------------+-----------------------+----------+--------------------------------+
| | | Resource | memory, cpu, | Pod | low | None of resources is be |
| | | | ephemeral-storage | | | limited. |
+----+--------------------+------------------------------+-------------------+-----------------------+----------+--------------------------------+
| 2 | Name: vulntest2 | capabilities | CAP_SYS_ADMIN | capabilities.add | critical | There has a potential |
| | Namespace: default | | | | | container escape in privileged |
| | | | | | | module. |
+ + +------------------------------+-------------------+-----------------------+----------+--------------------------------+
| | | automountServiceAccountToken | true | kube-api-access-rnps6 | low | Mount service account has |
| | | | | | | a potential sensitive data |
| | | | | | | leakage. |
+ + +------------------------------+-------------------+-----------------------+----------+--------------------------------+
| | | Resource | cpu | Pod | low | CPU usage is not limited. |
| | | | | | | |
+----+--------------------+------------------------------+-------------------+-----------------------+----------+--------------------------------+
Configures:
+----+-----------------------------+--------------------------------+--------------------------------------------------------+----------+--------------------------------+
| ID | TYPEL | PARAM | VALUE | SEVERITY | DESCRIPTION |
+----+-----------------------------+--------------------------------+--------------------------------------------------------+----------+--------------------------------+
| 1 | K8s version less than v1.24 | kernel version | 5.10.104-linuxkit | critical | Kernel version is suffering |
| | | | | | the CVE-2022-0185 with |
| | | | | | CAP_SYS_ADMIN vulnerablility, |
| | | | | | has a potential container |
| | | | | | escape. |
+----+-----------------------------+--------------------------------+--------------------------------------------------------+----------+--------------------------------+
| 2 | ConfigMap | ConfigMap Name: vulnconfig | db.string:mysql+pymysql://dbapp:Password123@db:3306/db | high | ConfigMap has found weak |
| | | Namespace: default | | | password: 'Password123'. |
+----+-----------------------------+--------------------------------+--------------------------------------------------------+----------+--------------------------------+
| 3 | Secret | Secret Name: vulnsecret-auth | password:Password123 | high | Secret has found weak |
| | | Namespace: default | | | password: 'Password123'. |
+----+-----------------------------+--------------------------------+--------------------------------------------------------+----------+--------------------------------+
| 4 | ClusterRoleBinding | binding name: | verbs: | high | Key permission are given to |
| | | vuln-clusterrolebinding | | get,watch,list,create,update | | | the default service account |
| | | rolename: vuln-clusterrole | | resources: pods,services | | which will cause a potential |
| | | namespace: default | | | container escape. |
+----+-----------------------------+--------------------------------+--------------------------------------------------------+----------+--------------------------------+
см. также:
- ☸️ Защита трафика кластера Kubernetes с помощью сетевых политик подов
- ☸️ Как исследовать проблемы контейнеров Kubernetes с помощью “Kubectl Debug”
- ☸️ Как выполнять команды внутри контейнеров и подов Kubernetes
- ☸️ Как мониторить логи Kubernetes подов в режиме реального времени с помощью Stern
- ☸️ Выполняем проверку безопасности манифестов Kubernetes и чартов Helm с помощью Datree
- ☸️ Перехват трафика контейнеров в Kubernetes
- ☸️ Как установить и настроить OWASP ZAP в Kubernetes или Docker
- ☸️ Внедрили Kubernetes? Попробуйте эти 5 инструментов для аудита прав Rbac