
CVE-2022-27499
Это оригинальная демонстрация неожиданной атаки Snapshot, обнаруженной нами. Спасибо Intel за Security Advisory.
Прежде всего, любой желающий запустить демонстрацию должен установить Intel SGX SDK и Occlum (вы можете выбрать использование нашей модифицированной SGX SDK). Мы предоставляем Dockerfile для быстрой установки Occlum/SDK. Модифицированная SGX SDK помогает злоумышленнику определить время.
Вы также можете установить Occlum на хост-машину. (Пожалуйста, обратитесь к https://github.com/occlum/occlum для получения дополнительных сведений об установке.) В любом случае, вам сначала нужно установить Intel SGX driver на ваш хост или использовать драйвер SGX в ядре.
(sudo) docker build -t $Your_Image_Name .
После сборки образа выполните
(sudo) docker run -it --privileged -p $Redis_Server_Port:6379 -v $Host_SGX_Driver_Path:/dev/sgx --name "snapshot-demo" $Your_Image_Name
Здесь $Redis_Server_Port — это номер порта хоста, который вы хотите открыть для Redis-сервера в контейнере, а $Host_SGX_Driver_Path — это вышеупомянутый путь к устройству вашего установленного драйвера SGX.
Целевая программа находится в папке bash_redis.
Программа-жертва выполняет bash-скрипт (occlum_bash.sh). Сначала она получает заданный пароль для создания настраиваемого конфигурационного файла Redis с заполненным полем "requirepass". Затем она запускает Redis-сервер в соответствии с настраиваемым конфигурационным файлом.
Для сборки программы генерации конфигурации выполните make. Для сборки Redis-сервера выполните следующие команды.
cd bash_redis
./download_and_build_redis_glibc.sh
Откройте терминал для жертвы. Запустите run_redis.sh, проверяя, работает ли Redis-сервер корректно.
Используйте команду redis-cli -h $Redis_Server_IP -p $Redis_Server_Port -a admin123456, чтобы проверить, установлен ли пароль (admin123456) в конфигурационном файле.
Нажмите ctrl + C, чтобы завершить работу Redis-сервера.
Подготовьте 2 терминала: один для жертвы, другой для злоумышленника. Вы можете открыть только один дополнительный терминал (для злоумышленника), если один терминал уже открыт для жертвы.
Снова запустите run_redis.sh в терминале жертвы. Этот скрипт запустит целевую программу.
Злоумышленнику нужно сделать снимок (с помощью ./take_snapshot_step-1.sh), когда он сможет определить, что снимок сбрасывается. В демонстрации злоумышленник получает четкое уведомление из терминала жертвы следующим образом:
...
Run ./take_snapshot_step-1.sh NOW!
line 4522: # passwords, then flags, or key patterns. However note that the additive
line 4523: # and subtractive rules will CHANGE MEANING depending on the ordering.
line 4524: # For instance see the following example:
...
Запустите скрипт ./take_snapshot_step-1.sh в терминале злоумышленника.
Если вы собрали Occlum с нашей модифицированной SGX SDK, вы увидите больше подсказок. Это связано с тем, что мы модифицировали ненадежную часть Intel SGX SDK, выводя вспомогательные сообщения, чтобы облегчить злоумышленнику определение времени. Для удобства злоумышленника мы зарезервировали временные слоты, чтобы позволить ему запустить ./take_snapshot_step-1.sh. На самом деле злоумышленник, имеющий привилегии root на хосте, может перехватить выполнение анклава и захватить любые снимки, модифицировав ненадежную часть SGX SDK.
Как только Redis-сервер запущен и работает, выполните ./take_snapshot_step-2.sh, чтобы завершить сбор снимков.
Злоумышленник выполняет replay_redis.sh, чтобы воспроизвести анклав с использованием собранного снимка. Любой клиент может войти на Redis-сервер без аутентификации.
Пример команды для Redis-клиента:
redis-cli -h $Redis_Server_IP -p $Redis_Server_Port
keys *
Если появится сообщение (error) NOAUTH Authentication required., это означает, что для доступа к Redis-серверу потребуется пароль. Введите auth $Your_Password, чтобы пройти аутентификацию. В этой демонстрации используйте auth admin123456.
Если появится сообщение (empty array), это означает, что для доступа к Redis-серверу пароль не требуется.
Иногда демонстрация завершается ошибкой из-за проверки целостности Occlum. Вы, вероятно, увидите следующее сообщение.
Replaying ...
~/snapshot-demo/bash_redis_replay/occlum_instance ~/snapshot-demo/bash_redis_replay
In: writing meta-data in write_all_changes_to_disk
In: writing meta-data in write_all_changes_to_disk
Error: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }
[ERROR] occlum-pal: The init process exit with code: 1 (line 59, file src/pal_api.c)
[ERROR] occlum-pal: Failed to run the init process: EINVAL (line 129, file src/pal_api.c)
Просто запустите демонстрацию заново (с этапа записи), и ошибка исчезнет навсегда.
Удачи и веселья!