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‑стек действительно защищённым.