Критическая уязвимость в модулях отправки смс

Модули подверженные уязвимости:

mlife.smsservices, targetsms.sms, sms96ru.sms

В старой реализации функции compileTemplate отсутствовала фильтрация пользовательских данных, поступающих через макросы ($macros). Злоумышленник мог передать опасный PHP-код или символы управления переменными внутри макросов. Поскольку далее шаблон обрабатывался методом self::executePhp(), это приводило к произвольному исполнению кода (RCE) на сервере.

Кто находится в зоне риска: Уязвимости подвержены те пользователи, которые используют в смс шаблоне макросы с данных без дополнительной фильтрации, отправленные пользователем (например, имя).

Пошаговое руководство по исправлению

Шаг 1: Откройте целевой файл

Перейдите в директорию вашего проекта и откройте для редактирования следующий файл:bitrix/modules/<модуль>/lib/events.php

Шаг 2: Найдите старый метод

Найдите в коде уязвимую функцию compileTemplate. Она выглядит так:

public static function compileTemplate($template, &$macros){
    $arParams = array();
    foreach($macros as $k=>$v){
        $arParams[str_replace("#","",$k)] = $v;
    }
    $template = str_replace(array_keys($macros), $macros, $template);
    $template = self::executePhp($template,$macros,$arParams);
    foreach($arParams as $k=>$v){
        $macros['#'.$k.'#'] = $v;
    }
    //$template = preg_replace('/(\#[^#]+\#)/is',"",$template);
    return $template;
}

Шаг 3: Замените код на безопасную версию

Замените старое тело функции на новый безопасный вариант. В нем реализована многоуровневая очистка данных (удаление PHP-тегов, знаков доллара и экранирование спецсимволов):

public static function compileTemplate($template, &$macros){
    $arParams = array();
    foreach($macros as $k=>&$v){
        if(is_array($v)) continue;
        $arParams[str_replace("#","",$k)] = $v;

        // 2. УДАЛЯЕМ теги <?php
        $vClean = preg_replace('/<\?(php)?/i', '', $v);
        $vClean = str_replace('?>', '', $vClean);

        // 3. УДАЛЯЕМ знак доллара (запрет вызова переменных)
        if (stripos($template, '<?') !== false)
            $vClean = str_replace('$', '', $vClean);
        $v = $vClean;
    }
    unset($v);

    // ПРОВЕРКА: Вызываем executePhp только при наличии PHP-кода в шаблоне
    if (stripos($template, '<?') !== false) {
        // для совместимости со старыми версиями, вместо макросов в php лучше использовать $arParams
        $template = str_replace(array_keys($macros), $macros, $template);
        $template = self::executePhp($template, $macros, $arParams);
    }else{
        $template = str_replace(array_keys($macros), $macros, $template);
    }
    foreach($arParams as $k=>$v){
        $macros['#'.$k.'#'] = $v;
    }
    //$template = preg_replace('/(\#[^#]+\#)/is',"",$template);
    return $template;
}

Я ничего не понял как исправлять, и касается ли это меня?

Крайне рекомендуется обновить модули до последний версий

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

Например, не безопасный шаблон:

#NAMЕ#, ваш заказ на сумму #PRICE# принят.

Замените на безопасный:

Ваш заказ на сумму #PRICE# принят.
Для улучшения работы сайта используются cookie.
Подробнее об этом в Политике cookie.
Принять Настроить