Смотрим слова для блокировки недавней спам-атаки

У меня как минимум два сайта подверглись волне спама, похожего на атаку, направленную на отравление больших языковых моделей (LLM). О такой же атаке уже сообщалось здесь как минимум один раз (Anyone else currently undergoing mass spam attack?). Лучшее решение — настроить Discourse AI - Spam detection, что я и рекомендую, но это немного хлопотно. Вот временное решение, которое можно реализовать за несколько минут.

Предполагается, что у вас операционная система типа Unix (например, Linux или macOS). Если вы используете Windows и можете копировать/вставлять в терминал, вы можете подключиться по SSH к вашему серверу Discourse и вставить это туда.

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

Блокируемые слова могут быть очень раздражающими, так как они будут мешать легитимным пользователям создавать посты, содержащие эти слова, поэтому внимательно проверьте, чтобы ни одно из этих слов не могло появиться в легитимных постах на вашем форуме!

Введите URL вашего сайта, API-ключ и имя пользователя API в поля ниже (они будут отображаться только в вашем браузере, но вы можете просто вставить их как есть и отредактировать файл, если предпочитаете), а затем скопируйте/вставьте блок кода в терминал. Он создаст файл upload_watched_words_full.sh и сделает его исполняемым. Затем вы можете запустить его командой ./upload_watched_words_full.sh.

cat <<'EOF' > upload_watched_words_full.sh
#!/usr/bin/env bash
# Использование: ./upload_watched_words_full.sh

DISCOURSE_URL="=URL="
API_KEY="=API_KEY="
API_USERNAME="=API_USERNAME="

# Слова для блокировки с высокой уверенностью
BLOCK_WORDS=(
  "customer service number"
  "contact number"
  "support number"
  "refund phone number"
  "toll free"
  "24/7 support"
  "helpline"
  "call us"
  "live representative"
  "technical support"
  "lufthansa"
  "royal caribbean"
  "coinbase"
  "robinhood"
  "reservation number"
  "booking number"
  "flight cancellation"
  "name change fee"
  "║"
  "⇆"
  "★"
  "®️"
  "™️"
)

# Слова-флаги со средним риском
FLAG_WORDS=(
  "customer service"
  "customer support"
  "support team"
  "help desk"
  "hotline"
  "agent"
  "representative"
  "contact us"
  "phone support"
  "service center"
)

# Слова, требующие одобрения
REQUIRE_APPROVAL_WORDS=(
  "urgent"
  "immediate action"
  "act now"
  "limited time"
  "exclusive offer"
  "approve this"
  "verify account"
)

# Функция для отправки слов пакетно
add_words () {
  local ACTION="$1"
  shift
  local WORDS=("$@")

  # Формирование параметров words[]
  local DATA=""
  for w in "${WORDS[@]}"; do
    DATA+="words%5B%5D=$(printf '%s' "$w" | jq -s -R -r @uri)&"
  done
  DATA+="replacement=&action_key=${ACTION}&case_sensitive=false&html=false"

  echo "Загрузка слов ${ACTION}..."
  curl -s -X POST "${DISCOURSE_URL}/admin/customize/watched_words.json" \
    -H "Api-Key: ${API_KEY}" \
    -H "Api-Username: ${API_USERNAME}" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    --data "$DATA"
  echo -e "\nГотово."
}

# Загрузка слов для блокировки
add_words "block" "${BLOCK_WORDS[@]}"

# Загрузка слов-флагов
add_words "flag" "${FLAG_WORDS[@]}"

# Загрузка слов, требующих одобрения
add_words "require_approval" "${REQUIRE_APPROVAL_WORDS[@]}"
EOF

# Сделать скрипт исполняемым
chmod +x upload_watched_words_full.sh

echo "Скрипт 'upload_watched_words_full.sh' создан и сделан исполняемым."

8 лайков

Но Watched word Approval doesn't work if a user edits the reply?

Что ж, я не обращал на это внимания. Моя наивная надежда состоит в том, что спамеры не догадаются так делать. :person_shrugging:

1 лайк

Боты, которые были у нас несколько лет назад, создавали темы с заголовками вроде бессмыслицы dhfhstyhjfhhr, чтобы обойти фильтр ключевых слов, а затем редактировали их на настоящий спам-сообщение «лучшие онлайн-казино». :expressionless_face:

2 лайка

Это странно, что редактирование поста обходит проверку на запрещённые слова.

Возможно, эта группа спамеров не додумается до такого. Или, наоборот, это вообще не поможет. :person_shrugging:

1 лайк

Спасибо, Джей, отличный скрипт, спасибо за его создание. Кто-нибудь, кто его использовал, обнаружил, что он работает — в плане обходного пути «редактирование постов»? Боты редактируют посты или просто спамят текст напрямую?

Я не знаю, но если это проблема, вы можете изменить настройки так, чтобы некоторые пользователи не могли редактировать посты (группы, которым разрешено редактирование постов), например, требуя уровень TL2 и настраивая параметры, чтобы сделать получение TL2 проще или сложнее.

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

1 лайк

Хорошая мысль. Я изменю настройки так, чтобы tl_0 не мог редактировать сообщения.

Рассматривая одно из недавних сообщений:

Похоже, изначально это был просто мусор, который затем был отредактирован в спам; насколько я понимаю, это позволило бы обойти «Слежение за словами».

Учитывая, что редактирование сообщений от безобидного бессмыслицы до спама становится частью модуса операнди ботов в их попытках обмануть спам-фильтры, считает ли команда Discourse, что tl_0 по умолчанию не должен иметь возможность редактировать сообщения?

4 лайка

Вау. Я удивлен, что по умолчанию включен TL0.

Хорошо знать наверняка, что эти спамеры используют этот трюк.

Думаю, модуль AI Spam это бы перехватил.

2 лайка

О да, безусловно перехватил бы. Однако, хотя это и не очень дорого, настраивать AI на каждом форуме Discourse для отпугивания спама — это немного хлопотно. Многим из моих форумов он не понадобился бы (или не был бы нужен) для каких-либо других довольно полезных функций AI в Discourse.

1 лайк

Решение здесь заключается не в том, чтобы запретить tl0 или любой другой группе редактировать сообщения.

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

3 лайка

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

О, это «ожидаемое поведение»:

Наверное, так это и произошло, возможно.

Кажется, что отслеживаемые слова можно было бы применять перед сохранением (before_save), но я не изучал код.

2 лайка

Возникает вопрос о том, что именно означает применение некоторых типов отслеживаемых слов к правке. Однако также очевидно, что это ограничение значительно снижает ценность отслеживаемых слов.

Я ожидаю, что было бы полезно предложить спецификацию того, что именно должно происходить для каждого типа в случае правки; это сделало бы запрос на новую функцию более конкретным. Я не проделал эту работу, хотя периодически задумывался о конкретных случаях.

3 лайка