DYLD_PRINT_TO_FILE exploit kering szabadon

Címkék

DYLD_PRINT_TO_FILE exploit szabadon

Nemrég volt szó arról, hogy Stefan Esser egy helyi privilégiumszint-emelést lehetővé tevő OS X sebezhetőségről blogolt. A Malwarebytes most arról számolt be, hogy a sebezhetőséghez írt, szabadon keringő exploitot fogtak. Javítás az Apple-től még nincs. Ideiglenes megoldás lehet az Esser-féle SUIDGuard.

A részletek itt olvashatók.

Hozzászólások

Vagyugye a 10.11 El capitan beta sem sebezheto, ha valakinek arra van ingerenciaja.
Eleg kinos egy sebezhetoseg ez.

Ez a kód milyen nyelven van?

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Objective-C, teljesen mechanikusan generálva gépi kódból.
Például az utolsó pár sor, az igazából
objc_msgSend() hívások sorozata, ami ugye az Objective-C nyelv metódushívások megvalósítása.
Itt tulajdonképpen egy NSTask példányt hoznak létre.
Az rbx=*objc_msgSend; sortól kezdve szerintem ezt csinálják a sorok:
1. [NSTask alloc]
2. [NSTask init]
3. [NSTask arrayWithObjects:/var/tmp/se10395.sh]
4. [NSTask setArguments:]
5. [NSTask launch]
6. [NSTask autorelease]

Ez csak annyit csinál, hogy elindítja a /var/tmp/se10395.sh alatt lévő scriptet.
A scriptben van a lényeg, a script tartalma meg a fenti NSString konstansban látható.

Az világos, hogy Objective-C kódokat hívogat, de az gyanús, hogy a kód nem Objective-C legalábbis nem hallottam olyanról, hogy ott közvetlenül lehetne a regisztereket piszkálni.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Ezek nem regiszterek :) Csak éppen olyan változónevek, amik a regiszterek neveinek felelnek meg.
Értsd: a bináris azt csinálná, hogy rbx-be tesz egy címet stb.
És ezt meg C-ben leírod úgy, hogy void* rbx = *objc_msgSend;
Itt ezek változónevek és nem regiszterekbe pakolás megy :)

Java meg JS kódot is írhatsz, ahol a változóidat rax,rbxnek meg eflagsnek nevezed el.

Ennél egyszerűbb exploit, ami ugyanezt csinálja: https://gist.github.com/szhu/816822de3f171e6ce15c

A lényeg, ha jól értem:
1. A stderror-ra általában hibaüzeneteket küldünk.
2. A dyld a stderrorra kiírt stringeket kiírja a saját stderrorjára. Azonban a DYLD_PRINT_TO_FILE környezeti változóval az stderrorra kiírt stringet kiírja bármelyik file-ba. És mivel a dyld root jogokkal fut, ezért bármelyik file-ba bármit kiírhatunk.
3. Az stderrorra kiírjuk, hogy ALL ALL=(ALL) NOPASSWD: ALL, mintha hibaüzenet lenne, majd a DYLD_PRINT_TO_FILE 2-es pontban leírt képességét kihasználva beírjuk a sudoers fileba.
4. sudo jogaink lesznek jelszó nélkül. A cikkben lévő példában ez VSInstallert indít el, a gistben lévő példában csak egy root jogokkal rendelkező shellt.

Csak elméleti szinten talán ez is lehet megoldás...
chflags schg /etc/sudoers