CleanTalk Malware Scanner — эвристический анализ кода +4


Мы уже рассказывали о запуске Security сервиса для WordPress в предыдущей статье. Сегодня мы хотим рассказать о запуске эвристического анализа для определения вредоносного кода.

Само наличие вредоносного кода может привести к бану в поисковой выдаче или предупреждению в поиске о том что сайт заражен, оградить пользователей от возможно опасного контента.

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

Зачастую авторы вредоносного кода маскируют его, что затрудняет его определение по сигнатурам. Сам вредоносный код может находится где угодно на сайте, например обфусцированный php-код в файле logo.png, а сам код вызывается одной незаметной строчкой в index.php. Поэтому использование плагинов для поиска вредоносного кода предпочтительнее.

CleanTalk при первом сканировании, сканирует все файлы ядра WordPress, плагинов и тем. При повторных сканированиях, скинируются только те файлы, которые были изменены с момента последнего сканирования. Это экономит ресурсы и увеличивает скорость сканирования.

Как работает эвристический анализ


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

  1. Символы пробелов.
  2. Комментарий различных видов.
  3. Не PHP код (вне тегов <?php ?>)

Далее мы рекурсивно упрощаем код, пока не останется «сложных конструкций»:

  1. Выполняем конкатенацию строк.
  2. Подстановку переменных в переменные.
  3. и прочее

Также в процессе упрощения кода мы следим за происхождением переменных и многим другим.

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

В смысле поиска «плохой конструкции» eval для нас есть разница:

<?php echo 'eval("echo \"some\"")'; ?>

— в данном случае не будет лексемы T_EVAL,

будет лексема T_CONSTANT_ENCAPSED_STRING 'eval(«echo \»eval\"")'

<?php eval('echo "some"'); ?>

— а здесь будет. И именно этот вариант мы и обнаружим.

Мы ищем такие конструкции, разбиваем их на степени критичности:

  1. Критические:
    • eval
    • include* и require*
      • с плохим расширением файла
      • несуществующих файлов (будет удалена в след. версиях)
      • подключение удаленных файлов
  2. Опасные
    • system
    • passthru
    • proc_open
    • exec
    • include* и require*
      • с оператором подавления ошибки (будет удалена в след. версиях)
      • с переменными зависящими от POST или GET.
  3. Подозрительные
    • base64_encode
    • str_rot13
    • syslog

  4. И другие.

Мы постоянно совершенствуем этот анализ: добавляем новые конструкции для поиска, уменьшить количество ложных сработок, оптимизируем упрощение кода.

В планах научить его обнаруживать и декодировать строки закодированные в URL и BASE64 и прочих.

Сам плагин доступен в каталоге WordPress.




К сожалению, не доступен сервер mySQL