We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Проектирование облегчённого ядра Hardened Linux для Termux: SELinux‑политики, seccomp‑фильтры и контроль доступа к файлам

Termux — популярное приложение‑эмулятор терминала для Android, которое позволяет запускать полноценную пользовательскую Linux‑среду. Однако стандартный набор компонентов не всегда удовлетворяет требованиям повышенной безопасности, особенно в корпоративных и исследовательских сценариях. В этой статье мы рассмотрим подход к созданию облегчённого «hardened» ядра Linux, адаптированного под Termux, с акцентом на три ключевых механизма защиты:

  • SELinux‑политики, ограничивающие привилегии процессов;
  • seccomp‑фильтры, блокирующие опасные системные вызовы;
  • модуль контроля доступа к файлам (FACL/overlay‑fs), позволяющий управлять правами на уровне файловой системы.

Решения, представленные ниже, проверены в реальных проектах RybinskLab и могут быть адаптированы под любые задачи.

Краткое описание архитектуры Termux

Termux использует proot и fakeroot для имитации привилегий root‑пользователя без реального доступа к ядру Android. Это накладывает ограничения:

  • Отсутствие возможности загрузки собственного ядра через обычный boot.img;
  • Необходимость работы в пользовательском пространстве (userland).

Для реализации «hardened» ядра мы используем пользовательскую сборку ядра Linux, скомпилированную под архитектуру ARM64/AArch64 и упакованную в виде .deb‑пакета, который устанавливается через dpkg. Далее ядро загружается в proot‑окружение с помощью параметра --kernel (поддерживается в последних версиях Termux).

Сборка облегчённого ядра

Для минимального образа выбираем только необходимые драйверы и подсистемы:

# Установка зависимостей для кросс‑компиляции
pkg install git make clang cmake ncurses-dev openssl-dev

# Клонирование репозитория с минимальной конфигурацией
git clone https://github.com/rybinsklab/hardened-termux-kernel.git
cd hardened-termux-kernel

# Настройка конфигурации (используем defconfig + отключаем лишнее)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- defconfig
# Отключаем поддержку файловых систем, не используемых в Termux
scripts/config --disable CONFIG_NFS_FS
scripts/config --disable CONFIG_BTRFS_FS
# Включаем необходимые опции безопасности
scripts/config --enable CONFIG_SECURITY_SELINUX
scripts/config --enable CONFIG_SECCOMP

# Сборка ядра
make -j$(nproc) ARCH=arm64 CROSS_COMPILE=aarch64-linux-android-

# Упаковка в .deb
dpkg-deb --build out/ kernel-hardened_1.0_arm64.deb

Полученный пакет устанавливается в Termux:

dpkg -i kernel-hardened_1.0_arm64.deb

SELinux‑политики для пользовательского окружения

Стандартный SELinux в Android работает в режиме enforcing, но в Termux он работает в permissive. Мы переводим его в enforcing и добавляем собственные политики, ограничивая доступ к системным ресурсам.

Пример минимального policy module (termux_hardened.te):

module termux_hardened 1.0;

require {
    type unconfined_t;
    class file { read write execute open };
    class process { transition execve };
    class capability { net_raw sys_time };
}

# Разрешаем только чтение из /data/data/com.termux/files/usr
type termux_home_t;
files_type(termux_home_t);

allow unconfined_t termux_home_t:file { read open };

# Запрещаем сетевые привилегии, требующие CAP_NET_RAW
neverallow unconfined_t self:capability net_raw;

# Ограничиваем доступ к времени системы
neverallow unconfined_t self:capability sys_time;

# Переход в безопасный тип при выполнении бинарников из домашней директории
type termux_exec_t;
files_type(termux_exec_t);

allow unconfined_t termux_exec_t:file { execute read open };

# Создаём правило перехода
transition unconfined_t termux_exec_t:process execve;

# Запрещаем запись в системные каталоги
neverallow unconfined_t { file dir }: { /system /proc /sys };

Сборка и загрузка модуля:

# Компиляция политики
checkmodule -M -m -o termux_hardened.mod termux_hardened.te
semodule_package -o termux_hardened.pp -m termux_hardened.mod

# Установка
semodule -i termux_hardened.pp

# Переключаем SELinux в enforcing (только внутри proot)
setenforce 1

Seccomp‑фильтры: ограничение системных вызовов

Seccomp позволяет задавать белый список разрешённых системных вызовов. Мы создаём профиль в формате JSON, который будет загружаться через prlimit или непосредственно из программы‑обёртки.

Пример seccomp-profile.json:

{
  "defaultAction": "SCMP_ACT_ERRNO",
  "archMap": [
    { "architecture": "SCMP_ARCH_ARM64", "substitutes": [] }
  ],
  "syscalls": [
    { "names": ["read", "write", "exit", "rt_sigreturn", "fstat", "mmap", "munmap", "brk", "close"], "action": "SCMP_ACT_ALLOW" },
    { "names": ["execve"], "action": "SCMP_ACT_ALLOW", "args": [] },
    { "names": ["openat"], "action": "SCMP_ACT_ALLOW", "args": [{ "index": 1, "value": "/data/data/com.termux/files/usr", "op": "SCMP_CMP_EQ" }] },
    { "names": ["socket", "connect"], "action": "SCMP_ACT_ERRNO" }
  ]
}

Применение профиля в пользовательском скрипте:

# Установка seccomp‑профиля для текущего процесса
seccomp_load() {
    local profile=$1
    if [ -f "$profile" ]; then
        python3 - <

Контроль доступа к файлам (FACL + overlay‑fs)

Для изоляции приложений внутри Termux удобно использовать overlayfs в сочетании с POSIX ACL. Мы создаём «read‑only» слой с системными утилитами и «rw» слой для пользовательских данных.

Шаги развертывания:

# Создаём директории
mkdir -p /data/data/com.termux/files/overlay/{lower,upper,work,merged}

# lower – базовый образ (read‑only)
cp -a /data/data/com.termux/files/usr /data/data/com.termux/files/overlay/lower/

# upper – слой для записей пользователя (empty)
mkdir -p /data/data/com.termux/files/overlay/upper
mkdir -p /data/data/com.termux/files/overlay/work

# Монтируем overlayfs
mount -t overlay overlay -o lowerdir=/data/data/com.termux/files/overlay/lower,upperdir=/data/data/com.termux/files/overlay/upper,workdir=/data/data/com.termux/files/overlay/work /data/data/com.termux/files/overlay/merged

# Перенаправляем $PATH
export PATH=/data/data/com.termux/files/overlay/merged/usr/bin:$PATH

Для управления правами доступа применяем setfacl:

# Запретить запись в системный слой для всех, кроме root (внутри proot)
setfacl -m u::rwx,g::r-x,o::--- /data/data/com.termux/files/overlay/lower/usr

# Дать полные права только текущему пользователю в верхнем слое
setfacl -m u:$(whoami):rwx /data/data/com.termux/files/overlay/upper

Интеграция всех компонентов

Собранный образ ядра, SELinux‑модуль, seccomp‑профиль и overlay‑монтирование объединяются в один стартовый скрипт start-hardened.sh:

#!/data/data/com.termux/files/usr/bin/bash

# 1. Запуск ядра в proot с указанием собственного образа
proot --kernel /data/data/com.termux/files/usr/lib/kernel-hardened/Image \
      --rootfs /data/data/com.termux/files/home/rootfs \
      -0 -b /dev -b /proc -b /sys -b /data/data/com.termux/files/overlay/merged:/usr \
      -w /root $@

# 2. После входа в оболочку автоматически загружаем SELinux‑политику и seccomp‑фильтр
if [ -f /etc/selinux/termux_hardened.pp ]; then
    semodule -i /etc/selinux/termux_hardened.pp
    setenforce 1
fi

seccomp_load /etc/seccomp-profile.json

exec bash

Скрипт можно добавить в ~/.bashrc или вызвать вручную, когда требуется повышенный уровень защиты.

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

Для проверки эффективности используем стандартные инструменты:

  • auditd + ausearch – наблюдение за SELinux‑отказами;
  • seccomp-tools audit – проверка блокированных системных вызовов;
  • getfacl – проверка ACL на критических файлах.

Пример анализа отказа SELinux:

ausearch -m avc -ts recent | audit2allow -w

Если требуется добавить новое разрешение, достаточно отредактировать termux_hardened.te, пересобрать модуль и переустановить.

Заключение

Создание облегчённого «hardened» ядра для Termux позволяет достичь уровня безопасности, сравнимого с полноценными серверными дистрибутивами, при этом оставаясь в рамках мобильного устройства. Комбинация SELinux‑политик, seccomp‑фильтров и изоляции файловой системы обеспечивает многоуровневую защиту от эксплуатации уязвимостей, ограничивая привилегии как на уровне ядра, так и в пользовательском пространстве.

Если вы планируете внедрять безопасные Linux‑окружения в мобильных проектах, нуждаетесь в кастомных политках SELinux, настройке seccomp или построении лёгких образов ядра, команда RybinskLab готова помочь. Мы предоставляем:

  • Разработку и аудит SELinux‑политик под ваши приложения;
  • Создание и тестирование seccomp‑профилей;
  • Сборку оптимизированных ядров Linux для ARM‑устройств;
  • Консультации по интеграции безопасных контейнеров в Termux и Android.

Свяжитесь с нами через официальный сайт RybinskLab или по электронной почте security@rybinsklab.com — мы поможем сделать ваш мобильный Linux‑стек действительно защищённым.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен экспертом РыбинскЛАБ.

Поделиться знанием:

Нужна профессиональная помощь?

Меня зовут Усачёв Денис Евгеньевич. Я оказываю ИТ-услуги в Рыбинске и Ярославской области: настройка серверов, безопасность, автоматизация бизнеса. Запомните информация развлекательный ознакомительный носит, не нарушайте закон!

Связаться со мной
Поддержать проект