Skype являє собою одну з найбільш популярних VoIP -програм, встановлену на мільйонах комп'ютерів по всьому світу, власники яких навіть і не підозрюють, яка небезпека їм загрожує. А небезпека їм загрожує вельми серйозна: від витоку конфіденційної інформації до проникнення черв'яків і попадання на трафік, не кажучи вже про такі дрібниці, як небажання Skype працювати при активному SoftICE.
Skype, створений батьками-засновниками скандально відомої Kazaa і що успадкував від своєї прародительки найгірші її риси, працює за принципом самоорганізується розподіленої пиринговой мережі (distributed self-organized peer-to-peer network, P2P). Skype - це чорний ящик з багаторівневою системою шифрування, напханого антіотладочнимі прийомами виконуваного файлу, який зчитує з комп'ютера конфіденційну інформацію і передає її в мережу по закритому протоколу. Останній обходить брандмауери і суворо маскує свій трафік, перешкоджаючи його блокуванню. Все це перетворює Skype в ідеального переносника вірусів, хробаків і дронів, що створюють свої власні розподілені мережі усередині Skype-мережі. До того ж, Skype досить безцеремонно поводиться з ресурсами твого вузла, використовуючи його для підтримки зв'язку між рештою вузлів Skype-мережі, напружуючи ЦП і генеруючи могутній потік трафіку. А трафік, як відомо, рідко буває безкоштовним (особливо в Росії), так що здається безкоштовність дзвінків досить умовна: за вузли з «тонкими» каналами розплачуються «товсті» власники.
Skype активно вивчається в хакерських лабораторіях і security-організаціях по всьому світу, і більшість дослідників одностайно сходяться на думці, що Skype - це диявольськи хитра програма, написана безперечно талановитими людьми в стилі Black Magic Art. Skype не гребує брудними трюками, що створюють величезні проблеми, про які я і збираюся розповісти.
Аналіз виконуваного файлу Skype
Виконуваний файл Skype-клієнта є справжній шедевр хакерського мистецтва, що увібрав в себе безліч цікавих і досить могутніх захисних механізмів. Для протидії їм потрібні не тільки потужні інструментальні засоби (отладчики, дизасемблери, дампер і т.д.) і знання / навички, але ще і купа вільного часу.
Двійковий файл повністю зашифрований і динамічно розшифровується у міру завантаження в пам'ять. Причому скидання дампу неможливий, точніше, утруднений тією обставиною, що стартовий код після виконання очищається, в результаті чого ми отримуємо exe, який не починається. Оригінальна таблиця імпорту не містить нічого цікавого, і API-функції підключаються вже в процесі розпаковування. Перевірка цілісності коду виконується з різних місць у випадковому порядку (переважно при вхідних дзвінках), тому пошук захисних процедур є вельми нетривіальне завдання. Тим більше що вони засновані на криптографічних RSA-сигнатури і забезпечені поліморфними генераторами, які у випадковому порядку переставляють інструкції ADD, XOR, SUB і ін., Перемішуючи їх з лівими машинними командами.
Статичний виклик функцій (за жорстко прописаному адресою) практично не зустрічається, і всі важливі процедури викликаються по динамічно обчислюваному вказівником, пропущеного через обфуськатор. Отже, дизассемблер нам тут вже не допоможе, і доводиться братися за відладчик.
А ось про відладчик слід сказати окремо. Skype розпізнає SoftICE навіть при наявності встановленого IceExt, навідріз відмовляючись запускатися. Це забавно, оскільки для злому самого Skype відладчик SoftICE не дуже-то й потрібний, адже існують і інші інструменти подібного роду, серед яких в першу чергу хотілося б відзначити The Rasta Ring 0 Debugger, або скорочено [RR0D], що не виявляється Skype-клієнтом і, як і випливає з його назви, працює на рівні ядра. В принципі, можна скористатися і отладчиком прикладного рівня (наприклад, стрімко набирає популярність OllyDbg). Тільки при цьому важливо пам'ятати, що Skype легко виявляє програмні точки зупину, що представляють собою однобайтових машинну інструкцію з опкодом CCh, записувати поверх отлаживаемого коду. А для запобігання покрокової трасування Skype здійснює виміри часу виконання певних ділянок коду, для проходження через які доводиться використовувати повноцінні емулятори PC з інтегрованим відладчиком, наприклад, знаменитий BOCHS.
Нарешті, коли виконуваний файл розпакований і всі перевірки пройдені, захист обчислює контрольну суму і перетворює її в покажчик, за яким передається керування, що будить Skype.
висновок
Що ж все-таки приховують творці Skype в надрах свого коду? Чому, поширюючи програму безкоштовно, вони закривають вихідні тексти і використовують закритий протокол, викликаючи тим самим недовіру фахівців з безпеки? Для чого безкоштовній програмі настільки наворочена захист, що знижує продуктивність і споживає велику кількість пам'яті, адже зламувати її ніхто не збирається? Чому взагалі Skype-клієнт реалізований як чорний ящик?
WWW
General Skype Analysis - міні-портал з купою посилань на статті та інші ресурси, присвячені аналізу Skype і методам боротьби з ним: http://www1.cs.columbia.edu/~salman/Skype.
Skype Trojan - тезова презентація Walter Sprenger, що показує, як можна використовувати Skype-мережу для поширення хробаків та іншої зарази: http://www.csnc.ch/static/download/misc/2006_Skype_trojaner_v1.1.pdf.
How to use Skype with Softice? - цікава стаття, що розповідає, чому Skype-клієнт не працює при встановленому SoftICE і як це побороти: http://gcasiez.perso.orange.fr/Skypeandsoftice.html.
Skype Reads Your BIOS and Motherboard Serial Number - замітка в блозі, що викриває махінації, приховано проробляються Skype, читає BIOS і серійний номер материнської плати: http://www.pagetable.com/?p=27.
Проблема в тому, що Skype дуже стежить за своєю цілістю, тому спроба виправлення jnz на jmp short працює тільки до першого вхідного дзвінка, після якого Skype падає і назад вже не піднімається. Спеціально для таких хитромудрих захистів ще за часів MS-DOS була розроблена техніка онлайн-патча, при якій виправлення програми здійснюється безпосередньо в оперативній пам'яті, а після успішного проходження перевірки на наявність SoftICE відбувається відкат, щоб не хвилювати процедуру перевірки цілості.
Побіжна трасування Skype за допомогою OllyDbg швидко виявляє захисний код, який виконує перевірку на присутність SoftICE
Архітектура розподіленої мережі
На атомарному рівні структура Skype-мережі складається зі звичайних вузлів (normal / ordinal node / host / nest), що позначаються абревіатурою SC (Skype Client), і super-вузлів (super node / host / nest), яким відповідає абревіатура SN. Будь-вузол, який має публічний IP-адресу (той, який маршрутизируется в інтернет) і володіє досить широким каналом, автоматично стає super-вузлом і жене через себе трафік звичайних вузлів, допомагаючи їм подолати захисту типу брандмауерів або трансляторів мережевих адрес (NAT) і рівномірно розподіляючи навантаження між хостами. В цьому і полягає суть самоорганізується розподіленої децентралізованої пиринговой мережі, єдиним централізованим елементом якої є Skype-login-сервер, який відповідає за процедуру авторизації Skype-клієнтів і гарантує унікальність позивних для всієї розподіленої мережі.
Важливо підкреслити, що зв'язок між вузлами здійснюється не безпосередньо, а через ланцюжок super-вузлів. Серверів в загальноприйнятому сенсі цього слова (таких, наприклад, як в мережі eDonkey) в Skype-мережі немає. Будь-вузол з встановленим Skype-клієнтом є потенційним сервером, яким він автоматично стає за наявності достатніх системних ресурсів (об'єму оперативної пам'яті, швидкодії процесора і пропускної спроможності мережевого каналу).
Кожен вузол Skype-мережі зберігає перелік IP-адрес і портів відомих йому super-вузлів в динамічно оновлюваних кеш-таблицях (Host Cache Tables, HC-tables). Починаючи з версії Skype 1.0, кеш-таблиця являє собою простий XML-файл, в незашифрованому вигляді записаний на диску в домашній директорії користувача.
Структура децентралізованої самоорганізується пиринговой Skype-мережі
Skype-клієнти за окрему плату можуть приймати вхідні дзвінки із звичайних телефонів і здійснювати подібні дзвінки. Однак в PC2PC-обміні ці сервери ніяк не беруть участь, тому ми не будемо на них зупинятися.
Як Skype обходить брандмауери
Протокол обміну між Skype-клієнтами абсолютно Недокументовані, і тому вся інформація про нього отримана методами реінженерінга: дизассемблирования Skype-клієнтів, аналізу перехопленого мережевого трафіку і т.д. Оскільки існує величезна кількість значно різняться між собою версій Skype-клієнтів, то опис протоколу може містити неточності, у всякому разі, open-source-клієнта ще ніхто не написав.
Відразу ж після свого запуску Skype-клієнт відкриває TCP- і UDP-порти. Їх номери випадковим чином задаються при інсталяції і можуть бути в будь-який момент змінені через діалог конфігурації, що утрудняє блокування Skype-трафика на брандмауері. Крім цього, Skype відкриває порти 80 (HTTP) і 443, однак вони не є життєво важливими, і, навіть якщо їх заблокувати, Skype нітрохи не засмутиться.
Структура IP-пакета при роботі Skype по протоколу UDP
Ситуація ускладнюється тим, що Skype шифрує трафік, активно використовуючи просунуті технології обфускаціі, що перешкоджають виділенню постійних сигнатур в полях заголовків. Алгоритми шифрування міняються від версії до версії, до того ж випущено безліч спеціальних версій для різних країн світу, чиї закони накладають певні обмеження на довжину ключа або вибрані криптографічні алгоритми.
Але в цілому механізм шифрування виглядає так, як показано на малюнку.
Механізм шифрування, використовуваний Skype
Skype-клієнти вкрай делікатно обходяться з брандмауерами і трансляторами мережевих адрес, просочуючись крізь них через добре відомі протоколи STUN і TURN. Протокол STUN вже увійшов в Біблію Інтернету і докладно описаний в RFC-3489 . Що ж стосується TURN'а, то він все ще знаходиться в розробці і в даний час доступна лише чорнова версія стандарту: www.jdrosen.net/midcom_turn.html.
Так що, з юридичної точки зору, дії Skype законні і не потрапляють під статтю. STUN, розшифровується як Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs) (просте проникнення датаграм протоколу UDP через транслятор мережевих адрес (NAT)), являє собою відмінний засіб, яке страждає, однак, поряд обмежень і не працює в наступних випадках:
1. якщо шлях в зовнішню мережу перегороджений злобним брандмауером, ріжучим весь UDP;
2. якщо на шляху в зовнішню мережу коштує симетричний транслятор мережевих адрес. Ну, з брандмауером все зрозуміло. Якщо UDP закритий, то ніяк його НЕ відкриєш. А ось симетричний транслятор мережевих адрес (symmetric NAT) - це що за штука? Аби не заглиблюватися в технічні деталі, скажімо, що симетричний NAT є різновидом звичайного транслятора, що вимагає, щоб цільової IP-адреса і порт трансльованого пакету співпадали із зовнішнім (external) IP-адресою і портом. Якщо один і той же вузол посилає пакети з однаковими вихідними IP-адресами і портами за різними напрямками, NAT буде змушений транслювати їх на інші порти. Таким чином, щоб відправити внутрішньому вузлу UDP-пакет, зовнішній вузол повинен насамперед отримати запит від внутрішнього вузла. Самостійно ініціювати з'єднання зовнішній вузол не в змозі, оскільки NAT просто не знає, на який внутрішній IP і порт слід транслювати несподівано звалюється UDP-пакет.
Ця проблема вирішується протоколом TURN (Traversal Using Relay NAT), технічні подробиці роботи якого описані по вищезазначеною адресою і більшості читачів абсолютно нецікаві. Набагато важливіше інше - протокол TURN значно збільшує латентність і втрачає велику кількість UDP-пакетів (packet loss), що далеко не кращим чином позначається на якості і стійкості зв'язку, але повна відсутність зв'язку - ще гірше. Так що користувачам Skype варто радіти, а не скаржитися!
Структура Skype-мережі, в якій присутні Skype-клієнти за NAT і брандмауерами
Ось тільки адміністратори цієї радості чомусь не розділяють, наглухо закриваючи UDP-трафік (тим більше що більшості нормальних програм він не потрібний). Трохи побурчав для пристойності (замурували, демони!), Skype автоматично перемикається на чистий TCP, відрубати який адміністраторові ніхто не дозволить. Правда, поколдовав над брандмауером, той може закрити всі порти, але в тому-то і підступ, що невикористовуваних портів в природі не зустрічається! При з'єднанні з видаленим вузлом операційна система призначає клієнтові будь-який вільний TCP / UDP-порт, на який будуть приходити пакети. Тобто, якщо ми підключаємося до web-серверу по 80-му порту, наш локальний порт може виявитися 1369-м, 6927-м або ще якимось іншим. Закривши всі порти, ми позбудемося можливості встановлювати TCP / UDP-з'єднання!
Єдиний вихід - обрубати всім користувачам локальної мережі прямий доступ в інтернет, змусивши їх ходити через proxy-сервер. Однак навіть такі драконівські заходи не вирішать проблеми, оскільки Skype просто прочитає конфігурацію браузера і скористається proxy-сервером як своїм рідним!
Skype, який працював через proxy-сервер, конфігурація якого прочитана з налаштувань браузера
Як заблокувати Skype-трафік
Розробники Skype застерігають адміністраторів від спроб виявлення і блокування його трафіку (типу: «Все одно у вас нічого не вийде!»). І дійсно, розпізнати Skype-трафік дуже складно, а заблокувати його можна тільки по вмісту, яке зашифроване і не містить ніяких передбачуваних послідовностей. На щастя для адміністраторів, творці Skype, при всій своїй геніальності, допустили ряд помилок, залишивши частину трафіку незашифрованной. UDP-з'єднання використовує відкритий протокол для отримання публічних IP-адрес super-вузлів, що цілком може бути виявлено аналізатором трафіку. Це раз. TCP-з'єднання використовує один і той же RC4-поток двічі, що дозволяє нам відновити 10 перших байт ключа, розшифрувавши частину постійних полів заголовків Skype-протоколу. Це два! До речі, вельми корисна річ для шпигунства за чужими розмовами! Однак мені не відомий жоден готовий блокує Skype-трафіку.
Повторне використання RC4-потоку дозволяє відновити 10 байт ключа з 12-ти, розшифровуючи частина Skype-трафіку
Розпізнати і заблокувати UDP-трафік набагато простіше. Кожен фрейм починається з двухбайтового ідентифікаційного номера (ID) і типу пакету (payload). У UDP-пакет вкладений 39-байтний NACK-пакет, пропущений через обфуськатор і містить наступні дані:
- ідентифікатор пакета (непостійний і варіюється від пакету до пакету);
- номер функції (func), пропущений через обфуськатор, але func & 8Fh завжди одно 7h;
- IP відправника;
- IP одержувача.
Таким чином, щоб заблокувати UDP-трафік, що генерується Skype, достатньо додати в брандмауер наступне правило:
iptables -I FORWARD -p udp -m length -length 39 -m u32
-u32 '27 & 0 x8f = 7 '-u32 '31 = 0 x527c4833' -j DROP
Структура NACK-пакета
На жаль, блокування UDP-трафіку нічого не вирішує, оскільки Skype автоматом переходить на TCP, але тут є одна невелика зачіпка. Заголовки входять IP-пакетів, що належать до протоколу обміну SSL-ключами (SSL key-exchange packets), містять нехарактерний для «нормальних» додатків ідентифікатор 170301h, що повертається у відповідь на запит з ідентифікатором 160301h (стандартний SSL версії 3.1). Таким чином, блокування всіх вхідних пакетів, що містять в заголовку 170301h, серйозно спантеличить Skype, і поточні версії втратять працездатність. Ось тільки чи надовго ...
Розпізнавання Skype-трафіку за незвичним ідентифікатором під час звернення до Login Server при обміні SSL-ключами
Для детектування і блокування Skype-трафика можна використовувати і інші програмно-апаратні засоби, наприклад, PRX від Ipoque або Cisco Network-Based Application Recognition (NBAR). Однак всі вони недостатньо ефективні, так як розробники Skype не сидять склавши руки, і якщо комусь вдається знайти надійний спосіб блокування його поганого трафіку, в наступних версіях поганець з'являється знову.
Армії дронів, або як зомбувати Skype
Дешевизна голосових розмов викликала бурхливе зростання популярності Skype, мережа якого на 27 квітня 2006 року, за офіційними даними, склала понад 100 мільйонів зареєстрованих користувачів. А сьогодні роблять, щонайменше, один Skype-дзвінок в день понад 700 тисяч чоловік! Нескладно спрогнозувати, що незабаром в Skype увійде левова частка вузлів інтернету, що має як позитивну, так і негативну сторону.
Хакери вже давно здогадалися використовувати Skype для поширення вірусів і організації розподілених атак, яким дуже складно перешкодити - Skype-трафік надійно зашифрований і не може бути проаналізований антивірусами, заблокований брандмауерами або розпізнаний системами виявлення вторгнення.
Природно, щоб захопити Skype-вузол, хакер повинен знайти спосіб передати на нього шкідливий код, що при дотриманні всіх заходів безпеки він ні за що не зможе зробити. Але, як і будь-яке інше програмне забезпечення, Skype схильний до помилок, в тому числі і помилок переповнення, одна з яких була виявлена 25 вересня 2005 року. Зараз вона вже давно виправлена і представляє лише історичний інтерес, але з нею все-таки варто познайомитися ближче (а зробити це можна на Skype.com/security/Skype-sb-2005-03.html або на seclists.org/fulldisclosure/2005 /Oct/0533.html).
Можливість передачі управління на shell-код дозволяла атакуючому опановувати будь-яким Skype-вузлом, а також всіма відомими йому super-вузлами і т.д. Над розподіленою мережею нависла глобальна загроза, і просто диво, що вона не закінчилася катастрофою. Однак, як показує практика, там, де є одна помилка, рано чи пізно з'являються і інші. Закритість початкових текстів і безліч антіотладочних прийомів (що утрудняють тестування програми) цьому тільки сприяють!
Інша небезпечна «смакота» Skype полягає в відкритості його API. Пішовши назустріч стороннім розробникам, творці Skype передбачили можливість інтеграції будь-якої прикладної програми з Skype-клієнтом. Правда, при цьому на екран виводиться грізне попередження, що така-то програма хоче користуватися Skype API: дозволити або послати її на фіг? Природно, більшість користувачів на подібні питання відповідають ствердно. Вже звикли до набридливих попереджень, вони інстинктивно тиснуть «Yes» і тільки потім починають думати, а що ж вони, власне, дозволили?
Ясна річ, що, щоб використовувати Skype API, шкідливу програму потрібно якось доставити на комп'ютер. Раніше для цього застосовувалася електронна пошта, успішно фильтруемая антивірусами, але кількість користувачів, які запустили виконуваний файл, все одно обчислювалася мільйонами. Тепер же для розсилки вірусів можна використовувати сам Skype. Локальний антивірус - єдиний засіб оборони, потенційно здатне відбити атаку. Але, якщо він і встановлений, розпізнати невідомий науці вірус він не в змозі навіть при наявності антивірусних баз першої свіжості (евристика поки все-таки працює більше на рекламу, ніж на кінцевий результат).
Важливо, що протокол Skype вже частково розшифрований і створені хакерські інструменти, що дозволяють взаємодіяти зі Skype-вузлами в обхід стандартних Skype-клієнтів, і навіть без сервера реєстрації! І хоча в даний час справа обмежується простим збором адрес super-вузлів, існує принципова можливість створення своїх власних мереж на базі розподіленої Skype-мережі, головна помилка розробників якої полягає в тому, що Skype-вузли беззастережно довіряють один одному і вся «безпека» грунтується лише на закритості протоколу.
Висновок
Що ж все-таки приховують творці Skype в надрах свого коду? Чому, поширюючи програму безкоштовно, вони закривають вихідні тексти і використовують закритий протокол, викликаючи тим самим недовіру фахівців з безпеки? Для чого безкоштовній програмі настільки наворочена захист, що знижує продуктивність і споживає велику кількість пам'яті, адже зламувати її ніхто не збирається? Чому взагалі Skype-клієнт реалізований як чорний ящик?
WWW
General Skype Analysis - міні-портал з купою посилань на статті та інші ресурси, присвячені аналізу Skype і методам боротьби з ним: http://www1.cs.columbia.edu/~salman/Skype.
Skype Trojan - тезова презентація Walter Sprenger, що показує, як можна використовувати Skype-мережу для поширення хробаків та іншої зарази: http://www.csnc.ch/static/download/misc/2006_Skype_trojaner_v1.1.pdf.
How to use Skype with Softice? - цікава стаття, що розповідає, чому Skype-клієнт не працює при встановленому SoftICE і як це побороти: http://gcasiez.perso.orange.fr/Skypeandsoftice.html.
Skype Reads Your BIOS and Motherboard Serial Number - замітка в блозі, що викриває махінації, приховано проробляються Skype, читає BIOS і серійний номер материнської плати: http://www.pagetable.com/?p=27.
Для чого безкоштовній програмі настільки наворочена захист, що знижує продуктивність і споживає велику кількість пам'яті, адже зламувати її ніхто не збирається?
Чому взагалі Skype-клієнт реалізований як чорний ящик?
How to use Skype with Softice?
Com/?
А ось симетричний транслятор мережевих адрес (symmetric NAT) - це що за штука?
Правда, при цьому на екран виводиться грізне попередження, що така-то програма хоче користуватися Skype API: дозволити або послати її на фіг?
Вже звикли до набридливих попереджень, вони інстинктивно тиснуть «Yes» і тільки потім починають думати, а що ж вони, власне, дозволили?
Чому, поширюючи програму безкоштовно, вони закривають вихідні тексти і використовують закритий протокол, викликаючи тим самим недовіру фахівців з безпеки?
Для чого безкоштовній програмі настільки наворочена захист, що знижує продуктивність і споживає велику кількість пам'яті, адже зламувати її ніхто не збирається?