ano, není to vhodné, viz zranitelnost ssh agenta, https://www.qualys.com/2023/07/19/cve-2023-38408/rce-openssh-forwarded-ssh-agent.txt, kvůli tomu nejspíš i tenhle patch vznikl a až po testování se ukazuje, že dopad je daleko větší než si zaslouží setinkový update.
Ve skutečnosti upstream i udržuje ty větve dlouhodoběji. Například i zde je úplně nový commit: https://sourceware.org/git/?p=glibc.git;a=shortlog;h=refs/heads/release/2.34/master
Napíše ho docela jednoduše. Stačí když použije GNU C a nested functions, to vede na executable stack a spouštení kódu na stacku. Tady je to hezky popsáno: https://nullprogram.com/blog/2019/11/15/
Kde zaver toho clanku je asi najdolezitejsi:
"Nested C closures are super slick, but they’re just not worth the risk of an executable stack, and they’re certainly not worth an entire toolchain being fail open about it."
Dakujem ale za clanok. Dozvedel som sa v nom nieco velmi zaujimave a musim vyskusat (myslim skutocne, nie ironicky, ak by to tak nahodou vyznelo).
To jo, pritom by stacilo kdyby prekladac z takove funkce udelal static, pridal tam pointer na strukturu s pouzitymi argumenty od volajici funkce.. a za malej vykonovej rozdil ta funkce nemusi byt na stacku. Lokalni funkce nebude v exportech, takze realna implementace je soukromou zalezitosti prekladace.
Staci na to option v GCC, aby to nebylo na stacku.. a muzou se vsechny projekty prelozit spravne. Ze je to nenapadlo.. kdyz vymysleli flagy a optiony pro executable-stack ,)
To se mi nezda.
- static nebude ani reentrantni, ani thread-safe
- pokud to propasirujete pres nejakou "cizi" funkci, treba ze standardni knihovny (cokoli, co ma nejaky callback - qsort), jak presne tomu ten pointer predate? global variable nezafunguje, strcit to do thread local storage - porad to nebude reentrantni.
Tak pokud lokalni funkce odvozovala svuj kontext relativne od EIP, tak se lze stejneho vysledku dopatrat skrze stack-unwinding nez se nalezne frame s rodicovskou funkci podle adresy (ktera je znama kompilatoru). Ale tak moderni PIC do toho pak taky hodi vidle a byla by potreba soucinnost linkeru, aby se ziskala VA rodicovske funkce.
Jako je to hodne drbani - jako trest za to, ze callback nema void* context jako jeden z argumentu.
(muj codebase tohle ma, protoze jedu takove poor man OOP v C, kde funkce jsou spis metody a je treba kontext dodavat explicitnim *this)
Bojim se, ze i to by vedlo k dost nehezkym vedlejsim efektum (ono by snad i stacilo, aby nekde po ceste na stacku neco nemelo frame pointer, a uz by se z deterministickeho unwindingu stala heuristika ;-) )
ad poor man OOP - jojo neco podobneho taky pouzivam, *this resp tabulka "metod" je dobra vec i u mostly proceduralnim programovani. Ale tezko to vnutit kompileru, ktery se musi drzet jak ABI, tak i standardu jazyka.
BTW na celem problemu me spis zarazi zpusob zarazeni patche. Timhle zpusobem neco rozbit bych chapal u nejakeho specifickeho programu, ale ne u knihovny, kterou pouziva uplne vsechno...