본문으로 건너뛰기
피드

Firefox 확장 프로그램 8만 4천 개 전부 설치해봤더니

general 약 7분
vote
0
댓글
북마크

Firefox 확장 프로그램 전체(약 8만 4천 개)를 AMO API로 스크래핑하고, 실제로 한 대의 컴퓨터에 전부 설치하는 과정을 기록한 글. 피싱 확장, PUA 제국, 바이브 코딩 슬롭 개발자 등 생태계의 민낯이 적나라하게 드러남.

  • 1

    AMO 공개 API로 8만 4천 개 확장 전수 스크래핑 후 Hugging Face에 데이터셋 공개

  • 2

    키릴 문자 호모글리프 피싱 확장, 3695개 퍼미션 요청 확장 등 악성 사례 다수 발견

  • 3

    Innover Online Group 등 PUA 기업이 70만+ 사용자를 Yahoo 어필리에이트로 유도

  • 4

    64GB RAM VM에서 전체 설치 성공 — about:addons 로딩에 6시간, 일반 웹페이지는 로딩 불가

  • Firefox 확장 프로그램이 총 몇 개인지 아는 사람? 약 8만 4천 개밖에 안 됨
    • "50GB도 안 되겠는데? 다 설치해보자!"라는 미친 발상에서 시작된 프로젝트

전체 확장 프로그램 스크래핑

  • AMO(addons.mozilla.org)에 인증 불필요, 레이트 리밋도 없는 공개 API가 있음
    • 검색 API가 최대 600페이지(3만 개)만 반환해서 전체 수집이 바로 안 됨
    • sort=created, sort=rating, sort=hotness 등 정렬 조건을 바꿔가며 롱테일을 수집
    • exclude_addons 파라미터로 이미 본 확장을 제외하면서 페이지를 넘김 — URL 길이 제한 때문에 20페이지 추가가 한계
  • 결국 카테고리 필터링을 병렬로 돌리니까 거의 전부 수집됨
    • 이전에 한 삽질이 전부 무의미해 보이는 순간ㅋㅋ
    • 데이터셋은 Hugging Face에 공개해둠 — 누구든 다시 할 필요 없게

확장 프로그램 분석 — 별의별 게 다 있음

  • 가장 큰 확장: dmitlichess (196.3MB) — 오디오 파일 2천 개 이상 포함
    • 2위 ReactBot Web (184.9MB)은 아예 Unity 앱을 통째로 넣어둠. "이 확장은 대부분의 확장보다 큽니다"가 역대급 언더스테이트먼트
    • Tesseract.js 임베딩한 OCR 확장이 두 개(각각 128.3MB), ONNX 런타임 내장 AI 모델 확장도 있음
  • 가장 작은 확장: theTabs-saver — 7,518바이트, 코드 없음
  • 가장 많은 권한 요청: FalscheLaden — 사용자 0명인데 3,695개 퍼미션 요청
  • 가장 다작 개발자: Dr. B — 84개 확장 전부 바이브 코딩(Grok 3 사용)
    • 확장마다 README.md에 리뷰 통과 과정이 적혀 있고, 아이콘이나 스크린샷은 하나도 없음

피싱과 악성 확장 실태

  • 크립토 지갑 호모글리프 공격(동형 문자 위장) 확장들이 발견됨
    • 가짜 MetaMask 확장인데, 그냥 시드 구문 입력 폼 띄워서 서버로 전송하는 수준
    • "확장이잖아! coinbase.com 토큰을 훔치든, 클립보드 주소를 바꿔치기하든 할 수 있는데 왜 이렇게 허접하게 만들었냐"는 게 글쓴이 반응
  • 가장 흥미로운 건 "Іron Wаllеt" — I, a, e가 키릴 문자
    • 설치 3초 후 NocoDB 스프레드시트에서 피싱 URL을 가져와서 오픈
    • "원격 코드 없음"이라고 적어놓은 게 유튜브에 "저작권 침해 의도 없음" 쓰는 것과 같은 느낌
    • API 키에 쓰기 권한이 있어서 글쓴이가 스프레드시트를 날려버림ㅋㅋ

⚠️주의

> 모질라에 신고하니 다음 날 전부 삭제됐는데, 신고 안 한 것들까지 사라짐. AMO 측에서 자체 탐지도 하고 있는 듯

PUA(원치 않는 프로그램) 제국

  • "○○ & Custom Web Search" 패턴의 확장이 27개, 총 사용자 70만 명 이상
    • 전부 각각 다른 계정에서 올라왔지만 동일 도메인 구조, 동일 약관(Innover Online Group Ltd)
    • "Custom Web Search"의 정체는 어필리에이트 코드가 붙은 Yahoo 검색
    • Chrome/Firefox 양쪽에 올라와 있는데, Yahoo 검색은 Firefox 버전에만 있음 — "Chrome 버전은 왜 만든 거지, NSA한테 팔려고?"
    • 모질라가 이 중 3개(사용자 11.5만)를 비활성화함
  • 비슷한 회사 Atom Apps도 같은 수법으로 22만 일일 사용자 보유, 아직 건재

진짜로 8만 4천 개 설치하기

  • 프로파일의 extensions 폴더에 .xpi 파일을 GUID 이름으로 다운로드, addonStartup.json.lz4extensions.json 삭제 후 재시작하는 방식

  • 시행착오 과정이 처절함:

    • 1차: tiny11 VM에서 enterprise policies로 시도 → 메모리 풀, 저장공간 풀, 프리징
    • 2차: 1,000개까지는 동작. 컨텍스트 메뉴가 화면을 꽉 채울 정도로 길어짐
    • 3차(Mac): 65,335개 설치, 다운로드에 6시간. 창은 뜨지만 응답 없음
    • 4~10차: 1,000개씩 추가하며 한계 테스트 → 3,000개가 웹페이지 로딩 가능한 마지노선, 6,000개부터는 about:addons만 로딩됨
  • 11차 시도(최종): 친구의 64GB RAM VM에서 도전

    • 다운로드 1시간 43분, extensions.json 재생성에 39분 (189MB짜리 JSON!)
    • extensions.json은 매 쓰기마다 전체를 직렬화해서 다시 쓰는 구조 — 15개면 괜찮지만 8만 4천 개는 아님
    • 결국 안정화에 성공 — 메모리 27~37GB 사이를 오가며 버팀

중요

> about:addons 페이지가 완전히 로딩되는 데 6시간 소요. example.com은 24시간 열어둬도 로딩 안 됨. "이거 쓸 수 있냐고? 아니."

재미있는 숫자들

  • 34.3%의 확장이 일일 사용자 0명
  • 19%는 사용자·리뷰·스크린샷·다운로드·아이콘 전부 없음
  • 76.7%가 오픈소스 라이선스 — 근데 유료 확장의 38.1%도 오픈소스라는 게 웃김
  • 글쓴이가 글 쓰는 동안 전체의 23%가 새로 생김

브라우저 확장 생태계의 보안 실태를 적나라하게 보여주는 글. 확장 스토어의 리뷰 체계가 대규모 PUA와 피싱을 막기엔 역부족이라는 점이 개발자로서 경각심을 갖게 함.

댓글

댓글

댓글을 불러오는 중...

general

Last.fm, 소유권 바뀌고 독립 회사로 새 출발

Last.fm이 소유권 변경을 거쳐 독립 회사로 운영된다고 밝혔다. 계정, 청취 기록, 스크로블, Pro 구독, API 기능은 그대로 유지되며 사용자 데이터 처리 방식도 바뀌지 않는다고 안내했다.

general

구글이 “사람들은 AI 모드를 좋아한다”고 하자 덕덕고 방문이 28% 가까이 늘어남

구글 검색이 AI 모드와 AI 개요를 전면에 밀어붙이는 사이, AI 없는 검색을 내세운 덕덕고 쪽 트래픽이 눈에 띄게 뛰었다. 덕덕고는 “사람들이 원하는 건 AI 자체의 찬반이 아니라 선택권”이라고 보고 있다.

general

경기도, 도민 15만 명 대상 AI·디지털 교육 시작

경기도가 2026년 AI디지털배움터를 열고 약 15만 명을 대상으로 스마트폰, 키오스크, 생성형 AI, 업무 자동화 교육을 운영해. 고령층과 정보취약지역 주민을 위한 찾아가는 교육, 청년·소상공인 대상 AI 활용 교육까지 범위를 넓힌 게 특징이야.

general

NIA “공공 AX 표준 만들고, 정책부터 현장 구현까지 직접 잇겠다”

한국지능정보사회진흥원(NIA)이 AI 기본법에 따른 인공지능정책센터로 지정되며 공공 부문의 AI 전환을 지원하겠다는 방향을 밝혔다. 핵심은 부처·지자체가 각자 따로 AI를 도입하다 생기는 중복 투자와 표준 부재를 줄이고, 일부 유스케이스는 정책 설계에서 구현까지 직접 밀어붙이겠다는 것.

general

최악의 면접은 코딩 테스트가 아니라 ‘무단 심리평가’였다

한 엔지니어가 정신건강 스타트업의 창업 엔지니어 면접에서 겪은 일을 공유했다. 기술 평가도 하기 전에 90분짜리 컬처핏 인터뷰에서 인생의 가장 힘든 날, 가족 문제, 실패한 관계 같은 사적인 이야기를 끌어냈고, 다음 날 한 줄짜리 탈락 메일을 받았다는 내용이다.