Мы уже рассказывали о запуске Security сервиса для WordPress в предыдущей статье. Сегодня мы хотим рассказать о запуске эвристического анализа для определения вредоносного кода.
Само наличие вредоносного кода может привести к бану в поисковой выдаче или предупреждению в поиске о том что сайт заражен, оградить пользователей от возможно опасного контента.
Можно найти вредоносный код и самостоятельно, но это и большой объем работы и большинство пользователей WordPress не обладает необходимыми навыками, чтобы найти и удалить ненужные строки кода.
Зачастую авторы вредоносного кода маскируют его, что затрудняет его определение по сигнатурам. Сам вредоносный код может находится где угодно на сайте, например обфусцированный php-код в файле logo.png, а сам код вызывается одной незаметной строчкой в index.php. Поэтому использование плагинов для поиска вредоносного кода предпочтительнее.
CleanTalk при первом сканировании, сканирует все файлы ядра WordPress, плагинов и тем. При повторных сканированиях, скинируются только те файлы, которые были изменены с момента последнего сканирования. Это экономит ресурсы и увеличивает скорость сканирования.
Один из главных недостатков эвристического анализа, это то что он достаточно медленный, соответственно мы используем его только когда он действительно необходим. В первую очередь мы разбиваем исходный код на лексемы (минимальная языковая конструкция) и удаляем все ненужное:
Далее мы рекурсивно упрощаем код, пока не останется «сложных конструкций»:
Также в процессе упрощения кода мы следим за происхождением переменных и многим другим.
В итоге мы получаем чистый код который можно анализировать. Очень важно, что код мы получаем не в виде строки, а в виде лексем. Таким образом, мы знаем, где находится лексема-строка с искомым текстом, а где лексема-функция.
В смысле поиска «плохой конструкции» eval для нас есть разница:
— в данном случае не будет лексемы T_EVAL,
будет лексема T_CONSTANT_ENCAPSED_STRING 'eval(«echo \»eval\"")'
— а здесь будет. И именно этот вариант мы и обнаружим.
Мы ищем такие конструкции, разбиваем их на степени критичности:
Мы постоянно совершенствуем этот анализ: добавляем новые конструкции для поиска, уменьшить количество ложных сработок, оптимизируем упрощение кода.
В планах научить его обнаруживать и декодировать строки закодированные в URL и BASE64 и прочих.
Сам плагин доступен в каталоге WordPress.
Само наличие вредоносного кода может привести к бану в поисковой выдаче или предупреждению в поиске о том что сайт заражен, оградить пользователей от возможно опасного контента.
Можно найти вредоносный код и самостоятельно, но это и большой объем работы и большинство пользователей WordPress не обладает необходимыми навыками, чтобы найти и удалить ненужные строки кода.
Зачастую авторы вредоносного кода маскируют его, что затрудняет его определение по сигнатурам. Сам вредоносный код может находится где угодно на сайте, например обфусцированный php-код в файле logo.png, а сам код вызывается одной незаметной строчкой в index.php. Поэтому использование плагинов для поиска вредоносного кода предпочтительнее.
CleanTalk при первом сканировании, сканирует все файлы ядра WordPress, плагинов и тем. При повторных сканированиях, скинируются только те файлы, которые были изменены с момента последнего сканирования. Это экономит ресурсы и увеличивает скорость сканирования.
Как работает эвристический анализ
Один из главных недостатков эвристического анализа, это то что он достаточно медленный, соответственно мы используем его только когда он действительно необходим. В первую очередь мы разбиваем исходный код на лексемы (минимальная языковая конструкция) и удаляем все ненужное:
- Символы пробелов.
- Комментарий различных видов.
- Не PHP код (вне тегов <?php ?>)
Далее мы рекурсивно упрощаем код, пока не останется «сложных конструкций»:
- Выполняем конкатенацию строк.
- Подстановку переменных в переменные.
- и прочее
Также в процессе упрощения кода мы следим за происхождением переменных и многим другим.
В итоге мы получаем чистый код который можно анализировать. Очень важно, что код мы получаем не в виде строки, а в виде лексем. Таким образом, мы знаем, где находится лексема-строка с искомым текстом, а где лексема-функция.
В смысле поиска «плохой конструкции» eval для нас есть разница:
<?php echo 'eval("echo \"some\"")'; ?>
— в данном случае не будет лексемы T_EVAL,
будет лексема T_CONSTANT_ENCAPSED_STRING 'eval(«echo \»eval\"")'
<?php eval('echo "some"'); ?>
— а здесь будет. И именно этот вариант мы и обнаружим.
Мы ищем такие конструкции, разбиваем их на степени критичности:
- Критические:
- eval
- include* и require*
- с плохим расширением файла
- несуществующих файлов (будет удалена в след. версиях)
- подключение удаленных файлов
- Опасные
- system
- passthru
- proc_open
- exec
- include* и require*
- с оператором подавления ошибки (будет удалена в след. версиях)
- с переменными зависящими от POST или GET.
- Подозрительные
- base64_encode
- str_rot13
- syslog
- И другие.
Мы постоянно совершенствуем этот анализ: добавляем новые конструкции для поиска, уменьшить количество ложных сработок, оптимизируем упрощение кода.
В планах научить его обнаруживать и декодировать строки закодированные в URL и BASE64 и прочих.
Сам плагин доступен в каталоге WordPress.