The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

В OpenSSH добавлена защита от атак по сторонним каналам

22.06.2019 05:06

Дэмиен Миллер (djm @) добавил в OpenSSH улучшение, которое должно помочь защитить от различных атак по сторонним каналам, таким как Spectre, Meltdown, RowHammer и RAMBleed. Добавленная защита призвана предотвратить восстановление приватного ключа, находящегося в оперативной памяти, пользуясь утечками данных по сторонним каналам.

Суть защиты в том, что приватные ключи, в моменты, когда они не используются, зашифровываются с помощью симметричного ключа, который получен из относительно большого «предварительного ключа» (prekey), состоящего из случайных данных (в настоящее время его размер - 16 КБ). С точки зрения реализации, приватные ключи шифруются при загрузке в память, а затем автоматически и прозрачно расшифровываются при использовании для подписей или при сохранении/сериализации.

Для успешной атаки злоумышленники должны восстановить весь prekey с высокой точностью, прежде чем они смогут попытаться расшифровать защищённый приватный ключ. Однако нынешнее поколение атак имеет такую частоту ошибок восстановления битов, что совокупность этих ошибок делают корректное восстановление предварительного ключа маловероятным.

  1. Главная ссылка к новости (https://undeadly.org/cgi?actio...)
  2. OpenNews: Релиз OpenSSH 8.0
  3. OpenNews: Выявлен 21 вид вредоносных программ, подменяющих OpenSSH
  4. OpenNews: Семь новых атак на механизм спекулятивного выполнения в CPU
  5. OpenNews: Атака по определению состояния памяти процессов при помощи страничного кэша
  6. OpenNews: Представлен новый класс уязвимостей в процессорах Intel
Автор новости: Дон Ягон
Тип: Обобщение
Ключевые слова: ssh, openbsd
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (12) Ajax | 1 уровень | Линейный | Раскрыть всё | RSS
  • 1.1, Аноним (-), 09:09, 22/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –9 +/
    ...и создали новый класс уязвимостей...
     
     
  • 2.2, Аноним (2), 09:49, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ваше второе имя Капитан Очевидность? ;)
     

  • 1.3, Fedd (ok), 11:20, 22/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Там и без шифрования восстановить маловероятно
     
  • 1.4, Анонм (?), 14:20, 22/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Надо еще по cron'у пинать сигналом на перешифрование новым ключом с частотой выше, чем можно вычитать
     
     
  • 2.5, pda (?), 15:39, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Перешифровывать не обязательно, некоторые алгоритмы обладают частичной гомоморфностью. По идее можно покумекать и как-нибудь циклицески домножать (rsa вроде как раз гомоморфен к умножению) ключ и шифротекст на какое-нибудь значение, чтобы синхронно измменять их.

    Надо будет подумать на досуге.

     
     
  • 3.6, Онанимус (?), 22:22, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну как, подумали?
     
     
  • 4.7, pda (?), 00:35, 23/06/2019 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Подумал. И пока выходит что сложные схемы городить вообще нет смысла. Конечно это нарушает заповедь "не изобретать собственную криптографию", но одноразовый шифроблокнот видится мне достаточно простым и надёжным.

    Шаг 1. Надо увеличть размер секретных данных, чтобы осложнить их извлечение по сторонним каналам. Для этого выделяем буфер в скажем 16 кб (размер взять из исходного поста), в конец помещаются секретные данные, а начало заполняется с crng. Теперь блоками равными длине секретных данных мы последовательно ксорим эти блоки, а в конце ксорим сами данные.

    [мусор1][мусор2][мусор2]...[секрет] т.е. в итоге [скрытый секрет] = мусор1 ^ мусор 2 ^ мусор3 ^ ...

    Т.е. мы добились того, что для чтения секретных данных нужно получить весь 16 к блок. На этот моменте не параноики могут и успокоиться. Просто достаточно вспомнить сколько времени потребуется на кражу такого объяма. А ведь можно увеличить длину буфера до 64 кб, мегабайта и т.д.

    Но мы параноики.

    Шаг 2. Выделяем второй буфер той же длины и заполняем его с crng. Затем ксорим с первым буфером и записываем результат в первый. Т.е. теперь перед восстановлением секрета его надо ксорить со вторым буфером.

    Шаг 3. Запускаем фоновый поток, который каждые n секунд будет заполнять третий буфер той же длины с crng и ксорить одновременно и первый и второй. Третий буфер после этого должен очищаться. Из-за свойств xor мы всё ещё будем способны восстановить секрет имея в наличии только два буфера.

    На этом всё. Есть надёжные реализации crng. Одноразовые шифроблокноты доказанно не взламываемые. Вычислительная сложность копеечная (кроме crng). Все операции выполняются за константное время.

    Т.е. от прямой кражи хранит операционка, а любители получить что-то по сторонним каналам - замучаются тут биты глотать... По моему так.

     
     
  • 5.8, Ivan_83 (ok), 03:21, 23/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    НУДНО!

    Берём рандому на хх килобайт, пихаем в KDF, результат используем для шифрования и расшифрования секретного ключа в памяти.
    При этом после каждого расшифрования можно легко генерить новый одноразовый ключ на хх кб и им шифровать секретный.

    Твоя схема с ксором - очень плоха, вот почему:
    атакующим может не спеша вычитывать по байту "мусор"[1234n] и потом "скрытый секрет" и получать один байт закрытого ключа.
    Те ему не придётся собирать все 16к или сколько там мусора чтобы узнать хотя бы один байт ключа, в итоге скажем по байту в день/неделю ключ будет прочитан.

     
     
  • 6.9, pda (?), 15:44, 23/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > атакующим может не спеша вычитывать по байту "мусор"[1234n] и потом "скрытый секрет" и получать один байт закрытого ключа.

    Как? Ведь его содержимое постоянно меняется? И после каждого изменения то, что было прочитано раньше теряет смысл.

    > При этом после каждого расшифрования можно легко генерить новый одноразовый ключ на хх кб и им шифровать секретный.

    Фишка-то как раз в том, что расшифровывание может быть процедурой редкой.

     
     
  • 7.10, pda (?), 17:31, 23/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Впрочем, это была всего лишь быстрая идея, так чтобы сделать секретную информацию зависимой от всего первого буфера. Вместо xor можно использовать какой-нибудь легковесный шифр, типа speck (или aes, если аппаратное ускорение доступно), чтобы блок n-1 становился ключём для блока n, а результат - ключём для блока n+1.
     
  • 7.11, Ivan_83 (ok), 02:44, 27/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ещё раз: в твоей схеме достаточно читать по одному байту из каждого блока и один байт из закрытого ключа чтобы восстановить один байт закрытого ключа.
    Это как в вин98 xintruder пароль ломал на сетевую шару: венда ему сообщала сколько символов пароля введено правильно, в итоге время подбора пароля падало до смешних значений.
    Не нужны никакие шифры, есть kdf для этого, вот только для этого. И легковестность всем побоку, впрочем нынче тот же sha1, sha2-256 уже аппаратный в райзенах, а aes-ni и вообще много где.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру