Системные вызовы, поставляющие энтропию

Системные вызовы в Unix-подобных операционных системах

Системные вызовы, предоставляющие энтропию, — это системные вызовы в ядрах операционных систем типа Unix, с помощью которых процессы могут получать энтропийные или случайные данные. Первым из них был , представленный в операционной системе OpenBSD в выпуске 5.6 (ноябрь 2014 г.) как рефакторинг подхода sysctl(3) KERN_ARND, используемого с 1997 г. [1] Linux предлагает очень похожий системный вызов, , который был основан на . [2] Впервые он был доступен в Linux 3.17, выпущенном в октябре 2014 г. [3] В июле 2015 г. Solaris представила слегка измененные версии и . [4] В августе 2015 г. FreeBSD представила системный вызов для получения случайных данных из ядра. [5]getentropygetrandomgetentropygetentropygetrandomread_random

Эти системные вызовы позволяют процессам получать доступ к качественным случайным данным без открытия и чтения случайных псевдоустройств .

API Microsoft Windows и CryptGenRandomApple iOS очень похожи. Однако они не реализованы как системные вызовы SecRandom .

Мотивация

Традиционно Unix-подобные операционные системы предоставляют случайные данные через два псевдоустройства : /dev/randomи /dev/urandom. Однако безопасное и надежное чтение случайных данных с этих устройств может быть сложным и запутанным. Например, злоумышленник может помешать доступу процесса к псевдоустройствам, открыв все доступные файловые дескрипторы или используя похожую форму атаки истощения ресурсов . Использование этих устройств также мешает отзыву привилегий . Непривилегированные процессы часто лишены возможности открывать и читать файлы и устройства, а устройства случайности даже не видны процессам с chrooted-окружением .

Трудность использования псевдоустройств случайности часто заставляет разработчиков использовать вместо них стандартные библиотечные функции. Некоторые из них, такие как язык программирования Crand() , POSIX и random(), drand48()очень небезопасны при использовании в криптографии или подобных приложениях, поскольку эти алгоритмы на самом деле детерминированы, будучи намеренно искалеченными для удовлетворения требований повторного использования семени через интерфейсы srand(), srandom(), и srand48().

Между этими вызовами существует существенное различие: getentropy()гарантирует, что случайные числа будут возвращены немедленно, без какой-либо блокировки. Требуется операционная поддержка, которая гарантирует инициализацию случайного потока данных при первой возможности. Чтобы побудить другие операционные системы следовать этой модели, getentropy()не может указывать на ошибки в приложении. Другие вызовы, описанные здесь, могут вместо этого возвращать ошибки или блокироваться неопределенно. Такая блокирующая семантика была вовлечена в серьезные проблемы. [6]

Поскольку безопасность становится все более распространенным приоритетом в разработке программного обеспечения, качественная случайность используется все чаще и в большем количестве контекстов. Из-за этого предоставление качественной случайности все чаще считается основной обязанностью ядра. Системные вызовы являются традиционным интерфейсом, через который процесс использует основные службы ядра , и поэтому ядра поддерживают доступ к случайности через системные вызовы.

Использование

Поскольку это быстрее и добавляет еще один уровень смешивания энтропии, обычно предлагается, чтобы процессы использовали данные этих системных вызовов через криптографически безопасный генератор псевдослучайных чисел (CSPRNG) пользовательского пространства, а не назначали полученные данные напрямую переменным. Для этой цели стандартная библиотека OpenBSD C включает функцию arc4random, которую программы должны вызывать, когда им нужны случайные данные. [1] Как и getentropy, arc4randomтакже не может блокировать или возвращать ошибку.

Этот подход позволяет программе извлекать меньше энтропии из ядра, не уменьшая силу ее случайных данных. getentropyСистемный вызов разработан на основе этого предположения, предоставляя не более 256 байт на вызов. [1] [7]

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

Ссылки

  1. ^ abc "getentropy(2) OpenBSD man page". Страницы руководства OpenBSD . OpenBSD . Получено 27 мая 2016 .
  2. ^ "[PATCH, RFC] random: введение системного вызова getrandom(2)". LKML . 17 июля 2014 г. Получено 30 декабря 2015 г.
  3. ^ "Linux 3.17". Linux Kernel Newbies . Получено 30 декабря 2015 г.
  4. ^ Даррен, Моффат. "Новые системные вызовы Solaris: getentropy(2) и getrandom(2)". /dev/urandom . Oracle. Архивировано из оригинала 2 августа 2017 г. Получено 3 января 2016 г.
  5. ^ "Ревизия r286839". svnweb.freebsd.org . FreeBSD . Получено 29 августа 2017 г. .
  6. ^ "Python блокируется во время загрузки" . Получено 28 апреля 2017 г. .
  7. ^ "arc4random(3) OpenBSD man page". Страницы руководства OpenBSD . OpenBSD . Получено 27 мая 2016 .
  • Системный вызов для случайных чисел: getrandom(), LWN.net , 23 июля 2014 г., Джейк Эдж
Взято с "https://en.wikipedia.org/w/index.php?title=Вызовы_систем_обеспечения_энтропии&oldid=1264904677"