Zkompiloval jsem si obě verze a takovéhle vidím velikosti binárek:
coreutils 0.0.17 (rust) 14,9 MB
coreutils 9.1 13,5 MB
V čem tedy vidíš problém nebo jak to porovnáváš? Původní coreutils používají hodně linkovaných knihoven, naopak rustové mají trochu jinou strukturu a nelinkují si mezi sebou, buď se pak distribuují po jednotlivých binárkách, které obsahují duplicitní kód nebo naopak v jedné binárce, které se symlinkuje.
Můžeš nějak podložit tvoji tezi ohledně přesunutí CVE?
Malware gangy zakládají CVE? :)
Coreutils mají málo CVE protože jsou to primitivní jednorázové programy s malým attack surface a minimálním užitkem. Nemají suid bit, s výjimkou prakticky nepoužívaných programů jako finger nemají síťové rozhraní, takže pro prakticky všechny útoky už útočník stejně musí mít lokální shell nebo schopnost zapsat soubor, a tím pádem nemá moc co útokem na coreutils získat.
14. 2. 2023, 14:46 editováno autorem komentáře
Alebo to bude inak - tým, že sú to primitívne jednoúčelové programy, nie je v nich toľko priestoru, kde by sa mohla chyba nepozorovane ukrývať. Pozeral som z istého dôvodu trebárs zdroják programu "ping" (OK, to nie je coreutils ale iputils, ale princíp je podobný), a dohromady v ňom skoro nič nebolo.
> pro prakticky všechny útoky už útočník stejně musí mít lokální shell nebo schopnost zapsat soubor
Útok lze provést i souborem staženým od útočníka. To je problém třeba u less (vím, není z coreutils) se zapnutou lesspipe. Je to spíše o tom, že i pokud ty programy pracují s nedůvěryhodným vstupem, reálně na tom dělají takovou práci, kde není tolik co pokazit, aniž by se to projevovalo při běžném provozu. Třeba md5sum v podstatě stačí číst bloky dat konstantní délky, cpát je do kompresní funkce, a na konci se vyrovnat s tím, že může přijít necelý blok. Oproti tomu taková lesspipe si to komplikuje tím, že umí zpracovat hromadu formátů, a u některých už je toho víc co pokazit…
Jasně, ale absolutní bezpečnost garantovaná nějakým jazykem s formální verifikací je extrémně drahá (na čas vývoje) a navíc jen hrstka vývojářů je schopna příslušný kód napsat, protože to je prostě hodně náročný a specifický skill. U projektů tohoto typu holt musí stačit iluze bezpečnosti, jakkoliv se nám to nemusí líbit.
> Jasně, tento typ "bezpečnosti" Rust celkem zvládne, ovšem stejně dobře by posloužilo i (moderní) C++.
Jo, teoreticky tomu nic nebrání. V praxi: https://github.com/fish-shell/fish-shell/pull/9512
Tady k tématu obecněji: https://mmapped.blog/posts/15-when-rust-hurts.html
“Accidental complexity” sedí jak p…l na hrnec. Tady tedy na Rust. Bylo by hezké mít nějaký jazyk s výhodami Rustu, ale bez jeho nevýhod, problémů a WTFs. Možná už se něco rýsuje.
Zběžně jsem to prolítl:
a. Ano, jsou tu nějaké věci, které by snad šlo zlepšit bez větších negativních dopadů. Třeba ten pattern matching. Na to je ale mnohem jednodušší se snažit upravit stávající jazyk…
b. Jsou tu věci, které jsou někdy otravné, ale mají v Rustu dobrý důvod. Kdybychom je chtěli vyřešit, nejspíš nezískáme lepší nebo horší jazyk, ale získáme jiný kompromis. To je případ Common expression elimination.
c. A pak jsou tu povzdechy nad tím, že Rust nevyřeší vše. Ano, nevyřeší, například FS v principu je stav sdílený s ostatními procesy. Zejména u problémů, které sám o sobě zřejmě neřeší žádný jazyk, to zavání nirvana fallacy. Ano, je dobré o tom vědět a myslet na to, když je to relevantní, ale není to nevýhoda Rustu oproti konkurenci…
A naopak člověk pracující léta v Rustu, který nikdy nepoužil C/C++ si nyní chybu najde hned, zatímco dosud byl namydlenej. Ale že obou táborů jsou masivní zástupy, já třeba běžně potkávám stovky důchodců, co se vrtají v C-čkových Coreutils, jak se ve frontě u kasy hádají s mladejma hejskama, co jedou jenom Rust.
Rust je hlavně navržen tak, aby se různým typům chyb dalo vyhnout. C bude jazyk pro podobné aplikace už navždy nevhodný. C++ je jiná story, ale v C++ ty původní utils napsány nejsou. Pokud někdo udělá alternativní projekt přepsání do C++, bylo by to zajímavé srovnání, každopádně nikdo nikomu nebrání to přepsat do Sparku, C++, D nebo Nimu. Akorát by se někomu muselo chtít a ideálně tak dlouho, aby to dopsal.
Jenže vtip je v tom, že ta portace, aby měla nějaký význam, by musela být idiomaticky rozdílná od toho originálu, jinak to nemá moc smysl. Když si otevřeš zdrojáky třeba tohohle: https://github.com/coreutils/coreutils/tree/master/src , tak to fakt převádět do C++ nebo jiného jazyka takhle mechanicky nechceš, chceš to zahodit a napsat znovu jinak. Nebo jsi myslel portaci z Rustu?
zapomněl jsi zohlednit, že tohle je osobní aktivita několika málo lidí. Celý open source a linux je založený na diverzifikaci kódu, na různých alternativách toho stejného, na pročišťování věcí, které jsou příliš zaneseny historickým smetím.
GNU coreutils nikdo nezabíjí, stejně jako je nezabil busybox (což je také přepsání coreutils, že).
U tohohle je super, že je to multiplatformí, neustálé přechody mezi BSD, busybox a GNU mě občas dokážou pěkně potrápit a vznikají občas zbytečné chyby, sjednotit tohle nějak, proč ne.
K úpravě coreutils ti ale pouze znalost C nestačí, musíš znát vnitřní logiku a strukturu, syscally na linuxu (či jiných platformách), znalost jazyka je naopak za mě ten minoritní problém. Pokud objevíš chybu, tak i její reportování, zdokumentování a poskytnutí chybového scénaře přece výrazně pomůže k opravě někomu, kdo kódu rozumí.
Z kontextu odhaduji, že to měly být standardy místo protokoly a byla to narážka na https://xkcd.com/927. A nebo taky ne :-).
Malá poznámka: autor Sylvestre Ledru v poslední prezentaci na FOSDEM objasňuje, že důvodem přepsaní není ani změna licence GPL/MIT ani větší bezpečnost. V GNU Coreutils se našlo od 2003 jen 17 CVE.
https://sylvestre.ledru.info/presentations/coreutils-fosdem-2023/#25