Rust 1.98.0 нұсқасы: 3 айда 53 миллион рет жүктелген arrayref пакетінің бұзылуы

Mozilla жобасы негізін қалаған, бірақ қазір тәуелсіз Rust Foundation бейкоммерциялық ұйымының қолдауымен әзірленген Rust 1.98 бағдарламалау тілі шығарылды. Тіл жад қауіпсіздігіне назар аударады және қоқыс жинағышты және орындалу уақытын қолданбай орындай отырып, тапсырмаларды орындаудың жоғары параллельділігіне қол жеткізу үшін құралдарды ұсынады (орындау уақыты стандартты кітапхананың негізгі инициализациясы мен қызмет көрсетуіне дейін қысқарады).

Rust компаниясының жадты басқару әдістері көрсеткішті манипуляциялаудағы қателерді жоюға және жадты босатқаннан кейін оған қол жеткізу, нөлдік көрсеткіштерді алып тастау, буфердің артық жүктелуі және т.б. сияқты төменгі деңгейлі жадты басқарудан туындайтын мәселелерден қорғауға арналған. Жоба кітапханаларды тарату, құрастыруды жеңілдету және тәуелділіктерді басқару үшін Cargo пакет менеджерін әзірлеуде. crates.io репозиторийі кітапханаларды орналастыру үшін сақталады.

Жадтың қауіпсіздігі Rust бағдарламасында компиляция уақытында анықтамалық тексеру, объект иеленуін қадағалау, объектінің қызмет ету мерзімін (аумақтарын) қадағалау және кодты орындау кезінде жадқа қол жеткізудің дұрыстығын бағалау арқылы қамтамасыз етіледі. Rust сонымен қатар бүтін сандардың толып кетуінен қорғауды қамтамасыз етеді, пайдалану алдында айнымалы мәндерді міндетті түрде инициализациялауды талап етеді, стандартты кітапханада қателерді жақсы өңдейді, әдепкі бойынша өзгермейтін сілтемелер мен айнымалылар тұжырымдамасын қолданады, логикалық қателерді азайту үшін күшті статикалық теруді ұсынады.

Негізгі инновациялар:

  • f32 және f64 қалқымалы нүктелі түрлері үшін қосу, азайту, көбейту, бөлу және қалдық амалдарының алгебралық әдістері енгізілген, бұл C/C++ компиляторларындағы "-ffast-math" опциясына ұқсас оңтайландыруларды жүзеге асырады. Бұл әдістер цикл векторизациясы сияқты оңтайландырулар үшін қажет болған жағдайда операциялардың ретін өзгертуге мүмкіндік береді. Мысалы, кәдімгі қосуды пайдаланып "a + b + c + d" есептеу кезінде компилятор есептеуді әрқашан сол ретпен орындайды: "((a + b) + c) + d", бірақ algebraic_add әдісін қолдана отырып, ол өрнекті "(a + b) + (c + d)" ретінде топтастырып, SIMD нұсқауларын қолдана отырып, "(a + b)" және "(c + d)" амалдарын параллель орындай алады. Алгебралық әдістерді қолданудың бағасы есептеу нәтижелерінің анықталмағандығында, ол қателік шегінде өзгеруі мүмкін.
  • Барлық қарабайыр бүтін сан түрлерінде сандарды жолдарға түрлендіруге арналған кіріктірілген "format_into" әдісі бар, оны itoa пакетінің орнына пайдалануға болады. NumBuffer буфері параметр ретінде беріледі. , оның өлшемі пайдаланылған типтің кез келген мәнін ондық түрде жазуға жеткілікті деп кепілдік беріледі. Шығысы - бұл пішімделген &str жолы, оның өмір сүру уақыты буферге байланысты.
  • ManuallyDrop сымдары мен Box ақылды көрсеткішінің өзара әрекеттесуі енді анықталмаған әрекетке әкелмейді.
  • API жаңа бөлігі тұрақты санатқа ауыстырылды, оның ішінде белгілердің әдістері мен іске асырылуы тұрақтандырылды:
    • str::substr_range
    • [T]::субслич_диапазоны
    • core::fmt::NumBuffer
    • <{бүтін сан}>::format_into
    • std::process::CommandArgs үшін жіберу/синхрондау
    • {fN}::algebraic_add
    • {fN}::алгебралық_қосалқы
    • {fN}::алгебралық_муль
    • {fN}::алгебралық_див
    • {fN}::алгебралық_тізім
    • Нөлдік емес<{бүтін сан}>::from_str_radix
    • Жол::from_utf16le
    • Жол::from_utf16le_lossy
    • Жол::from_utf16be
    • Жол::from_utf16be_lossy
    • [T]::жолақ_циркумфикс
    • str::strip_circumfix
    • Атомдық ::from_mut
    • Атомдық ::get_mut_slice
    • Атомдық ::from_mut_slice
    • std::range::legacy
  • thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf және thumbv8r-none-eabihf мақсатты платформалары екінші қолдау деңгейіне ауыстырылды, оған құрастыру кепілдігі кіреді, бірақ сынақ жиынтығынан өтуге кепілдік жоқ.
  • powerpc64-unknown-linux-gnuelfv2 және aarch64-unknown-linux-pauthtest платформаларына қолдау қосылды, олар қазір 3-деңгейде қолдауда. 3-деңгей негізгі қолдауды қамтиды, бірақ автоматтандырылған тестілеуді, ресми құрастыру нұсқаларын немесе құрастыруды тексеруді қамтымайды.

Сонымен қатар, соңғы 90 күнде 53 миллионнан астам рет жүктелген және 403 пакет тәуелділік ретінде пайдаланылатын танымал crate arrayref пакеті бұзылды. Шабуылдаушылар crates.io репозиторийіне зиянды коды бар жаңа пакеттерді орналастырды: proc-macro1, proc-macro-en, aovine, arone, aronenao және tinymember. Кейіннен arrayref 0.3.10, internment 0.8.7 және append-only-vec 0.1.9 жаңа нұсқалары репозиторийге жарияланды, олардың әрқайсысы зиянды proc-macro1 пакетін тәуелділік ретінде қосты. arrayref пакетінің зиянды нұсқасы 20 тамызда сағат 10:15-те (MSK) жарияланды және сағат 11:41-ге дейін белсенді болды, содан кейін оны crates.io әкімшілері жойды.

arrayref қолдаушысымен жағдайды анықтау үшін әлі байланысқа шықпады, бірақ олардың тіркелгі деректерін шабуылдаушылар ұстап алды деп есептеледі. proc-macro1 пакетінде құрастыру скриптінде зиянды өзгеріс болды және сыртқы каталогтан орындалатын файлды жүктеді. серверЖүктелген файл Unix жүйелерінде /tmp/rust-setup ретінде сақталды және Windows — %TEMP%\rust-setup.ps1 немесе %TEMP%\rust-setup-launch.vbs.

Ақпарат көзі: opennet.ru

DDoS қорғауы бар сайттар үшін сенімді хостинг, VPS VDS серверлерін сатып алыңыз 🔥 DDoS қорғанысы, VPS VDS серверлері бар сенімді веб-сайт хостингін сатып алыңыз | ProHoster