RAND_bytes() failed er fullyrðing um eina staðbundna frumstærð, ekki um reikninginn, fyrirfram deildan lykil eða fjartengda portið. Tvær mjög ólíkar bilanir framleiða sömu línuna og skilja eftir sig ólík ummerki. Önnur er dulritunarleg bakenda sem neitar að gefa frá sér bæti; hin er ferli sem nær ekki frumorkugjafanum sem kóði þess var byggður fyrir. Að aðgreina þær krefst einnar lestrar á villuröðinni og eins augnatillits á skráarkerfissýn fangelsaða ferlisins, og sú athugun á heima fyrir því sem er búið til undir /dev.

Hvað skilagildið greinir

Skjalfesti samningurinn greinir þrjár niðurstöður, ekki tvær: 1 fyrir árangur, -1 þegar hlaðna RAND-aðferðin styður ekki beiðnina og 0 fyrir aðrar bilanir, en skýringin er látin vera í villuröðinni. RAND_bytes-tilvísunin bætir við punkti sem er auðvelt að missa af: sjálfgefni rafallinn fær sáð efni frá stýrikerfinu á studdum kerfum, og þegar sú sáning mistekst helst hann í villustöðu í stað þess að skila fyrirsjáanlegum bætum.

Aðeins ein þessara talna lýsir umhverfinu. -1 er spurning um byggingu, veitanda eða eiginleika, því kóðinn bað um eitthvað sem virka útfærslan býður ekki. 0 með kvörtun um sáningu er umhverfisspurning, því rafallinn náði alls ekki í frumorku. Talan ein og sér segir aldrei hvora, og fallsheitið ekki heldur.

Hvenær faldur tækishnútur er raunverulega orsökin

Takmörkuð þjónusta sér annað tré en skelina sem þú skrifar í. Chroot-fangelsi, gámaímyndir og hertar unit-skrár sýna venjulega /dev sem heldur færri hnútum en sá gestgjafans. Ef bilaða útfærslan opnar /dev/urandom eftir slóð skiptir sá munur máli til að brjóta ræsinguna á meðan gestgjafinn sjálfur virðist fullkomlega heilbrigður. Tæki sem er til utan fangelsisins sannar ekkert um hvað fangelsaða ferlið má opna.

Ekki þarf hvert slembiviðmót slóð, þó. Kerfiskallið getrandom í Linux tekur hvorki við skráarheiti né skráartölu, og handbókarsíðan þess bendir á að þessi eiginleiki sé einmitt gagnlegur þar sem chroot hylur tækjaslóðir.

Þannig er skýringin um hnútinn sem vantar tilgáta um eina grein kóðans, ekki regla um slembitölur almennt. Hún stendur þegar ummerkin nefna slóð, og hún er gisk þegar ummerkin nefna eitthvað annað.

Lestu villuröðina, þá sýn ferlisins

Fljótlegasta leiðin til að útkljá spurninguna er að lesa það sem bókasafnið hefur þegar skráð og líta síðan beint á sýnina inni í fangelsinu. Byrjaðu á OpenSSL-byggingunni sem þjónustan hlóð í raun, því veitendastafar eru mismunandi milli aðalútgáfa og milli dreifinga. Spurðu systemd síðan hvaða ferli er í gangi og hvaða takmarkanir gilda um það. Aðeins þegar báðar staðreyndir liggja á borðinu er þess virði að telja upp hnútana sem það ferli sér.

openssl version -a
systemctl show openvpn-server@lab -p MainPID -p PrivateDevices -p DevicePolicy
pid=$(systemctl show -p MainPID --value openvpn-server@lab)
sudo ls -l /proc/"$pid"/root/dev/urandom /proc/"$pid"/root/dev/random

Keyrðu þessar lestrar gegn sama ferli, ekki gegn skelinni sem stendur tilboðin opin. Að bera saman /dev gestgjafans við sýn ótengds ferlis er hvernig ranga fylgjan er gerð við tvisvar.

Bættu fylgjunni við aðeins eftir að þú getur nefnt hana

Þegar ummerkin nefna raunverulega slóð er viðgerðin lítil: gerðu þá einu slóð aðgengilega inni í fangelsinu og láttu allt annað í friði. Bind-mount á einstaka hnútnum nægir venjulega, og mknod með hefðbundnum major- og minornúmerum hnútsins gefur sömu niðurstöðu á uppsetningum þar sem mount er ekki valkostur. Að víkka sandkassann, veita aðgang að hverju stafatæki eða slökkva á PrivateDevices skiptir markvissri lagfæringu fyrir varanlega öryggisafturför.

Frumorkudímonn kemur ekki í stað þeirrar viðgerðar. Pakkar eins og haveged breyta því hvernig kjarnapotturinn er fóðraður; þeir geta ekki búið til slóð sem fangelsað ferli má opna. Að setja einn upp getur látið heilsugrafsmynd líta betur út á meðan op-kallið mistekst enn. Haltu vandamálunum tveimur aðskildum, annars verður næsta bilun aftur kennd röngu lagi.

Staðfestu rafalann og göngin sitt í hvoru lagi

Endurræsing er eina prófið sem endurnýtir sömu stillingar, sömu unit-skrá og sama einangrun og olli biluninni. Keyrðu hana og lestu síðan nýjustu færslur journalsins í stað úrtaks frá fyrri ræsingu.

sudo systemctl restart openvpn-server@lab
sudo journalctl -u openvpn-server@lab --since -5min --no-pager | grep -iE 'rand|entropy|Initialization Sequence'

Leitaðu að tveimur aðskildum hlutum í þeirri úttak: skilaboðunum um slembiheimildina sem hverfa, og göngunum sem ná venjulegu ræsingarviðmiði sínu. Rafall sem virkar aftur fjarlægir eina staðbundna bilun og segir ekkert um auðkenni þjónsins, skilríki eða forgreiðslu. Prófaðu það með sömu biðlarastillingu og brást áður, svo niðurstaðan sé sambærileg en ekki bara betri.

Tengdir greinar