Випуск RUST 1.98.0. Компрометація пакету arrayref, що налічує 53 млн завантажень за 3 місяці

Опубліковано реліз мови програмування Rust 1.98, заснованого проектом Mozilla, але нині розвивається під заступництвом незалежної некомерційної організації Rust Foundation. Мова сфокусована на безпечній роботі з пам'яттю та надає засоби для досягнення високого паралелізму виконання завдань, при цьому обходячись без використання збирача сміття та runtime (runtime зводиться до базової ініціалізації та супроводу стандартної бібліотеки).

Методи роботи з пам'яттю в Rust націлені на виключення помилок при маніпулюванні вказівниками та захист від проблем, що виникають через низькорівневу роботу з пам'яттю, таких як звернення до області пам'яті після її звільнення, розіменування нульових покажчиків, вихід за межі буфера і т.п. Для поширення бібліотек, забезпечення збирання та управління залежностями проектом розвивається пакетний менеджер Cargo. Для розміщення бібліотеки підтримується репозиторій crates.io.

Безпечна робота з пам'яттю забезпечується в Rust під час компіляції через перевірку посилань, відстеження володіння об'єктами, облік часу життя об'єктів (області видимості) та оцінку коректності доступу до пам'яті під час виконання коду. Rust також надає засоби для захисту від цілих переповнень, вимагає обов'язкової ініціалізації значень змінних перед використанням, краще обробляє помилки в стандартній бібліотеці, застосовує концепцію незмінності посилань і змінних за умовчанням, пропонує сильну статичну типізацію для мінімізації логічних помилок.

Основні нововведення:

  • Для типів з плаваючою комою f32 і f64 реалізовані методи алгебри для складання, віднімання, множення, поділу і знаходження залишку, що реалізують оптимізацію, схожу на опцію «-ffast-math» в компіляторах C/C++. Подібні методи допускають зміну порядку операцій, коли це необхідно для оптимізації, таких як векторизація циклів. Наприклад, при обчисленні "a + b + c + d" при використанні звичайної додавання компілятор завжди виконає обчислення в одному порядку "((a + b) + c) + d", а при використанні методу algebraic_add може згрупувати вираз як "(a + b) + (c + d)" і виконати "(a + b)" і "c". Ціною застосування методів алгебри є недетермінованість результатів обчислення, які можуть змінюватися в межах похибки.
  • Для всіх примітивних цілих типів реалізовано вбудований метод «format_into» для перетворення чисел у рядки, який може застосовуватися замість пакета itoa. Як параметр передається буфер NumBuffer розмір якого гарантовано достатній для запису будь-якого значення використовуваного типу в десятковому вигляді. На виході повертається відформатований рядок &str, час життя якого прив'язаний до буфера.
  • Взаємодія між обв'язкою ManuallyDrop та розумним покажчиком Box тепер не призводить до невизначеної поведінки.
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • str::substr_range
    • [T]::subslice_range
    • core::fmt::NumBuffer
    • <{integer}>::format_into
    • Send/Sync for std::process::CommandArgs
    • {fN}::algebraic_add
    • {fN}::algebraic_sub
    • {fN}::algebraic_mul
    • {fN}::algebraic_div
    • {fN}::algebraic_rem
    • NonZero<{integer}>::from_str_radix
    • String::from_utf16le
    • String::from_utf16le_lossy
    • String::from_utf16be
    • String::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • Atomic ::from_mut
    • Atomic ::get_mut_slice
    • Atomic ::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, для яких забезпечений третій рівень підтримки. Третій рівень охоплює базову підтримку, але без автоматизованого тестування, публікації офіційних збірок та перевірки можливості складання коду.

Додатково можна відзначити компрометацію популярного crate-пакету arrayref, що налічує понад 53 млн завантажень за останні 90 днів і застосовується як залежність у 403 пакетів. Атакуючі розмістили в репозиторії 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.

З супроводжуючим ареямиреф поки не вдалося зв'язатися для прояснення ситуації, але передбачається, що його облікові дані були перехоплені зловмисниками. У пакеті 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