
변종 Anti-AI 봇 네트워크가 어떻게 정부 관련 Google 검색 결과를 하이재킹하고 있는가
요약
AI 생성 코드 방식인 'Vibe coding'에 반대하는 개발자가 구축한 봇 네트워크가 SEO 취약점을 악용해 Google 검색 결과를 하이재킹하고 있습니다. 이들은 권위 있는 웹사이트의 URL을 변조하여 자신들의 메시지를 전파하는 조직적인 공격을 수행합니다.
핵심 포인트
- AI 기반 코딩 방식에 반대하는 특정 목적의 봇 네트워크 발견
- SEO 취약점을 이용해 정부 및 기업 웹사이트의 검색 결과를 조작
- Cloudflare를 활용해 공격자의 신원을 은닉하고 대규모 도메인 운영
- 도메인 보안 및 검색 엔진 최적화 취약점에 대한 주의 필요
만약 당신이 정기적으로 서버 로그를 모니터링하거나 권위 있는 웹사이트들을 브라우징한다면, 최근 브라우저 주소창에 기이한 트렌드가 스며들고 있다는 것을 눈치챘을지도 모릅니다.
Anthropic의 경제 보고서를 불러오든, 미국 환경보호청 (EPA) 웹사이트를 확인하든, 혹은 인도 정부의 Sanchar Saathi 포털을 방문하든, 다음과 같이 보이는 URL을 마주칠 수 있습니다:
언뜻 보기에는 개발자가 실수로 운영 환경 (production environment)에 농담을 푸시한 것처럼 보입니다. 하지만 더 깊은 기술적 조사를 통해 매우 조직적이고 자동화된 SEO (검색 엔진 최적화) 취약점 공격임이 드러났습니다. 한 변종 개발자가 AI 생성 코드의 부상을 반대하기 위해 거대한 스크래퍼 네트워크 (scraper network)를 구축했으며, 기술적인 SEO 취약점을 활용하여 전 세계 Google 검색 결과에 자신들의 선언문을 직접 새겨 넣고 있습니다.
이 봇 네트워크가 어떻게 작동하는지, 왜 주요 정부 및 기업 웹사이트들이 이 공격의 희생양이 되고 있는지, 그리고 개발자들이 도메인을 보호하기 위해 취해야 할 정확한 단계는 무엇인지에 대해 분석해 보겠습니다.
네트워크의 동기
이 취약점 공격을 이해하려면 그 동기를 살펴봐야 합니다. "Vibe coding"은 최근 큰 인기를 얻은 속어입니다. 이는 기초 로직을 수동으로 작성하거나 검증하지 않고, AI 에이전트에게 자연어 프롬프트를 입력하는 것만으로 소프트웨어를 구축하는 관행을 설명합니다.
많은 전통적인 소프트웨어 엔지니어들은 이러한 변화가 취약하고, 보안에 취약하며, 유지보수가 불가능한 시스템을 만든다고 주장하며 강력히 반대합니다.
한 엔지니어는 공격적인 행동을 취하기로 결심했습니다. 조사관들이 이 이상한 URL들의 백링크 프로필 (backlink profiles)을 추적한 결과, 전체 운영의 중심이 되는 중앙 집중식 루트 도메인(root domain)을 발견했습니다: https://vibecodingisbullshit.com/.
텍스트 아래에는 제작자가 "엔터프라이즈 파트너 네트워크 (Enterprise Partner Network)"라고 부르는 디렉토리가 존재합니다. 개발자는 조정된 신디케이션 엔진 (syndication engine) 역할을 수행하기 위해 (Cloudflare 개인정보 보호 기능 뒤에 숨겨진) 방대한 도메인 포트폴리오를 등록했습니다. 스팸을 생성하는 핵심 네트워크는 다음과 같습니다:
- https://vibecodingsucks.ai/
- https://vibecodingisbullshit.ai/
- https://vibecoding.sucks/
- https://vibecodingsucks.dev/
취약점 공격의 메커니즘 (The Mechanics of the Exploit)
이것은 서버 해킹이 아닙니다. 개발자가 Anthropic이나 영국 정부의 데이터베이스를 침해한 것이 아닙니다. 대신, 이들은 검색 엔진이 웹을 크롤링 (crawl)하는 방식을 악용하고 있습니다.
이 네트워크는 최대의 SEO 혼란을 야기하도록 무기화된 전형적인 콘텐츠 애그리게이터 (content aggregator) 모델로 작동합니다:
- 스크레이핑 (The Scrape): 자동화된 봇들이 정부, AI 기업, 뉴스 포털과 같은 권위 있는 타겟들을 지속적으로 크롤링합니다.
- 신디케이션 (The Syndication): 봇들은 기사의 헤드라인과 처음 몇 문단을 스크레이핑하여, 네트워크의 .ai 또는 .sucks 스팸 도메인 중 하나에 해당 스니펫 (snippet)을 게시합니다.
- 함정 (The Trap): 자동화된 저작권 침해 신고를 피하기 위해, 봇들은 원본 소스로 다시 연결되는 "전체 기사 읽기 (Read Full Article)" 버튼을 추가합니다.
- 페이로드 (The Payload): 모든 외부 링크에는
utm_source=vibecodingsucks와 같은 항의용 파라미터 (parameter)가 하드코딩되어 있습니다.
스크레이퍼 스크립트(scraper script)에 의해 남겨진 명백한 프로그래밍 흔적도 존재합니다. article_id=446943146.0이라는 파라미터를 살펴보면 끝에 .0이 붙어 있는 것을 알 수 있습니다. Python 데이터 스크레이핑 워크플로우 (특히 Pandas 라이브러리를 사용하는 경우)에서는 데이터 구조가 엄격하게 타입 지정 (typed)되지 않으면 정수형 데이터베이스 ID가 소수점 부동 소수점 (decimal floats)으로 빈번하게 변환됩니다.
흔적 감사하기: 직접 검색하는 방법 (Auditing the Footprint: How to Search This Yourself)
이 취약점의 규모를 제 말만 믿으실 필요는 없습니다. Google의 고급 검색 연산자(흔히 Google Dorking이라고 불림)를 사용하여 지금 바로 실제 타겟에서 발생한 피해를 확인할 수 있습니다.
inurl: 연산자를 사용하면 일반적인 텍ст 검색을 우회하여, Google이 이 악성 페이로드(payload)와 함께 실수로 인덱싱(indexing)한 모든 URL을 강제로 표시하게 할 수 있습니다.
이 네트워크의 전 세계적인 흔적을 확인하려면, 다음 문자열을 그대로 복사하여 Google에 붙여넣으세요:
inurl:vibecodingisbullshit OR inurl:vibecodingsucks OR inurl:vibecodingsucksdev
이 연산자들을 실행하면 결과는 경악스러울 정도입니다. 실제 기사 콘텐츠를 우회하여, 정규 URL(canonical tag) 설정이 누락된 조직들에 의해 남겨진, 파라미터(parameter)가 가득한 가공되지 않은 흔적들을 노출하게 됩니다.
왜 정부 사이트가 주요 피해자인가
스크레이퍼(scraper) 네트워크가 이러한 기사들을 게시하면, Googlebot은 .ai 스팸 사이트들을 크롤링(crawling)하고, 외부 링크를 클릭하여 utm_source=vibecodingsucks 페이로드를 포함한 공식 웹사이트에 도달하게 됩니다.
이상적으로는 Google이 UTM 파라미터(parameter)를 단순한 추적 노이즈로 인식하고 깨끗한 URL만 인덱싱해야 합니다. 하지만 이는 대상 웹사이트가 적절한 기술적 SEO (Search Engine Optimization)를 갖추고 있는지, 특히 정규 URL 태그(canonical tag)가 있는지 여부에 전적으로 달려 있습니다.
정규 URL 태그(canonical tag)는 검색 엔진에 URL의 정확히 어떤 버전을 인덱싱해야 하는지 알려주며, 임의의 추적 파라미터를 무시하도록 명시적으로 명령합니다.
정부 웹사이트(.gov, .gov.in, .gov.uk), 거대한 학술 포털, 그리고 레거시(legacy) 기업 CMS 빌드들은 엄청난 기술 부채(technical debt)를 안고 있는 것으로 악명이 높습니다. 이들 중 상당수는 정규 URL 태그(canonical tag)가 완전히 결여되어 있습니다. Googlebot이 이러한 페이지에 접속하면, 파라미터가 포함된 URL을 고유하고 유효한 문서로 간주합니다. 봇 네트워크가 매일 수천 개의 이러한 링크를 생성하기 때문에, Google은 이들에게 권위(authority)를 부여하고 인덱싱하여, 조롱 섞인 URL들을 공개 검색 결과로 밀어 넣게 됩니다.
개발자를 위한 우선순위 대응 계획 (The Developer’s Triage Plan)
만약 귀하의 분석 대시보드나 Google Search Console이 갑자기 이러한 파라미터(parameters)로 넘쳐난다면, 귀하의 사이트 SEO 아키텍처(architecture)가 침해된 것입니다. 이를 해결하기 위한 플레이북(playbook)은 다음과 같습니다.
1. Canonical 태그 배포 (실질적인 해결책)
이것이 유일한 영구적인 해결책입니다. 애플리케이션의 모든 페이지가 <head> 문서 내에 절대 경로를 사용하는 자기 참조형 Canonical 태그를 출력하도록 설정하십시오.
<link rel="canonical" href="https://www.yourdomain.com/clean-path" />
배포가 완료되면, Google은 향후 몇 번의 크롤링 주기(crawl cycles)에 걸쳐 링크 자산(link equity)을 통합하고 스팸 파라미터를 인덱스(index)에서 자동으로 제거할 것입니다.
2. robots.txt를 사용하지 마십시오
많은 개발자가 본능적으로 robots.txt 파일에 Disallow: /*?utm_을 추가합니다. 이는 치명적인 실수입니다. 만약 Google이 UTM 링크를 크롤링하는 것을 차단하면, Google은 귀하의 새로운 Canonical 태그를 읽을 수 없습니다. 결과적으로 Google은 해당 스팸 링크를 "robots.txt에 의해 차단되었지만 인덱스됨(Indexed, though blocked by robots.txt)" 상태로 검색 인덱스에 남겨둘 가능성이 높습니다.
3. 스크레이퍼 네트워크(Scraper Network) 거부
Google Search Console의 거부 도구(Disavow Tool)로 이동하여 루트 도메인(root domains)을 거부하는 텍스트 파일을 업로드하십시오. 이는 Google의 알고리즘에 스크레이퍼 네트워크와의 모든 연관성을 끊으라고 지시하는 것입니다:
domain:vibecodingisbullshit.ai
domain:vibecodingsucks.ai
domain:vibecoding.sucks
...
4. 클라이언트 측 주소창 정리
실제 사용자가 저속한 파라미터를 보고 실수로 소셜 미디어에 공유하는 것을 방지하려면, 분석 스크립트(analytics scripts)가 실행된 직후 JavaScript History API를 사용하여 UTM을 제거하십시오:
if (window.location.search.includes('utm_source=vibecoding')) {
const cleanUrl = window.location.protocol + "//" + window.location.host + window.location.pathname;
window.history.replaceState({}, document.title, cleanUrl);
...
5. 스크레이퍼 (Scrapers) 차단
서버 로그를 확인하여 초인적인 속도로 사이트에 접속하는 IP 주소나 User-Agent 문자열을 격리하십시오. 방화벽 수준에서 이를 차단하거나, 웹 애플리케이션 방화벽 (WAF)을 도입하여 공격적인 자동화 트래픽에 대응하십시오.
시사점
이 항의의 아이러니를 무시하기는 어렵습니다. 자동화되고 통제되지 않은 소프트웨어의 위험성을 항의하던 개발자가, 정작 인터넷을 적극적으로 오염시키고 있는 자동화되고 통제되지 않은 봇 네트워크를 풀어버린 셈입니다.
AI 보조 코딩 (AI-assisted coding)에 대해 어떤 입장을 취하든, 이번 사건은 웹마스터들에게 거대한 경종을 울립니다. 만약 귀하의 캐노니컬 (canonical) 인프라가 빈틈없이 구축되어 있지 않다면, 도메인 이름과 Python 스크립트를 가진 누구라도 검색 결과에서 귀하의 조직이 나타나는 방식을 재작성할 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기