Setiap ekstensi Chrome membawa manifest.json yang menjelaskan sebagian besar batas kemampuan di level browser: API yang diminta, pola host, content script statis, izin opsional, dan koneksi eksternal yang diizinkan. Ini adalah file publik di paket yang Anda instal. Namun file ini tidak membuktikan capability mana yang benar-benar dipakai oleh kode saat berjalan, data apa yang keluar dari perangkat, atau akses akun mana yang terjadi lewat login web terpisah.
Saya membaca sepuluh ekstensi scraping dan otomasi browser yang dipilih untuk audit ini, termasuk Thunderbit, karena itu milik kami. Rentangnya sangat lebar. Ada yang tidak mendeklarasikan akses situs sama sekali. Ada juga yang menyatakan tiga belas izin, termasuk clipboardRead. Thunderbit adalah satu-satunya ekstensi dalam set ini yang mendeklarasikan debugger, sebuah capability luas untuk menempel ke CDP dengan profil risiko yang berbeda dari akses halaman, OAuth, atau skrip yang disediakan pengguna.
Semua itu bukan tuduhan. Izin yang luas sering kali memang satu-satunya cara jujur untuk membangun fitur tertentu, dan izin yang sempit kadang hanya berarti produknya memang lebih sedikit fungsi. Poinnya adalah: perbedaannya sangat besar, dipublikasikan, dan hampir tak pernah muncul dalam tabel perbandingan.
Bagaimana ini dilakukan
Setiap ekstensi diunduh sebagai .crx dari endpoint update milik Google sendiri — URL yang sama yang dipakai Chrome — lalu dibongkar dan diparsing. Tidak ada ekstensi yang diinstal dan tidak ada kode ekstensi yang dijalankan. Ini murni pembacaan file JSON.
Pengunduhan dilakukan dengan jeda sekitar satu permintaan tiap dua detik. Setiap .crx, SHA-256-nya, dan manifest.json hasil ekstraksi disimpan sebagai artefak. Thunderbit diproses lewat skrip yang sama seperti sembilan lainnya, bukan lewat jalur khusus, jadi barisnya diturunkan persis seperti milik mereka.
Analisis ini memakai dua kelas bukti dan memisahkannya:
- Perilaku statis yang dideklarasikan: pola host dan entri
content_scripts, termasukmatches,run_at, danall_frames. - Capability yang tersedia untuk kode runtime: API yang disebut di
permissionsatauoptional_permissions. Deklarasi ini menunjukkan apa yang bisa diminta atau dipanggil kode, bukan bahwa kode benar-benar melakukannya.
Tidak ada skor ordinal seperti "yang paling kuat". debugger, userScripts, akses host yang luas, scope OAuth, akses clipboard, dan pesan eksternal membuka data yang berbeda dan memerlukan prasyarat yang berbeda. Membandingkannya butuh model ancaman yang tidak disediakan oleh audit berbasis manifest ini.
Ukuran di bawah adalah total hasil bongkaran dalam MiB (2²⁰ bytes), dijumlahkan dari entri ZIP.
Berlaku per 2026-07-29. Ekstensi terus diperbarui; cek ulang sebelum mengutip.
Apa yang dideklarasikan oleh sepuluh manifest

Referensi resmi: panduan deklarasi izin Chrome.
| Ekstensi | Versi | Unpacked | File | Izin | Akses situs | Menjangkau file:// |
|---|---|---|---|---|---|---|
| Axiom.ai | 5.1.0 | 37.1 MiB | 232 | 8 | http://*/* + https://*/* | ✅ |
| Table Capture | 11.0.41 | 21.1 MiB | 115 | 4 (+3 opsional) | <all_urls> | ✅ |
| Magical | 3.119.1 | 16.8 MiB | 395 | 13 (+2 opsional) | <all_urls> | ✅ |
| Thunderbit (milik kami) | 4.6.4 | 15.9 MiB | 78 | 8 dikenali (+1 string array tidak dikenali: commands) | <all_urls> | ✅ |
| Clay for Chrome | 1.0.0 | 6.3 MiB | 51 | 6 | *://*/* (hanya menyuntik di domain miliknya sendiri) | — |
| Listly | 0.9.6 | 3.5 MiB | 84 | 7 | http://*/*, https://*/*, file:///*.html | ✅ |
| Hexomatic | 1.8.4 | 2.7 MiB | 37 | 2 | hanya domain milik sendiri | — |
| Agenty | 2.9.7 | 2.2 MiB | 49 | 4 | tidak ada yang dideklarasikan | — |
| Clip to Clay | 1.8.0 | 0.7 MiB | 16 | 4 | 2 domain bernama | — |
| TexAu v2 | 1.6.6 | 0.3 MiB | 12 | 6 | 14 domain bernama | — |
Dua lagi ada dalam daftar kandidat tetapi tidak masuk tabel, dan alasannya layak dibahas terpisah.
Rentangnya adalah pilihan desain, bukan efek ukuran
Agenty tidak mendeklarasikan host permission dan sama sekali tidak mengirim content script. Empat izinnya adalah activeTab, scripting, identity, dan identity.email. activeTab adalah yang paling sempit: ia memberi akses ke tab yang sedang aktif hanya setelah Anda mengklik ekstensi, dan hanya sampai Anda berpindah halaman. Tidak ada yang berjalan di halaman Anda kecuali Anda memicunya sendiri. Ukurannya 2.2 MiB.
Axiom.ai mendeklarasikan http://*/* dan https://*/*, menyuntik content script yang cocok dengan <all_urls>, dan setelah dibongkar menjadi 37.1 MiB di 232 file — tujuh belas kali ukuran Agenty, dengan akses tetap ke setiap halaman yang Anda kunjungi.
Hexomatic berada bersama Agenty: dua izin (storage, tabs), tanpa host permission, content script dibatasi ke dua domain miliknya sendiri.
Clay for Chrome adalah bentuk ketiga yang perlu dipisahkan: ia mendeklarasikan *://*/* sebagai host permission tetapi hanya menyuntik content script di domain miliknya sendiri. Capability yang tetap terbuka luas; perilaku otomatis yang sempit. Tabel izin saja menyatukan hal-hal yang seharusnya dibedakan.
Lima dari sepuluh bisa menjangkau file di disk Anda
file:/// bukan situs web. Itu adalah filesystem lokal Anda yang dirender dalam tab browser — PDF yang Anda buka, ekspor HTML, faktur yang diunduh.
Referensi resmi: dokumentasi match-pattern Chrome.
Tiga ekstensi menyatakannya secara eksplisit. Dua lainnya sampai ke sana tanpa menyebutnya: <all_urls> mencakup skema file:.
| Ekstensi | Cara menjangkau file:// | Menyebut file:// di manifest? | Di mana |
|---|---|---|---|
| Magical | cocok dengan file:///* — semua file lokal yang dirender Chrome, bukan hanya HTML — dalam empat dari enam entri content script-nya | ✅ | content script, dan web_accessible_resources |
| Listly | cocok dengan file:///*.html | ✅ | content script |
| Table Capture | content script <all_urls>, dan ia juga menamai skemanya | ✅ | web_accessible_resources |
| Axiom.ai | semata-mata karena wildcard <all_urls> | — | tidak di mana pun |
| Thunderbit (milik kami) | semata-mata karena wildcard <all_urls> | — | tidak di mana pun |
http://*/* dan https://*/* tidak mencakup file://; <all_urls> dan *://*/* juga berbeda pada hal ini. Lima di sini adalah yang deklarasinya menjangkau skema itu lewat satu jalur atau lainnya — bukan karena bentuk wildcard yang dipilih.
Chrome membatasi semua ini lewat toggle per-ekstensi "Allow access to file URLs" yang mati secara default, jadi deklarasi itu adalah permintaan, bukan pemberian. Lima dari sepuluh adalah hitungan yang jujur, dan dua dari lima itu tidak pernah menulis file:// di manifest mereka: Axiom.ai dan kami.
Hitungan ini mencakup web_accessible_resources, bukan hanya content script dan host permission. Table Capture menamai file://*/* di sana; mengabaikan blok ini akan keliru menempatkannya sebagai ekstensi yang menjangkau file tanpa menyebut skemanya.
Izin yang tidak terlihat sampai diminta

optional_permissions dideklarasikan di awal tetapi diminta saat runtime, jadi tidak muncul di prompt saat instalasi. Dua ekstensi menggunakannya, dan satu di antaranya signifikan.
| Ekstensi | optional_permissions | Yang penting |
|---|---|---|
| Table Capture | userScripts, downloads, identity | userScripts bisa menjalankan skrip buatan pengguna di konteks halaman setelah gate pengguna Chrome diaktifkan |
| Magical | downloads, webRequest | webRequest mengamati trafik jaringan |
userScripts tidak terlihat sampai diminta, dan tak terlihat oleh siapa pun yang hanya membaca jumlah izin.
Ia juga punya gate yang tidak dimiliki izin lain dalam audit ini, dan jika itu diabaikan maka hasilnya jadi terlalu tinggi. Mendeklarasikan userScripts saja tidak cukup untuk memakainya: Chrome mensyaratkan aksi pengguna yang eksplisit terlebih dahulu. Sebelum Chrome 138, itu adalah Developer Mode yang diaktifkan secara global di chrome://extensions. Mulai Chrome 138, gate itu menjadi toggle Allow User Scripts per-ekstensi di halaman detail ekstensi tersebut, yang default-nya mati. Jadi untuk instalasi biasa, capability itu memang dideklarasikan tetapi tidak aktif. Klaim yang tepat bersifat kondisional: Table Capture dapat membuat API userScripts tersedia setelah pengguna mengaktifkan gate Chrome. Audit ini tidak mengukur seberapa sering pengguna membuka halaman pengaturan itu atau menyalakan toggle tersebut.
Keduanya tidak tersembunyi; keduanya ada di manifest. Tabel yang mengabaikan blok opsional meremehkan dua produk.
Waktu injeksi, bukan hanya cakupan
Bagaimana sebuah content script disuntikkan juga penting dan mengubah gambaran. document_start adalah hook paling awal yang disediakan Chrome; all_frames menjangkau embed pihak ketiga.
Semua yang dalam set ini secara statis menyuntik ke semua frame, diurutkan menurut timing yang dideklarasikan:
| Ekstensi | run_at | all_frames | Pola match content script |
|---|---|---|---|
| Table Capture | document_start | ✅ | <all_urls> |
| Listly | document_start | ✅ | file:///*.html plus semua http dan https |
| Axiom.ai | document_start | ✅ | hanya domain miliknya sendiri |
| Clay for Chrome | document_start | ✅ | hanya domain miliknya sendiri |
| Thunderbit (milik kami) | document_end | ✅ | <all_urls> |
| Magical | document_idle | ✅ | file:///* plus http dan https yang luas |
| TexAu | document_idle (tidak diset) | ✅ | empat belas pola bernama |
Table Capture dan Listly memakai hook paling awal pada pola match yang luas. Axiom.ai dan Clay for Chrome memakai timing yang sama tetapi hanya di domain milik sendiri — agresif yang sama, target yang sempit.
Untuk deklarasi statis, <all_urls> plus all_frames adalah batas maksimal keluasan match, dan Table Capture serta Thunderbit sama-sama berada di sana. Timing yang mereka deklarasikan berbeda: Table Capture memakai document_start; content script statis Thunderbit memakai document_end. API runtime adalah kelas capability yang terpisah dan tidak bisa disimpulkan dari tabel ini.
Jumlah izin adalah statistik ringkasan yang buruk. Table Capture mendeklarasikan empat izin — lebih sedikit daripada kebanyakan di sini — dan menyuntik pada document_start ke semua frame di <all_urls>, ditambah userScripts saat diminta.
Siapa yang diizinkan mengirim pesan ke ekstensi
externally_connectable mengontrol halaman web atau ekstensi lain mana yang boleh mengirim pesan langsung ke background script sebuah ekstensi. Default-nya tidak intuitif.
Menghilangkan key ini justru berarti lebih permisif. Default Chrome ketika externally_connectable tidak ada adalah ekstensi apa pun boleh terhubung, sedangkan tidak ada web page yang boleh. Mendeklarasikannya adalah cara untuk membatasi.
Jika dibaca begitu, tabelnya berbalik:
| Ekstensi | Deklarasi externally_connectable | Siapa yang bisa mengirim pesan |
|---|---|---|
| Agenty | tidak ada | Default permisif — ekstensi apa pun boleh terhubung, tidak ada web page yang boleh |
| Clay for Chrome | tidak ada | Default permisif — ekstensi apa pun boleh terhubung, tidak ada web page yang boleh |
| Clip to Clay | tidak ada | Default permisif — ekstensi apa pun boleh terhubung, tidak ada web page yang boleh |
| Listly | tidak ada | Default permisif — ekstensi apa pun boleh terhubung, tidak ada web page yang boleh |
| Table Capture | tidak ada | Default permisif — ekstensi apa pun boleh terhubung, tidak ada web page yang boleh |
| TexAu | tidak ada | Default permisif — ekstensi apa pun boleh terhubung, tidak ada web page yang boleh |
| Thunderbit (milik kami) | tidak ada | Default permisif — ekstensi apa pun boleh terhubung, tidak ada web page yang boleh |
| Hexomatic | delapan ID ekstensi dan enam origin web | Membuka kedua kanal dari baseline tertutup |
| Axiom.ai | tujuh origin web, tanpa ids | Kanal ekstensi tertutup, tujuh web page dibuka |
| Magical | {"ids": [], "matches": []} | Satu-satunya ekstensi di sini yang menutup kedua kanal secara eksplisit |
Aturan Chrome punya dua level. Dari referensi manifest:
| Situasi | Siapa yang boleh terhubung |
|---|---|
| seluruh key tidak ada | "semua ekstensi dapat terhubung, tetapi tidak ada web page yang dapat terhubung" |
key ada, ids tidak disetel atau [] | "tidak ada ekstensi atau aplikasi yang dapat terhubung" |
key ada, matches tidak disetel atau [] | "tidak ada web page yang dapat terhubung" |
Default permisif melekat pada ketiadaan seluruh key. Begitu key ada, kedua sub-field mulai dari posisi tertutup, dan nilai yang disebutkan memperluas masing-masing kanal.
Axiom.ai mendeklarasikan key itu hanya dengan matches. Jadi ids-nya tidak disetel, yang berarti tidak ada ekstensi yang bisa mengiriminya pesan — kanal ekstensi tertutup, bukan dibiarkan terbuka. Yang dibuka adalah tujuh origin web, dan hanya satu di antaranya domain Axiom: dua adalah pihak ketiga yang tak bisa diatribusikan (*://*.tgwc.space/*, *://*.bitmachine.co.uk/*) dan sisanya adalah localhost, 0.0.0.0, host Google APIs, dan satu platform sosial besar yang tidak dioperasikannya.
Hexomatic membuka kanal ekstensi ke delapan ID bernama. Dengan key yang ada, baseline-nya adalah nol ekstensi; menyebut delapan berarti memperluasnya menjadi delapan. Enam matches-nya memperluas kanal lain dari nol, dan dua di antaranya adalah http://localhost:8000/* dan http://localhost:3000/* lewat HTTP biasa — apa pun yang merespons port itu di mesin pengguna masuk dalam allowlist.
Tujuh dari sepuluh menghilangkan key itu sepenuhnya, termasuk kami, dan merekalah yang berada di default permisif untuk messaging ekstensi-ke-ekstensi. Dua ekstensi menutup kanal itu: Magical secara eksplisit dengan ids: [], dan Axiom.ai dengan mendeklarasikan key namun tidak pernah menyebut ids. Magical adalah satu-satunya yang menutup keduanya.
Baris terakhir itulah alasan mengapa manifest harus dibaca, bukan sekadar menghitung izin. Ekstensi yang sama bisa sangat longgar di satu sumbu, namun paling ketat di sumbu lain.
Sumbu yang tak dihitung siapa pun: scope OAuth
Sebuah manifest dapat membawa blok oauth2, dan scope di dalamnya adalah akses ke akun Anda di perusahaan lain — jenis jangkauan yang berbeda dari semua yang di atas, dan tidak tercermin oleh hitungan izin mana pun.
Referensi resmi: daftar scope Google OAuth 2.0.
| Ekstensi | Scope oauth2 yang diminta |
|---|---|
| Axiom.ai | openid, email, profile, auth/drive, auth/spreadsheets |
| Table Capture | auth/spreadsheets, auth/userinfo.email |
| Agenty | openid, email, profile |
| Tujuh lainnya, termasuk kami | tidak ada yang dideklarasikan |
https://www.googleapis.com/auth/drive adalah yang paling luas. Google menyediakan scope yang lebih sempit drive.file, yang hanya memberi akses ke file yang dibuat aplikasi itu sendiri atau dipilih secara eksplisit oleh pengguna; auth/drive berarti melihat, mengedit, membuat, dan menghapus di seluruh Drive milik pengguna. auth/spreadsheets memiliki bentuk yang sama untuk setiap spreadsheet yang bisa dijangkau akun itu.
Baik Axiom.ai maupun Table Capture memasangkan scope akun Google dengan akses halaman <all_urls>.
Ada dua batas atas tentang apa yang dibuktikan tabel ini. Scope adalah diminta, bukan diberikan — Google menampilkan layar persetujuan dan pengguna bisa menolak, dan ekstensi mungkin tidak pernah memanggil API-nya. Selain itu, manifest hanya melihat OAuth yang dilakukan lewat flow identity milik Chrome; ekstensi yang mengarahkan Anda ke halaman sign-in web akan tidak menuliskan apa pun di sini. Tujuh nol itu berarti "tidak diminta di file ini", bukan "tidak ada akses ke akun Google Anda" — termasuk kami, dan itulah sebabnya sumbu ini dilaporkan, bukan diklaim sempit.
Ekstensi kami sendiri, pada skala yang sama
Thunderbit 4.6.4 melalui parser manifest yang sama seperti sembilan lainnya. Paketnya 15.9 MiB unpacked dalam 78 file.
Perilaku statis yang dideklarasikan: <all_urls> muncul di host permissions dan di cocokannya content script. Script statis berjalan di all_frames pada document_end. Karena <all_urls> mencakup file:, manifest bisa menjangkau file lokal setelah pengguna mengaktifkan toggle akses file Chrome. Thunderbit juga menghilangkan externally_connectable, jadi default Chrome mengizinkan pesan dari ekstensi apa pun tetapi tidak dari web page mana pun.
Batas capability runtime: array permissions berisi sembilan string: activeTab, commands, debugger, offscreen, scripting, sidePanel, storage, tabGroups, dan tabs. Chrome mengenali delapan di antaranya sebagai permission; commands adalah key manifest level atas dan tidak berpengaruh jika berada di array ini. Thunderbit adalah satu-satunya ekstensi dalam set ini yang mendeklarasikan debugger, yang dapat menempelkan CDP ke tab. Manifest juga menyediakan scripting untuk registrasi runtime. API-api itu menciptakan capability di luar baris statis document_end, tetapi pembacaan manifest tidak bisa membuktikan bahwa Thunderbit memanggil method CDP tertentu atau mendaftarkan skrip pada waktu lebih awal tertentu.
Perbedaan itu menutup beberapa perbandingan yang menggoda tetapi salah. Tidak adanya permission yang lebih sempit seperti cookies tidak membatasi apa yang mungkin diakses kode dengan debugger. Tidak adanya clipboardRead bukan bukti bahwa akses clipboard mustahil. Sebaliknya, adanya debugger juga bukan bukti bahwa jalur-jalur itu dipakai. Untuk menjawab pertanyaan-pertanyaan itu perlu inspeksi source code atau tracing runtime, dan keduanya tidak dilakukan di sini.
Pada instrumen ini, Thunderbit luas dalam akses situs statis, unik dalam set ini karena mendeklarasikan debugger, dan berada di default Chrome untuk messaging ekstensi-ke-ekstensi. Tidak ada satu ranking "terkuat" karena audit ini tidak menyediakan model ancaman bersama untuk CDP, OAuth, userScripts, clipboard, dan host access.
Desain yang tertahan dan tidak dipasarkan siapa pun
TexAu hanya 0.3 MiB — yang terkecil di sini dengan selisih dua kali — dan ia menamai empat belas situs spesifik alih-alih memakai wildcard: jejaring sosial, platform developer, platform publikasi, produk chat, penyedia data bisnis, dan domain miliknya sendiri. Content script-nya juga cocok tepat pada empat belas target itu.
Anda bisa membaca manifest ini dan tahu persis di mana ekstensi aktif. Itu juga bentuk disclosure produk — daftar target menjelaskan apa kegunaan alat ini lebih terang daripada materi marketing.
Trade-off-nya nyata: daftar bernama tidak bisa men-scrape situs yang tidak ada di dalamnya, dan setiap target baru butuh rilis. Tetapi "empat belas domain bernama" dan "setiap URL yang ada" adalah dua proposisi yang sangat berbeda, dan hanya satu yang terbaca dengan jelas.
Dua produk yang ternyata bukan seperti yang dikatakan daftar
Ekstensi Captain Data tidak didistribusikan secara publik. Endpoint update Google mengembalikan HTTP 204 dengan body kosong untuk extension ID-nya — respons untuk sesuatu yang tidak akan disajikan toko secara anonim. Sementara halaman listing-nya justru disajikan secara anonim — HTTP 200, 509.829 bytes. Apa yang tidak berhasil ditemukan capture di sana adalah string versi, tanggal pembaruan terakhir, atau jumlah instalasi; catatan skrip sendiri menyebut null di sana sebagai bukti lemah, dan tidak ada tembok login yang terlihat. ID-nya nyata dan first-party, jadi distribusi via tautan saja atau tidak tercantum adalah pembacaan yang paling mungkin, tetapi saya tidak bisa membedakannya dari delisting dan tidak akan menebak.
Dataflow Kit sama sekali tidak punya ekstensi Chrome. Situsnya menjelaskan aplikasi web yang di-host dengan pemilihan klik-untuk-pilih dan REST API. Namun ia tetap masuk daftar pendek ekstensi Chrome — dan begitulah biasanya daftar semacam ini dibuat.
Kebaruan dan jangkauan, karena keduanya bisa diperiksa gratis
Metadata store menambah konteks pemilihan produk di luar izin. Bidang yang sama dikumpulkan untuk setiap ekstensi pada 2026-07-30.
| Ekstensi | Versi store | Terakhir diperbarui | Bucket instalasi |
|---|---|---|---|
| Thunderbit (milik kami) | 4.6.4 | July 28, 2026 | 200,000 |
| Listly | 0.9.6 | July 25, 2026 | 100,000 |
| Axiom.ai | 5.1.0 | July 20, 2026 | 100,000 |
| Table Capture | 11.0.41 | June 26, 2026 | 200,000 |
| Magical | 3.119.1 | April 4, 2026 | 200,000 |
| Agenty | 2.9.7 | February 8, 2026 | 10,000 |
| TexAu | 1.6.6 | August 20, 2025 | 7,000 |
| Clay for Chrome | 1.0.0 | April 9, 2025 | 10,000 |
| Clip to Clay | 1.8.0 | April 8, 2025 | 1,000 |
| Hexomatic | 1.8.4 | September 6, 2024 | 3,000 |
| Captain Data | — | — | tidak disajikan publik |
Tiga produk belum rilis lebih dari setahun, dan Hexomatic hampir dua tahun. Untuk ekstensi, ini lebih penting daripada untuk library: Chrome merilis versi stabil kira-kira setiap empat minggu dan platform ekstensi sendiri terus berubah di bawahnya. userScripts memindahkan gate pengguna di Chrome 138; ekstensi yang terakhir dirilis pada 2024 dibuat terhadap seperangkat aturan yang berbeda dari browser yang sekarang menegakkannya.
Dua hal yang bukan arti tabel ini. Jumlah instalasi dibucket oleh Google — 1.000 / 3.000 / 7.000 / 10.000 / 100.000 / 200.000 — jadi yang dibandingkan hanyalah orde besarnya, bukan detail halusnya, dan beberapa produk mengiklankan angka yang lebih besar di materi marketing mereka sendiri. Tanggal yang baru adalah fakta tentang rilis, bukan putusan tentang kualitas pemeliharaan atau risiko izin.
Efek samping yang berguna: versi store cocok dengan versi manifest pada semua sepuluh paket yang dianalisis. File CRX yang diparsing audit ini adalah yang sedang disajikan store hari ini, bukan salinan usang.
Kebaruan memengaruhi seberapa banyak tindak lanjut yang pantas dilakukan pada sebuah pilihan; ia tidak mengubah semantik manifest. Ekstensi dengan domain bernama yang terakhir diperbarui setahun lalu masih bisa memaparkan permukaan halaman yang lebih sedikit daripada ekstensi wildcard yang baru rilis kemarin. Paket yang lebih baru mungkin tetap menjadi pilihan operasional yang lebih baik jika ia cepat mengikuti perubahan Chrome. Untuk shortlist, gunakan tanggal store untuk menentukan mana yang perlu dites ulang, lalu gunakan manifest untuk menentukan mana yang memerlukan review capability yang lebih dekat. Jangan jadikan dua kolom itu satu skor.
Apa yang tidak diceritakan manifest
Permission yang dideklarasikan adalah batas atas, bukan perilaku. <all_urls> berarti ekstensi boleh membaca setiap halaman. Itu tidak berarti ia benar-benar melakukannya, atau ada sesuatu yang keluar dari mesin Anda. Menentukan apa yang benar-benar terjadi memerlukan pengamatan trafik jaringan saat runtime — pekerjaan berbeda, tidak dilakukan di sini, dan tidak ada di atas yang boleh dibaca sebagai bukti penyalahgunaan.
Review terkait: eksperimen testability ekstensi Chrome.
Tiga batas lagi:
- Chrome membatasi banyak hal ini. Akses file dimatikan secara default;
activeTabsengaja sempit; optional permissions butuh prompt saat runtime; pengguna melihat daftar permission saat instalasi. - Izin yang luas sering kali memang diperlukan. Alat yang tugasnya "mengambil tabel dari halaman apa pun yang Anda buka" tidak bisa berjalan dari allowlist domain bernama. Scope sempit kadang berarti disiplin, kadang hanya produk yang lebih kecil.
- Satu versi, satu hari. Semua angka berasal dari paket yang disajikan pada 2026-07-29.
Koreksi material dalam analisis
Hitungan yang dipublikasikan memakai tiga aturan yang mudah salah saat menulis parser manifest cepat. Pertama, <all_urls> mencakup skema file:, tetapi Chrome tetap menaruh akses file yang sebenarnya di balik toggle yang dikendalikan pengguna. Kedua, web_accessible_resources.matches harus diperiksa bersama content script dan host permission; di situlah Table Capture secara eksplisit menamai file://*/*. Ketiga, externally_connectable punya default berbeda tergantung apakah seluruh key tidak ada atau key ada dengan sub-field kosong. Tabel di atas menerapkan aturan ini secara konsisten.
Total permission Thunderbit juga membedakan string mentah dari permission Chrome yang dikenali. Array-nya punya sembilan entri, tetapi commands seharusnya berada di level atas, jadi hitungan efektif yang dipakai di sini adalah delapan permission yang dikenali plus satu string yang tidak dikenali. Terakhir, deklarasi content_scripts statis bukan bukti bahwa kode memanggil scripting.registerContentScripts atau method CDP. Kemungkinan-kemungkinan itu hanya muncul pada capability runtime, bukan sebagai perilaku yang diamati. Manifest mentah, hash CRX, dan output parser adalah jejak audit untuk normalisasi ini, jadi pembaca tidak perlu mempercayai prosa begitu saja.
Untuk keputusan instalasi yang nyata, bandingkan setidaknya empat dimensi secara terpisah: halaman mana yang termasuk cakupan secara default, aksi pengguna eksplisit apa yang membuka jangkauan lebih luas, API browser atau akun apa yang tersedia, dan caller eksternal mana yang bisa mengirim pesan ke ekstensi. Model activeTab Agenty, userScripts Table Capture yang digate, scope Drive Axiom.ai, dan deklarasi debugger Thunderbit bukan titik pada satu skala linear. Mereka adalah jawaban berbeda untuk pertanyaan ancaman yang berbeda.
Berikut perbandingan itu diterapkan pada empat desain yang sengaja dibuat berbeda:
| Ekstensi | Cakupan halaman yang terlihat di manifest | Gate tambahan | Capability non-halaman dalam audit ini | Sikap caller eksternal |
|---|---|---|---|---|
| Agenty | tidak ada host permission atau content script statis | pengguna memicu activeTab pada tab saat ini | permission Chrome identity | key dihilangkan: ekstensi apa pun boleh terhubung, tidak ada web page yang boleh |
| Table Capture | script statis pada <all_urls> di semua frame pada document_start | akses file mati secara default; userScripts butuh gate pengguna terpisah dari Chrome | userScripts, downloads, dan identity opsional | key dihilangkan: ekstensi apa pun boleh terhubung, tidak ada web page yang boleh |
| Axiom.ai | akses wildcard HTTP dan HTTPS; script statis pada document_start di domain miliknya sendiri | persetujuan OAuth untuk scope Google yang diminta | scope OAuth Drive dan Sheets yang dideklarasikan | caller ekstensi ditutup; tujuh origin web dibuka |
| Thunderbit | akses host <all_urls> dan script statis di semua frame pada document_end | akses file mati secara default; menempelkan debugger memiliki perilaku yang terlihat pengguna dan dikontrol Chrome | debugger, scripting, tabs, dan API browser terkait yang dideklarasikan | key dihilangkan: ekstensi apa pun boleh terhubung, tidak ada web page yang boleh |
Tabel ini tetap tidak menghasilkan pemenang. Cakupan halaman Agenty yang sempit tidak mengatakan apa pun tentang apa yang backend-nya lakukan dengan data yang dikirim. Scope akun Axiom.ai tidak sebanding dengan ekstensi yang membaca halaman saat ini. Deklarasi userScripts Table Capture tetap inert sampai pengguna mengaktifkan gate terpisahnya. Permission debugger Thunderbit membuka permukaan kontrol browser yang luas, tetapi manifest tidak mengungkap domain atau method CDP mana yang dipanggil kode. Setiap baris memberi tahu apa yang harus diperiksa berikutnya: trafik jaringan runtime, source code, alur persetujuan, atau jejak API browser.

Pemisahan yang sama penting ketika membaca prompt instalasi Chrome. Jumlah permission mentah tidak bisa menunjukkan timing, jangkauan frame, scope OAuth, web_accessible_resources, atau key externally_connectable yang dihilangkan. Sebaliknya, deklarasi yang luas bukan bukti pengumpulan atau exfiltration. Hasil yang berguna dari audit manifest adalah rencana uji runtime yang diprioritaskan: identifikasi permukaan data, catat gate pengguna, lalu amati apakah jalur yang dideklarasikan benar-benar dipakai.
Cara membaca milik Anda sendiri
Review terkait: panduan otomasi browser.
chrome://extensions→ Details menampilkan akses situs yang diberikan, dan memungkinkan Anda mengubahnya menjadi on click untuk apa pun yang tidak membutuhkan akses tetap. Ini mempersempit separuh akses situs dari yang dibahas di atas. Ini tidak menyentuh inbound messaging (externally_connectabletetap menjangkau service worker), atau permission level browser. Permissiondebuggermilik Thunderbit penting di sini. Dokumentasi keamanan ekstensi Chromium sendiri menyebut API debugger "in some cases also sidestep other typical restrictions, such as host permissions or file access", jadi mengatur akses situs menjadi "on click" tidak membatasi apa yang bisa dijangkaunya. Kontrol itu juga tidak menyentuhtabs,webNavigation,clipboardRead,downloads, atau apa pun dioptional_permissions.- Untuk file mentah, paket berada di direktori Chrome
Extensions/<id>/<version>/. Baca enam bidang:permissions,optional_permissions,host_permissions,content_scripts(termasukmatches,run_atdanall_framesdi dalamnya),externally_connectable— ingat bahwa key yang absen bersifat permisif untuk caller ekstensi — danweb_accessible_resources, yangmatches-nya bisa menamai skema yang tidak pernah disebut content script. Bidang terakhir Thunderbit memiliki dua entri<all_urls>yang mengeksposindex.htmldan dua script bawaan ke setiap origin, denganuse_dynamic_url: false, yang memungkinkan halaman menguji apakah URL ekstensi yang stabil itu dapat di-resolve. - Periksa tanggal pembaruan terakhir listing terhadap versi Chrome saat ini.
Disclosure dan resource: artikel ini diterbitkan oleh Thunderbit, yang ekstensi-nya termasuk dalam tabel dan parser yang sama. pilar scraper open-source kami membahas alat non-ekstensi.
Coba Thunderbit untuk Ekstraksi Data Web
Versi singkatnya
Sepuluh ekstensi scraping dan otomasi, termasuk milik kami, dibaca dari manifest mereka sendiri.
Agenty tidak mendeklarasikan akses situs dan tidak punya content script, hanya bekerja pada tab yang sedang Anda lihat saat Anda mengkliknya, dengan ukuran 2.2 MiB. Axiom.ai mendeklarasikan setiap URL HTTP dan HTTPS dalam 37.1 MiB. Magical mendeklarasikan tiga belas izin termasuk clipboardRead — dan juga satu-satunya ekstensi di sini yang sepenuhnya menutup messaging masuk. Table Capture hanya mendeklarasikan empat izin, dan menyuntik pada document_start ke semua frame di <all_urls> — batas match yang sama yang kami capai, tetapi lebih awal — plus userScripts saat diminta. TexAu adalah yang terkecil, dan ia menamai target paling banyak — empat belas pola di tiga belas properti yang berbeda. Ia bukan satu-satunya yang menamai target: Clip to Clay mendeklarasikan dua (clay.com dan satu situs pihak ketiga), dan Hexomatic serta Clay for Chrome menamai domain milik mereka sendiri. TexAu adalah satu-satunya yang daftar nama targetnya mayoritas adalah situs milik orang lain. Lima dari sepuluh bisa menjangkau file di disk Anda, dan dua di antaranya — Axiom.ai dan kami — tanpa pernah menulis file://.
Thunderbit, milik kami, berada di ujung yang lebih luas: <all_urls> untuk akses host dan injeksi statis, plus debugger, yang tidak dideklarasikan oleh ekstensi lain mana pun di set ini. Ia berada pada default Chrome yang mengizinkan pesan dari ekstensi apa pun, dan ia bisa menjangkau file:// setelah gate akses file Chrome diaktifkan.
Deklarasi adalah batas atas, bukan perilaku, dan semua ini bukan bukti penyalahgunaan. Tetapi semuanya dipublikasikan, gratis untuk dicek, dan jarak antara dua ujungnya lebih besar daripada apa pun yang tampil di halaman produk.
Coba Thunderbit untuk Ekstraksi Data Web Get Started Free
FAQ
Apakah izin yang luas berarti ekstensi melakukan sesuatu yang salah — dan mengapa menghitung izin saja tidak cukup?
Tidak, dan karena hitungan izin melewatkan dua hal. <all_urls> berarti ekstensi boleh membaca setiap halaman yang Anda kunjungi; itu tidak mengatakan apa yang ia lakukan atau apakah ada sesuatu yang keluar dari mesin Anda, dan alat yang dibangun untuk mengekstrak data dari halaman apa pun memang tidak bisa bekerja dari daftar domain bernama. Temuan di sini adalah rentangnya, bukan penyimpangan — membuktikan perilaku nyata butuh analisis trafik runtime, yang tidak dilakukan audit ini. Soal hitungan: pengaturan injeksi bukan permission, jadi Table Capture mendeklarasikan empat sementara menyuntik pada document_start, ke all_frames, dengan match <all_urls>. Dan optional_permissions sama sekali tidak muncul di prompt instalasi — Table Capture bisa meminta userScripts saat runtime, yang memungkinkan menjalankan skrip pengguna arbitrer di konteks halaman, dan Magical bisa meminta webRequest.
Mana yang meminta paling sedikit?
Agenty: empat izin, tanpa host permission, tanpa content script. Ia mengandalkan activeTab, yang memberi akses ke tab saat ini hanya setelah Anda mengklik ekstensi dan hanya sampai Anda berpindah halaman. Hexomatic berikutnya, dengan dua izin dan content script yang dibatasi ke domain miliknya sendiri.
Bagaimana ekstensi bisa menjangkau file lokal saya tanpa mendeklarasikan file://?
Karena <all_urls> mencakup skema file:. Listly, Magical, dan Table Capture menamai pola file:// secara eksplisit — Magical di content script-nya dan Table Capture di web_accessible_resources. Axiom.ai dan Thunderbit menjangkaunya lewat wildcard tanpa menyebutnya di mana pun. http://*/* dan https://*/* tidak mencakup file://. Chrome menaruh akses file mati secara default di balik toggle per-ekstensi, jadi deklarasi itu adalah permintaan, bukan pemberian.
Apa itu externally_connectable, dan mengapa tidak menyebutnya justru pilihan yang lebih permisif?
Ia menamai origin web atau ID ekstensi yang boleh mengirim pesan ke background script sebuah ekstensi. Default Chrome ketika key itu tidak ada adalah bahwa setiap ekstensi boleh terhubung dan tidak ada web page yang boleh. Tujuh dari sepuluh ini menghilangkannya, termasuk Thunderbit. Dengan key hadir, Hexomatic membuka kanal ekstensi ke delapan ID bernama; Axiom.ai membuka tujuh origin web sambil membiarkan kanal ekstensi tetap tertutup; Magical mendeklarasikan daftar kosong untuk keduanya, sehingga kedua kanal tertutup.
Apa yang dideklarasikan manifest Thunderbit sendiri?
<all_urls> untuk akses host dan injeksi content script statis, di all_frames pada document_end; 15.9 MiB di 78 file; dan sembilan string dalam array permission. Delapan adalah permission yang dikenali: activeTab, debugger, offscreen, scripting, sidePanel, storage, tabGroups, dan tabs. commands adalah key manifest level atas dan tidak berpengaruh dalam array itu. Tidak ada ekstensi lain dalam set ini yang mendeklarasikan debugger. Thunderbit juga menjangkau file:// lewat <all_urls> setelah gate akses file Chrome diaktifkan, dan ia menghilangkan externally_connectable. Perilaku runtime tidak dieksekusi, jadi audit ini tidak mengklaim CDP atau method scripting mana yang benar-benar dipanggil ekstensi.


