Линукс: цоожны санг устгаж байна /dev/random

/dev/random, криптографийн хувьд аюулгүй псевдо санамсаргүй тоо үүсгэгч (CSPRNG) нь нэг ядаргаатай асуудалтай байдаг: блоклох. Энэ нийтлэлд та үүнийг хэрхэн шийдвэрлэх талаар тайлбарласан болно.

Сүүлийн хэдэн сарын хугацаанд цөм дэх санамсаргүй тоо үүсгэх байгууламжууд бага зэрэг шинэчлэгдсэн боловч энэ дэд систем дэх асуудлууд илүү өргөн хүрээнд шийдэгдсэн. цаг хугацааны хүрээ. Хамгийн сүүлийн өөрчлөлтүүд систем ачаалагдах үед getrandom() системийн дуудлагыг удаан хугацаагаар хаахаас сэргийлэх зорилгоор хийгдсэн боловч үүний үндсэн шалтгаан нь санамсаргүй санд блоклох үйлдэл байсан. Саяхны засвар нь энэ цөөрмийг арилгах байсан бөгөөд энэ нь үндсэн цөм рүү чиглэнэ гэж таамаглаж байсан.

Энди Лутомирски XNUMX-р сарын сүүлээр засварын гурав дахь хувилбарыг нийтэлсэн. Тэр хувь нэмрээ оруулдаг "санамсаргүй Linux API-д хоёр үндсэн семантик өөрчлөлт". Уг нөхөөс нь getrandom() системийн дуудлагад шинэ GRND_INSECURE тугийг нэмдэг (хэдийгээр Лутомирский үүнийг getentropy() гэж хэлдэг ч энэ нь glibc дээр getrandom()-ыг тогтмол туг ашиглан хэрэгжүүлдэг); Энэ туг нь дуудлагыг хүссэн өгөгдлийн хэмжээг үргэлж буцааж өгөхөд хүргэдэг боловч өгөгдөл санамсаргүй гэдгийг баталгаажуулахгүй. Цөм нь тухайн үед хамгийн сайн санамсаргүй өгөгдлийг гаргахын тулд чадах бүхнээ хийх болно. "АЮУЛГҮЙ" гэж нэрлэх нь хамгийн зөв зүйл байх. (найдваргүй) энэ API-г аюулгүй байдлыг хангах шаардлагатай зүйлсэд ашиглахаас сэргийлнэ."

Засварууд нь мөн хаах усан санг арилгадаг. Цөм нь одоогоор энэ хэсэгт тайлбарласны дагуу нэг нь /dev/random, нөгөө нь /dev/urandom-д тохирох хоёр санамсаргүй өгөгдлийн санг хадгалж байна. нийтлэл 2015 он. Блоклох усан сан нь /dev/random; хүсэлтийг хангахын тулд системээс "хангалттай" энтропи цуглуулах хүртэл тухайн төхөөрөмжийн уншлага блоклох болно (түүний нэрийг хэлж байна). Хэрэв цөөрөмд хангалттай энтропи байхгүй бол энэ файлын цаашдын уншлагыг хаадаг.

Түгжээний санг арилгана гэдэг нь /dev/random-аас унших нь getrandom() шиг тугуудыг тэг болгож (мөн GRND_RANDOM тугийг noop болгон хувиргана) гэсэн үг юм. Криптограф санамсаргүй тоо үүсгэгчийг (CRNG) эхлүүлсний дараа /dev/random-аас унших болон getrandom(…,0) руу залгах нь хаагдахгүй бөгөөд хүссэн хэмжээний санамсаргүй өгөгдлийг буцаана.

Лутомирский хэлэхдээ: "Линуксыг хориглох сан хуучирсан гэдэгт би итгэж байна. CRNG Linux нь түлхүүр үүсгэхэд ашиглахад хангалттай сайн гаралтыг бий болгодог. Блоклох усан сан нь ямар ч материаллаг утгаараа илүү хүчтэй биш бөгөөд үүнийг дэмжихийн тулд эргэлзээтэй үнэ цэнэтэй олон дэд бүтэц шаардлагатай."

Өөрчлөлтүүд нь одоо байгаа програмуудад үнэхээр нөлөөлөхгүй байх үүднээс хийгдсэн бөгөөд үнэндээ GnuPG түлхүүр үүсгэх гэх мэт зүйлсийг удаан хүлээхэд асуудал бага байх болно.

“Эдгээр ангиуд нь одоо байгаа хөтөлбөрүүдийг тасалдуулах ёсгүй. /dev/urandom өөрчлөгдөөгүй хэвээр байна. /dev/random нь ачаалсны дараа шууд блоклодог ч өмнөхөөсөө бага блоклодог. Одоо байгаа тугуудтай getentropy() нь өмнөх шигээ практик зорилгод тохирсон үр дүнг буцаана."

Цөм нь "жинхэнэ санамсаргүй тоо" гэж нэрлэгддэг, хаах цөм тодорхой хэмжээгээр хийх ёстой зүйл болох эсэх нь нээлттэй асуулт хэвээр байгааг Лутомирский тэмдэглэв. Үүний цорын ганц шалтгааныг тэрээр "төрийн стандартыг дагаж мөрдөх" гэж харж байна. Лутомирский хэрэв цөм үүнийг хангах бол үүнийг огт өөр интерфэйсээр дамжуулан хийх эсвэл хэрэглэгчийн орон зайд шилжүүлж, ийм цоожны сан үүсгэхэд ашиглаж болох түүхий үйл явдлын дээжийг авах боломжийг хэрэглэгчдэд олгохыг санал болгосон.

Стефан Мюллер өөрийн багцыг санал болгов засварууд Linux-д зориулсан Random Number Generator (LRNG) (одоогоор 26-р хувилбар гарсан) нь шаардлагатай программуудад бодит санамсаргүй тоо өгөх арга байж болох юм. LRNG нь "Санамсаргүй бит үүсгэхэд ашигладаг энтропийн эх үүсвэрийн талаархи SP800-90B удирдамжтай бүрэн нийцэж байгаа" бөгөөд энэ нь засгийн газрын стандартын асуудлыг шийдвэрлэхэд тусалдаг.
Мэттью Гаррет "жинхэнэ санамсаргүй өгөгдөл" гэсэн нэр томъёог эсэргүүцэж, түүвэрлэсэн төхөөрөмжүүд нь зарчмын хувьд тэдгээрийг урьдчилан таамаглахуйц хангалттай нарийн загварчлах боломжтой гэдгийг тэмдэглэж: "Бид энд квант үйл явдлуудыг түүвэрлэхгүй."

Мюллер энэ нэр томъёо нь Германы стандарт AIS 31-ээс гаралтай бөгөөд зөвхөн "дуу чимээний үндсэн эх үүсвэр энтропи үүсгэдэгтэй ижил хурдаар" үр дүнг гаргадаг санамсаргүй тоо үүсгэгчийг дүрсэлсэн гэж хариулав.

Нэр томьёоны ялгааг үл харгалзан LRNG нөхөөсийн дагуу цоожны сантай байх нь янз бүрийн асуудалд хүргэх болно, ядаж ямар ч эрхгүйгээр ханддаг.

Лутомирскийн хэлснээр: “Энэ асуудлыг шийдэхгүй. Хэрэв хоёр өөр хэрэглэгч gnupg гэх мэт тэнэг программуудыг ажиллуулбал тэд зүгээр л бие биенээ шавхах болно. Одоогоор /dev/random-д хоёр гол асуудал байгааг би харж байна: энэ нь DoS-д өртөмтгий (жишээ нь: нөөцийн хомсдол, хортой нөлөө эсвэл үүнтэй төстэй зүйл), мөн үүнийг ашиглахад ямар нэгэн эрх мэдэл шаардлагагүй тул буруугаар ашиглах хандлагатай байдаг. Gnupg буруу, энэ бол бүрэн сүйрэл юм. Хэрэв бид gnupg болон үүнтэй төстэй программуудын ашиглах эрхгүй шинэ интерфэйсийг нэмбэл бид дахин алдах болно."

Getrandom()-г нэмснээр одоо GnuPG-д энэ интерфэйсийг ашиглах боломжтой болно гэж Мюллер тэмдэглэв. GnuPG хөгжүүлэгч Вернер Кохтой хийсэн хэлэлцүүлэгт үндэслэн Мюллер баталгаа нь GnuPG одоогоор /dev/random-аас шууд уншиж байгаа цорын ганц шалтгаан гэж үзэж байна. Гэхдээ хэрэв үйлчилгээ үзүүлэхээс татгалзах боломжтой давуу эрхгүй интерфейс байгаа бол (өнөөдрийн хувьд /dev/random) үүнийг зарим программ буруугаар ашиглах болно гэж Лутомирский үзэж байна.

Линуксийн санамсаргүй тооны дэд системийг хөгжүүлэгч Теодор Юе Так Ц'о хаах сан хэрэгтэй гэсэн бодлоо өөрчилсөн бололтой. Энэ санг устгаснаар Линукс нь жинхэнэ санамсаргүй тоо үүсгэгчтэй (TRNG) гэсэн бодлоос үр дүнтэй ангижирна гэж тэр хэлэв. "Энэ бол дэмий зүйл биш, учир нь *BSD үргэлж ийм зүйл хийдэг байсан."

Тэрээр мөн TRNG механизмыг хангах нь програм хөгжүүлэгчдэд зүгээр л өгөөш болно гэж санаа зовж байгаа бөгөөд үнэндээ Линукс дэмждэг янз бүрийн төрлийн техник хангамжийг харгалзан цөм дэх TRNG-ийг баталгаажуулах боломжгүй гэж үзэж байна. Зөвхөн үндсэн эрхтэй тоног төхөөрөмжтэй ажиллах чадвар ч гэсэн асуудлыг шийдэж чадахгүй. "Аппликэйшн хөгжүүлэгчид аюулгүй байдлын үүднээс өөрсдийн програмыг root хэлбэрээр суулгасан байх ёстой. Ингэснээр та "үнэхээр сайн" санамсаргүй тоонуудад хандах боломжтой болно."

Мюллер Као өөрөө удаан хугацаанд санал болгож байсан хаах усан сангийн хэрэгжилтээс татгалзсан эсэхийг асуув. Цао хариуд нь Лутомирскийн засваруудыг авахаар төлөвлөж байгаа бөгөөд цөмд дахин блоклох интерфейс нэмэхийг идэвхтэй эсэргүүцэж байна.

“Цөм нь дуу чимээний эх үүсвэрийг зохих ёсоор тодорхойлсон эсэх талаар ямар ч баталгаа гаргаж чадахгүй. GPG эсвэл OpenSSL хөгжүүлэгчийн авч чадах цорын ганц зүйл бол TRUERANDOM нь "илүү сайн" гэсэн тодорхой бус мэдрэмж бөгөөд тэд илүү аюулгүй байдлыг хүсч байгаа тул үүнийг ашиглахыг оролдох нь дамжиггүй. Хэзээ нэгэн цагт энэ нь хаагдах бөгөөд өөр ухаалаг хэрэглэгч (магадгүй түгээлтийн мэргэжилтэн) үүнийг init скриптэд оруулаад системүүд ажиллахаа болих үед хэрэглэгчид зөвхөн Линус Торвалдс руу гомдол гаргахаас өөр аргагүй болно.

Цао мөн криптографчид болон TRNG хэрэгтэй байгаа хүмүүст хэрэглэгчийн орон зайд өөрийн энтропийг цуглуулах арга замыг хүссэнээрээ ашиглахыг дэмждэг. Тэрээр хэлэхдээ, энтропи цуглуулах нь цөм нь дэмждэг бүх төрлийн техник хангамж дээр гүйцэтгэх процесс биш бөгөөд цөм өөрөө өөр өөр эх сурвалжаас өгсөн энтропийн хэмжээг тооцоолж чаддаггүй.

"Цөм нь янз бүрийн дуу чимээний эх үүсвэрүүдийг хооронд нь холих ёсгүй бөгөөд энэ нь маш энгийн CPU дээр ямар нэгэн "твитчи энтропи тоглоом" тоглохыг оролдох үед хичнээн бит энтропи авч байгааг мэдэх гэж оролдох ёсгүй. хэрэглэгчийн хэрэглэгчдэд зориулсан архитектур. IOT/Embedded тохиолдлууд нь нэг мастер осциллятортой бүх зүйл синхрончлолгүй, регистрийн эрэмбийг өөрчлөх, нэрийг өөрчлөх CPU зааваргүй гэх мэт.”

"Та эдгээр тооцоог хийх гэж оролддог хэрэгслүүдээр хангах талаар ярьж болно, гэхдээ ийм зүйлийг хэрэглэгч бүрийн техник хангамж дээр хийх ёстой бөгөөд энэ нь ихэнх түгээлтийн хэрэглэгчдийн хувьд тийм ч хялбар биш юм. Хэрэв энэ нь зөвхөн криптографчдад зориулагдсан бол тэдний хэрэглэгчийн орон зайд хийгээрэй. Хүн бүр "бид "жинхэнэ санамсаргүй байдлыг" хүсч байгаа бөгөөд үүнээс бага зүйлд тохирохгүй" гэж хэлэхийн тулд GPG, OpenSSL гэх мэтийг хялбарчлахгүй байцгаая. Бид криптографчдад интерфэйсийг хэрхэн хангаж өгөх талаар ярилцаж болно, ингэснээр тэд тусгаарлагдсан, нэрлэсэн дуу чимээний үндсэн эх үүсвэрт хандах замаар шаардлагатай мэдээллээ авах боломжтой бөгөөд магадгүй ямар нэгэн байдлаар дуу чимээний эх үүсвэр нь номын сан эсвэл хэрэглэгчийн орон зайн програм руу өөрийгөө баталгаажуулж чадна."

Жишээлбэл, зарим үйл явдлын аюулгүй байдлын үр дагавар байж болох тул ийм интерфейс ямар байх талаар зарим нэг хэлэлцүүлэг байсан. Энтропийн цуглуулгын нэг хэсэг болгон гар скан код (жишээ нь товчлуур дарах) нь цөөрөмд холилддог гэдгийг Цао тэмдэглээд: "Үүнийг системийн дуудлагаар дамжуулан хэрэглэгчийн орон зайд оруулах нь хамгийн бага зүйл гэж хэлэх нь ухаалаг хэрэг биш юм." Бусад үйл явдлын цаг хугацаа нь хажуугийн сувгаар ямар нэгэн мэдээлэл алдагдах магадлалтай.

Тиймээс Линуксийн санамсаргүй тооны дэд системтэй холбоотой удаан хугацааны асуудал шийдэлд хүрэх замд орсон бололтой. Санамсаргүй тооны дэд системд саяхан гарсан өөрчлөлтүүд нь үүнийг ашиглах явцад зөвхөн DoS-тэй холбоотой асуудлуудад хүргэсэн. Цөмийн өгч чадах хамгийн сайн санамсаргүй тоог авах үр дүнтэй аргууд одоо байна. Хэрэв Линукс дээр TRNG нь зүйтэй хэвээр байгаа бол энэ алдааг ирээдүйд засах шаардлагатай боловч үүнийг цөм дотор хийхгүй байх магадлалтай.

Зарим зар 🙂

Бидэнтэй хамт байсанд баярлалаа. Манай нийтлэл танд таалагдаж байна уу? Илүү сонирхолтой контент үзэхийг хүсч байна уу? Захиалга өгөх эсвэл найзууддаа санал болгох замаар биднийг дэмжээрэй, 4.99 доллараас эхлэн хөгжүүлэгчдэд зориулсан үүлэн VPS, Бидний танд зориулж бүтээсэн анхны түвшний серверүүдийн өвөрмөц аналоги: VPS (KVM) E5-2697 v3 (6 цөм) 10GB DDR4 480GB SSD 1Gbps-ийн 19 ам.долларын үнэ эсвэл серверийг хэрхэн хуваалцах тухай бүх үнэн үү? (RAID1 болон RAID10, 24 хүртэлх цөм, 40 ГБ хүртэл DDR4-тэй байх боломжтой).

Амстердам дахь Equinix Tier IV дата төвд Dell R730xd 2 дахин хямд байна уу? Зөвхөн энд 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ 199 доллараас Нидерландад! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 доллараас! тухай уншина уу Дэд бүтцийн корпорацийг хэрхэн барих вэ. нэг пенни нь 730 еврогийн үнэтэй Dell R5xd E2650-4 v9000 сервер ашиглах анги?

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх