Komoly sebezhetőség a Windows-os Bitcoin-Qt-ben

2012-03-20

Szerző: Gavin Andersen

Több, mint négy hónapon át maradt teljesen észrevétlen egy komoly sebezhetőség a Windows-os Bitcoin Qt-ben, egész pontosan a bitcoin-qt.pro fájlban, ebben a két sorban:

windows:LIBS += -lws2_32 -lshlwapi
windows:DEFINES += WIN32

Te látod ebben a hibát? Én nem, mivel a hiba abban állt, hogy a Windows-os Bitcoin-QT-t a “mingw” multithreading könyvtárral kellett volna összekapcsolni a -D_MT-nek megfelelően, a multithread-biztos, “mingw”-könyvtáras C++-kivételkezelés érdekében (a háromsoros hibajavítást lásd itt).

Amennyiben ezt multithreadelt, mingw-alapú C++-alkalmazások fejlesztésében járatos fejlesztők is olvassák, úgy most bizonyára felhördülnek, mondván, hogy “Ehh, hát persze, ti barmok, ezt mindenki tudja!” Nos, amennyiben te magad is egy vagy ezek közül, akkor neked is mondom, hogy szükségünk van rád és más hozzád hasonlókra! Nézzétek át a kódot, kísérjétek figyelemmel a fejlesztési folyamatokat, és szóljatok ránk, ha elbarmolunk valamit. Sajnos sokkal kevesebb a Windows-os fejlesztőnk, mint a Linuxos és a Mac-es – ami pedig azért különösen kellemetlen, mert a legtöbb letöltő bizony a Windows-os változatot használja.

Nem-mingw-C++-multithread-fejlesztők pedig talán arra gondolnak a fentiek olvastán, hogy “OTT volt a hiba? Nem valamiféle #ifdef WINDOWS C++-kódban vagy valami más hasonló, kissé már elavult könyvtárban, amihez linkeltetek?”

Nos, ez a hiba már csak azért is maradhatott észrevétlen ilyen sokáig, mert szinte soha nem is számít. A Bitcoin-Qt rendes körülmények között csak nagyon kevés kivételt produkál, és az esetek nagy részében a mingw single-threadelt alkalmazás-kivétel-támogatása tökéletesen működik. Még most sem vagyok teljesen biztos benne, hogy pontosan mi is aktiválja a hibát. Talán két thread egyidejű kivételgenerálása vagy egy thread megszakadása egy try{}-blokkban, majd a későbbi újrainduláskor a kivételkezelő kód időközben megváltozott állapota miatt bekövetkező összeomlás.

Matt Corallót illeti az elismerés a bugnak a nehezen reprodukálható, a Bitcoin-Qt -server flaggel indított és JSON-RPC-felkérések kezelése során csak időnként jelentkező összeomlás-jelentések kitartó kivizsgálása útján való feltárásáért. A debuggeren kívül soha nem tudta összeomlasztani a kódot, ami eléggé jellemző is a multithreadinggel kapcsolatos bugokra. Az RPC-felkéréseknél azonban már tapasztalt bugokat; ezért is tekintjük ezt a sebezhetőséget kritikusnak és tanácsoljuk mindenkinek ezúton is a kliensük azonnali frissítését.

És hogy ki lehet-e használni ezt a hibát? Hogy összeállíthat-e egy támadó olyan bitcoin-protokoll-üzeneteket, amelyek aktiválják a hibát és ezáltal kompromittálják a Windows-os gépeket? Hogy netalán ki is használta-e már valaki? Nos, erről fogalmunk sincs, nem tudjuk. Csak azt tudjuk, hogy rendkívül nehéz lenne használható támadóeszközt összerakni eköré a hiba köré, egyrészt mivel azt még csak előidézni sem lehet megbízhatóan, másrészt pedig mivel maga a Bitcoin-Qt is komoly biztonsági intézkedéseket működtet folyamatosan az ilyesféle bugok kiaknázásának megakadályozása érdekében.

Ha nagyon ügyesek és még annál is szerencsésebbek leszünk, akkor ez volt az utolsó alkalom, amikor valamiféle komoly biztonsági kockázat miatt kellett azt mondanunk mindenkinek, hogy azonnal állítsátok le a jelenleg használt klienseteket és frissítsetek a legújabbra. Mivel azonban tökéletes biztonság nincs, és mivel több, mint valószínű, hogy lesznek még a jövőben is hasonlóan jól rejtőzködő bugok vagy magában a Bitcoinban, vagy pedig a számtalan könyvtár valamelyikében, amelyekhez linkelünk, ezért ez a veszély mindig napirenden marad, mindig oda kell figyelni rá.

Ez azonban természetesen nem jelenti azt, hogy feladjuk az egészet és inkább visszatérünk újra a kagylópénzhez – hanem csak azt, hogy abból az előfeltevésből indulunk ki, hogy ami kompromittálódhat, az kompromittálódni is fog, és ennek megfelelően is tervezünk mindent. Úgy vélem, ezt a leckét a szoftveripar egészének is sokkal jobban meg kellene tanulnia.

Forrás: GavinTech

A lap szövege Creative Commons Nevezd meg! – Ne add el! – Így add tovább! 3.0 licenc alatt áll, felhasználni csak forrásmegjelöléssel, és ide mutató linkkel szabad.