Vydání Rust 1.98.0. Kompromitace balíčku arrayref, který měl 53 milionů stažení za 3 měsíce

Byl vydán nový jazyk programování Rust 1.98, původně vyvinutý projektem Mozilla, nyní rozvíjený pod záštitou nezávislé neziskové organizace Rust Foundation. Jazyk se zaměřuje na bezpečné zacházení s pamětí a poskytuje prostředky pro dosažení vysokého paralelismu vykonávání úloh, přičemž se obejde bez použití garbage collectoru a runtime (ten se redukuje na základní inicializaci a údržbu standardní knihovny).

Metody manipulace s pamětí v Rustu se zaměřují na eliminaci chyb při manipulaci s ukazateli a poskytují ochranu proti problémům vyplývajícím z nízkoúrovňové práce s pamětí, jako je přístup k uvolněné oblasti paměti, dereference nulových ukazatelů, přetečení bufferu atd. Pro distribuci knihoven, zajištění sestavení a správu závislostí se vyvíjí balíčkový manažer Cargo. Pro ukládání knihoven je podporován repozitář crates.io.

Bezpečné manipulace s pamětí jsou v Rustu zajištěny během kompilace prostřednictvím kontroly referencí, sledování vlastnictví objektů, zohlednění doby života objektů (viditelnosti) a hodnocení správnosti přístupu k paměti při vykonávání kódu. Rust také poskytuje prostředky pro ochranu proti přetečení celých čísel, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, aplikuje koncept neměnnosti (immutable) referencí a proměnných ve výchozím nastavení a nabízí silnou statickou typizaci pro minimalizaci logických chyb.

Hlavní novinky:

  • Pro typy s plovoucí desetinnou čárkou f32 a f64 byly implementovány algebraické metody pro sčítání, odčítání, násobení, dělení a nalezení zbytku, které realizují optimalizaci podobnou volbě „-ffast-math“ v kompilátorech C/C++. Tyto metody umožňují změnu pořadí operací, když je to potřebné pro optimalizace, jako je vektorizace cyklů. Například při výpočtu „a + b + c + d“ používající běžné sčítání kompilátor vždy provede výpočet v jednom pořadí „((a + b) + c) + d“, zatímco při použití metody algebraic_add může seskupit výraz jako „(a + b) + (c + d)“ a provést „(a + b)“ a „(c + d)“ paralelně pomocí instrukcí SIMD. Cena za použití algebraických metod je nedeterminovanost výsledků výpočtu, které se mohou měnit v rámci chyby.
  • Pro všechny primitivní celočíselné typy byl implementován vestavěný метод „format_into“ pro převod čísel na řetězce, který může být používán jako alternativa k balíčku itoa. Jako parametr se předává buffer NumBuffer, jehož velikost je zaručeně dostatečná pro zapsání jakékoli hodnoty používaného typu v desítkovém formátu. Na výstupu se vrací naformátovaný řetězec &str, jehož doba životnosti je vázána na buffer.
  • Interakce mezi obalovým typem ManuallyDrop a chytrým ukazatelem Box nyní nevede k nedefinovanému chování.
  • Nová sada API byla převedena do stabilního stavu, včetně stabilizovaných metod a implementací typů:
    • str::substr_range
    • [T]::subslice_range
    • core::fmt::NumBuffer
    • ::format_into
    • Send/Sync pro std::process::CommandArgs
    • {fN}::algebraic_add
    • {fN}::algebraic_sub
    • {fN}::algebraic_mul
    • {fN}::algebraic_div
    • {fN}::algebraic_rem
    • NonZero::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
  • Cílové platformy thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf a thumbv8r-none-eabihf byly převedeny na druhou úroveň podpory, která zahrnuje záruku sestavení, ale žádné záruky při absolvování testovací sady.
  • Byla přidána podpora pro platformy powerpc64-unknown-linux-gnuelfv2 a aarch64-unknown-linux-pauthtest, pro které je zajištěna třetí úroveň podpory. Třetí úroveň zahrnuje základní podporu, ale bez automatizovaného testování, publikace oficiálních sestavení a ověření proveditelnosti kódu.

Dále lze zmínit kompromitaci populárního crate balíčku arrayref, který zaznamenal více než 53 milionů stažení za posledních 90 dní a je používán jako závislost u 403 balíčků. Útočníci umístili do repozitáře crates.io nové balíčky proc-macro1, proc-macro-en, aovine, arone, aronenao a tinymember, obsahující škodlivý kód. Následně byly v repozitáři publikovány nové verze balíčků arrayref 0.3.10, internment 0.8.7 a append-only-vec 0.1.9, do kterých byl jako závislost přidán škodlivý balíček proc-macro1. Škodlivá verze balíčku arrayref byla umístěna 20. srpna v 10:15 (MSK) a existovala do 11:41, poté byla odstraněna administrátory crates.io.

S doprovodem arrayref se dosud nepodařilo spojit pro objasnění situace, ale předpokládá se, že jeho přihlašovací údaje byly odcizeny útočníky. V balíčku proc-macro1 bylo škodlivé změny přítomno ve skriptu pro sestavování a provádělo stahování spustitelného souboru z externího. serveruStahovaný soubor byl v Unixových systémech ukládán jako /tmp/rust-setup, a ve Windows jako %TEMP%\rust-setup.ps1 nebo %TEMP%\rust-setup-launch.vbs.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster