Upřímně nechápu, jak někdo může udělat takovou chybu. Pořád se točíme kolem chyb, které jsou velmi podobné SQL Injection, akorát tentokrát se injectuje commandline. Copak nikdo nikdy neescapuje? Když někde lepím nějaké stringy, proč se třeba nad tím ten programátor nezamyslí a nepředstaví si, co by se stalo, kdybych tam zadal něco, co není správně. A k čemu všemu jsou všechny ty testy, když tohle neodchytí.
Copak funkce execve nevyžaduje každý parametr jako samostatný string, takže je třeba nemožné, aby někdo z jednoho parametruy udělal dva (což předpokládám, že ta option bude vyžadovat ještě argument)?
Mimochodem, jak jde přes git clone spustit libovolný kod? Neříkejte mi, že to třeba ještě interpretuje nějaké bashové zkratky jako třeba zpětný apostrofy, atd...
Ty parametry jsou escapované a správně předané přes execve, ale dětský proces je pochopí jako volby (options), protože začínají pomlčkou. Krátké volby (třeba -c) mohou být následované argumenty bez mezery.
Libovolný kód lze spustit třeba tak, že přimějete git tam stáhnout post-checkout skript.
To je nesmysl, pořád potřebuju předat i platnou URL, protože bez ní git-clone nefunguje, takze to muze vypadat treba takto
-xoption url
ale protože v tom případě už tam musím mít mezeru, tak pak uz nejsem omezen krátkými options
A k druhé části, o čem ta chyba vlastně je? Nestačilo by prostě tam dát url na závadný repozitář, který spustí post-checkout script?
Nehledě na to, že význam těch skriptů je daleko menší, než jejich nebezpečnost, takže bych byl za, aby existovala volba clone repozitáře s globálním zákazem všech scriptů (pro daný repozitář a všechny submoduly rekurzivně)
Ten příkaz spustí git clone URL adresář
. Pokud jedno nahradíš za volbu, stále to má dost parametrů, protože adresář je nepovinný parametr. (Pokud nahradíš URL, tak clone selže, ale lze tam dát třeba pre-fetch hook.)
post-checkout (a další hooky) se normálně neklonuje, právě kvůli bezpečnosti. Ta volba existuje, ale právě pomocí -c ji lze přepsat.
Znám podobnou chybu, v BASHi. Pokud do skriptu vložím skript třetí strany, stahovaný automaticky třeba pomocí WGET a někdo tam na serveru pozmění stahovaný skript, spustím si kdoví co. Tak to prostě je.
Kua, co čekali, když se událostí dá automaticky spustit nějaká událost v podobě skriptu?