최근 스팸 공격을 차단할 감시 단어 설정

최소 두 개의 사이트에서 LLM을 오염시키도록 설계된 것으로 보이는 스팸 공격이 집중적으로 발생한 적이 있습니다. 동일한 공격은 이곳에서도 최소 한 번 보고되었습니다 (Anyone else currently undergoing mass spam attack?). 가장 좋은 해결책은 Discourse AI - Spam detection 을 설정하는 것인데, 이 방법은 추천하지만 약간 번거롭습니다. 여기서는 몇 분 만에 구현할 수 있는 임시 조치 방법을 소개합니다.

이 방법은 유닉스 계열 운영체제(예: Linux 또는 Mac)를 사용한다고 가정합니다. Windows를 사용하더라도 터미널에 복사/붙여넣기를 할 수 있다면 Discourse 서버에 ssh로 접속하여 이 내용을 붙여넣으면 됩니다.

이 스크립트는 제가 목격한 최근 공격에서 생성된 감시 단어(watched words) 집합을 생성하는 것입니다. nano 또는 유사한 편집기를 능숙하게 다룰 수 있다면 실행 전에 내용을 수정할 수 있습니다. 그렇지 않다면 이 스크립트를 실행한 후 원하지 않는 단어를 단어당 한 번의 클릭으로 삭제할 수 있습니다.

차단 단어(block words)는 해당 단어가 포함된 게시글을 합법적인 사용자가 작성하지 못하게 만들 수 있으므로 매우 번거로울 수 있습니다. 따라서 포럼의 합법적인 게시글에 그런 단어가 나올 가능성이 없는지 꼭 확인해 보세요!

아래 상자에 사이트 URL, API 키, API 사용자를 입력하세요 (이 정보는 브라우저에만 저장됩니다—그대로 붙여넣은 후 파일을 편집하는 것을 선호한다면 그렇게 하셔도 됩니다). 그런 다음 코드 블록을 터미널에 복사/붙여넣기하세요. upload_watched_words_full.sh 파일이 생성되고 실행 권한이 부여됩니다. 이후 ./upload_watched_words_full.sh 명령으로 실행할 수 있습니다.

cat <<'EOF' > upload_watched_words_full.sh
#!/usr/bin/env bash
# Usage: ./upload_watched_words_full.sh

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

# High-confidence block words
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"
  "║"
  "⇆"
  "★"
  "®️"
  "™️"
)

# Medium-risk flag words
FLAG_WORDS=(
  "customer service"
  "customer support"
  "support team"
  "help desk"
  "hotline"
  "agent"
  "representative"
  "contact us"
  "phone support"
  "service center"
)

# Require-approval words
REQUIRE_APPROVAL_WORDS=(
  "urgent"
  "immediate action"
  "act now"
  "limited time"
  "exclusive offer"
  "approve this"
  "verify account"
)

# Function to send words in batch
add_words () {
  local ACTION="$1"
  shift
  local WORDS=("$@")

  # Build words[] parameters
  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 "Uploading ${ACTION} words..."
  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 "\nDone."
}

# Upload block words
add_words "block" "${BLOCK_WORDS[@]}"

# Upload flag words
add_words "flag" "${FLAG_WORDS[@]}"

# Upload require-approval words
add_words "require_approval" "${REQUIRE_APPROVAL_WORDS[@]}"
EOF

# Make the script executable
chmod +x upload_watched_words_full.sh

echo "Script 'upload_watched_words_full.sh' created and made executable."

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가 게시물을 수정할 수 없도록 변경하겠습니다.

최근 게시물 중 하나를 검토해 보았습니다:

처음에는 단순히 무의미한 문자열이었다가 나중에 스팸으로 수정된 것으로 보입니다. 제 이해로는 이 경우 Watched Words(감사 단어) 기능이 우회되었을 것입니다.

무해해 보이는 무의미한 글에서 스팸으로의 게시물 수정이 봇들이 스팸 필터를 회피하려는 시도의 한 수법이 되고 있는 상황에서, Discourse 팀은 기본적으로 tl_0가 게시물을 수정할 수 없어야 한다고 생각하시나요?

4개의 좋아요

와. 기본적으로 TL0이 포함된다는 게 놀랍네요.

이 스팸머들이 그 트릭을 사용하고 있다는 걸 확실히 알게 되어 좋습니다.

AI 스팸 모듈이 이를 잡아냈을 것 같습니다.

2개의 좋아요

그렇겠죠. 하지만 AI를 설정하는 데 비록 비용이 많이 들지는 않지만, 모든 Discourse에서 스팸을 막기 위해 AI를 설정해야 한다는 점은 다소 번거롭습니다. 제 포럼 중 많은 곳은 Discourse의 다른 유용한 AI 기능들과는 달리, AI를 필요로 하거나 원하지 않을 것입니다.

1개의 좋아요

여기서 해결책은 tl0나 다른 그룹이 게시물을 편집하는 것을 막는 것이 아닙니다.

해결책은 게시물을 편집할 때 사이트의 보호 장치를 우회하지 못하도록 만드는 것입니다. 편집된 게시물에는 (우리가 이미 본 것처럼) 스팸, 혐오 표현, 또는 기타 바람직하지 않은 내용이 포함될 수 있습니다. 편집된 게시물이 감시 단어(Watched Words)나 기타 필터를 우회할 수 있다면, 이는 봇뿐 아니라 사이트의 보호 장치를 우회하려는 사용자들에게도 표준적인 방식으로 자리 잡게 될 것입니다.

3개의 좋아요

동의합니다. 그렇게 작동하지 않는다는 것이 좀 이상해 보입니다. 그리고 제가 이해한 바로는 오랫동안 깨져 있었던 것 같습니다.

아, 이것은 "기대한 동작(expected behavior)"이네요:

아마 이렇게 된 것일 수도 있겠네요.

감시 단어(watched words)가 단순히 before_save 전에 적용될 수 있을 것 같지만, 코드를 확인해 보지는 않았습니다.

2개의 좋아요

감시 단어의 일부 유형이 편집에 적용되는 것이 무엇을 의미하는지에 대한 질문이 있습니다. 하지만 이 제한 사항이 감시 단어의 가치를 크게 떨어뜨린다는 것도 분명합니다.

편집 시 각 유형별로 정확히 어떤 일이 일어나야 하는지에 대한 사양을 제안하는 것이 도움이 될 것이라고 생각합니다. 그러면 기능 요청이 더 실행 가능한 형태로 변할 것입니다. 저는 아직 그 작업을 하지 않았지만, 특정 사례에 대해 간간이 생각해보긴 했습니다.

3개의 좋아요