# libcap

Библиотека для работы с возможностями (capabilities) Linux, которая предоставляет интерфейс для управления привилегиями процессов на уровне ядра. Библиотека позволяет работать с механизмом capabilities, который разделяет привилегии суперпользователя на отдельные права, обеспечивая более тонкий контроль безопасности и реализуя принцип наименьших привилегий.

## Особенности

- предоставляет API для работы с Linux capabilities;
- позволяет получать, устанавливать и изменять capabilities процессов и файлов;
- поддерживает как POSIX.1e (устаревший), так и современный Linux-специфичный API;
- включает утилиты командной строки для управления capabilities.

## Основные компоненты

libcap состоит из библиотеки времени выполнения и набора утилит командной строки для работы с capabilities (подробнее с документацией можно ознакомиться [здесь](https://sites.google.com/site/fullycapable/)).

### Управление capabilities процессов

Библиотека предоставляет функции для получения и установки capabilities текущего процесса или других процессов. Это позволяет программам запрашивать только необходимые привилегии вместо работы с полными правами root.

Основные функции для работы с процессами:

- `cap_get_proc()` — получение текущих capabilities процесса;
- `cap_set_proc()` — установка capabilities для текущего процесса;
- `cap_get_pid()` — получение capabilities указанного процесса (требует прав);
- `cap_set_flag()`, `cap_clear()` — манипуляции с наборами capabilities (effective, inheritable, permitted).

### Работа с файловыми capabilities

Начиная с ядра Linux 2.6.24, исполняемые файлы могут иметь связанные capabilities, которые наследуются процессом при запуске. Libcap позволяет читать и устанавливать эти файловые capabilities.

Функции для работы с файловыми capabilities:

- `cap_get_file()` — чтение capabilities файла;
- `cap_set_file()` — установка capabilities файла (требует CAP_SETFCAP);
- `cap_from_text()`, `cap_to_text()` — преобразование между текстовым представлением и внутренним форматом;
- Поддержка extended attributes (xattrs) для хранения capabilities файлов.

### Наборы capabilities и их состояния

Linux разделяет capabilities на три набора: эффективные (effective), разрешенные (permitted) и наследуемые (inheritable). Libcap предоставляет полный набор функций для работы с каждым из этих наборов.

Функции для работы с наборами capabilities:

- `cap_init()` — создание пустого набора capabilities;
- `cap_dup()` — дублирование набора capabilities;
- `cap_clear()` — очистка набора (все capabilities становятся выключенными);
- `cap_set_flag()` — установка или сброс конкретной capability в наборе;
- `cap_get_flag()` — проверка состояния конкретной capability в наборе;
- `cap_fill()` — заполнение набора всеми возможными capabilities.

### Текстовое представление и парсинг

Libcap поддерживает текстовое представление capabilities, что удобно для конфигурации, логирования и отладки. Библиотека предоставляет функции для преобразования между внутренним представлением и читаемым текстовым форматом.

Функции преобразования:

- `cap_from_text()` — преобразование строки в набор capabilities;
- `cap_to_text()` — преобразование набора capabilities в строку;
- `cap_from_name()`, `cap_to_name()` — преобразование между именем capability и ее числовым значением;
- Поддержка компактного и подробного текстового формата.

### Управление bounding set

Bounding set — это набор capabilities, которые могут быть получены процессом. Libcap предоставляет функции для работы с bounding set, что позволяет дополнительно ограничивать доступные процессу capabilities.

Функции для bounding set:

- `cap_get_bound()` — получение текущего bounding set;
- `cap_drop_bound()` — удаление capability из bounding set;
- Работа с bounding set через файловую систему /proc.

### Securebits и флаги наследования

Libcap поддерживает работу с securebits — флагами, которые управляют поведением наследования capabilities. Эти флаги позволяют тонко настраивать, как capabilities передаются между процессами.

Функции для securebits:

- `cap_get_secbits()` — получение текущих securebits;
- `cap_set_secbits()` — установка securebits;
- Управление флагами наследования (SECBIT_KEEP_CAPS, SECBIT_NO_SETUID_FIXUP и др.).
