/dev/random

С Википедије, слободне енциклопедије
Специјалнe датотеке уређаја

У Јуникс оперативним системима /dev/random, /dev/urandom и /dev/arandom су посебне датотеке које служе као генератор псеудо-насумичних бројева. Ове команде омогућавају приступ шумовима у програмском окружењу из управљачког програма и из других извора.[1] /dev/random обично заблокира ако има мање доступне ентропије од тражене; /dev/urandom никада не заблокира, чак и ако семе генератора псеудонасумичних бројева није у потпуности иницијализовано ентропијом од бутовања система. /dev/arandom заблокира након подизања све док се семе генератора псеудо-насумичних бројева не иницијализује безбедно са довољно ентропије, а затим никада не заблокира поново. Не имплементирају сви оперативни системи исте методе за /dev/ random и /dev/urandom, а само неколико поседује /dev/arandom.

Линукс[уреди | уреди извор]

Генерисање насумичних бројева у простору кернела је први пут имплементирано у Линуксу[2] 1994, од стране Теодора Цоа.[3] Имплементација се врши сигурним хашевима уместо шифрама, како би се избегла ограничења извоза криптографије која је била у функцији када је генератор првобитно пројектован. Имплементација је осмишљена са претпоставком да ће хеш бити слаб или шифра бити слаба, тако да је дизајн поуздан узевши у обзир слабости. Брзи опоравак од компромиса основе се не сматра захтевом, јер су захтеви за компромисом основе довољни за много лакше и директније нападе на са тим неповезане делове оперативног система.

У Цоовој имплементацији, генератор чува процену броја битова шума у заједничкој бази ентропије. Из ове заједничке базе ентропије праве се случајни бројеви. Када се учита, уређај који је послужио као извор за /dev/random ће враћати само случајне бајтове унутар процењеног броја битова шумова у заједничкој бази ентропије. Када је заједничка база ентропије празна, учитавања из /dev/random ће заблокирати док се не сакупи додатни шум из околине. Намера је да служи као криптографски сигуран генератор псеудонасумичних бројева, испоручујући излаз са што је могуће већом ентропијом. Аутори су предложили ово за употребу у генерисању криптографских кључева за високу или дугорочну заштиту.

Насупрот команде /dev/random је /dev/urandom („неограничен”/насумични извор који не блокира) који користи интерну заједничку основу како би произвео више псеудонасумичних битова. То значи да позив неће бити блокиран, али излаз може садржати мање ентропије од одговарајућег читања из команде /dev/random. Док је команда /dev/ urandom и даље замишљена као генератор псеудонасумичних бројева који су погодни за већину криптографских примена, аутори одговарајућих упутстава примећују да, у теорији, може постојати неки још увек необјављени напад на алгоритам који користи /dev/urandom и да корисници који брину због таквог напада треба да користе /dev/random. Међутим, мало је вероватно да ће до таквог напада доћи, јер када једном заједничка основа ентропије постане непредвидљива не умањује се сигурност услед смањеног броја битова.

Такође је могуће писати у /dev/random. Ово дозвољава сваком кориснику да меша насумичне податке у заједничку основу. Неслучајни подаци су безопасни, јер само привилеговани корисник може издати ioctl потребан за повећање процењене ентропије. Тренутна количина ентропије и величина ентропијске основе Линукс кернела, мерене у битовима, су доступни у /proc/sys/kernel/random/ и могу се приказати командом cat /proc/sys/kernel/random/entropy_avail и cat /proc/sys/kernel/random/poolsizе, респективно.

Гутерман, Пинкас и Реинман су у марту 2006. објавили детаљну криптографску анализу генератора случајних бројева Линуксовог генератора насумичних бројева у којој су описали неколико слабости. Можда је најозбиљнији проблем који пријављују са уграђеним или Лајв ЦД системима, као што су рутери и клијенти без диска, за које је стање при покретању система предвидљиво и доступна количина ентропије из окружења може бити ограничена. За систем са непроменљивом меморијом, они препоручују уштеду неког стања из RNG-а при гашењу тако да се може укључити у RNG стање на следећем рестартовању. У случају рутера за који мрежни саобраћај представља примарни расположиви извор ентропије, они примећују да би уштеда стања преко поновног покретања система "захтевала од потенцијалних нападача да прислушкују сав мрежни саобраћај" од тренутка када је рутер први пут пуштен у рад, или да обезбеди директан приступ интерном стању рутера. Овај проблем је, како је забележено, посебно критичан у случају бежичног рутера чији се мрежни саобраћај може ухватити из даљине и који можда користи RNG за генерисање кључева за енкрипцију података.

Линуксов кернел пружа подршку за неколико хардверских генератора насумичних бројева, под условом да су инсталирани. Необрађени излаз из таквог уређаја се може добити путем /dev/hwrng.

Са Линукс кернелом верзије 3.16 и новијим, сам кернел меша податке из хардверских генератора насумичних бројева у /dev/random, a клизачем је могуће одредити размер дефинисане процене вредности ентропије HWRNG-a. То значи да није потребан помоћни програм који се активира у радном окружењу, попут rngd из rng-tools, за тај задатак. Са Линукс кернелом верзије 3.17+, VirtIO RNG је модификован како би имао подразумеване дефинисане вредности изнад 0, и као такав, је тренутно једини HWRNG који је подразумевано комбинован у /dev/random.

Скуп ентропија може се побољшати програмима као што су timer_entropyd, haveged, randomsound итд. Са rng-tools, хардверски генератори случајних бројева као што је Entropy Key, итд. могу писати у /dev/random. Програми dieharder, diehard и ent могу тестирати ове генераторе случајних бројева.

У јануару 2014, Данијел Ј. Бернштајн је објавио критику о томе како Линукс комбинује различите изворе ентропије. Он наглашава да напад на један од извора ентропије који је способан да врши надзор других извора ентропије може променити свој излазни сигнал како би поништио насумичност осталих извора ентропије. Ако узмемо функцију H(x,y,z) где је H функција хеша, а параметри x, y, и z су извори ентропије где је z излазни сигнал малициозног HRNG Z-a који је везан за процесор:

  1. Z генерише насумичну вредност за r.
  2. Z израчунава H(x,y,r).
  3. Ако је излазна вредност H(x,y,r) једнака жељеној вредности, излазна вредност r је z.
  4. У супротном, почети од почетка, почевши од 1.

Бернштајн је проценио да нападач мора да понови H(x,y,r) 16 пута како би компромитовао DSA и ECDSA. Ово је могуће зато што Линукс врши поновно постављање H на трајној основи уместо да користи једно семе високог квалитета.

Октобра 2016. је са објављивањем Линукс кернела верзије 4.8 и новије, /dev/urandom пребачен на имплементацију базирану на Теодор Цоовом ЧаЧа20 (ChaCha20), који се заснива на Бернштајновом добро оцењеном низу шифри ЧаЧа20 (ChaCha20).

Пример[уреди | уреди извор]

Дати стандардни код скрипте испод користи /dev/urandom и генерише компликовани Криптмејл:

#!/bin/sh
printf " \$ti";
read pngs</dev/urandom;
pc=1; while [ $pc -le $(((${#pngs}%5)+8)) ]; do read s s2</dev/urandom;
printf "\n\n"; printf `printf "\\%o" "$(((${#s}%26)+65))"`;
printf `printf "\\%o" "$(((${#s2}%26)+97))"`; l=${#s}; i=1;
while [ $i -le $l ]; do c=`printf %c "${s%${s#?}}"`; s=${s#?};
cc=`printf %d \`printf "\047$c" 2>&-\``;
printf `printf "\\%o" "$((((cc+i)%95)+32))"`;
i=$((i+1));
done;
pc=$((pc+1));
done;

FreeBSD[уреди | уреди извор]

Оперативни систем FreeBSD омогућава /dev/urandom за потребе компатибилности, али се понаша врло различито од Линукса. На FreeBSD-у, /dev/urandom је само линк на /dev/random и блокира само док се не обезбеди правилно семе. FreeBSD-ов PRNG (Fortuna) поново узима семе, али не покушава да процени ентропију. На систему са малом количином мрежне активности и активности диска, поновно узимање семена се врши у делићу секунде.

Док су методе базиране на базама ентропије потпуно сигурне ако се правилно имплементирају, ако прецене своју ентропију, могу постати мање сигурне од добро зачетих PRNG-ова. У неким случајевима нападач може имати значајну контролу над ентропијом; на пример, сервер без диска може у потпуности засновати семе на основу протока мреже, што га чини потенцијално рањивим на нападе путем посредника.

Од OpenBSD верзије 5.1 (1. мај 2012) /dev/random и /dev/arandom користе алгоритам заснован на RC4 али преименован, због интелектуалне својине, ARC4. Док генерација насумичних бројева користи системску ентропију сакупљену на неколико начина, ARC4 алгоритам обезбеђује сигурносни механизам, осигуравајући да брз и висок квалитет буде обезбеђен за псеудо-насумични број чак и када је основа у стању ниске ентропије. Систем аутоматски користи хардверске генераторе насумичних бројева ( попут оних који се налазе на неким Intel PCI хабовима) ако су доступни, путем OpenBSD криптографског оквира.

Од OpenBSD верзије 5.5 (1. мај 2014), позив arc4random() који се користи за насумичне уређаје OpenBSD више не користи ARC4, већ ChaCha20 (arc4random име се може поново размотрити као позив за замену за насумично). NetBSD-ова имплементација АPI наследника за arc4random() је такође пребачена на ChaCha20.

Мак OC и iOS[уреди | уреди извор]

Mac OS користи 160-битни Yarrow на бази SHA1. Не постоји разлика између /dev/random и /dev/urandom; оба се понашају идентично. Еплов iOS такође користи Yarrow.

Остали оперативни системи[уреди | уреди извор]

/dev/random и /dev/urandom су такође доступни на Соларису, NetBSD-у, Tru64 UNIX 5.1B, AIX 5.2 и HP-UX 11и в2. Као и код FreeBSD, AIX имплементира сопствени дизајн базиран на Yarrow-у, али АIX користи знатно мање ентропијских извора од стандардне /dev/random имплементације и престаје да допуњава базу када изврши процену да садржи довољно ентропије.

У Виндовсу НТ, сличну функционалност испоручује ksecdd.sys али читање посебне датотеке \Device\KsecDD не ради као у Јуниксу. Документоване методе за генерисање криптографски насумичних бајтова су CryptGenRandom и RtlGenRandom.

Мада ДОС природно не пружа такву функционалност, постоји драјвер отвореног кода развијен од стране трећег лица под називом noise.sys, који функционише слично тако што ствара два уређаја, RANDOM$ и URANDOM$, који су такође доступни као /DEV/RANDOM$ и /DEV/URANDOM$, програми могу приступити за насумичне податке.

Линукс емулатор Cygwin на Виндовсу омогућава имплементацију и /dev/random и /dev/urandom, који се могу користити у скриптама и програмима.

Референце[уреди | уреди извор]

  1. ^ Torvalds, Linus (16. 4. 2005). „Linux Kernel drivers/char/random.c comment documentation @ 1da177e4”. Приступљено 22. 7. 2014. 
  2. ^ Lloyd, Jack (2008-12-09). „On Syllable's /dev/random”. Архивирано из оригинала 04. 03. 2016. г. Приступљено 2013-07-03.  Архивирано на сајту Wayback Machine (4. март 2016)
  3. ^ „/dev/random”. Everything2. 2003-06-08. Архивирано из оригинала 01. 05. 2019. г. Приступљено 2013-07-03. 

Спољашње везе[уреди | уреди извор]