A co zranitelnost, že napadený server může poslat jiný obsah souboru, než na něm je? Třeba kopíruji ze vzdáleného serveru skript, server mi podstrčí škodlivý kód, já ho v dobré víře spustím (kdo kontroluje známý skript, který si právě zkopíroval z jiného serveru) a voilá, můj počítač je napadený! Na to CVE a fix je? ;)
Ked uz je raz server kompromitovany to je velky problem. A asi preto existuju aj tieto zranitelnosti v klientovi lebo autor klienta to chape rovnako. Ak je server kompromitovany pan boh nam pomahaj, klient uz si velmi nepomoze. Ale OK, opravia dalsie chyby, ide sa delej. Je dobre ze sa niekto venuje takymto veciam.
Tak ty klíče snad jsou v ~/.ssh/authorized_keys a ~/.ssh/known_hosts, ne? Nastavím pro /home/*/.ssh jako vlastníka root, povolení k zápisu jenom pro vlastníka, zákaz připojení roota na dálku a pak má útočník jedinou možnost - SSH + su s heslem na roota... Nějaký SCP se další spojení nepřidá. Ani klient, ani server. Ani oblbnutý uživatel.
LOKÁLNĚ si nastavím práva a vlastníka k souborům v /home/$user/.ssh tak, aby je $user nemohl spustit.
SSH klient v kontextu uživatele $user pak nemůže měnit ani přidávat klíče. Uživatel $user si bez SU nemůže přidat další servery, na který se smí připojit. A dokonce ani smazat/přegenerovat klíče, takže ti odpadne řešení situací, že včera to fungovalo a dneska ne.
Zákaz přihlášení jako root je standardní doporučovaná věc, přihlásíš se jako jiný uživatel a přepneš se přes SU.
Co je v tom za problém?
Za prve otazka. Mas to tak urobene? Ci az ako reakcia na tieto chyby ktore aj tak opravia.
Za druhe ak ti moze prepisat akykolvek subor tak nemusi ist cez ~/.ssh moze ti urobit uplne hocico, prepisat bashrc, nahrat celeho noveho ssh klienta ktory kasle na tvoj ~/.ssh a nastavit PATH, ... fantazii sa medze nekladu.
Jistě, proto je celý ten původní příspěvek od L. úplně mimo mísu. Tohle prostě není typ problému, který lze vyřešit na straně klienta, leda by ten klient měl o obsahu kopírovaného souboru dodatečnou informaci odjinud (typicky nějaký checksum), pomocí které dokáže pravost obsahu toho souboru ověřit.
Co to kecáš? Když nemáš obsah souboru s čím porovnat, jak chceš ověřit jeho správnost? Pokud jde o seznam souborů, které chceš kopírovat (včetně nějakého blacklistu, který zabrání přepisu některých lokálních souborů), ten si můžeš na klientovi definovat a porovnat se seznamem souborů, které přicházejí ze serveru, a podle toho se zachovat. S obsahem souboru to uděláš jak?
Vtip je v tom, že ani ten "správný" seznam souborů na klientovi (v některých případech) nesestavíš. Protože prostě nevíš, které soubory na serveru reálně jsou a které ne. Polopaticky. Dám příkaz:
scp server:adresar/.* ~
Server pošle soubor (třeba) .bashrc. Jak rozhodneš, jestli je "opravdový" a máš ho uložit a zkopírovat, nebo jestli je podvržený? Nezjistíš, stejně jako v mém příkladu nezjistíš jestli ten skript je nebo není podvržený (leda by ho prozkoumal člověk, což ovšem v 99.99% případů neudělá).
Celý ten můj příspěvek byl takový inteligenční test, jestli lidem tahle analogie dojde nebo ne. Ty jsi evidentně neprošel. Ale nevěš hlavu, aktuální skóre je že 7 lidi prošlo a 10 ne, takže jsi s většinou.
Ne, bug je v tom, že server může poslat DO CÍLOVÉHO ADRESÁŘE i jiné soubory. Tedy problém je pouze pokud kopírujete do home. Že by server mohl uložit soubory i do adresáře nadřazeného cílovému se v popisu chyby nepíše. Viz: https://sintonen.fi/advisories/scp-client-multiple-vulnerabilities.txt
Ne nula, ale k nule se to limitně blíží. Už proto, že remote AFAIK nezná cílový adresář, takže by soubory musel posílat naslepo. A když by se ti začaly při kopírování ze serveru v cílových adresářích objevovat .bashrc, .ssh/authorized_keys a další soubory s podezřelým obsahem, tak bys asi zpozorněl.
Tvle to je zes chyba s velkym CH ... (a zdejsi banda tardu zas vede diskusi s velkym, D)
Co ze asi tak udela klient, kdyz se pripoji? Nj, rekne si o seznam souboru(a linku/adresaru) v aktualni ceste ... a co ze se asi tak dela, kdyz se neco kopiruje? Mno to samy jako lokalne ze ... tzn kdyz dam kopirovat celej folder, tak taky nikdo neresi, jesli tech souboru vevnitr je 10 nebo 11. Ale jo, muzeme to delat frikulinsky, nejdiv se nacte seznam vsech souboru (trebas 100k), pak se predhodi userovi ke kontrole (lol) a pak bude klient pekne jeden podruhym asi tak 100000x dyl kopirovat (megalol).
BTW: Prave sem analyzoval ... sambu, chova se uplne stejne. NFS jakbysmet ... jinak receno, kdyz mi "zlej" server pri kopirovani cely struktury do ni vlozi nejaky dalsi soubory, tak je ... zcela vzdy a kazdej klient (vcetne blbyho cp) ... co jinyho nez zkopiruje.
Co přesně ti přijde idiotského na něčem ve stylu scp -r foo.bar:/archive/bak/ ~
Dokud v home bak nemám předpokládanám, že scp dělá, co mu řekneš a ne, co mu řekne server, tak moc problémů nevidím. (Sám obvykle tlačím všechno přes ~/Downloads ale to je spíš zlozvyk starého muže než příklad hodný následování.)
Samozřejmě, že nepozná. Ale ať tam je nebo není, tak v prvním případě (bez wildcards) by neměl korektní klient co psát do .bashrc. S touhle chybou může, pokud si o to server řekne.
S těma wildcards se můžeš dočkat celé řady překvapení... už jen protože o jejich expanzi se v prvním kole postará tvůj lokální shell.
Pravda, ten příklad nebyl úplně korektní, moje chyba. AFAIK
scp -r 'server:adresar/.*' ~
by expanzi provádělo až na remote.
Každopádně jsme se od striktního "Data ze serveru jsou vstup a nutno validovat." dostali k tomu, že to vlastně (v některých případech) nejde. A o to mi šlo.
Jenomže on je rozdíl, když si řekneš o přepsání čehokoli a když ne... a chyba s nevalidováním ti stejně hodí do předpokladů vidle.
A pochopitelně i v tom případě s wildcards proběhne spousta validací... a tak například server utře, když záludně pošle cesty s ../ kterými by vyskákal mimo cílový adresář.