Использование цифровых подписей для проверки целостности бинарных файлов в Linux
Введение

В мире, где данные могут быть перехвачены или изменены, уверенность в подлинности полученных файлов первостепенна. Например, если Пользователь А отправляет бинарный файл Пользователю Б по email, как Б может быть уверен, что файл не был подделан? Цифровые подписи (ЦП) дают надёжное решение, привязывая данные к уникальным учётным данным отправителя.
- Подпись должна быть получена из подписываемого сообщения.
- Она должна включать уникальную информацию отправителя.
- Создание должно быть простым.
- Должно быть вычислительно неосуществимо подделать.
- Размер подписи должен оставаться небольшим.
Эта статья демонстрирует практическую реализацию ЦП для проверки целостности 64-битных ELF-бинарников в Linux. Подход использует схему прямой подписи (без третьего पक्षного арбитра) и опирается на приватный ключ для подписания и публичный сертификат для верификации.
Пример реализации ЦП
Реализация подписи включает следующие шаги:
- Генерация MD5-хеша исходного бинарника.
- Создание приватного ключа и самоподписанного публичного сертификата.
- Подписание бинарника:
- Шифрование MD5-хеша приватным ключом.
- Хранение зашифрованного хеша в новой секции
.sigELF-файла. - Сохранение сертификата в
~/.sshдля последующей верификации.
Весь процесс можно автоматизировать скриптом с использованием openssl, objcopy и md5sum. Ниже пример скрипта sign_elf.sh, автоматизирующего подписание ELF-бинарников. (Исходный код без номеров строк приведён в конце статьи.)
#!/bin/bash
KEY_DIR="$HOME/.ssh"
PRIVATE_KEY="$KEY_DIR/priv.key"
CERTIFICATE="$KEY_DIR/pub.crt"
SUBJECT="/C=RU/ST=Nizhni Novgorod/L=Nizhniy Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com"
if [ "$#" = "0" ]; then
echo "Usage: sign_elfs.sh [ELF files]"
exit 1
fi
[ ! -d "$KEY_DIR" ] && mkdir "$KEY_DIR"
# Генерация приватного ключа и сертификата
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"
for ELF_BIN in "$@"; do
ELF_BASE_NAME="${ELF_BIN##*/}"
ELF_BIN_SIGNATURE="$ELF_BASE_NAME.sha256"
ELF_BIN_MD5="$ELF_BASE_NAME.md5"
if [ ! -f "$ELF_BIN" ]; then
echo "Error: no such file $ELF_BIN"
exit 103
fi
# Удаление существующей секции .sig
objcopy --remove-section=.sig "$ELF_BIN"
# Добавление 512-байтовой нулевой секции .sig
rm -f dummy.txt
touch dummy.txt
truncate --size=512 dummy.txt
objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload,readonly "$ELF_BIN"
# Вычисление MD5-хеша бинарника (с секцией .sig)
md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5"
# Подписание MD5-хеша приватным ключом
openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
# Верификация подписи сразу (опционально)
openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
# Встраивание зашифрованного хеша в секцию .sig
objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN"
# Отображение содержимого секции .sig для инспекции
objdump -sj .sig "$ELF_BIN"
done
rm -f dummy.txt
ls -ls ~/.ssh

Рисунок 1. Процесс подписания ELF-бинарника. (Источник: Auriga)
Детальный разбор скрипта
Строка 19 — Генерация сертификата
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"
reqсоздаёт запрос на подпись сертификата.-nodesвыдаёт приватный ключ в открытом виде.-x509выдаёт самоподписанный сертификат.-sha256выбирает SHA-256 для хеширования.-newkey rsa:4096генерирует 4096-битный RSA ключ.- Поле
SUBJECTследует формату RFC 5280, например/C=RU/ST=…/CN=….
После этого шага ~/.ssh/priv.key хранит приватный ключ, а ~/.ssh/pub.crt — сертификат. Приватный ключ шифрует данные; сертификат содержит публичный ключ для верификации.
Цикл по ELF-файлам (Строка 21)
Каждый бинарник, указанный в командной строке, обрабатывается последовательно. Скрипт гарантирует, что любая предварительная секция .sig удалена перед повторным подписанием.
Управление секциями (Строки 33–40)
- Существующая секция
.sigудаляется сobjcopy --remove-section=.sig. - Создаётся 512-байтовый плейсхолдер и добавляется как read-only, non-loadable секция
.sig.
Вычисление хеша (Строка 42)
md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5"
MD5 вычисляется над бинарником, включая плейсхолдер секцию .sig, и сохраняется в binary_name.md5.
Подписание хеша (Строка 45)
openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
MD5-хеш шифруется приватным ключом, производя файл подписи (например, binary_name.sha256).
Верификация (опционально) (Строка 48)
openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
Этот шаг подтверждает, что подпись соответствует хешу, используя публичный ключ из сертификата.
Встраивание подписи (Строка 52)
objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN"
Зашифрованный хеш заменяет плейсхолдер, завершая подписанный ELF-бинарник.
Запуск скрипта на наборе ELF-файлов даст подписанные бинарники, которые можно безопасно распространять. Получатель может проверить целостность, извлекая секцию .sig, дешифруя её публичным сертификатом и сравнивая полученный хеш со свежевычисленным хешем полученного файла.
Интернет вещей
- Драйвинг IoT синергий: как Connectivity CoC Bosch формирует коннектед будущее
- Подготовка производственных операций к ИИ с помощью IoT
- Цифровые двойники: раскрытие интеллектуального Edge IoT в производстве — Часть 2
- Предиктивное обслуживание: использование Индустрии 4.0 для бесперебойного производства
- Готово ли ваше производство к IoT? Практическое руководство
- Цифровое страхование: 5 трендов, революционизирующих покупку и управление полисом
- Western Digital запускает надежное 64-слойное 3D NAND хранилище для Промышленного ИоТ и Edge Computing
- Western Digital запускает надежное 64-слойное 3D NAND хранилище для Промышленного ИоТ
- Почему облачные вычисления необходимы для хранения IoT-данных
- Использование Индустрии 4.0: проверенные стратегии построения цифровой дорожной карты