RAND_bytes() failed د یوې محلي بنسټیزې برخې په اړه خبره ده، نه د حساب، مخکې شریک شوي کیلي یا لرې پوټ په اړه۔ دوه خورا مختلفې خرابۍ هغه ورته کرښه جوړوي او مختلف شواهد پرېږدي۔ یوه کریپټوګرافیک بیکنډ دی چې د بایټونو د خپرولو څخه انکار کوي؛ بله پروسه ده چې هغې انټروپي سرچینې ته نه رسېږي چې د هغې لپاره یې کوډ جوړ شوی و۔ د دوی جلا کول د تېروتنو قطار یوه لوستنه او د بند شوې پروسې د فایل سیسټم لید ته یوه کتنه غواړي، او دا تفتیش باید د /dev لاندې د هر څه له جوړولو دمخه وي۔

د بیرته ستنیدو ارزښت څه جلا کوي

مستند شوی تړون درې پایلې جلا کوي، نه دوه: د بریالیتوب لپاره 1، کله چې بار شوې RAND طریقه غوښتنه نه ملاتړي -1، او د نورو خرابیو لپاره 0، پداسې حال کې چې تشریح د تېروتنو په قطار کې پاتې کېږي۔ د RAND_bytes حواله یوه نقطه زیاتوي چې له پامه غورځول یې اسانه دي: ډیفالټ جنریټر په ملاتړ شوو پلیټ فارمونو کې له عملیاتي سیسټم څخه تخم اخلي، او کله چې دا تخم اچول ناکام شي نو د وړاندوینې وړ بایټونو د بیرته راګرځولو پرځای په تېروتنې حالت کې پاتې کېږي۔

یوازې یو له دغو شمېرو محیط بیانوي۔ 1- د جوړښت، عرضه کوونکي یا ځانګړتیا پوښتنه ده، ځکه چې کوډ داسې څه غوښتل چې فعال تطبیق یې نه وړاندې کوي۔ د تخم اچولو شکایت سره 0 د محیط پوښتنه ده، ځکه چې جنریټر انټروپي په بشپړ ډول نه شو ترلاسه کولی۔ شمېره پخپله هیڅکله نه وایي کومه، او د فنکشن نوم هم نه۔

کله چې پټ د وسیلې نوډ اصلي لامل وي

محدوده خدمت له هغې شیل څخه مختلف ونه ګوري چې تاسو په کې ټایپ کوئ۔ د chroot جېلونه، کنټینر انځورونه او سخت شوي unit فایلونه معمولاً /dev وړاندې کوي چې له کوربه څخه لږ نوډونه لري۔ که ناکام تطبیق /dev/urandom د لارې په نوم خلاص کړي، دا توپیر د پیل ماتولو لپاره کافي دی پداسې حال کې چې کوربه پخپله بشپړ روغ ښکاري۔ د جېل څخه بهر شته وسیله د دې په اړه هیڅ نه ثابتوي چې بنده پروسې ته د څه خلاصولو اجازه ده۔

خو هر تصادفي انٹرفیس لارې ته اړتیا نه لري۔ په لینکس کې getrandom سیسټم کال نه د فایل نوم او نه د فایل ډیسکریپټر مني، او د هغې لارښود پاڼه یادونه کوي چې دا ځانګړتیا په دقیق ډول هغه ځای کې ګټوره ده چې chroot د وسیلو لارې پټوي۔

نو د ورک نوډ تشریح د کوډ د یوې څانګې په اړه فرضیه ده، نه د تصادفي شمېرو په اړه عمومي قاعده۔ کله چې شواهد لار ونوموي نو دا پاتې کېږي، او کله چې شواهد بل څه ونوموي نو اټکل دی۔

لومړی د تېروتنو قطار ولولئ، بیا د پروسې لید

د پوښتنې د حل کولو ترټولو ګړندۍ لار دا ده چې هغه څه ولولئ چې کتابخانې لا دمخه ثبت کړي دي، بیا مستقیم د جېل دننه لید ته وګورئ۔ له هغې OpenSSL جوړښت سره پیل وکړئ چې خدمت واقعاً بار کړی و، ځکه چې د عرضه کوونکو سټیکونه د لویو نسخو او ویشونو ترمنځ توپیر لري۔ بیا له systemd څخه وپوښتئ کومه پروسه روانه ده او کوم محدودیتونه پرې پلي کېږي۔ یوازې هغه وخت چې دواړه حقایق پر میز وي، د هغو نوډونو لیست کول ارزښت لري چې هغه پروسه یې ګوري۔

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

دا لوستنې په هماغه پروسه ترسره کړئ، نه په هغې شیل چې ناڅاپه خلاصه ده۔ د کوربه /dev له بې اړیکې پروسې لید سره پرتله کول هغه لاره ده چې غلط انحصار دوه ځله سمېږي۔

انحصار یوازې هغه وخت اضافه کړئ چې نوم یې اخیستلی شئ

کله چې شواهد واقعاً لار ونوموي، ترمیم کوچنی دی: هماغه یوه لار د جېل دننه شته کړئ او نور هر څه پرېږدئ۔ د یوې نوډ bind mount معمولاً کافي دی، او mknod د نوډ معیاري major او minor شمېرو سره په هغو نصبونو کې ورته پایله ورکوي چې mount اختیار نه وي۔ د sandbox پراخول، هر کرکټر وسیلې ته لاسرسی ورکول یا PrivateDevices بندول هدفمند اصلاح په تلپاتې امنیتي بیرته وتلو بدلوي۔

د انټروپي ډیمون د هغه ترمیم بدیل نه دی۔ لکه haveged ډوله بستې بدلوي چې د کرنل حوض څنګه تغذیه کېږي؛ دوی نه شي کولی هغه لار جوړه کړي چې بنده پروسې ته د خلاصولو اجازه وي۔ یو نصبول کېدای شي د روغتیا ګراف ښه ښکاره کړي پداسې حال کې چې د خلاصولو کال لا هم ناکامېږي۔ دوه ستونزې جلا وساتئ، که نه نو بله ناکامي به بیا غلط طبقې ته منسوب شي۔

جنریټر او تونل جلا جلا وګورئ

بیا پیل یوازینی ازموینه ده چې هماغه ترتیبات، هماغه unit فایل او هماغه محدودیت بیا کاروي چې ناکامي یې رامنځته کړه۔ دا چل کړئ، بیا د پخواني پیل نمونې پرځای د ژورنال ترټولو نوي ننوتنې ولولئ۔

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

په دې تولید کې دوه جلا شیان وپلټئ: د تصادفي سرچینې پیغام ورکیدل، او تونل خپل معمول پیلنې نښې ته رسیدل۔ بیا کار کوونکی جنریټر یوه سیمه ییزه ناکامي لرې کوي او د سرور هویت، اعتبارنامو یا روټینګ په اړه هیڅ نه وایي۔ دا د هماغه کلینټ ترتیباتو سره وازموئ چې مخکې ناکام شوي وو، ترڅو پایله د پرتله کولو وړ وي نه یوازې غوره۔

اړوندې مقالې