Дружим свой софт с антивирусами: как избежать ложных срабатываний

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



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

    Шаг 1. Сode signing




    Самый эффективный способ — это подписать свои исполняемые файлы, если этого не сделать то антивирусы будут сканировать их с особым пристрастием.

    Для того, чтобы убедить в важности данного шага, Александр (Rouse_) Багель любезно поделился наглядным примером. В испытуемом приложении не используется протектор, нет обращения в интернет, оно выполняет только одну функцию — считает CRC32 файлов. Сравним отчеты подписанного и неподписанного файлов:



    Думаю это достаточный аргумент в пользу подписи.

    Техническую сторону получения сертификата и подписывания файла описывать не буду. Я получал сертификат в startssl (подкупили ценой и русскоязычным саппортом) на физ лицо Class 1 за 100$ на два года без всякой волокиты. Для получения сертификата на ООО (Class 2) были сложности в том, том что бы найти в Москве нотариуса-адвоката который бы отправил свое мнение по электронной почте подписанное цифровой подписью Класса 2…

    Одобрение антивирусов является лишь побочным плюсом подписанного ПО, основные же прелести — это повышение доверия клиентов, мол «Есть ЦП — значит не колхоз!». Так же антивирусы, файрволлы и UAC не будут предупреждать о повышенной угрозе.

    Шаг 2. Гневные письма




    Подписан файл или нет, но если на вирустотале (далее VT) кто-то ругается — пора писать письма. Узнать куда слать жалобы о ложном срабатывании помогают специальные списки:



    Будьте готовы, что реакция вирлабовцев на обращение занимает пару недель.

    Шаг 3. Автоматическая проверка VirusTotal'ом на билд сервере


    Если не используется навесных защит то все просто, собрал релиз, залил на VT, отписал жалобы и все. Но в случае использования протекторов есть вариант сократить количество ложных срабатываний без отправки абуз.

    Немного теории. При повторной компиляции одних и тех же исходников содержимое exe файла не меняется (кроме временных меток в заголовках). Поэтому пересборка и повторная отправка на VT ситуацию с фальшпозитивами не решит: кто ругался тот снова ругнется.

    Совсем другое дело при использовании протектора (в моем случае VMProtect), который при каждой обработке файла формирует уникальную виртуальную машину (инструкции, обработчики) и соответствующий ей виртуализированный код. Эти уникальные данные могут как содержать сигнатуры какого-либо вируса, так и нет, отсюда появляется вероятность, что после повторной перезащиты антивирусы пропустят файл.

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

    Используем VirusTotalScan

    Скачать можно по ссылке. Программа консольная, результат работы возвращается кодом выхода: 0-вирусов нет, 1-найден вирус, 2-случилось что-то другое. Синтаксис вызова:

      VirusTotalScan.exe api_key имя_файла [/ignore [имя_антивируса][ ...]]
        api_key          Ключ доступа VirusTotal API
        имя_файла        Путь до проверяемого файла
        имя_антивируса   Список антивирусов, мнение которых игнорируется
    


    Для использования требуется ключ доступа к VirusTotal API, который можно получить на сайте virustotal.com после прохождения регистрации:



    Интеграцию в билд сервер приведу на своем примере, для сборки используется .bat скрипт:

    :VMPROTECT
      IF EXIST "~program.exe" DEL "~program.exe" 
     
      rem Использование виртуальной машины
      echo Compiling with WMProtect  
      VMProtect_Con.exe "program.exe" "~program.exe" -pf "program.exe.vmp"
      IF ERRORLEVEL 1 GOTO ERROR
        
      rem Установим цифровую подпись
      signtool.exe ...
    
      :VirusTotalScan
      rem закачка подписанного файла на VirusTotal
      rem пропустим антивирусы Qihoo-360 и CMC
      VirusTotalScan.exe 1fe0ef5feca2f84eb450bc3617f839e317b2a686af4d651a9bada77a522201b0 "~program.exe" /ignore "Qihoo-360" "CMC"
      
      rem при ошибке отправим на повторное сканирование
      IF ERRORLEVEL 2 GOTO VirusTotalScan
     
      rem Нашелся вирус, перезащищаем
      IF ERRORLEVEL 1 ( 
       echo Vireses finded. RECOMPILE.
       GOTO VMPROTECT 
      )
     
      rem вирусов нет, работаем дальше 
    
      rem заменим итоговый файл
      DEL "program.exe"
      COPY "~program.exe" "program.exe"
      DEL "~program.exe"
    


    Из примера должно быть все понятно. По иронии, на саму программу получил одно ложное срабатывание, отписал жалобу — теперь жду пару недель решения.

    Заключение


    В заключении хочу поблагодарить Александра, с подачи которого началась статья, и предупредить — не всегда удается решить вопрос с вирлабовцами.
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 34
    • +6
      Ох, как я вас понимаю, в своем проекте задолбался уже каждый раз писать письма в поддержку антивирусов.
      А главное иногда попадаются какие-то совершенно левые антивирусы про которые первый раз в жизни слышишь а они давай вирусы находить там где их нет, и никаких способов связи с ними не нету.

      Вот бы VirusTotal сделал возможность отправить false-positive жалобу сразу всем левым антивирусам, вот такой сервис был бы реально удобный.
      • 0
        Поделюсь своей историей.
        Kaspersky Endpoint Security при запуске инсталлера сообщал, что файл не имеет цифровой подписи и тихонько его удалял. Инсталлер написан на NSIS'е. Для всего проекта используется цифровая подпись Verisign Class 3.

        Примерно один раз из десяти, всё же удавалось установить приложение, но Касперский нападал уже на основной исполняемый файл.
        Проводилось сканирование как Касперским, так и на VirusTotal'е:
        • всех файлов по отдельности
        • инсталлер с компрессией (LZMA)
        • инсталлер без компрессии

        Угроз не обнаружено.

        Оказалось, что Касперскому была не по душе подозрительная сетевая активность в функции onInit.
        А именно, на сервер отправлялся номер устанавливаемой версии с помошью Inetc плагина.
        Сам плагин тут не причем — пробовал другие, писал свою .DLL, форкал .exe — результат тот же.

        В итоге пришлось отправлять статистику чуть позже — на первой странице инсталлера.
        • +5
          А почему вы вообще стучитесь в интернет при установке?
          Молча собираете данные о пользователях, не спрашивая, хотят ли они этого?
          Может скажете какое ПО разрабатываете? На какую фирму работаете?
          • –3
            Выход программы в интернет еще не означает что это вирус. Зачем она это делает, сетевая игра, чат, браузер или статистика скачиваний — совершенно другой вопрос и антивируса не касается. В данном случае это ошибка эвристика, но она вынужденная — совсем не просто узнать что именно посылается в сеть, поэтому идет перестраховка
            • +8
              Если инсталлятор ломится в сеть, лично я нахожу это подозрительным.
              • –1
                Вы же не находите подозрительным что при просмотре статьи — хабр считает статистику количества просмотров? Вообще тут уместно использование файрволлов, захотел — не пустил в сеть. Но вирус??? Вот реальный пример из моей практики. Из-за ложного срабатывания антивируса один клиент — паникер, написал жалобу в WebMoney, что я распространяю вирусы. Те заблокировали кошелек, а деньги-то нужны. В итоге разблокировали только когда антивирус убрал ложное срабатывание, а клиента, в итоге, послал вернув деньги и вовсе отказавшись ему что-либо продавать. Вот если бы антивирус предупредил, что программа просится в сеть, а не обвинял в наличии вирусов — неприятного осадка ни у кого не осталось бы.
                • +4
                  >Вы же не находите подозрительным что при просмотре статьи — хабр считает статистику количества просмотров?
                  Нет, потому что я ввел в адресную строку habrahabr.ru и я ожидаю, что браузер сделает запрос на сервер хабра и что с этим запросом будет делать хабр — это на усмотрение хабра. (или тех, кто смог перехватить запрос, спасибо отсутствию https)

                  Если я запускаю инсталлятор текстового редактора, я ожидаю, что он скопирует файлы и сделает записи в реестре.
                  Я не ожидаю того, что инсталлятор будет ломиться в сеть и рапортировать на мазершип о том, что он запустился, или спрашивать указаний.
                  Я не говорю, что это признак вируса, я говорю, что это подозрительно.
                  • +3
                    Согласен, намного приятней видеть как сделано в инсталляторах, например от Microsoft:
                    [x] Разрешить собирать анонимную статистику для улучшения наших продуктов
                    • +2
                      У микрософта по умолчанию эта галка снята.
                  • –5
                    P.S. сам я в инсталяторе для ведения статистики открываю страницу в браузере «Благодарим за установку, бла бла» в которую get'ом передаю версию которую поставили.
                    • +5
                      Убил бы.
                      • +2
                        Влад, что же вы так, не зная всей картины становитесь хейтером)

                        В случае узко нишевого софта, тесно интегрированного с веб приложением и браузерами в целом (в моем случае ПО содержит npapi и activex плагины), и пользователи когорого САМИ (первые 3 месяца бета-теста показали это) просят запустить браузер на нужной странице, для работы которой собственно было установлено ПО — не грех воспользоваться ситуацией и требуемую пользователю функцию использовать и для сбора статистики.
                        • +1
                          Ну так уточнять надо. А то просто страничка «благодарим за установку» наводит на мысли о убийстве.
                      • 0
                        Как замечательно когда после установки программы или апдейта запускается браузер! Хоть бы чекбокс о заходе на сайт после инсталла сделали ироды, присоединюсь к товарищу выше, напрягает.
                    • 0
                      У хрома, насколько мне известно, в инсталляторе нет самих устанавливаемых файлов: он их скачивает в процессе установки.
                      В любом случае, подобные инсталляторы есть, и не очень хорошо, если антивирус на них плохо реагирует.
                  • 0
                    С чего вы взяли, что молча? Есть Privacy Policy, где говорится что такая статистика может собираться.
                    Она ни в коем случае не персонализирована.

                    Продукт коммерческий, так что подобная статистика конечно же запрашивается менеджментом «верхнего» звена.
                    Никто за вами лично не шпионит, не волнуйтесь.
                    • 0
                      из того что мне лично встречалось явно полезного: предложение докачивать зависимости по фреймворкам на сотни МБ (в винде ведь нет пакетного менеджера с зависимостями), что бы не вкладывать этот фреймворк в каждый инсталлятор и напрягать пользователя открытием ссылок в браузере и морокой с дополнительными установками, при этом если положить файл фреймворка рядом с инсталлером, то он в инет не лезет вообще.
                    • 0
                      >>Оказалось, что Касперскому была не по душе подозрительная сетевая активность в функции onInit.
                      Задетектить на вечно!
                    • 0
                      Да, проблема с антивирусами и их false positive серьезная. Особенно начинает напрягать, когда попадаются те, кто не особо общается с разработчиками или «встает в позу».
                      • 0
                        А что делать, если вирус распознается в dll ресурсов?
                        • +1
                          Отправить вирлабовцам всё приложение и объяснить как эта dll используется. Была история лет 7 назад, всех деталей не упомню. Крякеры, хохмы ради, выдрали драйвер из моего продукта и выслали его отечественному антивирусу — мол вирус. Вирлабовцы добавили в базу, через пару дней драйвер стали детектировать еще с пяток антивирусов (наверно воруют базы друг у друга). На саппорт по почте ответа не было. Помогло сообщение на их форуме, где выложил скриншоты обусждения крякеров, мол как они здорово дурят вирлабовцев. После этого меня занесли в белый список, извинились и попросили перед очередным релизом высылать образец. В общем так как форум читают другие люди, и ситуация явно абсурдная — ответили.
                        • 0
                          Насколько я знаю цифровая подпись особого игнора со стороны современных АВ не даёт, детект всё равно может вызвать проактивка или эвристика, а то что показывает вирустотал это так сигнатурные-цветочки
                          • +1
                            Все верно, ЦП не панацея, и не редки случаи когда на VT все чисто, а проактивка антивируса блокирует. VT как раз позволяет провести экспресс тестирование на фальш позитивы. И если на VT все чисто, то большинство пускает продукт в релиз. Держать машины с десятком антиврусов — неудобно, и дорого (если не хочется раз в месяц все переустанавливать из-за окончания демоверсий антивирусов).
                          • 0
                            Смешной случай видел — клиент-банк Ощадбанка Украины съедает симантек.
                            • 0
                              В школьные времена писал плагин для Total Commander, к нему писал RunDll с манифестом, чтобы библиотека запускалась со стилизованными контролами. Решил выпендриться и сделать файл как можно меньше. Вот разница между использованием и неиспользованием упаковщика FSG:

                              www.virustotal.com/ru/file/03ae2a14553629912a71d2c0b9a0c3d1f2a4d9f2d924f881cc77ec76680f2a05/analysis/1404135942/ (30/53)
                              www.virustotal.com/ru/file/6abc81021545a058c9b33f7a80af089b23fc01463785696c5816decd2e2326db/analysis/1404136139/ (0/53)

                              Касперу и ДрВебу отослал, на остальных плюнул. %)
                              • 0
                                Война протекторов с антивирусами напоминает анекдот "И как там наши?". В том смысле, что и антивирусы чума, и протекторы на проприетарный софт — холера. Что лучше — а шут его знает.
                                • +3
                                  Ох, как мне это всё отвратительно. Ну кто они такие эти разработчики антивирусов, чтобы вы, разработчик совсем другого ПО уговаривали их не всегда адекватных сотрудников, что ваш продукт не вирус. Плясали с бубном, чтобы умилостивить из автоматику. У меня была похожая история несколько лет назад с ESET NOD32 habrahabr.ru/post/77587/
                                  • +1
                                    Ну вы же понимаете, что плясать с бубном надо не ради милости разработчиков антивирусов, а чтобы не потерять потенциальных пользователей.
                                    • +3
                                      Конечно понимаю. Меня возмущает сам факт возникновения этой гопоты на пути разработчика к сердцу пользователя
                                    • 0
                                      Шикарно — просто шикарно :)
                                  • 0
                                    Вот ещё один очень годный сервис www.herdprotect.com/ да и антивирусных движков на нём больше. однако хочу заметить что именно для указанных в статье юзкейсов данный сервис немного неудобен, но зато в целом более дружественный и позволяет сканировать файлы пачками любых размеров.
                                    • 0
                                      Так, например, в одном проекте партнеров, попавшем под вебфильтр нерекомендуемых сайтов известного российского антивируса, даже с привлечением юриста, умеющего составлять грамотные письменные жалобы — так и не удалось получить ответа за что туда попали и как же выбраться.


                                      Не знаете, они не пробовали судиться? Я эту тему обсуждал, правда, с американскими юристами, и вроде как там посудиться можно было (у нас есть продукт упаковщик исполняемых файлов, и потому периодически происходит бодание с антивирусами). Потом затянула разработка, и я забросил вопрос, да и вложиться надо серьезно. При этом в фоне подумывал, что, вероятно, судиться в РФ будет намного дешевле.
                                      • 0
                                        Всех тонкостей не знаю, но в суд точно не обращались, раз привлекали юриста и до суда не дошло — думаю юрист сам засомневаются что поможет. А если не поможет — это значит что ничто не помешает антивирусу в отместку остальные проекты компании забанить. Так и висит проблема уже года два — решать будут сменой домена, к сожалению архитектурой это не заложено, иначе сменили бы раньше.

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                      Самое читаемое