RAND_bytes() failed bitta mahalliy primitiv haqida bayonot, hisob, oldindan bo'lishilgan kalit yoki masofaviy port haqida emas. Ikki juda xil nosozlik bir xil qatorni keltirib chiqaradi va turli izlar qoldiradi. Biri bayt chiqarishdan bosh tortadigan kriptografik backend; ikkinchisi kodi foydalanish uchun qurilgan entropiya manbasiga yeta olmaydigan jarayon. Ularni ajratish uchun xato navbatini bir marta o'qish va qamalgan jarayonning fayl tizimi ko'rinishiga bir marta qarash kerak, va bu tekshiruv /dev ostida biror narsa yaratilishidan oldin bajarilishi kerak.

Qaytish qiymati nimani ajratadi

Hujjatlashtirilgan shartnoma ikkita emas, uchta natijani ajratadi: muvaffaqiyat uchun 1, yuklangan RAND usuli so'rovni qo'llab-quvvatlamasa -1 va boshqa nosozliklar uchun 0, tushuntirish esa xato navbatida qoladi. RAND_bytes havolasi oson o'tkazib yuboriladigan bir nuqtani qo'shadi: standart generator qo'llab-quvvatlanadigan platformalarda operatsion tizimdan urug' oladi va bu urug'lash muvaffaqiyatsiz bo'lsa, oldindan aytib bo'ladigan baytlarni qaytarish o'rniga xato holatida qoladi.

Bu raqamlardan faqat bittasi muhitni tavsiflaydi. -1 qurish, provayder yoki funksiya masalasidir, chunki kod faol tatbiq taklif qilmaydigan narsani so'radi. Urug'lash shikoyati bilan kelgan 0 esa muhit masalasidir, chunki generator umuman entropiya ololmadi. Raqamning o'zi hech qachon qaysi biri ekanini aytmaydi, funksiya nomi ham aytmaydi.

Yashirin qurilma tuguni haqiqiy sabab bo'lganda

Cheklangan xizmat siz yozayotgan qobiqdan boshqa daraxtni ko'radi. Chroot qamoqlari, konteyner tasvirlari va mustahkamlangan unit fayllari odatda xostnikidan kamroq tugun saqlaydigan /dev taqdim etadi. Agar nosoz tatbiq /dev/urandom faylini yo'l nomi bilan ochsa, bu farq xostning o'zi butunlay sog'lom ko'rinib turganda ishga tushishni buzishga yetadi. Qamoqdan tashqarida mavjud bo'lgan qurilma qamalgan jarayon nimani ochishi mumkinligi haqida hech narsani isbotlamaydi.

Biroq har bir tasodifiy interfeys yo'lga muhtoj emas. Linuxning getrandom tizim chaqiruvi na fayl nomini, na fayl deskriptorini qabul qiladi va uning qo'llanma sahifasi bu xususiyat aynan chroot qurilma yo'llarini yashirgan joyda foydali ekanini qayd etadi.

Shunday qilib, yetishmayotgan tugun izohi kodning bir tarmog'i haqidagi gipoteza, tasodifiy sonlar haqidagi umumiy qoida emas. Dalillar yo'lni nomlaganda amal qiladi va dalillar boshqa narsani nomlaganda bu taxmin bo'ladi.

Avval xato navbatini, keyin jarayon ko'rinishini o'qing

Savolni hal qilishning eng tez yo'li kutubxona allaqachon qayd etgan narsani o'qish va keyin qamoq ichidagi ko'rinishga bevosita qarashdir. Xizmat haqiqatan yuklagan OpenSSL qurilishi bilan boshlang, chunki provayder steklari asosiy versiyalar va distributivlar orasida farq qiladi. Keyin systemd dan qaysi jarayon ishlayotganini va qanday cheklovlar amal qilishini so'rang. Faqat ikkala fakt stolda bo'lganda o'sha jarayon ko'ra oladigan tugunlarni sanashga arziydi.

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

Bu o'qishlarni bir xil jarayon ustida bajaring, tasodifan ochiq qolgan qobiq ustida emas. Xostning /dev qiymatini aloqasiz jarayon ko'rinishi bilan solishtirish noto'g'ri bog'liqlikning ikki marta tuzatilish yo'lidir.

Bog'liqlikni faqat nomlay olganingizdan keyin qo'shing

Dalillar haqiqatan yo'lni nomlaganda tuzatish kichik: o'sha yagona yo'lni qamoq ichida mavjud qiling va qolgan hamma narsaga tegmasdan qoldiring. Bitta tugunning bind mount qilinishi odatda yetarli va mknod tugunning standart major va minor raqamlari bilan mount imkonsiz bo'lgan o'rnatishlarda bir xil natija beradi. Sandboxni kengaytirish, har bir belgi qurilmasiga ruxsat berish yoki PrivateDevices ni o'chirish maqsadli tuzatishni doimiy xavfsizlik regressiyasiga almashtiradi.

Entropiya demoni bu tuzatishning o'rnini bosmaydi. haveged kabi paketlar yadro hovuzining qanday oziqlanishini o'zgartiradi; ular qamalgan jarayon ochishga ruxsat etilgan yo'lni yarata olmaydi. Bittasini o'rnatish ochish chaqiruvi hali ham muvaffaqiyatsiz bo'layotganda sog'liq grafigini yaxshiroq ko'rsatishi mumkin. Ikki muammoni alohida saqlang, aks holda keyingi nosozlik yana noto'g'ri qatlamga bog'lanadi.

Generatorni va tunnelni alohida tekshiring

Qayta ishga tushirish nosozlikni keltirib chiqargan bir xil konfiguratsiyani, bir xil unit faylini va bir xil izolyatsiyani qayta ishlatadigan yagona sinovdir. Uni ishga tushiring va keyin avvalgi ishga tushirishdan olingan namuna o'rniga jurnalning eng yangi yozuvlarini o'qing.

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

O'sha chiqishda ikkita alohida narsani qidiring: tasodifiy manba haqidagi xabar yo'qolishi va tunnel o'zining odatdagi ishga tushish bosqichiga yetishi. Qayta ishlaydigan generator bitta mahalliy nosozlikni olib tashlaydi va server identifikatori, hisob ma'lumotlari yoki marshrutlash haqida hech narsa demaydi. Buni avval muvaffaqiyatsiz bo'lgan bir xil mijoz konfiguratsiyasi bilan sinab ko'ring, natija faqat yaxshiroq emas, balki solishtirish mumkin bo'lsin.

O'xshash maqolalar