You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
11 KiB
239 lines
11 KiB
НАЗНАЧЕНИЕ ПРОЕКТА
|
|
|
|
Автоматизация тестирования файлов на детекты антивирусов (АВ в дальнейшем), и правильность работы клиента.
|
|
Подразумевается работа в следующем окружении:
|
|
* ОС: Windows 10 с последними обновлениями
|
|
* АВ: Windows Defender (встроенный АВ 10-ки). Интересует только этот АВ!
|
|
* есть криптопанель - это сайт, на котором лежат образцы для тестирования. С ним идет связь через обычные веб-запросы.
|
|
* есть админка - это сайт, с которым связывается клиент при запуске, и пишет туда логи своей работы.
|
|
|
|
|
|
СЦЕНАРИЙ РУЧНОГО ТЕСТИРОВАНИЯ
|
|
|
|
1. Подготовка виртуальной машины
|
|
2. Загрузка архива с файлом из криптопанели на рабочий стол виртуальной машины
|
|
3. Проверка сработки АВ на архив
|
|
4. Распаковка архива
|
|
5. Проверка сработки АВ на распакованный файл(ы)
|
|
6. Запуск распакованного файла
|
|
7. Проверка сработки АВ на запущенный файл
|
|
8. Ожидание в течение заданного времени
|
|
9. Проверка создания любого из каталогов (в дальнейшем обозначаем его как %dir%):
|
|
%appdata%\vcmsd\
|
|
default user\%appdata%\vcmcsd
|
|
(см. параметр №8 в разделе ВАРИАНТЫ РЕАЛИЗАЦИИ - проверка идет по этому списку)
|
|
10. Получение client ID из файла %dir%\FAQ
|
|
11. Подключение к админке
|
|
12. Ожидание в течение заданного времени
|
|
13. Поиск отстука программы по полученному client ID
|
|
Отстук представляет из себя несколько событий:
|
|
13.1. появление СВЕЖЕЙ записи с таким client ID в админке
|
|
(факт непустого ответа от API админки, и наличие в нем записи вида
|
|
2018-08-30 10:45:58.323278 1 3 online
|
|
)
|
|
13.2. появление записи о запуске модуля system info (наличие в ответе от API админки записи вида
|
|
2018-08-30 10:47:59.642231 systeminfo start 0 63
|
|
)
|
|
13.3. появление записи о запуске модуля injectDll (наличие в ответе от API админки записи вида
|
|
injectDll 2018-08-30 11:20:26.490341 start Success
|
|
)
|
|
14. Проверка сработки АВ после отстука
|
|
|
|
При ЛЮБОМ ДЕТЕКТЕ дальнейшая проверка должна остановиться. Все последующие тесты должны получить статус SKIPPED.
|
|
SKIPPED фактически означает провал теста, но мы заводим отдельный статус, для различения с простым провалом.
|
|
В криптопанель должно быть отправлено уведомление о провале (имя образца, список тестов с результатами).
|
|
|
|
|
|
АВТОТЕСТЫ
|
|
|
|
Автотест представляет из себя подпрограмму, проверяющую одно простое условие и возвращающую TRUE/FALSE о выполнении этого условия.
|
|
|
|
Список автотестов для данного сценария:
|
|
1. archive_static_detect - был ли детект АВ на шаге 3
|
|
2. unarchived_static_detect - был ли детект АВ на шаге 5
|
|
3. proactive_detect - был ли детект АВ на шаге 7
|
|
4. client_installed - проинсталлировался ли клиент (шаг 10)
|
|
5. client_knocked - отстучал ли клиент в админку (шаг 13.1)
|
|
6. client_sysinfo_loaded - отстучал ли клиент в админку шаг 13.2
|
|
7. client_inject_loaded - отстучал ли клиент в админку шаг 13.3
|
|
8. client_modules_detect - был ли детект АВ на шаге 14
|
|
|
|
|
|
ВАРИАНТЫ РЕАЛИЗАЦИИ
|
|
|
|
Предлагается реализовать автотесты на Powershell по возможности v2.0. Выбор версии обусловлен тем, что v2.0 есть на всех ОС начиная с Windows 7.
|
|
|
|
Обращение к криптопанели предполагается через API (пока что не готово). Обязательным параметром при работе через API
|
|
будет сетевое имя компьютера.
|
|
|
|
|
|
API АДМИНКИ
|
|
|
|
https://185.64.105.33/du8ASnIODJjksdb89fsibndg7s6giosulDSGsdgsyb78s87dgdsgszklj8zgh8dsgisgsdg/clientID_suffix
|
|
Здесь clientID_suffix - это часть строки из файла FAQ после точки.
|
|
Например, если в файле C:/users/user/AppData/Roaming/vsmcd/FAQ содержится строка DESKTOP-4KGAGIP_W10014393.701EBF802F2CB023A6C24D34D9F31071
|
|
то clientID_suffix - это строка 701EBF802F2CB023A6C24D34D9F31071
|
|
Запрос следует отправлять через HTTP POST
|
|
|
|
В запросе могут быть следующие поля:
|
|
- pass: пароль. Значение всегда фиксировано - строка f779f60d4868063d462c3f99656a8a6d
|
|
- timeout: глубина времени поиска отстука, в минутах. Параметр необязательный, значение на сервере по умолчанию - 15 минут.
|
|
Рекомендуется задавать время, равное "сейчас" - "начало времени проверки отстука".
|
|
Например
|
|
- проверка отстука началась в 13:02
|
|
- ...
|
|
- в 13:07 мы делаем проверку отстука, вычисляем значение timeout, которое необходимо задать в запросе: 13:07-13:02 == 5.
|
|
Сервер отвечает, что данных нет (отстука не было)
|
|
- в 13:08 мы вновь делаем проверку отстука, вычисляем значение timeout, которое необходимо задать в запросе: 13:08-13:02 == 6.
|
|
Сервер отвечает, что данных нет (отстука не было)
|
|
- в 13:09 мы вновь делаем проверку отстука, вычисляем значение timeout, которое необходимо задать в запросе: 13:09-13:02 == 7.
|
|
Сервер отдает данные, свидетельствующие о том, что отстук был. Мы завершаем тест со статусом "успех".
|
|
|
|
Наличие параметра timeout обусловлено тем, что автотесты на одной и той же машине могут проходить часто (каждые 15-20 минут).
|
|
При этом у машины может быть один и тот же clientID. Если не отфильтровывать данные по времени, то сервер может отдать
|
|
данные об отстуке от предыдущего теста (к примеру, мы тестили 20 минут назад на этой же машине, и сервер отдал нам данные
|
|
об отстуке с предыдущего теста -- это неправильно; ожидаемый нами результат - для текущего теста отстука не было).
|
|
|
|
|
|
API КРИПТОПАНЕЛИ
|
|
|
|
Криптопанель предоставляет API со следующими операциями:
|
|
|
|
1. дай мне следующий по приоритету файл в очереди для проверки на машине с именем %MACHINE%
|
|
|
|
HTTP POST /some-random-and-long-api-prefix/getfile
|
|
|
|
параметры:
|
|
|
|
pass: захардкоженый пароль - общий для всего API. Строка.
|
|
machine: доменное имя компьютера. Строка. Это имя берется непосредственно из свойств компьютера в ОС.
|
|
|
|
Ответ: json следующего вида:
|
|
{
|
|
"file_id": 32, // идентификатор файла в БД
|
|
"file": "TVqQAAMAAAAEAAAA//8AA" // тело файла в кодировке base64
|
|
}
|
|
|
|
Начиная с момента отдачи файла, данная машина помечается в БД как проверяюшая данный файл.
|
|
Повторные запросы с этой же машины на выдачу расцениваются как валидные --
|
|
это означает сетевой сбой при приеме файла на предыдущем запросе.
|
|
|
|
2. возьми результаты проверки файла на машине %MACHINE%
|
|
|
|
HTTP POST /some-random-and-long-api-prefix/setresult
|
|
|
|
параметры:
|
|
|
|
pass: захардкоженый пароль - общий для всего API. Строка.
|
|
machine: доменное имя компьютера. Строка.
|
|
status: 0|1. Число. Возможно только два значения - обозначающие "ok" и "failed" соответственно. Означает общий результат тестирования.
|
|
log: лог тестирования. Длинная строка (будем считать, до 64к, но в теории может быть и больше) в кодировке base64.
|
|
file_id: число. Идентификатор файла, полученный в предыдущем запросе.
|
|
|
|
Система смотрит, какой файл проверялся на данной машине, и проставляет ему соответствующий статус.
|
|
ЕСЛИ файл на данной машине НЕ проверялся, либо время начала проверки слишком давнее (больше 24 часов), данный запрос следует игнорировать
|
|
как невалидный.
|
|
|
|
|
|
НАСТРОЙКА СКРИПТА
|
|
|
|
Скрипт должен быть легко конфигурируем человеком, не знающим PowerShell. Для этого в заголовок скрипта
|
|
должны быть вынесены следующие параметры (список не исключительный - туда можно выносить и другие параметры по необходимости):
|
|
1. URL криптопанели для скачки архива
|
|
2. Логин криптопанели
|
|
3. Пароль криптопанели
|
|
4. URL админки
|
|
5. Логин админки
|
|
6. Пароль админки
|
|
7. Периодичность проверки результата теста, в секундах (sleep_every)
|
|
8. Список имен папок для проверки успеха инсталляции
|
|
ЛИБО URL в криптопанели, откуда взять их список
|
|
9. Таймаут ожидания от завершения загрузки архива до результата статического детекта 1 (в секундах) (1 минута)
|
|
10. Таймаут ожидания от распаковки архива до результата статического детекта 2 (в секундах) (1 минута)
|
|
11. Таймаут ожидания от запуска клиента до результата проактивного детекта (в секундах) (5 минут)
|
|
12. Таймаут ожидания от запуска клиента до проверки создания рабочих каталогов клиента (в секундах) (5 минуты)
|
|
13. Таймаут ожидания от запуска клиента до проверки отстука клиента в админку (в секундах) (15 минут)
|
|
(вероятно тут будет несколько таймаутов, по числу под-шагов 13.1, 13.2 итд - на усмотрение программиста)
|
|
модуль sysInfo - 10 минут
|
|
модуль injectDll - 5 минут
|
|
14. Таймаут ожидания от отстука клиента в админку, до результата проактивного детекта (шаги 13-14) (в секундах) (2 минуты)
|
|
По поводу таймаутов -- суть в том, что каждое событие мы ждем определенное кол-во времени. Если за это время мы события (минут)
|
|
не дождались, то мы принимаем решение о результате теста.
|
|
Вот на каждое событие у нас должен быть таймаут, даже если он не упомянут в ТЗ.
|
|
|
|
|
|
Алгоритм всех тестов следующий (C-style псевдокод):
|
|
|
|
bool result = false;
|
|
time_t started = time(NULL);
|
|
|
|
while(time(NULL) - started < test_timeout) {
|
|
if(test condition) {
|
|
result = true;
|
|
break;
|
|
}
|
|
sleep(sleep_every);
|
|
}
|
|
|
|
time_t end = time(NULL);
|
|
|
|
То, есть, мы вертимся в цикле, просыпаясь каждые sleep_every секунд, пока не настанет ожидаемое условие (например, детект, или отстук).
|
|
Если за test_timeout условие не настало, мы завершаем проверку и публикуем результат теста.
|
|
Для детектов, логика инверсная
|
|
true это НЕУДАЧА теста (детект был :-(
|
|
false это УСПЕХ теста (детекта не было)
|
|
|
|
Детекты Windows Defender предлагается проверять по логам в Event Viewer\Applications and Services Logs\Microsoft\Windows\Windows Defender
|
|
Это можно сделать коммандлетом (см. https://letitknow.wordpress.com/2012/09/02/powershell-and-the-applications-and-services-logs/):
|
|
|
|
Get-WinEvent "Microsoft-Windows-Windows Defender/Operational"
|
|
|
|
|
|
|
|
РЕЗУЛЬТАТЫ ТЕСТОВ
|
|
|
|
1. Вывод на экран результатов тестов с метками времени начала и завершения теста:
|
|
|
|
2018-08-14 00:01:02 archive_static_detect started
|
|
2018-08-14 00:01:12 archive_static_detect: OK
|
|
2018-08-14 00:01:22 unarchived_static_detect started
|
|
2018-08-14 00:01:32 unarchived_static_detect: OK
|
|
2018-08-14 00:01:42 proactive_detect started
|
|
2018-08-14 00:01:52 proactive_detect: FAILED!
|
|
2018-08-14 00:02:02 client_installed started
|
|
2018-08-14 00:01:12 client_installed: SKIPPED
|
|
2018-08-14 00:01:22 client_knocked started
|
|
2018-08-14 00:01:32 client_knocked: SKIPPED
|
|
2018-08-14 00:01:32 client_sysinfo_loaded started
|
|
2018-08-14 00:01:32 client_sysinfo_loaded: SKIPPED
|
|
2018-08-14 00:01:32 client_inject_loaded started
|
|
2018-08-14 00:01:32 client_inject_loaded: SKIPPED
|
|
2018-08-14 00:01:32 client_modules_detect started
|
|
2018-08-14 00:01:32 client_modules_detect: SKIPPED
|
|
|
|
2. Скрипт должен возвращать в ОС значение, равное количеству проваленных тестов.
|
|
3. Скрипт должен выдавать в криптопанель результат тестов (полный лог и общий статус успех/неудача)
|
|
|
|
|
|
АВТООБНОВЛЕНИЕ СКРИПТА
|
|
|
|
Полная автоматизация тестов возможна только с автоматизацией подготовки виртуальной машины к тесту.
|
|
|
|
Подготовка к тесту включает в себя:
|
|
- обновление Windows всеми последними изменениями (это делается раз в сутки с самого начала работы, и это нельзя автоматизировать)
|
|
- автообновление скрипта автотеста. Скрипт постоянно будет обновляться, т.к. будут меняться рабочие каталоги тестируемого бинарника.
|
|
|
|
Автообновление скрипта автотеста предлагается делать через API GitLab.
|
|
Для этого требуется 2 HTTP запроса:
|
|
- для авторизации в GitLab
|
|
- для закачки скрипта.
|
|
|
|
Подробный скрипт логина на Unix shell приведен здесь:
|
|
https://stackoverflow.com/questions/47948887/login-to-gitlab-using-curl
|
|
|
|
|
|
Соответственно, должны быть добавлены следующие конфигурационные параметры скрипта:
|
|
- URL web-интерфейса GitLab
|
|
- учетные данные GitLab
|
|
- URI к исходнику скрипта на GitLab.
|
|
|