Btw. pekny priklad je opravena zranitelnost v KDE: https://www.theregister.co.uk/2018/02/12/kde_naming_usb_drive_vuln/
Problém je hlubší než se na první pohled zdá...programátor volající nějakou funkčnost nemá samozřejmě ani páru, jakým způsobem je ona funkcionalita v nějaké nizkoúrovňové knihovně naprogramována....narozdíl od SQL, kde přeci jenom musí být přítomen nebo propagován Connection, a jde celkem odtušít, kde číhá nebezpečí.
Primárně by si měl každý programátor okolní svět zawrapovat do funkci a objektů. Jakékoliv inline sestavování query v kódu je automaticky stopka při code review.
Ale dělá se to často. Viděl jsem mnohokrát jak si programátor sestavuje například RPC volání jako XML v řetězci než aby si napsal plnohodnotného klienta. Možná že má v kódu jen jedno takové volání. Ne, on tam volal každou chvíli něco a všechna volání sestavovat inline jako string
Proto je lepší postavit validace na podmínce "vstupní řetězec musí obsahovat toto..." namísto "vstupní řetězec nesmí obsahovat toto..."
Pokud se očekává url, musí začínat http:// nebo https:// samozřejmě je dobre prohnat tu url do regexpem
Vícenásobné možnosti vyjádření vstupu je lepší neumožnit, trvat na přesně formě.
Ono jde hlavne o to, ze kdyz mas vstup, kde ma byt URL, tak zajistit, aby se to nijak jinak nez jako URL nedalo pouzit. A ne ze nekdo veme vstup, posle ho nejakym parseru a ten z toho trebas zjisti, ze ma vlastne spustit rm -rf. Coz jaksi tvurce vubec nepobral, protoze on prece pouziva tu uzasnou knihovnu (nebo ten uzasnej frejmwork) aby se timhle nemusel zebejvat.
Je to stejny, jako kdyz v kodu vidis try (a+b) catch "asi to neni cislo". 0xAC47 ... ovsem tahle vec jako cislo klidne veme. A to se pak dejou veci ... kdyz trebas aplikace tvrdi, ze A + B = 21 ;D.
Ktera bezna utilita vezme argv[] a prohani to nejakym urldecoderem? Pak at' si klidne "2f%65%74%63%2f%70%61%73%73%77%64 " otevira ...
Chtel jsem tim jen rict, ze volani system() vnasi celou radu problemu, o kterych autor aplikace ani nemuze tusit (protoze treba jen nevi co je /bin/sh). namatkou zneuziti $VAR v ruznych formach zapisu , `cat /etc/passwd`, "... ; cat /etc/passwd", hvezdickove doplneni, ... atd.
U execve resime jen bezpecnost volane aplikace, u system() navic i shellu, ktery dneska umi pomalu uvarit i kafe.