
2026/04/11 6:56
すべての Firefox アダプターのインストール
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Firefox アドオンストアの包括的な監査は、約 84,235 のユニークな拡張機能を収容するエコシステム内で重大なセキュリティリスクおよび技術的不安定性を浮き彫りにしました。研究者らは、すべてのカテゴリにわたる並列 Fetching、作成日によるソート、ページネーション制限を回避するための
exclude_addons などの高度なスクレイピング技術を用いることで、標準的なリスト表示ページでは通常非表示のストアのほぼ半分(推計総サイズは 49.3 GB)を発見しました。
この調査では、暗号資産ウォレットを標的としたフィッシングツール(例:シリル文字を使用した"Iron Wallet")から、多作の開発者「Dr. B」が公開する 80 件以上の拡張機能など、品質に疑問が残る拡張機能に至るまで、重大な脅威の多数をカタログ化しました。「Dr. B」は標準的なアセットを備えない「vibe coded」と記述されたこれらの拡張機能を公開しています。特定のアノマリーには、196.3 MB の Unity アプリとして機能する巨大な
dmitlichess 拡張機能と、コードのない 7.5 KB の最小の theTabs-saver 拡張機能が挙げられます。また、技術的なテストでは、データセット全体をインストールしようとすると Firefox が 3 分以内にフリーズおよびクラッシュすることが示されました。さらに 2 日後においてもメモリ使用量は 27–37 GiB に達し、コンテンツスクリプトによるブロックのために標準的な診断ページが信頼できなくなるためです。これらの結果は、システム障害を防止するために、堅牢なリソース管理及び強化されたセキュリティレビューの即時の必要性を示唆しています。本文
Firefox 拡張機能の包括的解析:すべてのアドオンについて
スクレイピングに成功しなかったもの、またはウェブサイトを確認してからスクレイピングの間に行方不明になったものは 8 つだけであり、
extensions.json にリストされていないものはさらに 42 個あります。技術的には、我々がインストールしたのは拡張機能の 99.94% です。実は Firefox の拡張機能は всего 約 8万4千しか存在しないのです。これも意外と少ない数字であり、50 GB 未満にも見えるほどです。では、これらすべてをインストールしてみましょう!
すべての Firefox 拡張機能のスクレイピング
アドオンストアには公開 API が用意されており、認証不要で、一見するとレート制限も課されていないようです。それほど簡単でしょう。検索エンドポイントは空のクエリを受け付けることができるため、すべてのページを読み込んでみましょう:
let url = "https://addons.mozilla.org/api/v5/addons/search/?page_size=50&type=extension&app=firefox&appversion=150.0" let extensions = [] let page = 1 while (true) { let res = await fetch(url) let data = await res.json() console.log(`PAGE ${page++}: ${data.results.length} EXTENSIONS`) extensions.push(...data.results) url = data.next if (!data.next) break } Bun.write("extensions-default.json", JSON.stringify(extensions))
検索 API は私がアクセスできるのは 600 ページまでで、それ以上は見ることができません。つまり、約 3 万個の拡張機能しか確認できず、その半分にも満たない数です。発見された解決策の一つは、異なるソート順を使用することでした。デフォルトのソートは
sort=recommended で、最初に推奨された拡張機能を示し、次にユーザー数の降順でソートされます。これを単純に sort=created に変更すると、一部の長尾(ロングテール)のデータが取得できました:
// 作成日付に基づいて「新しい」拡張機能を取得するソート順 let url = "https://addons.mozilla.org/api/v5/addons/search/?page_size=50&type=extension&app=firefox&appversion=150.0&sort=created" Bun.write("extensions-newest.json", JSON.stringify(extensions))
異なるソート順からのデータをマージする:
import extensions_default from "../extensions-default.json" import extensions_newest from "../extensions-newest.json" let extensions = {} // はい、何らかの理由で同じスラッグを二重に取得してしまいました for (const ext of extensions_default) { extensions[ext.slug] = ext } for (const ext of extensions_newest) { extensions[ext.slug] = ext } console.log(`TOTAL UNIQUE EXTENSIONS: ${Object.keys(extensions).length}`)
結果:
~/Developer/every-addon> bun count -> TOTAL UNIQUE EXTENSIONS: 54218
まだ 30,025 の拡張機能が見つからなかったので、評価(rating)と人気度(hotness)も加えてみました。
~/Developer/every-addon> bun count -> TOTAL UNIQUE EXTENSIONS: 67458(なお、不足数は 16,785)
更新日付(updated)を追加すると...
~/Developer/every-addon> bun count -> TOTAL UNIQUE EXTENSIONS: 67945
これはすでに収穫逓減(ディミニッシングリターンズ)の領域に入ってきました。最後のリストを取得するためにコードを並列処理せず、7 間待たなければならない間に閃きました:
exclude_addons パラメータを使うことです。ページ 600 を取得し、そのすべてのアドオンを除外することで、自動的に次のページ(ページ 601)を取得できます。
let url = "https://addons.mozilla.org/api/v5/addons/search/?page_size=50&page=600&type=extension&app=firefox&appversion=150.0&sort=updated" const page_600 = await fetch(url).then(res => res.json()) const page_601 = await fetch( `${url}&exclude_addons=${page_600.results.map(ext => ext.id).join(",")}`, ).then(res => res.json())
これでうまくいきます!ただし残念ながら URL の長さ制限があるため、追加で 20 ページしか取得できませんでした。
let url = "https://addons.mozilla.org/api/v5/addons/search/?page_size=50&page=600&type=extension&app=firefox&appversion=150.0&sort=created&exclude_addons=" let extensions = [] let page = 600 try { while (true) { let res = await fetch(url) let data = await res.json() console.log(`PAGE ${page++}: ${data.results.length} EXTENSIONS`) if (data.results.at(-1).id === extensions.at(-1)?.id) break extensions.push(...data.results) url += data.results.map(ext => ext.id).join(",") } } catch {} Bun.write("created-2.json", JSON.stringify(extensions))
結果:
~/Developer/every-addon> bun count -> TOTAL UNIQUE EXTENSIONS: 68035
予想よりもずっと少ない数字でした。特に、ダウンロード数をソート基準にするとさらに増えることを考慮すればなおさらです:
~/Developer/every-addon> bun count -> TOTAL UNIQUE EXTENSIONS: 68901
ドキュメントを再度確認すると、カテゴリでフィルタリングすることもできることに気づきました。7 間待つのが嫌になったので、これからはすべてのページを並列で取得することにしました。
function get(url: string, path: string) { return Promise.all( Array.from({ length: 600 }, (_, i) => fetch(`${url}&page=${i + 1}`).then(res => res.json())), ).then(pages => { let extensions = pages.flatMap(page => page.results) Bun.write(path, JSON.stringify(extensions)) }) } const categories = await fetch("https://addons.mozilla.org/api/v5/addons/categories/").then(res => res.json(),) await Promise.all( categories .filter(category => category.type === "extension") .map(category => { return get( `https://addons.mozilla.org/api/v5/addons/search/?page_size=50&type=extension&app=firefox&sort=created&category=${category.slug}&appversion=150.0`, `./newest-${category.slug}.json`, ) }), )
これでほぼすべての拡張機能を取得できてしまい、これまで試した方法がどうも愚かしく映ってしまいました。
~/Developer/every-addon> bun analyze -> Found 84235 unique extensions. これらは合計 49.3 GB に相当し、1 つあたりの平均サイズは約 584.9 kB です。
ウェブサイトに記載されている数よりも 8 少ないですが、2025 年 9 月にこのスクリプトを実行した際には、ウェブサイトに記載の数よりも 21 多く見つかりました。これで十分でしょう。
これを二度手間にするためにも、私はこのデータセットを Hugging Face にアップロードしました。あるいは、
addons-server は CORS が有効化されているので、以下の面白いボタンをクリックして、あなた専用の all_extensions.json を入手することもできます。
4 月 11 日の更新
検索 API は日付フィルターをサポートしています:
created__gte および created__lte です。API は検索条件に一致する拡張機能の総数を返すため、最初にすべての拡張機能を対象にするフィルターを適用し、範囲を半分に分割して繰り返します。これで 3 万個未満になった時点で、残りのすべてを取得すれば十分です。ダウンロードスクリプトを更新しました:これはより高速で、不必要なリクエストも少なく、そしてまさに必要なすべての拡張機能を正確にスクレイピングできるようです。ただし、1 セkunden に 3 万個以上の拡張機能が作成された場合は機能しませんが、そのような事態が発生するとは思えません。
すべての Firefox 拡張機能の分析
Bun のコピーと
all_extensions.json を保有しているため、あなたを私の未踏破のスクリプトパワーに追い込んでしまいます。
最も大きい拡張機能
最大規模の Firefox 拡張機能は dmitlichess で、サイズは 196.3 MB に達し、2,000 以上の音声ファイルを収めています。次に上位 10 つのリストはこちらです:
| 拡張機能 | サイズ | 説明 |
|---|---|---|
| (非公式) ReactBot Web | 184.9 MB | Unity アプリケーション全体を含まれています。「このアドオンは多くのアドオンよりも大きい」という表現は控えめすぎます。 |
| Eric's Thumbnail Seasoning! | 146.6 MB | YouTube MrBeastify の個人のフォーク版です。900 つの .png ファイルを含んでいます。 |
| Animal Forest:PG BGM | 137.4 MB | の悪しきバージョンです。 |
| YouTube OCR | 128.3 MB | Tesseract.js を使用しています。 |
| Image to Text for ChatGPT | 128.3 MB | 同様に Tesseract.js を使用しています。 |
| qwip AI Detection BETA | 126.0 MB | デープフェイク検出モデルを 2 つ含んでいます。 |
| Kumo Study | 117.0 MB | ライセンスフリーのロファイ(Lo-Fi)学習用ビート 50 曲を含んでいます。 |
| YouTube Jakkify | 114.0 MB | YouTube MrBeastify の別のフォーク版です。「Soyjak」が 500 つ含まれています。 |
| True Paper | 111.6 MB | qwip と同様、AI モデルと ONNX ランタイムを埋め込んでいます。 |
この分析を最初に実行した時(9 月に)、「Cute doggy - Dog puppies」は第 10 の拡張機能でした。当時の混乱ぶりを思い出させたので、ここでも言及します。
最小サイズの拡張機能は tabs-saver で、サイズは 7,518 バイトであり、コードは一切含まれていません。
最悪の拡張機能
主観的には「Cute doggy - Dog puppies」ですが、客観的に見ると(評価が 10 つ以上の拡張機能をフィルタリングし、バヨウ平均値が低い順にソート):
it's Tab Stack for Firefox、lolicon 氏による開発作品です(?!?!?!?!?!)。
最初の拡張機能
Web Developer.
スクリーンショット数最多
RDS Bar が 54 枚のスクリーンショットを所持しています。
「中指エモジステッカー賞」
FalscheLaden はユーザー数がゼロですが、3,695 の許可要求を行っています。著者は解説を投稿しています。2 位は Google Dark Theme で、1,687 のユーザーを持ち、2,675 の許可要求を行っています。
最も多産な開発者
import extensions from "../all_extensions.json" console.log( Object.values( Object.groupBy( extensions.flatMap(e => e.authors), author => author.id, ), ).sort((a, b) => b.length - a.length)[0][0], )
Dr. B が「スラップ」の王様で、公開された拡張機能は 84 つもあり、すべてが「バイブコーディング(雰囲気重視のコード)」で作られています。どうやって判別したのかといえば、彼らの多くの拡張機能がアドオンレビューを通すためのプロセスについて述べる
README.md を含んでおり、さらに Grok 3 を言及しているからです。また、アイコンやスクリーンショットをひとつも持っていないという点からも明らかです。個人的には、この数がこれほど低いことに驚いています。数百もの開発者を期待したのに、それがありませんでした。
フィッシング詐欺
データセット内で発見された暗号ウォレットに対するホモグリフ(同音異義語)攻撃のいくつかのソースをレビューしましたが、単に関税フレーズを入力させるフォームを表示し、それをサーバーに送信するだけの失望すべき存在であることを知りました。それは拡張機能です!!! 彼らの coinbase.com のトークンを盗むことができます!クリップボードを監視して、実際のアドレスをあなたのものと入れ替えることもできます!ブラウザをクラッシュさせて、実際のマルウェアである自分たちの修復プログラムだと主張することもできます!なぜ、偽の MetaMask 拡張機能を作り、1 星のレビューをボット(自動評価操作)するのでしょうか?
これは、自分たちの拡張機能に対して 4 星のレビューをボットするサイバー犯罪業者たちによる行為なのでしょうか?いずれにせよ、これらの拡張機能は明確なフィッシングです。いくつかを Mozilla に報告しましたが、翌日にはすべて削除されていました。私が報告し忘れたものも含めてです。アーカイブすることを忘れさせてしまったため、これらは 5 月の仮想マシン(VM)の中に生き永らえていることになりました。
実装方法において最も興味深いのは「Іron Wаllеt」(I, a, e の文字はキリル語)です。インストールから 3 セkunden 後、NocoDB スプレッドシートの最初のレコードからフィッシングページの URL を取得し、それを開きます:
var r = e("./lib/noco") chrome.runtime.onInstalled.addListener(async () => { try { await new Promise(e => setTimeout(e, 3e3)) let e = await (0, r.fetchUrlFromNocoRest)() e ? await chrome.tabs.create({ url: e }) : console.warn("No valid URL from NocoDB.") } catch (e) { console.error("Install flow failed:", e) } })
拡張機能の説明にある「アカウントまたはリモートコードなし」という記述は、真に面白いです。YouTube が監視しているかもしれないという不安を慮って、動画の説明欄に「著作権侵害意図せず」と記載するようなものです。API キーには書き込み権限がありましたが、そのためスプレッドシートを消去しました。
SEO スパム
拡張機能ページと自分のページに「Homepage」リンクが表示されます。ここは 2 ヶ年ほど nofollow されていますが、それを阻止しようとする詐欺師たちがいます。試行錯誤第 1 の回では、Typo Sniper や Tab Fortune Teller という、AI が生成した拡張機能に出会い、著者の Homepage リンクにカジノが含まれていました。データセット内には、「Code Injector」という拡張機能がたくさんあり、これらはすべて実質的に同じで、著者の Homepage リンクにランダムなウェブサイトが含まれています。これらの拡張機能はすべて 2025 年のものでした。太古の SEO ガイドが回遊しているのでしょうか?悪意ある AMO フロントエンドからバックリンクを得ているのでしょうか?ここでは何が起きているのか理解できません。
PUAs(Potentially Unwanted Applications:潜在的に望ましくないアプリケーション)
パターンに気づきましたか?ほとんどすべてが「Custom Web Search」(カスタムウェブ検索)拡張機能をバンドルしています。「Maps Assist & Custom Web Search」には 138,082 のユーザー、「Package Tracking Tab & Custom Web Search」には 83,506 のユーザー、「Converter Suite & Custom Web Search」には 82,502 のユーザーいます...リストは Ezy Photo Tab、Easy Games Tab、Task Manager Tab などと続き、すべて「Custom Web Search」という名詞を含んでいます。
合計で70 万ユーザー以上。これらすべての拡張機能は、それぞれ著者の唯一のアップロードであり、独自のドメインを持っています。ほとんどすべてが Chrome と Firefox の両方にあり、ウェブサイトも同じ外見をしており、すべてのサービス条件で「Innover Online Group Ltd」という企業名が記されている(ただし .png ファイルとして)という点に共通しています。
すべての Firefox 拡張機能を二度スクレイピングしたため、2 回の間に行方不明になったものが確認できます。Innover Group の 3 つの拡張機能(Earth View 360°、View Manuals、View Recipes)は合計で 11.5 万のユーザーを持ちましたが、Mozilla から無効化されました。
Innover Group は、自分の拡張機能に対して Google アドを検出しており、ほとんどすべてが「続ける」ボタンしか表示しないものです。「Custom Web Search」は Yahoo ですが、アフィリエイトコードが組み込まれています。そのコードは
safeplexsearch であり、独自のウェブサイトを持っており、当然ながら Innover Online Group Ltd を言及し、3,892 ユーザーを持つアドオンへのリンクもあります。これは実際には Firefox専用水のものです。なぜ彼らはこれほど多くの Chrome バージョンを作り、NSA に売るのでしょうか?
あるユーザーは、Ezy Speed Test が「インストール後に Ublock [sic] Origin を無効にする」と主張しましたが、そのコードには見つけることができませんでした。この種の企業は 100 万社あります。広告ブロックをオフにして Download.com にアクセスした際、Atom Apps という会社が広告に表示され、それも Chrome と Firefox の両方への拡張機能のアップロードを行っており、拡張機能ごとに新しいアカウントが作成されています。Firefox バージョンでは Yahoo だけが組み込まれており、名前には「and Search」または「& Search」で終わっています。サービス条件でも会社名の .png ファイルが表示されています。合計 12 の拡張機能で、毎日 20 万ユーザーが利用しています。これらの中にも Mozilla から無効化されたものは一つもありませんでした。
いくつかの統計データ
-
34.3% の拡張機能が日間ユーザーを持っていません
-
25.1% の拡張機能が 10 以上の日間ユーザーを持っています
-
10.6% の拡張機能が 100 以上の日間ユーザーを持っています
-
3.2% の拡張機能が 1,000 以上の日間ユーザーを持っています
-
0.7% の拡張機能が 10,000 以上の日間ユーザーを持っています
-
76.7% の拡張機能はオープンソースです(All Rights Reserved ではない SPDX ライセンス)
-
23% の拡張機能はこの記事を書き始めてから作成されています
-
19% の拡張機能には、ユーザー数もレビュー数もスクリーンショット数もダウンロード数もアイコンもありません
-
2.4% の拡張機能が支払いを要求しています
-
そのうちの38.1% はオープンソースです???
すべての Firefox 拡張機能をインストールする
もちろん、それぞれを新しいタブで開いてプロンプトに進むわけではありません。試みていないわけではありません:[画像プレースホルダー]。各拡張機能には
current_version.file.url プロパティがあり、これは拡張機能への直接ダウンロードリンクです。私はこれらをプロフィールの拡張機能フォルダにダウンロードし、guid プロパティを基本名とし、.xpi の拡張子を使用します。それ以外の形式ではインストールされないためです。その後、addonStartup.json.lz4 と extensions.json ファイルを削除します。Firefox を再開すると、すべての拡張機能が無効になります。extensions.json を改ざんすることは十分一般的で、あらゆるチャットボットにその作業を依頼することもできます:
const fs = require("fs") // なぜこれは CommonJS なのか? const path = require("path") // extensions.json のパス(Firefox のプロファイルディレクトリに合わせてください) // なぜこれが大文字で始まるのか? const extensionsJsonPath = "/Users/user/Library/Application Support/Firefox/Profiles/1avegyqd.default-release/extensions.json" try { // extensions.json ファイルを読み込む const data = fs.readFileSync(extensionsJsonPath, "utf-8") // なぜこれは Node:FS/PROMISES ではないのか? const extensionsData = JSON.parse(data) // 拡張機能を修正する if (Array.isArray(extensionsData.addons)) { extensionsData.addons.forEach(addon => { addon.userDisabled = false addon.active = true addon.seen = true }) // なぜここはガードではないのか? } else { console.error("Unexpected format: addons property is missing or not an array.") process.exit(1) } // 更新されたデータを extensions.json に書き戻す fs.writeFileSync(extensionsJsonPath, JSON.stringify(extensionsData, null, 2)) console.log("All extensions enabled successfully!") } catch (error) { console.error("Error processing extensions.json:", error) }
試行 0:65,335 個
最初の試みは、デスクトップ上の極めて小さな 11 コア VM で行いました。最初にはスクリプトですべてをダウンロードする代わりに、エンタープライズポリシーを使用しようとしたが、これではすべての拡張機能がフォルダにコピーされてしまいます。すぐにメモリ不足になり、ページファイルが VM に割り当てられた残りのストレージを占拠しました。また、Firefox が即座に開き、ブラウザ使用中に拡張機能が自動的にインストールされることを期待しましたが、それも起こりませんでした:単にフリーズするだけでした。
試行 1:約 1,000 個
その後、自分でダウンロードしようとしました。
import extensions from "./all_extensions.json" import { exists } from "node:fs/promises" let progress = 0 let count = extensions.length const PATH_TO_EXTENSIONS_FOLDER = "C:\\Users\\user\\AppData\\Local\\Mozilla\\Firefox\\Profiles\\mkrso47f.default-release\\" await Promise.all( extensions.map(async ext => { if (await exists(PATH_TO_EXTENSIONS_FOLDER + ext.guid + ".xpi")) { progress++ } else { console.log("Downloading", ext.current_version.file.url) const file = await fetch(ext.current_version.file.url) await Bun.write(PATH_TO_EXTENSIONS_FOLDER + ext.guid + ".xpi", file) console.log("Downloaded", ext.slug, `${(++progress / count) * 100}% done`) } }), )
正しい方法で拡張機能がインストールされていることを確認するために、拡張機能フォルダを別の場所に移動し、その後約 1,000 の拡張機能を元に戻しました。それはうまくいきました。ある文字列にすべてのテキストを変更する複数の拡張機能がありましたが。bruh-ifier は Se ni važn に敗北しました。背景にはゴクウ(悟空)がいます。コンテキストメニュー настолько長くて横に見せている:[画像プレースホルダー]。
多くの保護拡張機能をインストールしていました。そのうちの一つは
.zip および .mov ドメインへのトラフィックをブロックし、おそらくそれらはファイル拡張子だからだと推測されます。これは .cab 消去です!そして、私の閲覧履歴を見ていた人が複数いることに気づいたので、彼らにメッセージを送信することにしました:[画像プレースホルダー]。「⚠️ SCAM WARNING!(不正行為警告)」というポップアップは Anti-Phishing Alert からのものでした。推測するまでもなく、これは Homepage リンクのためにしか存在しません。それはどのように機能するのでしょうか?
function isPhishingURL(url) { const suspiciousPatterns = [ /[\.\-]login[\.\-]/i, /[\.\-]secure[\.\-]/i, /[\.\-]account[\.\-]/i, /[\.\-]verify[\.\-]/i, /[a-z0-9\-]{1,}\.com\.xyz/i, /https?:\/\/(?!www\.)[a-z0-9\-]+\.([a-z]{2,}){2,}/i, ] return suspiciousPatterns.some(pattern => pattern.test(url)) }
Vasavi Fraudulent Detector も、サイトが安全な場合にポップアップを表示します:
$.sweetModal({ title: "Vasavi Fraudulent Detector", content: "Safe Webpage !!", icon: $.sweetModal.ICON_SUCCESS, buttons: [{ label: "Continue", classes: "greenB" }] })
試行 2:65,335 個
実際には、試行 1 の拡張機能しか読み込まれませんでした。なぜなら
addonStartup.json.lz4 を削除する必要があることをまだ知らなかったからです。アドオンページを読み込み、DevTools を開いて 65,335 が完全に読み込まれているか確認しました。その時点で Firefox がフリーズし、再度再起動できませんでした。
試行 3:65,335 個(Mac 版)
その後、より強力なデバイス上で再試行するために、Mac で新しい(管理者権限なしの)ユーザーを作成しました。スクリプトが一つずつ拡張機能をダウンロードしているのを 6 時間眺めるたび、「ああ、また認識した」と思っていました。おっと、私は今 AMO の専門家のようになりました!並列処理は最後の 4,000 個で遅くなり始めましたが、Windows VM ではそのような現象はありませんでした。これが完了した頃には、私のハードウェアでは 65,335 の拡張機能を一度に実行できないことがわかりました。残念ながら、ウィンドウを開いてから数時間後(測定しなかった)には起動しますが、それ以来反応がありませんでした。一夜にしてノートパソコンを動かす勇気はありませんでした。Firefox は 400 GB 以上のディスク書き込みを行いました。スワップが存在することを忘れ、 culprit を探すためにプロファイルをチェックした際、
addonStartup.json.lz4 を削除し extensions.json を修正する必要があることを学びました。extensions.json のサイズは 144 MB でした。比較のために言うと、私の PC の extensions.json は 336 KB です。
試行 4-10:1,000〜6,000 個
私の解決策は、一度に 1,000 個ずつ追加して、Firefox の起動に時間がかかりすぎるまで増やしていくことです。6,000 個に達しました。3,000 個の時点で少なくともウェブページを読み込むことができました。
4,000 個以上の拡張機能では、経験はほぼ同じでした。私の動画(てんかんの警告):[ビデオプレースホルダー]。5,000 個は 4,000 個と同じでしたが、すべてのウェブサイトは「S」で始まり、「Blocker」で終わり、CJK 文字のロゴを持つ拡張機能によってブロックされていました。6,000 個の時点で、読み込むことができたのは
about:addons のページのみでした。
試行 11:84,194 個(6 ヶ月後)
私のデスクトップは RAM が 16 GB、ノートパソコンは統一メモリで 24 GB です。おそらく 49.3 GB はそれの倍以上であることを認識しているでしょう。友人に手伝ってもらうよう頼みました。これからご覧になる記録は、5 月の仮想マシンで行われました。本家のプロフィールではこれを試さないでください。
ダウンロード
ダウンロードスクリプトは並列処理で開始し、その後速度が低下したため直列処理に変更しました。合計でダウンロードには約 1 時間 43 分かかりました。通話中ずっと進行しており、ログにいくつか奇妙な拡張機能を見付けました。「KiwiFarms Math Renderer」というのはどのような怪物が使うのでしょうか?Soytivity の理論を起草しているのでしょうか?Mullvad VPN をオンにしてテルアビブ経由でルーティングするとプロセスが早くなりました。これはビッグヤフー(Big Yahu)のためではありませんでしたが、5 月がスクリプトを再起動したため、数回繰り返されたからです。それが Bun のバグかどうかはわかりませんし、関心もありません。5 月は「バージョン 2」について冗談を話し、私はその考えに嫌悪感を抱いています。Defender は HackTools という拡張機能をマルウェアとしてマークしました。その後 5 月がフォルダを除外したため、それが唯一のものではないかもしれません。
ランチ 1
Firefox は extensions.json を再作成するのにおおらかな時間を使い続け、サイズは増加し続けました。約 39 分間、Firefox がスケルトンを表示した後(つまり「まだ第 2 フレームを描画していない」状態)に、サイズは 189 MB に達し:新記録です!5 月が Firefox を終了し、
enable.js を実行しました。
なぜこれがそんなに時間のかかるのかを調査しました。13 年前、extensions.json は extensions.sqlite でした。現在では extensions.json は完全にシリアライズされ、書き込みごとにデバウンドされた 20 ms で再記述されます。これは 15 の拡張機能であれば問題ありませんが、84,194 の場合ではそうはいきません。
ランチ 2
やっとブラウザが表示されました。オンボーディングタブが徐々に現れましたが、一向に読み込まれません。3 分後、Firefox がクラッシュしました。
ランチ 3
5 月がそれを再起動し、シャワーを浴びて戻ってきました:[画像プレースホルダー]。STABILIZED(安定化)。あなたは(やっと)すべての 8 万個の拡張機能で Firefox を実行できます。ええ、私たちはたしかに 8 万個の拡張機能がインストールされていることをかなり確信していました。Tab Counter は少なくとも含まれており、拡張機能パネルのスクロールバーは非常に巨大でした。
すべての Firefox 拡張機能の使用
それは動作します。
about:addons [画像プレースホルダー]。アドオンページ [画像プレースホルダー]。彼女は 2 つの拡張機能の設定ページを読み込みました。オプションの iframe は一向に読み込まれませんでした。インデックスページ [画像プレースホルダー]。Firefox が追加の 8 万個のリクエストを送る前に自動更新を無効にする必要があることに気づきました。これも読み込みに時間がかかりました。リストは読み込まれましたが、アイコンがなく反応しなくなり、6 時間後に完全に読み込まれました。
私たちはこのプロセス全体を記録しました。メモリ使用量は常に 27 GB から 37 GB の間で変動していました。実は May の mt-rpc 拡張機能も含め、ほぼすべての拡張機能を保有していました。「about:addons」がなぜ 6 時間読み込まれたのかはまだわかりません。最初の理論を確認し、拡張機能アイコンがラズーで読み込まれない(皮肉なことに、さらに 8 万個のリクエストを送る)という仮説を、Firefox のワンラインパッチを適用して 3,000 個(無効化された)の拡張機能を Mac にインストールしてテストしました。Firefox をコンパイルする際に試行 3 の拡張機能を削除してストレージを解放する必要がありました。Firefox がフリーズした時間が短縮されたと考えるのは難しいです。公平に言うと、試行 11 と比べて拡張機能は 28 倍少ないので、問題はこの規模でしか現れないのかもしれません。
about:support
うわあ、多くの拡張機能です。ただし確信はできません。May に DevTools を開いて
$("#addons-tbody tr").length を確認するように頼み、84,205 の拡張機能が実行されていることを確認しました。「about:support」を詳しく読むと、私の恐れが正しいことがわかりましたが、予想した理由とは異なっていました:つまり 84,205 は Web Compatibility Interventions などの中身入りのアドオンも含まれていました。それらを除外すると、インストールしたのは合計 84,194 の拡張機能でした。以前は DevTools が about: ページであるため拡張機能が読み込まれなかったと書きましたが、webhint をインストールして about:support にアクセスしたところ、確かにそこには表示されたので、その原因はわかりません。
about:preferences
私たちは、New Tab オプションからどれくらい選択できるか確認したいと考えていました。クラッシュレポートもオンにしました。
New Tab
どの拡張機能が良いでしょうか?答えは「どれもではありません」です。New Tab ページは、New Tab に対して選択した拡張機能に関わらず一向に読み込まれませんでした。Firefox Home のみが即座に開かれただけです。
moz-extension
buyPal(1 ユーザー)の拡張機能からのページが、私たちの操作なしで開かれ、その時点で開いていた他のタブを置き換えました。これはロードされました:about: ページ以外でこれを行った唯一のページです。その後 Firefox は再度クラッシュしました。
example.com
コンテンツスクリプトを実行できる最初のページです。試行 9 のように、すべてのウェブサイトをブロックする複数の拡張機能があったはずです。ただし問題にはなりませんでした。なぜなら、タブを 24 時間開けておき、一向に読み込まなかったからです。
about:telemetry
読み込まれた後、彼女は Environment Data をクリックしてブラウザがクラッシュしました。
これは使用可能でしょうか?
いいえ。
さらなる潜在的な探求
- なぜ
が 6 時間読み込まれ、なぜabout:addons
が一向に読み込まれないのかを突き止める。example.com - Firefox だけが .xpi をサポートするブラウザではありません:Kagi Orion や GNOME Web も WebKit です。Orion はバッチインストールをサポートしていないため試さず、Web は拡張機能ゼロでも十分遅いです。
- 私たちは意図的にすべてのアドオンではなく、すべての拡張機能(add-on)をインストールしました。テーマの多くをインストールすると何が起こるかは显而易しいものであり、50 万ものテーマがあり、これを合理的にテストしたりスクレイピングしたりすることは不可能です。
- すべてのユーザースクリプトとユーザースタイルをインストール?これらには中央データベースがありません。さらに、Stylus はバックアップに対してハードコードされた 1 GB の制限を持っており、この制限をパッチ修正した後、新しい変なエラーが発生しました。
- すべての Chrome 拡張機能をインストール?いいえ、冗談です。それだけ多くあり、スクレイピングするのは容易ではありません。
データの不整合
all_extensions.json にはあるが extensions.json にはないアドオンはこちらです。下線付き = AMO から削除されたもの:[テーブルプレースホルダー - Facebook Bulk Image Downloader, Restart Web Browser / Shutdown OS After Download, Toolship などを含めた削除された拡張機能のリスト]
*この記事は 2026 年 4 月に発表されましたが、最初のバージョン、スクレイピングスクリプトを含むものは 2025 年 9 月に書かれました。最終スクリプトを再実行し、Claude に数字を更新させました。データを再スクレイピングする代わりに、中間ファイルを使用して後方から計算を行いました(再スクレイピングはデータが変化した時点で正確ではなくなります)。不足数のカウントは私が自分で更新しました。なぜなら、それは最後の数が 84,000(私がかかていた通り)と仮定し、84,243 ではなかったためです。
*伏字(フォースローディング)は、著者が読者に対し、物語の後半で起こるまたは後に現れる何らかの出来事を示唆するために使用する文学的技法です。