В конце октября 2005 года Марк Руссинович, один из создателей Sysinternals, проверял свежую версию RootkitRevealer на собственной машине. Утилита нашла на ней руткит, хотя ничего подозрительного Руссинович туда не ставил и к безопасности относился довольно параноидально.

Виновником оказался музыкальный компакт-диск Sony BMG, честно купленный на Amazon, а Sony BMG на тот момент была вторым по величине лейблом в мире. Руткит положили на диск сознательно, как часть защиты от копирования. С точки зрения лейбла задача у него была самая добропорядочная, он должен был мешать покупателю наделать из альбома mp3 и выложить их в Kazaa.

А через пару недель выяснилось, что внутри самой защиты лежат куски чужих open source проектов, взятые без соблюдения лицензий. Среди них нашлась даже функция из программы, которую написали специально для снятия DRM с песен из iTunes. Звукозаписывающая индустрия к тому времени уже 2 года судилась с рядовыми слушателями, от 12-летней школьницы до техасского пенсионера за 70. И вот лейбл из этой индустрии разослал на дисках программу, нарушающую чужие авторские права, причем разослал ее как средство защиты авторских прав.

Диск с драйвером внутри

Руссинович опубликовал разбор в блоге 31 октября, и читается он как добротный детектив. Автор шаг за шагом идет от скрытого каталога $sys$filesystem к драйверу, который этот каталог прячет, а от драйвера к фирме, которая его написала.

RootkitRevealer устроен довольно просто, он сравнивает картину, которую отдает Windows API, с сырым содержимым диска и файлов реестра. Если между ними есть расхождение, значит, кто-то в системе перехватывает вызовы и показывает программам отредактированный мир.

Дальше в ход пошли LiveKd и IDA Pro, и дамп таблицы системных сервисов показал несколько подмененных указателей, которые вели в драйвер Aries.sys. Разбор его инициализации показал, что драйвер прячет любой файл, каталог, ключ реестра или процесс, чье имя начинается с $sys$. Для проверки Руссинович скопировал Notepad.exe под именем $sys$notepad.exe, и блокнот послушно пропал из виду, хотя к защите от копирования никакого отношения не имел.

Утилита Sigcheck показала, что в строках версии большинства скрытых файлов значится продукт Essential System Tools от британской компании First 4 Internet. Поиск по названию быстро вывел на ее технологию XCP, Extended Copy Protection, которую та продавала звукозаписывающим лейблам.

Тут Руссинович вспомнил про недавнюю покупку, диск, который на компьютере играл только через собственный плеер и разрешал сделать не больше 3 защищенных копий. Это был альбом братьев Van Zant «Get Right with the Man», крепкий южный рок, который трудно заподозрить в связях с хакерской сценой.

Плеер в Process Explorer представлялся продуктом Macromedia, а при нажатии на Play росла нагрузка от скрытого процесса $sys$DRMServer.exe. Даже после закрытия плеера этот процесс съедал 1-2% CPU, потому что каждые 2 секунды перебирал исполняемые файлы всех запущенных программ.

В «Установке и удалении программ» XCP не значился, деинсталлятора не было ни на диске, ни на сайте First 4 Internet. Когда Руссинович удалил драйверы руками, из Проводника пропал CD-привод. Оказалось, что к приводу был прицеплен фильтр Crater.sys, а к каналу IDE еще и Cor.sys. Записи о них пришлось вычищать из реестра через Regedit, запущенный с правами Local System через PsExec, и только после перезагрузки дисковод вернулся на место.

Атмосферу середины нулевых хорошо показывает то, что в интервью Руссинович неохотно вдавался в подробности работы DRM, опасаясь преследования по DMCA. Человек, нашедший у себя чужой руткит, всерьез прикидывал, не засудят ли его самого за то, что он в этом рутките разобрался.

Как Aries прячет файлы

По меркам руткитов тех лет механизм сокрытия почти учебный. Aries при загрузке подменяет в таблице системных сервисов обработчики ZwCreateFile, ZwQueryDirectoryFile, ZwOpenKey, ZwEnumerateKey и ZwQuerySystemInformation. Каждый результат этих функций проходит через фильтр по префиксу имени. Если отбросить разбор буферов, логика фильтра выглядит примерно так:

NTSTATUS Hook_ZwQueryDirectoryFile(/* ... */)
{
    NTSTATUS st = Real_ZwQueryDirectoryFile(/* ... */);

    // своим показываем систему как есть
    if (CallerImageNameStartsWith(L"$sys$"))
        return st;

    // остальным вырезаем из выдачи все, что начинается с $sys$
    // кому принадлежит файл, никто не проверяет
    StripEntriesWithPrefix(FileInformation, L"$sys$");
    return st;
}

Драйвер смотрит на имя вызывающего процесса в его структуре EPROCESS. Процессам, чьи имена начинаются с $sys$, он показывает систему без фильтра, а всем остальным отдает выдачу, из которой вырезано все помеченное. Кому на самом деле принадлежит файл или процесс, никто не проверяет, драйвер просто верит имени на слово.

Поэтому прятаться за префиксом $sys$ мог кто угодно, от компонентов самой XCP до любой программы, автор которой прочитал блог Руссиновича. Сам Руссинович предупреждал об этом в интервью сразу после публикации, и ждать, пока предупреждение сбудется, пришлось меньше 2 недель.

Стабильности системе Aries тоже не добавлял, потому что обработчик ZwCreateFile проверял имя файла, но не проверял сам буфер. Программа с кривым указателем могла уронить систему в синий экран, выгрузка драйвера на работающей системе тоже грозила падением, а грузились драйверы XCP даже в безопасном режиме.

На чужом горбу

10 ноября Sophos описала троян Stinx-E, который у других антивирусов проходил как Breplibot и Ryknos. Рассылался он спамом под видом письма от британского делового журнала. После запуска троян копировал себя в файл $sys$drv.exe и на машине с XCP просто исчезал из поля зрения, в том числе и антивирусных сканеров.

Писать собственный код для сокрытия авторам трояна не пришлось. Инфраструктуру им за свой счет развернула Sony BMG, причем на компьютерах собственных покупателей, и оставила ее открытой для всех желающих. Вирусописатели въехали в рай на чужом горбу и даже не сказали спасибо.

Сколько таких машин, Sony не сообщала, и посчитать их взялся Дэн Камински, которого через пару лет узнает весь мир благодаря большой дыре в DNS. XCP связывался с серверами Sony, а для этого ему нужно было разрешить их доменные имена. Кеширующие DNS-серверы провайдеров какое-то время помнят такие запросы, поэтому Камински опросил больше 3 миллионов DNS-серверов и получил 568 200 утвердительных ответов.

Это число считает сети, ведь за одним провайдерским сервером мог стоять и один зараженный компьютер, и несколько тысяч. Брюс Шнайер, например, сомневался, что эти альбомы вообще разошлись таким тиражом среди тех, кто слушает музыку на компьютере. Зато география получилась внушительной, 135 стран, хотя 52 альбома с XCP продавались только в Северной Америке. В январе 2006 года на ShmooCon Камински рассказал, что следы руткита есть в военных и правительственных сетях, причем далеко не только американских.

Лекарство хуже болезни

Первая публичная реакция Sony BMG была примерно такой, какой и бывает реакция лейбла, впервые увидевшего слово «руткит» в новостях. 4 ноября президент глобального цифрового бизнеса компании Томас Хессе сказал в эфире NPR, что большинство людей, как ему кажется, даже не знают, что такое руткит, так почему их это должно волновать. Фразу потом цитировали почти все, кто писал о скандале, и каждая новая подробность про XCP делала ее немного смешнее.

Сначала компания выпустила обновление, которое снимало маскировку с файлов XCP, но саму защиту оставляло на месте. За полноценным деинсталлятором нужно было пройти небольшой квест из формы на сайте Sony BMG, письма со ссылкой на вторую форму и только потом самой программы удаления.

Уже первая форма ставила в Internet Explorer ActiveX-компонент CodeSupport от First 4 Internet. Компонент был помечен как безопасный для скриптов и оставался в системе после того, как вы ушли с сайта. По команде он умел скачать и запустить код с любого адреса и никак не проверял, что этот код пришел от Sony.

Первым это заметил финский исследователь Матти Никки, известный в сети как muzzy. Эд Фелтен и Алекс Халдерман из Принстона подтвердили, что любой сайт, знающий про CodeSupport, может поставить на компьютер посетителя что угодно, и для наглядности сделали страницу, которая через этот компонент перезагружала машину.

CERT завел на дыру карточку VU#312073, а у MediaMax от SunnComm, второй защиты на дисках Sony BMG, деинсталлятор оказался с той же самой дырой в компоненте AxWebRemoveCtrl. Человек, который хотел избавиться от одной уязвимости, получал вместо нее другую, посерьезнее, и в придачу оставлял Sony свой почтовый адрес.

Те, кто пытался снести XCP антишпионскими утилитами, тоже рисковали, потому что некоторые из них удаляли драйверы так же грубо, как человек руками. CD-привод после этого пропадал из системы вместе с последними нервишками владельца.

Пикантность в том, что вся конструкция держалась на автозапуске Windows. Достаточно было зажать Shift при вставке диска, и ничего не ставилось. XCP содержал только код для Windows, поэтому на маке и в обычном музыкальном центре диск играл как самый обыкновенный компакт-диск. Защита по-настоящему срабатывала только у тех, кто не знал про Shift и честно нажимал «Согласен» в окошке лицензии.

А почитать в этой лицензии было что, юристы EFF нашли в ней условия, которые сложно придумать нарочно. Копии песен разрешалось держать только на домашнем компьютере, который принадлежит вам. Права на копии заканчивались, как только у вас пропадал оригинальный диск. Если квартиру обокрали и диск унесли вместе с телевизором, по букве соглашения надо было вернуться домой и стереть музыку с ноутбука. При переезде в другую страну полагалось сделать то же самое, а при банкротстве стереть всю музыку с компьютера, видимо, чтобы кредиторам не досталось ничего лишнего. Про руткит, драйверы и скрытый сервис в соглашении при этом не было ни слова.

Что лежало в ECDPlayerControl.ocx

Пока одни разбирались с деинсталлятором, другие полезли смотреть, из чего собран сам XCP. Первым звоночком стали строки из файла version.c библиотеки LAME, найденные в компонентах защиты на том же диске Van Zant. В середине ноября об этом написала голландская пресса, а следом Slashdot.

LAME распространяется под LGPL, и вопрос сразу встал ребром. Эта лицензия разрешает встраивать библиотеку в закрытый продукт, но требует указать, откуда взят код, и приложить текст лицензии. Еще она требует дать пользователю возможность пересобрать программу с другой версией библиотеки, а ничего из этого на дисках Sony не было.

У Себастьяна Порста был Sabre BinDiff, но не было подозрительного файла, поэтому он попросил его у muzzy. Порст сравнил go.exe с собранной в Visual C++ lame_enc.dll, и сравнение не нашло ни одной совпавшей функции. Для истории с такой репутацией это выглядело даже немного разочаровывающе.

Тогда внимание переключилось на ECDPlayerControl.ocx, ActiveX-компонент плеера XCP, и там совпадений нашлось уже много. Томас Дуллиен из Sabre Security подтвердил журналистам, что в исполняемый файл встроены значительные объемы кода из FAAC.

В итоге в одном этом файлике обнаружились куски LAME, mpglib, id3lib, FAAC, mpg123 и DRMS. Код mpg123 и DRMS распространялся под GPL, остальное под LGPL. С GPL разговор совсем другой, потому что она в такой ситуации требует открыть исходники всего продукта, то есть XCP целиком. Код был встроен прямо в исполняемый файл, поэтому сослаться на то, что плеер всего лишь вызывает внешнюю библиотеку, у First 4 Internet тоже не получалось.

Разработчики LAME ответили открытым письмом, в котором написали, что судиться не любят и не собираются, но ждут от Sony, что та разберется с ситуацией по-взрослому. На Slashdot тем временем шутили, что по условиям LGPL Sony обязана выдать исходники, чтобы пользователи могли сами пересобрать руткит под свежую версию LAME.

Функция DoShuffle

По виртуальному адресу 0x10089E00 в том же ECDPlayerControl.ocx Порст опознал функцию DoShuffle из файла drms.c. Этот файл входит в VLC и снимает защиту FairPlay с песен, купленных в iTunes Music Store, а написали его Йон Лех Йохансен и Сэм Хосевар.

Йохансена к тому моменту знала вся индустрия как DVD Jon. В 15 лет он помог написать DeCSS, программу для снятия защиты с DVD. По жалобе MPAA и DVD CCA норвежская прокуратура завела на него дело, которое тянулось несколько лет, и суд дважды его оправдал, в январе и в декабре 2003 года. Потом он взялся за FairPlay и раз за разом находил способы обойти новые версии защиты Apple.

Иначе говоря, в программе, которую лейбл ставил покупателям ради защиты своих авторских прав, лежал код самого известного в мире ломателя DRM. Взят он был в обход лицензии самого Йохансена, и комментаторам на Slashdot этого праздника хватило не на одну неделю.

Скрытый мостик в iTunes

Зачем защите от копирования код для взлома чужой защиты, оставалось непонятным до начала декабря. Тогда Алекс Халдерман разобрал этот кусок XCP и опубликовал результат.

В плеере нашелся полностью рабочий код, который умеет сжать аудио в памяти и зашифровать его тем же алгоритмом, что использует FairPlay. На выходе получается файл, который iTunes и iPod считают своим, защищенным и честно купленным. Причем умеет этот код работать с MP3, WAV, сырым звуком и обычными незащищенными дисками, и с дисками XCP тоже.

Халдерман для проверки сделал защищенный файл из обычного MP3 и спокойно проиграл его в iTunes. Сам XCP эту функцию не использовал, она даже не экспортировалась из библиотеки, где лежала. Выглядело это так, будто First 4 Internet выпилила поддержку iPod в последний момент перед выпуском дисков, а код оставила в бинарнике.

Apple FairPlay никому не лицензировала, и взять поддержку iPod было негде, кроме как отреверсить формат самостоятельно. Разработчики, судя по всему, пошли коротким путем и взяли готовое у Йохансена и Хосевара, которые проделали эту работу раньше и выложили ее под GPL.

Код, который двое энтузиастов написали, чтобы освобождать купленную музыку от FairPlay, попал в программу, которая собиралась эту же FairPlay на музыку надевать. Попал он туда в обход единственной вещи, которую авторы просили взамен, а именно открытых исходников производного продукта.

Счет

11 ноября Sony BMG объявила, что временно приостанавливает выпуск дисков с XCP. 15 ноября компания объявила отзыв, попросила магазины убрать непроданные экземпляры с полок и пообещала обменять диски на версии без защиты. На сайте программы обмена можно было заодно скачать пострадавшие альбомы в MP3, то есть ровно в том формате, которого лейбл так боялся.

Отзыв шел со скрипом, и в конце месяца следователи генерального прокурора Нью-Йорка Элиота Спитцера все еще находили диски с XCP на прилавках города. На следующий день генеральный прокурор Массачусетса сообщил о том же в Бостоне.

21 ноября Техас в лице генерального прокурора Грега Эбботта подал на Sony BMG в суд по местному закону о шпионском ПО и стал первым штатом, который это сделал. Тогда же свой иск подала EFF, насчитавшая больше 24 миллионов дисков с XCP и MediaMax, а следом подтянулись коллективные иски в Калифорнии, Нью-Йорке и других штатах.

Коллективный иск в Нью-Йорке закончился мировым соглашением, по которому заявителю полагалось 7,50 доллара и бесплатная музыка для скачивания. Sony BMG к тому же на 2 года соглашалась на независимый аудит своих DRM.

В декабре 2006 года компания заплатила 1,5 миллиона долларов Техасу и Калифорнии и пообещала жителям этих штатов до 175 долларов на ремонт компьютеров, пострадавших при попытках удалить XCP. С 40 с лишним штатами она договорилась больше чем на 4 миллиона.

В начале 2007 года к ним добавилась Федеральная торговая комиссия. По соглашению с ней Sony BMG возмещала покупателям до 150 долларов за ремонт, обязалась прямо писать об ограничениях на использование диска и не пускать собранные данные на маркетинг. Нарушение закона компания при этом так и не признала.

Мотивы у Sony BMG, если смотреть из 2005 года, были вполне понятные. Продажи компакт-дисков падали, файлообменники росли, и лейблы уже несколько лет перебирали схемы защиты CD. Собственную защиту Sony, Key2Audio, в 2002 году обходили фломастером по краю диска, так что XCP выглядел очередной попыткой из того же ряда, просто сделанной поглубже, на уровне ядра.

Платить за эту глубину пришлось отозванным тиражом, судами в десятках штатов, мировыми соглашениями и репутацией. В начале 2007 года Sony BMG прекратила ставить защиту от копирования на свои компакт-диски.

Если пересчитать всех, кто осенью 2005 года что-то получил от этих дисков, список выйдет короткий. Вирусописатели получили бесплатную маскировку, юристы работу на пару лет вперед, а Руссинович, пожалуй, самый известный пост в истории своего блога. Авторы LAME, FAAC, mpg123 и DRMS, чей код лежал внутри ECDPlayerControl.ocx, не получили даже строчки со своими именами в лицензионном соглашении, хотя место там нашлось и банкротству, и квартирным кражам, и переезду за границу.

Меньше чем через год после этой истории Microsoft купила Sysinternals вместе с Руссиновичем. RootkitRevealer, который первым нашел Aries.sys, переехал под крыло той самой компании, в чье ядро этот драйвер так бесцеремонно лез через таблицу системных сервисов.

Комментарии (0)