stringtranslate.com

/dev/случайный

256-байтовый шестнадцатеричный дамп /dev/urandom

В операционных системах типа Unix / dev/random и /dev/urandom — это специальные файлы , которые служат криптографически безопасными генераторами псевдослучайных чисел (CSPRNG). Они позволяют получить доступ к CSPRNG , который засеян энтропией (значением, обеспечивающим случайность ) из окружающего шума, собранного с драйверов устройств и других источников. [1] /dev/random обычно блокируется , если доступно меньше энтропии , чем запрошено; в последнее время (см. ниже различия между операционными системами) он обычно блокируется при запуске, пока не будет собрано достаточно энтропии, а затем разблокируется навсегда. Устройство /dev/urandom обычно никогда не было блокирующим устройством, даже если зародыш генератора псевдослучайных чисел не был полностью инициализирован энтропией с момента загрузки. Не все операционные системы реализуют одни и те же методы для /dev/random и /dev/urandom .

Этот специальный файл появился в Linux в 1994 году. Он был быстро принят другими Unix-подобными операционными системами. [2]

Линукс

Rngtest тестирование /dev/random пула

Ядро Linux предоставляет отдельные файлы устройств /dev/random и /dev/urandom . Начиная с версии ядра 5.6 2020 года, /dev/random блокируется только тогда, когда CSPRNG не инициализирован. После инициализации /dev/random и /dev/urandom ведут себя одинаково. [3]

В октябре 2016 года, с выпуском ядра Linux версии 4.8, /dev/urandom ядра был переключен на реализацию криптографического генератора псевдослучайных чисел (CPRNG) на основе ChaCha20 [4] , разработанную Теодором Цо на основе хорошо известного потокового шифра Бернштейна ChaCha20 .

Начиная с версии 5.17 ядра Linux, генератор случайных чисел перешел с использования криптографической хэш-функции SHA-1 в сборщике энтропии на BLAKE2s — более новую, быструю и безопасную хэш-функцию. [5]

Оригинальная реализация

Генерация случайных чисел в пространстве ядра была впервые реализована для Linux [2] в 1994 году Теодором Цо . [6] Реализация использовала безопасные хэши вместо шифров , [ необходимо разъяснение ] чтобы избежать ограничений на экспорт криптографии , которые были на момент первоначального проектирования генератора. Реализация также была разработана с предположением, что любой заданный хэш или шифр может в конечном итоге оказаться слабым, и поэтому конструкция устойчива к любым таким слабостям. Быстрое восстановление после компрометации пула не считается требованием, поскольку требования к компрометации пула достаточны для гораздо более простых и прямых атак на несвязанные части операционной системы.

В реализации Цо генератор сохраняет оценку количества бит шума в пуле энтропии . Из этого пула энтропии создаются случайные числа. При чтении устройство /dev/random будет возвращать только случайные байты в пределах предполагаемого количества бит шума в пуле энтропии. Когда пул энтропии пуст, чтение из /dev/random будет блокироваться до тех пор, пока не будет собран дополнительный шум окружающей среды. [7] Цель состоит в том, чтобы служить криптографически безопасным генератором псевдослучайных чисел , предоставляя вывод с максимально возможной энтропией. Это предлагается авторами для использования при генерации криптографических ключей для высокоценной или долгосрочной защиты. [7]

Аналогом /dev/random является /dev/urandom («неограниченный» [8] /неблокируемый случайный источник [7] ), который повторно использует внутренний пул для создания большего количества псевдослучайных битов. Это означает, что вызов не будет блокироваться, но вывод может содержать меньше энтропии, чем соответствующее чтение из /dev/random . Хотя /dev/urandom по-прежнему предназначен как генератор псевдослучайных чисел, подходящий для большинства криптографических целей, авторы соответствующей страницы руководства отмечают, что теоретически может существовать пока неопубликованная атака на алгоритм, используемый /dev/urandom , и что пользователи, обеспокоенные такой атакой, должны использовать /dev/random вместо этого. [7] Однако такая атака вряд ли произойдет, потому что как только пул энтропии станет непредсказуемым, он не будет давать утечку безопасности из-за уменьшенного количества битов. [9]

Также можно записывать в /dev/random . Это позволяет любому пользователю подмешивать случайные данные в пул. Неслучайные данные безвредны, поскольку только привилегированный пользователь может выдать ioctl, необходимый для увеличения оценки энтропии. [ dubiousобсудить ] Текущее количество энтропии и размер пула энтропии ядра Linux, оба измеренные в битах, доступны в /proc/sys/kernel/random/ и могут быть отображены командой и соответственно.cat /proc/sys/kernel/random/entropy_availcat /proc/sys/kernel/random/poolsize

Инъекция энтропии

Gutterman, Pinkas и Reinman в марте 2006 года опубликовали подробный криптографический анализ генератора случайных чисел Linux [10] , в котором описали несколько слабых мест. Возможно, самая серьезная проблема, о которой они сообщают, связана со встроенными или Live CD- системами, такими как маршрутизаторы и бездисковые клиенты , для которых состояние загрузки предсказуемо, а доступный запас энтропии из среды может быть ограничен. Для системы с энергонезависимой памятью они рекомендуют сохранять некоторое состояние из RNG при выключении, чтобы его можно было включить в состояние RNG при следующей перезагрузке. В случае маршрутизатора, для которого сетевой трафик представляет собой основной доступный источник энтропии, они отмечают, что сохранение состояния между перезагрузками «потребует от потенциальных злоумышленников либо прослушивания всего сетевого трафика» с момента первого ввода маршрутизатора в эксплуатацию, либо получения прямого доступа к внутреннему состоянию маршрутизатора. Эта проблема, как они отмечают, особенно критична в случае беспроводного маршрутизатора, сетевой трафик которого может быть перехвачен на расстоянии и который может использовать RNG для генерации ключей для шифрования данных.

Ядро Linux обеспечивает поддержку нескольких аппаратных генераторов случайных чисел , если они установлены. Необработанный вывод такого устройства может быть получен из /dev/hwrng . [11]

С ядром Linux 3.16 и новее [12] само ядро ​​смешивает данные из аппаратных генераторов случайных чисел в /dev/random по скользящей шкале на основе определяемого качества оценки энтропии HWRNG. Это означает, что для выполнения этой работы не требуется демон пользовательского пространства, такой как rngd из rng-tools . С ядром Linux 3.17+ RNG VirtIO был изменен так, чтобы иметь качество по умолчанию, определенное выше 0, [13] и, как таковой, в настоящее время является единственным HWRNG, смешанным в /dev/random по умолчанию.

Энтропийный пул может быть улучшен такими программами, как timer_entropyd , haveged , randomsound и т. д. С помощью rng-tools аппаратные генераторы случайных чисел, такие как Entropy Key и т. д., могут записывать в /dev/random . Программы diehard tests diehard , dieharder и ent могут тестировать эти генераторы случайных чисел. [14] [15] [16] [17]

Критика инъекции энтропии

В январе 2014 года Дэниел Дж. Бернстайн опубликовал критику [18] того, как Linux смешивает различные источники энтропии. Он описывает атаку, в которой один источник энтропии, способный контролировать другие источники энтропии, может изменить свой вывод, чтобы свести на нет случайность других источников энтропии. Рассмотрим функцию ⁠ ⁠, где H — хэш-функция, а x , y и z — источники энтропии, причем z — вывод вредоносного HRNG Z на базе ЦП:

  1. Z генерирует случайное значение r .
  2. Z вычисляет ⁠ ⁠ .
  3. Если выходной сигнал ⁠ ⁠ равен желаемому значению, выведите r как z .
  4. В противном случае повторите, начиная с пункта 1.

Бернстайн подсчитал, что злоумышленнику потребуется повторить 16 раз , чтобы скомпрометировать DSA и ECDSA, сделав первые четыре бита выходного сигнала RNG равными 0. Это возможно, поскольку Linux постоянно обновляет начальное число H вместо использования одного высококачественного начального числа. [18]

Бернстайн также утверждает, что инъекция энтропии бессмысленна после инициализации CSPRNG. [18]

В ядре 5.17 (обратно портированном в ядро ​​5.10.119) Джейсон А. Доненфельд предложил новый дизайн инфраструктуры пула энтропии Linux. Доненфельд сообщил, что старый пул, состоящий из одного 4096-битного LFSR, уязвим для двух атак: (1) злоумышленник может отменить эффект известного ввода; (2) если состояние всего пула утекло, злоумышленник может установить все биты в пуле в ноль. Его новый дизайн, который быстрее и безопаснее, использует хэш-функцию blake2s для смешивания 256-битного пула. [19]

BSD-системы

Операционная система FreeBSD предоставляет ссылку /dev/urandom на /dev/random . Оба блокируются только до тех пор, пока не будут правильно засеяны. PRNG FreeBSD ( Fortuna ) регулярно засеивает и не пытается оценить энтропию. В системе с небольшим объемом сетевой и дисковой активности засеивание выполняется за доли секунды. [20]

DragonFly BSD унаследовал файлы случайных устройств FreeBSD, когда был разветвлен. [21] [ необходим неосновной источник ] [22]

Начиная с OpenBSD 5.1 (1 мая 2012 г.) /dev/random и /dev/arandom используют arc4random , функцию CSPRNG на основе RC4 . Функция была изменена для использования более сильного ChaCha20 с OpenBSD 5.5 (1 мая 2014 г.). Система автоматически использует аппаратные генераторы случайных чисел (например, те, которые предоставляются на некоторых концентраторах Intel PCI), если они доступны, через OpenBSD Cryptographic Framework . [23] [24] /dev/arandom был удален в OpenBSD 6.3 (15 апреля 2018 г.). [25]

Реализация устаревшего API NetBSDarc4random() также была переключена на ChaCha20. [26]

macOS, iOS и другие операционные системы Apple

Все операционные системы Apple перешли на Fortuna как минимум с декабря 2019 года, возможно, и раньше. [27] Он основан на SHA-256 . Используются несколько источников энтропии, таких как безопасный анклавный RNG, джиттер синхронизации фазы загрузки, аппаратное прерывание (предполагаемое время). RDSEED/RDRAND используется на компьютерах Mac на базе Intel, которые его поддерживают. Данные начального значения (энтропии) также сохраняются для последующих перезагрузок.

До этого изменения macOS и iOS использовали 160-битный Yarrow на основе SHA-1 . [28]

Нет никакой разницы между /dev/random и /dev/urandom ; оба ведут себя одинаково. [29] [30]

Другие операционные системы

/dev/random и /dev/urandom также доступны в Solaris, [31] NetBSD, [32] Tru64 UNIX 5.1B, [33] AIX 5.2 [34] и HP-UX 11i v2. [35] Как и в FreeBSD, AIX реализует собственную конструкцию на основе Yarrow, однако AIX использует значительно меньше источников энтропии, чем стандартная реализация /dev/random , и прекращает пополнение пула, когда считает, что он содержит достаточно энтропии. [36]

В Windows NT подобная функциональность предоставляется ksecdd.sys , но чтение специального файла \Device\KsecDD не работает как в UNIX. Документированными методами генерации криптографически случайных байтов являются CryptGenRandom и RtlGenRandom . Windows PowerShell предоставляет доступ к криптографически безопасному генератору псевдослучайных чисел через командлет Get-SecureRandom . [37]

Cygwin на Windows предоставляет реализации как /dev/random, так и /dev/urandom , которые можно использовать в скриптах и ​​программах. [38]

Смотрите также

Ссылки

  1. ^ "random(7) - Страница руководства Linux". 2023-02-10 . Получено 2023-11-24 .
  2. ^ ab Ллойд, Джек (2008-12-09). "О /dev/random в Syllable" . Получено 2019-08-21 .
  3. ^ "/dev/random больше похож на /dev/urandom в Linux 5.6 - Phoronix". www.phoronix.com .
  4. ^ "kernel/git/torvalds/linux.git - Исходное дерево ядра Linux". kernel.org. 2016-07-27 . Получено 2016-11-23 .
  5. ^ "Генератор случайных чисел Linux 5.17 ускоряется, переход с SHA1 на BLAKE2s - Phoronix". www.phoronix.com .
  6. ^ "/dev/random". Everything2 . 2003-06-08. Архивировано из оригинала 2009-11-17 . Получено 2013-07-03 .
  7. ^ abcd random(4) –  Руководство программиста Linux – Специальные файлы
  8. ^ "Реализация /dev/random и /dev/urandom в Linux 1.3.39, функция random_read_unlimited". 1995-11-04 . Получено 2013-11-21 .
  9. ^ Филиппо Вальсорда (29.12.2015). Простая реальность энтропии.
  10. ^ Gutterman, Zvi; Pinkas, Benny; Reinman, Tzachy (2006-03-06). "Анализ генератора случайных чисел Linux" (PDF) . Архивировано (PDF) из оригинала 2008-10-03 . Получено 2013-07-03 .
  11. ^ "Руководство пользователя криптографии". Texas Instruments . 2013-06-04. Архивировано из оригинала 2018-04-16 . Получено 2013-07-03 .
  12. ^ "kernel/git/torvalds/linux.git - Исходное дерево ядра Linux @ be4000bc4644d027c519b6361f5ae3bbfc52c347 "hwrng: создать поток-заполнитель"". Git.kernel.org . Получено 18 октября 2016 г. .
  13. ^ "kernel/git/torvalds/linux.git - Исходное дерево ядра Linux @ 34679ec7a0c45da8161507e1f2e1f72749dfd85c "virtio: rng: добавить коэффициент снижения производительности для использования ядром hwrng"". Git.kernel.org . Получено 18 октября 2016 г. .
  14. ^ "??". Vanheusden.com . Архивировано из оригинала 2013-09-21 . Получено 2016-10-23 .
  15. ^ "Архив Google Code для dieharder". Code.google.com . Получено 18 октября 2016 г. .
  16. ^ "CDROM Marsaglia Random Number, включающий Diehard Battery of Tests of Randomness". Stat.fsu.edu . Архивировано из оригинала 25-01-2016 . Получено 23-10-2016 .
  17. ^ "rng-tools". Gnu.org . Получено 2016-10-23 .
  18. ^ abc Daniel J. Bernstein (2014-02-05). "cr.yp.to: 2014.02.05: Entropy Attacks!". Есть ли какой-либо серьезный аргумент в пользу того, что постоянное добавление новой энтропии — это хорошо? На странице руководства Linux /dev/urandom утверждается, что без новой энтропии пользователь "теоретически уязвим для криптографической атаки", но (как я уже упоминал в разных местах) это смехотворный аргумент
  19. ^ "[PATCH 5.15 038/145] random: использовать вычислительный хэш для извлечения энтропии". lore.kernel.org .
  20. ^ random(4)  –  Руководство по интерфейсам ядра FreeBSD
  21. ^ "random(4)". Страницы руководства DragonFly On-Line . Получено 2024-06-15 .
  22. ^ "Сравнение скорости /dev/random в Linux и BSD". ianix.com . Получено 2024-06-15 .
  23. ^ random(4)  –  Руководство по интерфейсам ядра OpenBSD
  24. ^ deraadt , ред. (2014-07-21). "libc/crypt/arc4random.c". BSD Cross Reference, OpenBSD src/lib/ . Получено 2015-01-13 . Генератор случайных чисел на основе ChaCha для OpenBSD.
  25. ^ naddy, ed. (14.11.2017). "src/etc/MAKEDEV.common". Зеркало исходного кода OpenBSD на GitHub src/etc/ . Получено 14.11.2017 . /dev/arandom удален из OpenBSD.
  26. ^ riastradh, ред. (2014-11-16). "libc/gen/arc4random.c". BSD Cross Reference, NetBSD src/lib/ . Получено 2015-01-13 . Устаревший arc4random(3) API из OpenBSD, переработанный с использованием ChaCha20 PRF, с состоянием для каждого потока.
  27. ^ «Безопасность платформы Apple». Apple Inc.
  28. ^ "xnu-1456.1.26/bsd/dev/random". Apple Inc. Получено 18 октября 2016 г.
  29. ^ random(4)  –  Руководство по интерфейсам ядра Darwin и macOS
  30. ^ "iOS Security" (PDF) . Apple Inc. Октябрь 2012 г. Архивировано из оригинала (PDF) 5 апреля 2014 г. Получено 27 мая 2015 г.
  31. ^ Моффат, Даррен (2013-09-12). "Генерация случайных чисел в Solaris". Блог Oracle Solaris . Получено 2022-04-30 .
  32. ^ rnd(4)  –  Руководство по интерфейсам ядра NetBSD
  33. ^ "random(4)". 1999-09-19 . Получено 2013-07-03 .
  34. ^ "random and urandom Devices". Информационный центр pSeries и AIX . 2010-03-15. Архивировано из оригинала 2021-03-03 . Получено 2013-07-03 .
  35. ^ "HP-UX Strong Random Number Generator". 2004-07-23 . Получено 2013-07-03 .
  36. ^ Робертс, Иэн (2003-04-25). "AIX 5.2 /dev/random и /dev/urandom устройства". Lists.gnupg.org. Архивировано из оригинала 2012-02-22 . Получено 2013-07-03 .
  37. ^ "Get-SecureRandom (Microsoft.PowerShell.Utility) - PowerShell". learn.microsoft.com . Получено 2024-06-16 .
  38. ^ «Как работают /dev/random и urandom в Cygwin?». www.linuxquestions.org . Получено 09.03.2018 .

Внешние ссылки