Tarayıcı eklentileri JavaScript ile yazılır ve tarayıcı tarafından arka planda yüklenir. Kendi DOM yapısına sahiptir ancak diğer sitelerin DOM'larıyla etkileşimde bulunabilir. Bu, diğer sitelerin gizliliğini, bütünlüğünü ve erişilebilirliğini (CIA) tehlikeye atabileceği anlamına gelir.
Ana Bileşenler
Eklenti düzenleri en iyi şekilde görselleştirildiğinde görünür ve üç bileşenden oluşur. Her bir bileşeni derinlemesine inceleyelim.
İçerik Scriptleri
Her içerik scripti tek bir web sayfasının DOM'una doğrudan erişime sahiptir ve bu nedenle potansiyel olarak kötü niyetli girdilere maruz kalır. Ancak, içerik scriptinin eklenti çekirdeğine mesaj göndermenin dışında başka bir izni yoktur.
Eklenti Çekirdeği
Eklenti çekirdeği, eklentinin çoğu ayrıcalıklarını/erişimlerini içerir, ancak eklenti çekirdeği yalnızca XMLHttpRequest ve içerik scriptleri aracılığıyla web içeriğiyle etkileşimde bulunabilir. Ayrıca, eklenti çekirdeği ana makineye doğrudan erişime sahip değildir.
Yerel İkili
Eklenti, kullanıcının tam ayrıcalıklarıyla ana makineye erişebilen bir yerel ikiliyi destekler. Yerel ikili, Flash ve diğer tarayıcı eklentileri tarafından kullanılan standart Netscape Eklenti Uygulama Programlama Arayüzü (NPAPI) aracılığıyla eklenti çekirdeği ile etkileşimde bulunur.
Sınırlar
Kullanıcının tam ayrıcalıklarını elde etmek için, bir saldırgan eklentiyi kötü niyetli girdileri içerik scriptinden eklentinin çekirdeğine ve eklentinin çekirdeğinden yerel ikiliye geçirmesi için ikna etmelidir.
Eklentinin her bir bileşeni, güçlü koruyucu sınırlarla birbirinden ayrılmıştır. Her bileşen, ayrı bir işletim sistemi sürecinde çalışır. İçerik scriptleri ve eklenti çekirdekleri, çoğu işletim sistemi hizmetlerine kapalı olan sandbox süreçlerinde çalışır.
Ayrıca, içerik scriptleri, ayrı bir JavaScript yığını içinde çalışarak ilişkili web sayfalarından ayrılır. İçerik scripti ve web sayfası, aynı temel DOM'a erişime sahiptir, ancak ikisi asla JavaScript işaretçilerini değiş tokuş etmez, bu da JavaScript işlevselliğinin sızmasını önler.
manifest.json
Bir Chrome eklentisi, .crx dosya uzantısına sahip bir ZIP klasörüdür. Eklentinin çekirdeği, klasörün kökünde bulunan manifest.json dosyasıdır ve bu dosya düzen, izinler ve diğer yapılandırma seçeneklerini belirtir.
İçerik betikleri, kullanıcı eşleşen bir sayfaya gittiğindeyüklenir, bu durumda https://example.com/* ifadesine uyan ve *://*/*/business* regex'ine uymayan herhangi bir sayfa. Sayfanın Belge Nesne Modeli (DOM) üzerinde keyfi erişime sahip olarak sayfanın kendi betikleri gibi çalışırlar.
Daha fazla URL eklemek veya çıkarmak için include_globs ve exclude_globs kullanmak da mümkündür.
Bu, uzantının depolama alanından message değerini almak için depolama API'sini kullanan bir açıklama butonu ekleyecek örnek bir içerik betiğidir.
chrome.storage.local.get("message", result =>{let div =document.createElement("div");div.innerHTML =result.message +" <button>Explain</button>";div.querySelector("button").addEventListener("click", () =>{chrome.runtime.sendMessage("explain");});document.body.appendChild(div);});
Bu butona tıklandığında, içerik betiği tarafından uzantı sayfalarına bir mesaj gönderilir; bu, runtime.sendMessage() API kullanılarak gerçekleştirilir. Bu, içerik betiğinin API'lere doğrudan erişimindeki sınırlamadan kaynaklanmaktadır; storage bu istisnalardan biridir. Bu istisnaların ötesindeki işlevler için, içerik betiklerinin iletişim kurabileceği uzantı sayfalarına mesajlar gönderilir.
Tarayıcıya bağlı olarak, içerik betiğinin yetenekleri biraz farklılık gösterebilir. Chromium tabanlı tarayıcılar için yetenekler listesi Chrome Geliştiricileri belgelerinde mevcuttur ve Firefox için MDN ana kaynak olarak hizmet etmektedir.
Ayrıca, içerik betiklerinin arka plan betikleriyle iletişim kurma yeteneğine sahip olduğu ve bu sayede eylemler gerçekleştirebildiği ve yanıtları iletebildiği de dikkate değerdir.
Chrome'da içerik betiklerini görüntülemek ve hata ayıklamak için, Chrome geliştirici araçları menüsüne Seçenekler > Daha fazla araç > Geliştirici araçları üzerinden veya Ctrl + Shift + I tuşlarına basarak erişilebilir.
Geliştirici araçları görüntülendikten sonra, Kaynak sekmesine tıklanmalı ve ardından İçerik Betikleri sekmesi seçilmelidir. Bu, çeşitli uzantılardan çalışan içerik betiklerinin gözlemlenmesini ve yürütme akışını izlemek için kesme noktalarının ayarlanmasını sağlar.
Enjekte edilmiş içerik betikleri
İçerik Betikleri zorunlu değildir; ayrıca dinamik olarakenjekte etmek ve web sayfalarına programatik olarak enjekte etmek de mümkündür; bu, tabs.executeScript aracılığıyla gerçekleştirilir. Bu, aslında daha detaylı kontroller sağlar.
Bir içerik betiğinin programatik olarak enjekte edilmesi için, uzantının betiklerin enjekte edileceği sayfa için host izinlerine sahip olması gerekmektedir. Bu izinler, uzantının manifestosunda talep edilerek veya geçici olarak activeTab aracılığıyla güvence altına alınabilir.
İçerik betikleri tarafından gönderilen mesajlar, uzantının bileşenlerini koordine etmede merkezi bir rol oynayan arka plan sayfası tarafından alınır. Özellikle, arka plan sayfası uzantının ömrü boyunca devam eder, doğrudan kullanıcı etkileşimi olmadan gizlice çalışır. Kendi Belge Nesne Modeli (DOM) vardır, bu da karmaşık etkileşimler ve durum yönetimi sağlar.
Ana Noktalar:
Arka Plan Sayfası Rolü: Uzantının sinir merkezi olarak hareket eder, uzantının çeşitli parçaları arasında iletişim ve koordinasyonu sağlar.
Süreklilik: Kullanıcıya görünmez, ancak uzantının işlevselliği için hayati bir öneme sahip sürekli bir varlıktır.
Otomatik Oluşturma: Açıkça tanımlanmadığı takdirde, tarayıcı otomatik olarak bir arka plan sayfası oluşturur. Bu otomatik oluşturulan sayfa, uzantının manifestosunda belirtilen tüm arka plan betiklerini içerecek şekilde, uzantının arka plan görevlerinin kesintisiz çalışmasını sağlar.
Tarayıcının açıkça belirtilmediğinde arka plan sayfasını otomatik olarak oluşturma kolaylığı, gerekli tüm arka plan betiklerinin entegre edilmesini ve çalışmasını sağlar, uzantının kurulum sürecini kolaylaştırır.
Bu, mesajları dinlemek için runtime.onMessage API kullanır. Bir "explain" mesajı alındığında, yeni bir sekmede bir sayfa açmak için tabs API kullanır.
Arka plan betiğini hata ayıklamak için uzantı ayrıntılarına gidip hizmet çalışanını inceleyebilirsiniz, bu, arka plan betiği ile geliştirici araçlarını açacaktır:
Seçenek sayfaları ve diğerleri
Tarayıcı uzantıları çeşitli türde sayfalar içerebilir:
Seçenek Sayfaları: Bu sayfa tıklandığında uzantının üstünde görüntülenir. Önceki manifestoda, bu sayfaya chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca adresinden veya tıklayarak erişebildim:
Bu sayfaların, dinamik olarak içerik yükledikleri için arka plan sayfaları gibi kalıcı olmadığını unutmayın. Bununla birlikte, arka plan sayfasıyla belirli yetenekleri paylaşırlar:
İçerik Betikleri ile İletişim: Arka plan sayfasına benzer şekilde, bu sayfalar içerik betiklerinden mesaj alabilir, uzantı içinde etkileşimi kolaylaştırır.
Uzantıya Özel API'lere Erişim: Bu sayfalar, uzantı için tanımlanan izinlere tabi olarak uzantıya özel API'lere kapsamlı erişim sağlar.
permissions & host_permissions
permissions ve host_permissions, tarayıcı uzantısının hangi izinlere sahip olduğunu (depolama, konum...) ve hangi web sayfalarında olduğunu belirten manifest.json dosyasındaki girişlerdir.
Tarayıcı uzantıları bu kadar ayrıcalıklı olabileceğinden, kötü niyetli bir uzantı veya ele geçirilmiş bir uzantı, saldırgana hassas bilgileri çalmak ve kullanıcıyı gözetlemek için farklı yollar sağlayabilir.
Bu ayarların nasıl çalıştığını ve nasıl kötüye kullanılabileceğini kontrol edin:
Bir web sayfasının bir Tarayıcı Uzantısının sayfasına, örneğin bir .html sayfasına erişebilmesi için, bu sayfanın manifest.json dosyasındaki web_accessible_resources alanında belirtilmesi gerekir.
Örneğin:
Ancak, manifest.json parametresi use_dynamic_url kullanılıyorsa, bu id dinamik olabilir.
Burada bir sayfa belirtilse bile, Content Security Policy sayesinde ClickJacking'e karşı korunmuş olabilir. Bu nedenle, bir ClickJacking saldırısının mümkün olduğunu onaylamadan önce bunu (frame-ancestors bölümü) kontrol etmeniz gerekir.
Bu sayfalara erişim izni verilmesi, bu sayfaları potansiyel olarak savunmasız ClickJacking hale getirir:
Bu sayfaların yalnızca uzantı tarafından yüklenmesine izin vermek ve rastgele URL'ler tarafından yüklenmesine izin vermemek, ClickJacking saldırılarını önleyebilir.
web_accessible_resources ve uzantının diğer sayfaları da arka plan betikleriyle iletişim kurma yeteneğine sahiptir. Bu nedenle, bu sayfalardan biri XSS'ye karşı savunmasızsa, daha büyük bir güvenlik açığı açabilir.
Ayrıca, yalnızca web_accessible_resources içinde belirtilen sayfaları iframe'ler içinde açabileceğinizi, ancak yeni bir sekmeden uzantının ID'sini bilerek herhangi bir sayfaya erişmenin mümkün olduğunu unutmayın. Bu nedenle, aynı parametreleri kötüye kullanan bir XSS bulunursa, sayfa web_accessible_resources içinde yapılandırılmamış olsa bile kötüye kullanılabilir.
externally_connectable
docs gereği, "externally_connectable" manifest özelliği, hangi uzantıların ve web sayfalarının uzantınıza runtime.connect ve runtime.sendMessage aracılığıyla bağlanabileceğini belirtir.
Eğer externally_connectable anahtarı uzantınızın manifestosunda belirtilmemişse veya "ids": ["*"] olarak belirtilmişse, tüm uzantılar bağlanabilir, ancak hiçbir web sayfası bağlanamaz.
Eğer belirli ID'ler belirtilmişse, örneğin "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"], yalnızca o uygulamalar bağlanabilir.
Eğer eşleşmeler belirtilmişse, o web uygulamaları bağlanabilecektir:
Eğer boş olarak belirtilmişse: "externally_connectable": {}, hiçbir uygulama veya web bağlanamayacaktır.
Burada belirtilen daha az uzantı ve URL, saldırı yüzeyinin daha küçük olacağı anlamına gelir.
Eğer bir web sayfası XSS veya ele geçirme için externally_connectable içinde belirtilmişse, bir saldırgan mesajları doğrudan arka plan betiğine gönderebilir, bu da İçerik Betiğini ve CSP'yi tamamen atlaması anlamına gelir.
Bu nedenle, bu çok güçlü bir atlatmadır.
Ayrıca, eğer istemci kötü niyetli bir uzantı yüklerse, bu uzantının savunmasız uzantıyla iletişim kurmasına izin verilse bile, izin verilen bir web sayfasına XSS verisi enjekte edebilir veya WebRequest veya DeclarativeNetRequest API'lerini kötüye kullanarak hedef bir alan üzerindeki istekleri manipüle edebilir ve bir sayfanın JavaScript dosyası isteğini değiştirebilir. (Hedef sayfadaki CSP'nin bu saldırıları önleyebileceğini unutmayın). Bu fikir bu yazıdan gelmektedir.
İletişim özeti
Uzantı <--> Web Uygulaması
İçerik betiği ile web sayfası arasında iletişim kurmak için genellikle post mesajları kullanılır. Bu nedenle, web uygulamasında genellikle window.postMessage fonksiyonuna yapılan çağrılar ve içerik betiğinde window.addEventListener gibi dinleyiciler bulacaksınız. Ancak, uzantının da bir Post Mesajı göndererek web uygulamasıyla iletişim kurabileceğini (bu nedenle webin bunu beklemesi gerektiğini) veya sadece webin yeni bir betik yüklemesini sağlayabileceğini unutmayın.
Uzantının içinde
Genellikle uzantı içinde bir mesaj göndermek için chrome.runtime.sendMessage fonksiyonu kullanılır (genellikle background betiği tarafından işlenir) ve bunu almak ve işlemek için bir dinleyici chrome.runtime.onMessage.addListener çağrısı ile tanımlanır.
Ayrıca, tekil mesajlar göndermek yerine sürekli bir bağlantı kurmak için chrome.runtime.connect() kullanmak da mümkündür, bu, aşağıdaki örnekte olduğu gibi mesajlar göndermek ve almak için kullanılabilir:
chrome.runtime.connect() örneği
```javascript var port = chrome.runtime.connect();
// Listen for messages from the web page window.addEventListener("message", (event) => { // Only accept messages from the same window if (event.source !== window) { return; }
// Check if the message type is "FROM_PAGE" if (event.data.type && (event.data.type === "FROM_PAGE")) { console.log("Content script received: " + event.data.text); // Forward the message to the background script port.postMessage({ type: 'FROM_PAGE', text: event.data.text }); } }, false);
// Listen for messages from the background script port.onMessage.addListener(function(msg) { console.log("Content script received message from background script:", msg); // Handle the response message from the background script });
</details>
Arka plan betiğinden belirli bir sekmede bulunan içerik betiğine mesaj göndermek de mümkündür; bu, mesajı göndermek için **`chrome.tabs.sendMessage`** çağrısını yaparak **sekmenin ID'sini** belirtmeniz gerektiği anlamına gelir.
### İzin verilen `externally_connectable`'dan uzantıya
`externally_connectable` yapılandırmasında **izin verilen web uygulamaları ve harici tarayıcı uzantıları** istek gönderebilir:
```javascript
chrome.runtime.sendMessage(extensionId, ...
extension ID'nin belirtilmesi gereken yerler.
Native Messaging
Arka plan betikleri, sistem içindeki ikili dosyalarla iletişim kurabilir; bu iletişim düzgün bir şekilde güvence altına alınmazsa RCE'ler gibi kritik güvenlik açıklarına maruz kalabilir. Bununla ilgili daha fazla bilgi.
İçerik scriptlerinin çalıştığı ortamlar ve ana sayfaların bulunduğu yerler ayrıdır, bu da izolasyon sağlar. Bu izolasyona rağmen, her ikisi de sayfanın Belge Nesne Modeli (DOM) ile etkileşimde bulunma yeteneğine sahiptir, bu da paylaşılan bir kaynaktır. Ana sayfanın içerik scripti ile veya dolaylı olarak içerik scripti aracılığıyla uzantı ile iletişim kurabilmesi için, her iki tarafın da erişebildiği DOM'u iletişim kanalı olarak kullanması gerekmektedir.
Post Mesajları
content-script.js
// This is like "chrome.runtime.sendMessage" but to maintain the connectionvar port =chrome.runtime.connect();window.addEventListener("message", (event) => {// We only accept messages from ourselvesif (event.source !== window) {return;}if (event.data.type && (event.data.type ==="FROM_PAGE")) {console.log("Content script received: "+event.data.text);// Forward the message to the background scriptport.postMessage(event.data.text);}},false);
example.js
document.getElementById("theButton").addEventListener("click", () => {window.postMessage({type :"FROM_PAGE", text :"Hello from the webpage!"},"*");},false);
Güvenli bir Post Message iletişimi, alınan mesajın doğruluğunu kontrol etmelidir, bu şu şekilde yapılabilir:
event.isTrusted: Bu, yalnızca olayın bir kullanıcı eylemi tarafından tetiklendiği durumlarda Doğru'dur.
İçerik betiği, yalnızca kullanıcı bir eylem gerçekleştirdiğinde bir mesaj bekliyor olabilir.
origin domain: yalnızca izin verilen alanlar listesinden bir mesaj bekliyor olabilir.
Bir regex kullanılıyorsa, çok dikkatli olun.
Source: received_message.source !== window, mesajın Content Script'in dinlediği aynı pencereden gelip gelmediğini kontrol etmek için kullanılabilir.
Önceki kontroller, yapılsa bile, savunmasız olabilir, bu nedenle aşağıdaki sayfada potansiyel Post Message atlatmalarını kontrol edin:
Iframe
İletişim için başka bir olası yol Iframe URL'leri aracılığıyla olabilir, bir örneği burada bulabilirsiniz:
DOM
Bu "tam olarak" bir iletişim yolu değildir, ancak web ve içerik betiği web DOM'una erişime sahip olacaktır. Yani, eğer içerik betiği buradan bazı bilgileri okuyorsa, web DOM'una güveniyorsa, web bu veriyi değiştirebilir (çünkü web güvenilir olmamalıdır veya web XSS'e karşı savunmasızdır) ve Content Script'i tehlikeye atabilir.
Ayrıca, bir tarayıcı uzantısını tehlikeye atmak için DOM tabanlı XSS örneğini burada bulabilirsiniz:
Yanıtı işlemek için döndürülen Promise'i kullanın. Ancak, geriye dönük uyumluluk için, son argüman olarak hala bir callback geçebilirsiniz.
Bir içerik betiğinden istek göndermek şöyle görünür:
(async () => {constresponse=awaitchrome.runtime.sendMessage({greeting:"hello"});// do something with response here, not outside the functionconsole.log(response);})();
uzantı'dan bir istek gönderme (genellikle bir arka plan betiği). Seçilen sekmedeki içerik betiğine mesaj göndermenin bir örneği:
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {const [tab] =awaitchrome.tabs.query({active:true, lastFocusedWindow:true});constresponse=awaitchrome.tabs.sendMessage(tab.id, {greeting:"hello"});// do something with response here, not outside the functionconsole.log(response);})();
Alıcı tarafında, mesajı işlemek için bir runtime.onMessageolay dinleyicisi kurmalısınız. Bu, bir içerik betiği veya uzantı sayfasından aynı görünür.
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-jschrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {console.log(sender.tab ?"from a content script:"+sender.tab.url :"from the extension");if (request.greeting ==="hello")sendResponse({farewell:"goodbye"});});
Öne çıkan örnekte, sendResponse() senkron bir şekilde yürütüldü. sendResponse()'nin asenkron yürütülmesi için onMessage olay işleyicisini değiştirmek için return true; eklemek zorunludur.
Önemli bir husus, birden fazla sayfanın onMessage olaylarını alacak şekilde ayarlandığı senaryolarda, belirli bir olay için sendResponse()'yi yürüten ilk sayfa yanıtı etkili bir şekilde iletebilecek tek sayfa olacaktır. Aynı olaya yönelik sonraki yanıtlar dikkate alınmayacaktır.
Yeni uzantılar oluştururken, geri çağrılar yerine sözleşmelere yönelmek tercih edilmelidir. Geri çağrıların kullanımıyla ilgili olarak, sendResponse() fonksiyonu yalnızca senkron bağlamda doğrudan yürütüldüğünde veya olay işleyicisi true döndürerek asenkron bir işlemi belirttiğinde geçerli kabul edilir. Hiçbir işleyici true döndürmezse veya sendResponse() fonksiyonu bellekten kaldırılırsa (çöp toplayıcı tarafından), sendMessage() fonksiyonu ile ilişkili geri çağrı varsayılan olarak tetiklenecektir.
Native Messaging
Tarayıcı uzantıları ayrıca sistemdeki ikili dosyalarla stdin üzerinden iletişim kurmaya da olanak tanır. Uygulama, bunu belirten bir json yüklemelidir:
name değişkeni, tarayıcı uzantısının arka plan betiklerinden uygulama ile iletişim kurmak için runtime.connectNative() veya runtime.sendNativeMessage() fonksiyonuna geçirilen dizedir. path, ikili dosyanın yoludur, geçerli olan tek type stdio'dur (stdin ve stdout kullanın) ve allowed_origins, buna erişebilecek uzantıları belirtir (wildcard olamaz).
Chrome/Chromium, bu json'u bazı Windows kayıt defterlerinde ve macOS ile Linux'taki bazı yollarda arayacaktır (daha fazla bilgi için docs sayfasına bakın).
Tarayıcı uzantısının bu iletişimi kullanabilmesi için nativeMessaing izninin de tanımlanması gerekir.
Bu, bir arka plan betiği kodunun yerel bir uygulamaya mesaj göndermesinin nasıl göründüğüdür:
In bu blog yazısında, yerel mesajları kötüye kullanan bir zayıf desen önerilmektedir:
Tarayıcı uzantısı içerik betiği için bir joker karakter deseni vardır.
İçerik betiği postMessage mesajlarını arka plan betiğine sendMessage kullanarak iletir.
Arka plan betiği mesajı yerel uygulamaya sendNativeMessage kullanarak iletir.
Yerel uygulama mesajı tehlikeli bir şekilde işler, bu da kod yürütmeye yol açar.
Ve bunun içinde herhangi bir sayfadan RCE'ye geçiş yapma örneği bir tarayıcı uzantısını kötüye kullanarak açıklanmaktadır.
Bellekte/Kodda/Panoda Hassas Bilgiler
Eğer bir Tarayıcı Uzantısı hassas bilgileri belleğinde saklıyorsa, bu dökülebilir (özellikle Windows makinelerinde) ve bu bilgiler için arama yapılabilir.
Bu nedenle, Tarayıcı Uzantısının belleği güvenli olarak kabul edilmemelidir ve hassas bilgiler (kimlik bilgileri veya mnemonik ifadeler gibi) saklanmamalıdır.
Elbette, hassas bilgileri kodda saklamayın, çünkü bu kamusal olacaktır.
Tarayıcıdan bellek dökmek için işlem belleğini dökebilir veya tarayıcı uzantısının ayarlarına gitmek için Inspect pop-up üzerine tıklayın -> Memory bölümünde -> Take a snapshot ve hassas bilgileri bulmak için anlık görüntü içinde CTRL+F ile arama yapın.
Ayrıca, mnemonik anahtarlar veya şifreler gibi son derece hassas bilgilerin panoya kopyalanmasına izin verilmemelidir (veya en azından birkaç saniye içinde panodan kaldırılmalıdır) çünkü bu durumda panoyu izleyen işlemler bunları alabilecektir.
Tarayıcıda Bir Uzantı Yükleme
Tarayıcı Uzantısını indirin ve açın
chrome://extensions/ adresine gidin ve Geliştirici Modunu etkinleştirin
Yüklenmemiş butonuna tıklayın
Firefox'taabout:debugging#/runtime/this-firefox adresine gidin ve Geçici Eklenti Yükle butonuna tıklayın.
Mağazadan kaynak kodunu alma
Bir Chrome uzantısının kaynak kodu çeşitli yöntemlerle elde edilebilir. Aşağıda her seçenek için ayrıntılı açıklamalar ve talimatlar bulunmaktadır.
Komut Satırı ile ZIP Olarak Uzantıyı İndirme
Bir Chrome uzantısının kaynak kodu, komut satırı kullanılarak ZIP dosyası olarak indirilebilir. Bu, belirli bir URL'den ZIP dosyasını almak için curl kullanmayı ve ardından ZIP dosyasının içeriğini bir dizine çıkarmayı içerir. İşte adımlar:
"extension_id" kısmını uzantının gerçek ID'si ile değiştirin.
Aşağıdaki komutları çalıştırın:
extension_id=your_extension_id# Replace with the actual extension IDcurl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip-d"$extension_id-source""$extension_id.zip"
Başka bir pratik yöntem, açık kaynaklı bir proje olan Chrome Extension Source Viewer'ı kullanmaktır. Chrome Web Store üzerinden yüklenebilir. Görüntüleyicinin kaynak kodu GitHub deposunda mevcuttur.
Yerel olarak yüklenmiş uzantının kaynağını görüntüleyin
Yerel olarak yüklenmiş Chrome uzantıları da incelenebilir. İşte nasıl:
chrome://version/ adresine giderek Chrome yerel profil dizininize erişin ve "Profil Yolu" alanını bulun.
Profil dizinindeki Extensions/ alt klasörüne gidin.
Bu klasör, genellikle okunabilir formatta kaynak kodlarıyla birlikte tüm yüklenmiş uzantıları içerir.
Uzantıları tanımlamak için, kimliklerini isimlere eşleyebilirsiniz:
Her uzantının kimliklerini görmek için about:extensions sayfasında Geliştirici Modu'nu etkinleştirin.
Her uzantının klasöründe, manifest.json dosyası okunabilir bir name alanı içerir ve bu, uzantıyı tanımlamanıza yardımcı olur.
Bir Dosya Arşivleyici veya Açıcı Kullanın
Chrome Web Store'a gidin ve uzantıyı indirin. Dosya .crx uzantısına sahip olacaktır. Dosya uzantısını .crx'den .zip'e değiştirin. ZIP dosyasının içeriğini çıkarmak için herhangi bir dosya arşivleyici (WinRAR, 7-Zip vb.) kullanın.
Chrome'da Geliştirici Modunu Kullanın
Chrome'u açın ve chrome://extensions/ adresine gidin. Sağ üstte "Geliştirici modu"nu etkinleştirin. "Paketlenmemiş uzantıyı yükle..." seçeneğine tıklayın. Uzantınızın dizinine gidin. Bu, kaynak kodunu indirmez, ancak zaten indirilmiş veya geliştirilmiş bir uzantının kodunu görüntülemek ve değiştirmek için faydalıdır.
Chrome uzantı manifest veri seti
Zayıf tarayıcı uzantılarını tespit etmeye çalışmak için https://github.com/palant/chrome-extension-manifests-dataset adresini kullanabilir ve manifest dosyalarını potansiyel olarak zayıf işaretler için kontrol edebilirsiniz. Örneğin, 25000'den fazla kullanıcısı olan, content_scripts ve nativeMessaing iznine sahip uzantıları kontrol etmek için:
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
Güvenlik Denetimi Kontrol Listesi
Tarayıcı Uzantılarının sınırlı bir saldırı yüzeyi olmasına rağmen, bazıları zayıflıklar veya potansiyel güçlendirme iyileştirmeleri içerebilir. Aşağıdakiler en yaygın olanlardır: