CVE-2014-6271: remote code execution through bash
Régen létező hiba a Bash shellben, ami akár távolról kezdeményezett kódfuttatást is lehetővé tehet
■ H | K | Sze | Cs | P | Szo | V |
---|---|---|---|---|---|---|
28 | 29 | 30 | 31 | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 1 |
Akiket a lényeg érdekel
variable named by the function name, and a function definition
starting with “() {” in the variable value to propagate function
definitions through the environment. The vulnerability occurs because
bash does not stop after processing the function definition; it
continues to parse and execute shell commands following the function
definition.
The fact that an environment variable with an arbitrary name can be
used as a carrier for a malicious function definition containing
trailing commands makes this vulnerability particularly severe;
Vagyis többnyire CGI szkriptek vannak veszélyben, de kihasználható akár PHP-n keresztül is, ha parancsot futtatunk (és az alapértelmezett shell a bash, nem pedig az sh - bár sok helyen az sh csak egy symlink a bash-re), valamint ha a futtatott parancs maga egy shellscript (ami behívja a bash-t), vagy a futtatott parancs meghív valamit ami meghív valamit, ami használja a bash-t.
Néhány változó egy-az-egyben tartalmazza a usertől kapott stringet (HTTP_COOKIE, HTTP_QUERY_STRING, HTTP_USER_AGENT).
Extrém esetben akár egy mail() meghívása is lehetőséget teremethet (ami alapértelmezésben a sendmail programot hajtja végre), hiszen a sendmail lehet egy shellscript az adott Linux disztribúcióban.
A sebezhetőség testelhető a következő paranccsal:
Gyorssegély a patchelés előtt: a PHP szkript elején (ugyebár single entry pointot használunk, úgyhogy ez egyszerű) végigiterálni az _ENV tömbbön és, ha bármely érték a "() {" stringgel kezdődik nyomunk egy die()-t. - Esetleg egy error_log-ot előtte, hogy meglegyen az IP későbbre.
összefoglaló írás
még egy összefoglaló
teszt módszerek
_ENV
Érdekelne pl. janoszen
Annyi hajmeresztő dolgot olvastam tegnap óta, hogy kétlem, akár a tizedük is igaz lenne.
Írtam pár példát
Nem erre gondoltam
Ha például engedélyezve van a
GET /cgi-bin/mukodo-cgi-script-neve.sh HTTP/1.1
Host: hostname
User-Agent: () { :; }; echo 123 >>/tmp/zzzz
A végén két üres enter kell.
Ha ez megvan és megnézed a szerveren a /tmp tartalmát, elvileg ott van egy zzzz nevű fájl, 123 tartalommal.
Nem állítom, hogy ez így működik, de valahogy így sikerült kipróbálni a saját virtuális gépeim egyikén.
Hozzáférés?
Nem
User Agent
Vektor
Behvod a böngészőben, majd a konzolba berod:
OMG
Már csak arra lennék kíváncsi, hogy aki azt kitalálta, hogy a bash-nak az összes környezeti változót végig kell néznie és bármelyik hatással lehet rá, az miért gondolta, hogy ez jó lesz. ???
Hát...
Jobban érzem magam
Nem számít
Ezek után el lehet képzelni, mi lesz, ha megvalósul a felhőben élő marketingesek által kitalált eszközök internettye. Amikor a saját hűtőd fog DDOS támadást indítani a node.js szervered ellen, akkor a te mosolyod sem lesz őszinte.
A beágyazott és mobil
Az viszont gáz, hogy az említett rendszereken egyéb lyukak is lehetnek, amiket tényleg a kutya sem fog befoltozni, ugyanakkor hosszú évekig rajta lesznek a neten...
Egyébként a node.js saját webszervert futtat, nem cgi-ként működik?
"okos"
Manapság általánosan elterjedt, hogy az okosnak nevezett eszközöket eleve csak egy-két évig támogatják, mert közben kihoznak ezer új változatot, és nincs rá elég erőforrás. A beágyazott rendszerekben tipikusan régi linux van, zárt forrású binárisokkal, csak a legnépszerűbbek mögött van közösség, akik foglalkoznak vele tovább is.
A node.js-ben van beépített webszerver, azt csak valószínűsíteni tudom, hogy fut cgi-ként is.
No várj, az "sh" az
A busybox az önmagában tartalmaz shellt, de ismereteim szerint az valami nagyon szűkített dolog, sem a bash, sem a C shell dolgai nem működnek benne igazán. (valójában van egy busybox nevű bináris és attól függően viselkedik, hogy milyen (sym)linken keresztül hívod meg)
De ha valaki másképp tudja, szóljon, mert nem jártam utána!
A kedvedért előveszem és
Megnéztem, nincs benne env, emiatt a
env x='() { :;}; echo vulnerable' sh -c 'echo hello'
nem futott le, a debianosban viszont már van (ott meg már foltozva lett).Debian 7, kifejezetten ilyen
bye
haazee@cerberus:~$ env X='() { :; }; echo hello' bash -c 'echo bye'
hello
bye
A /bin/sh egyébként egy link a dash nevű, limitált shellre.
De kipróbáltam a busybox-ra mutatóval is:
bye
haazee@cerberus:~$ ls -l ./sh
lrwxrwxrwx 1 haazee haazee 12 Jan 10 2014 ./sh -> /bin/busybox
node.js
Gyorssegély a patchelés
Általában nem
Amikor az Apache invokálja FastCGI-t nem valószínű, hogy a bash szerepet játszik még. Bár sok FastCGI kialakítás "otthon főzött" az üzemeletető által, szóval biztosnak semmi nem biztos.
Csak abból gondolom ezt, mert
Fast
Ha a php normál CGI módban fut, legjobb tudásom szerint akkor sem a shellen keresztül indítja el az apache, ha úgy tetszik maga a php lesz a shell ami végrehajtja a szkriptet.
Kedvem lenne kipróbálni, de
Nekem úgy rémlik, hogy ott azért indul shell, függetlenül attól, hogy cgi v. fastcgi... De ne legyen igazam!
Az a baj, hogy ha CGI-ként
Ennek egy esetben van értelme: ha apache-on, mod_php-t használsz, nem cgi-t.
Fent
Na most tartok ott, hogy
Ha nginx vagy apache2 van a gépen, de fastcgi-vel futtatom a PHP-t, akkor - már bocs - tojik a fejemre, nem működik, hiába bugos a bash.
Akkor most mi van? Még sincs akkora gáz, mint ahogy azt híresztelték?
Vagy csak én rontottam el valamit?
Metasploithoz még mindig nem értek, szóval fogalmam sincs, mi a helyzet.
Ott nincs bash
Ebben a WL cikkben kitérnek pár részletre.
Félreérthetően fogalmaztam:
Viszont az nagyon nem világos, hogy ha az általam elterjedtként ismert módokon nem okoz problémát (apache mod_php, fastcgi, nodejs, wsgi stb), akkor miért lett ekkora cirkusz belőle?
Hagyományos cgi-t ki használ még?
Mást használnak
Weben amivel mostanában
PHP különböző variációkban,
Java,
RoR,
node.js
Python (django framework vagy "mezítlábas" wsgi környezetben)
Ezek úgy tudom, nincsenek veszélyben.
Még a PHP-ből kiadott system hívás okozhatna gondot, de egy alapbeállításokkal felrakott debianos szerveren nem kapott meg az így hívott shell semmit az eredeti környezetből.
(egyéb rendszereken nem tudom, mi a helyzet a külső programok hívásával, de úgy rémlik, máshol végképp nem jellemző, hogy a webes felületről érkező adatok környezeti változóba kerüljenek)
CGI-ről tíz-tizenöt éve hallottam utoljára.
(Windows szervereken meg annyira nem jellemző a bash használata)
Biztosan van más, biztosan van ahol cgi-t használnak, de érzésem szerint elhanyagolható lehet ezek száma.
U.n. embedded rendszerekről nem sokat tudok, amit ismerek, azon nincs bash. (Router, mobil stb.)
Update: ma találtam valahol egy írást, miszerint a cPanel használóinak okozhat komoly gondokat ez a bug. Hm. Így már kezdem érteni a pánikot.
:(
Off: C64
Még jó, hogy ZX81-ed nem volt
Hálózat
Érdekességnek Xavier Mertens