Özel Ağ Erişimi: ön kontroller kullanıma sunuluyor

Titouan Rigoudy
Titouan Rigoudy
Yifan Luo
Yifan Luo

Güncellemeler

  • 7 Temmuz 2022: Mevcut durum güncellendi ve IP adresi alanı tanımı eklendi.
  • 27 Nisan 2022: Güncellenen zaman çizelgesi duyurusu.
  • 7 Mart 2022: Chrome 98'de sorunlar tespit edildikten sonra geri alma işleminin duyurulması.

Giriş

Chrome, Özel Ağ Erişimi (PNA) spesifikasyonu kapsamında, herkese açık web sitelerinden özel ağ uç noktalarına doğrudan erişimi kullanımdan kaldırıyor.

Chrome, bir alt kaynak için özel ağ isteğinden önce hedef sunucudan açık izin isteyen bir CORS ön uç isteğinde bulunmaya başlar. Bu uçuş öncesi istek, yeni bir başlık (Access-Control-Request-Private-Network: true) içerir ve bu isteğe verilen yanıtta, buna karşılık gelen bir başlık (Access-Control-Allow-Private-Network: true) bulunmalıdır.

Amaç, kullanıcıları özel ağlardaki yönlendiricileri ve diğer cihazları hedefleyen siteler arası istek sahteciliği (CSRF) saldırılarından korumaktır. Bu saldırıların yüz binlerce kullanıcıyı etkilediği ve saldırganların kullanıcıları kötü amaçlı sunuculara yönlendirmesine olanak tanıdığı tespit edildi.

Kullanıma sunma planı

Chrome, web sitelerine değişikliği fark edip gerekli düzenlemeyi yapmaları için zaman tanımak amacıyla bu değişikliği iki aşamada kullanıma sunacaktır.

  1. Chrome 104'te:

    • Chrome, özel ağ alt kaynak isteklerinden önce ön uç istek göndererek deneysel çalışmalar yapar.
    • Uçuş öncesi hatalar yalnızca DevTools'ta uyarılar gösterir ve gizli ağ isteklerini etkilemez.
    • Chrome, uyumluluk verilerini toplar ve en çok etkilenen web siteleriyle iletişime geçer.
    • Bu özelliğin mevcut web siteleriyle genel olarak uyumlu olmasını bekliyoruz.
  2. En erken Chrome 113'te:

    • Bu işlem, yalnızca uyumluluk verileri değişikliğin yeterince güvenli olduğunu gösterdiğinde ve gerektiğinde doğrudan iletişime geçtiğimizde başlar.
    • Chrome, ön uç isteklerinin başarılı olması gerektiğini zorunlu kılar. Aksi takdirde istekler başarısız olur.
    • Bu aşamadan etkilenen web sitelerinin süre uzatımı isteğinde bulunabilmesi için aynı zamanda desteklenen sürümün kullanımdan kaldırılma denemesi başlar. Deneme süresi en az 6 aydır.

Özel Ağ Erişimi (PNA) nedir?

Özel Ağ Erişimi (eski adıyla CORS-RFC1918), web sitelerinin özel ağlardaki sunuculara istek gönderme özelliğini kısıtlar.

Chrome, spesifikasyonun bir kısmını zaten uyguladı: Chrome 96'dan itibaren yalnızca güvenli bağlamların özel ağ isteği göndermesine izin verilir. Ayrıntılar için önceki blog yayınımızı inceleyin.

Spesifikasyon, Kaynaklar Arası Kaynak Paylaşımı (CORS) protokolünü de genişleterek web sitelerinin artık keyfi istek göndermesine izin verilmeden önce özel ağlardaki sunuculardan açıkça izin istemesi gerektiğini belirtir.

PNA, IP adreslerini nasıl sınıflandırır ve özel bir ağı nasıl tanımlar?

IP adresleri üç IP adresi alanına ayrılır: - public - private - local

Yerel IP adresi alanı, RFC1122'nin 3.2.1.3 numaralı bölümünde tanımlanan IPv4 loopback adresleri (127.0.0.0/8) veya RFC4291'in 2.5.3 numaralı bölümünde tanımlanan IPv6 loopback adresleri (::1/128) olan IP adreslerini içerir.

Özel IP adresi alanı, yalnızca mevcut ağ içinde anlamlı olan IP adreslerini içerir. RFC1918'de tanımlanan 10.0.0.0/8, 172.16.0.0/12 ve 192.168.0.0/16, RFC3927'de tanımlanan bağlantı yerel adresleri 169.254.0.0/16, RFC4193'te tanımlanan benzersiz yerel IPv6 tek adresli adresleri fc00::/7, RFC4291 bölüm 2.5.6'da tanımlanan bağlantı yerel IPv6 tek adresli adresleri fe80::/10 ve eşlenen IPv4 adresinin kendisinin özel olduğu IPv4 ile eşlenen IPv6 adreslerini içerir.

Herkese açık IP adresi alanı, daha önce bahsedilmeyen diğer tüm adresleri içerir.

Yerel IP adresi, herkese açık IP adresinden daha özel olan özel IP adresinden daha özel kabul edilir.

Daha kullanılabilir bir ağ, daha az kullanılabilir bir ağa istek gönderdiğinde istekler özeldir.
Özel Ağ Erişimi'ndeki herkese açık, özel ve yerel ağlar arasındaki ilişki (CORS-RFC1918)

Geri bildirim istiyoruz: Özel ağlar için CORS (RFC1918) başlıklı makalede daha fazla bilgi edinebilirsiniz.

Yayın öncesi istekler

Arka plan

Ön kontrol istekleri, yan etkileri olabilecek bir HTTP isteği göndermeden önce hedef web sitesinden izin istemek için kullanılan Kaynaklar Arası Kaynak Paylaşımı (CORS) standardı tarafından sağlanan bir mekanizmadır. Bu, hedef sunucunun CORS protokolünü anlamasını sağlar ve CSRF saldırısı riskini önemli ölçüde azaltır.

İzin isteği, yaklaşan HTTP isteğini açıklayan belirli CORS istek başlıklarıyla bir OPTIONS HTTP isteği olarak gönderilir. Yanıt, yaklaşan isteği açıkça kabul eden belirli CORS yanıt üstbilgilerini içermelidir.

CORS ön kontrolünü gösteren ardışık düzen şeması. Hedefe bir OPTIONS HTTP isteği gönderilir ve 200 OK döndürülür. Daha sonra, CORS istek başlığı gönderilir ve bu durumda bir CORS yanıt başlığı döndürülür.

Özel Ağ Erişimi'ndeki yenilikler

Kontrol öncesi isteklere yeni bir istek ve yanıt başlığı çifti eklenir:

  • Access-Control-Request-Private-Network: true, tüm PNA yayın öncesi isteklerinde ayarlanır.
  • Tüm PNA ön kontrol yanıtlarında Access-Control-Allow-Private-Network: true ayarlanmalıdır

PNA için uçuş öncesi istekler, istek yönteminden ve moddan bağımsız olarak tüm özel ağ istekleri için gönderilir. Bu istekler, cors modunun yanı sıra no-cors ve diğer tüm modlardaki isteklerden önce gönderilir. Bunun nedeni, istek modundan ve yanıt içeriğinin başlatıcıya sunulup sunulmadığından bağımsız olarak tüm özel ağ isteklerinin CSRF saldırıları için kullanılabilmesidir.

Hedef IP adresi başlatıcıdan daha özelse PNA için uçuş öncesi istekler aynı kaynak isteklerinde de gönderilir. Bu, yayın öncesi isteklerin yalnızca kaynaklar arası istekler için olduğu normal CORS'dan farklıdır. Aynı kaynaktan gelen istekler için ön uç uçuş istekleri, DNS yeniden bağlama saldırılarına karşı koruma sağlar.

Örnekler

Gözlemlenebilir davranış, isteğin moduna bağlıdır.

CORS yok modu

https://foo.example/index.html işlevinin <img src="https://bar.example/cat.gif" alt="dancing cat"/> yerleştirdiğini ve bar.example değerinin RFC 1918'e göre özel bir IP adresi olan 192.168.1.1 olarak çözümlendiğini varsayalım.

Chrome önce bir ön uç isteği gönderir:

HTTP/1.1 OPTIONS /cat.gif
Origin: https://foo.example
Access-Control-Request-Private-Network: true

Bu isteğin başarılı olması için sunucunun aşağıdaki kodla yanıt vermesi gerekir:

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://foo.example
Access-Control-Allow-Private-Network: true

Ardından Chrome gerçek isteği gönderir:

HTTP/1.1 GET /cat.gif
...

Sunucu bu isteğe normal şekilde yanıt verebilir.

CORS modu

https://foo.example/index.html'nin aşağıdaki kodu çalıştırdığını varsayalım:

await fetch('https://bar.example/delete-everything', {
  method: 'PUT',
  credentials: 'include',
})

Yine, bar.example 192.168.1.1 olarak çözümlenir.

Chrome önce bir ön kontrol isteği gönderir:

HTTP/1.1 OPTIONS /delete-everything
Origin: https://foo.example
Access-Control-Request-Method: PUT
Access-Control-Request-Credentials: true
Access-Control-Request-Private-Network: true

Bu isteğin başarılı olabilmesi için sunucunun şu yanıtı vermesi gerekir:

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://foo.example
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Credentials: true
Access-Control-Allow-Private-Network: true

Ardından Chrome gerçek isteği gönderir:

HTTP/1.1 PUT /delete-everything
Origin: https://foo.example

Sunucu, normal CORS kurallarına göre aşağıdakilere yanıt verebilir:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://foo.example

Web sitenizin etkilenip etkilenmediğini öğrenme

Chrome 104'ten itibaren, gizli ağ isteği algılanırsa bu istekten önce bir ön uç isteğinde bulunulur. Bu uçuş öncesi istek başarısız olursa nihai istek gönderilmeye devam eder ancak DevTools sorunları panelinde bir uyarı gösterilir.

Devtools Sorunlar panelinde uçuş öncesi istek başarısız uyarısı. Bu bildirimde:
   gizli ağ isteklerinin yalnızca izin verilen kaynaklara gönderildiğinden emin olun,
   belirli istek ve etkilenen kaynaklarla ilgili ayrıntılar

Etkilenen uçuş öncesi istekler ağ panelinde de görüntülenebilir ve teşhis edilebilir:

localhost&#39;un Geliştirici Araçları Ağı panelindeki başarısız bir ön kontrol isteği, 501 durumunu gösterir.

İsteğiniz, Özel Ağ Erişimi kuralları olmayan normal bir CORS ön kontrolünü tetiklediyse ağ panelinde, ilki her zaman başarısız olmuş olarak görünen iki ön kontrol görünebilir. Bu, bilinen bir hatadır ve bu hatayı göz ardı edebilirsiniz.

DevAraçlar Ağ panelindeki başarılı bir ön kontrol öncesinde hatalı bir ön kontrol isteği.

Uçuş öncesi başarı zorunlu kılınırsa ne olacağını incelemek için Chrome 98'den itibaren aşağıdaki komut satırı bağımsız değişkenini iletebilirsiniz:

--enable-features=PrivateNetworkAccessRespectPreflightResults

Başarısız olan tüm uçuş öncesi istekler, alma işleminin başarısız olmasına neden olur. Bu sayede, web sitenizin kullanıma sunma planımızın ikinci aşamasından sonra çalışıp çalışmayacağını test edebilirsiniz. Hatalar, yukarıda belirtilen Geliştirici Araçları panelleri kullanılarak uyarılarla aynı şekilde teşhis edilebilir.

Web siteniz etkilenirse yapılması gerekenler

Bu değişikliğin Chrome 104'te kullanıma sunulmasının herhangi bir web sitesini etkilemesi beklenmiyor. Ancak, web sitenizin beklendiği gibi çalışmaya devam etmesini sağlamak için etkilenen istek yollarını güncellemenizi önemle tavsiye ederiz.

Kullanabileceğiniz iki çözüm vardır:

  1. Sunucu tarafındaki kontrol öncesi istekleri yönetme
  2. Kurumsal politikalarla PNA kontrollerini devre dışı bırakma

Sunucu tarafı kontrol öncesi istekleri işleme

Etkilenen tüm getirme işlemlerinin hedef sunucusunu, PNA ön uçuş isteklerini işlemek için güncelleyin. Öncelikle, etkilenen rotalarda standart CORS ön uç isteklerine yönelik desteği uygulayın. Ardından, iki yeni yanıt başlığı için destek ekleyin.

Sunucunuz bir ön uç isteğinde (CORS üstbilgileri içeren bir OPTIONS isteği) bulunduğunda Access-Control-Request-Private-Network: true başlığının olup olmadığını kontrol etmelidir. İstekte bu başlık varsa sunucu, isteğe izin vermenin güvenli olduğundan emin olmak için Origin başlığını ve isteğin yolunu diğer ilgili bilgilerle (ör. Access-Control-Request-Headers) birlikte incelemelidir. Genellikle, kontrolünüz altındaki tek bir kaynağa erişim izni vermeniz gerekir.

Sunucunuz isteğe izin vermeye karar verdikten sonra gerekli CORS başlıklarını ve yeni PNA başlığını ekleyerek 204 No Content (veya 200 OK) yanıt vermelidir. Bu başlıklar arasında Access-Control-Allow-Origin ve Access-Control-Allow-Private-Network: true ile gerektiğinde diğer başlıklar yer alır.

Belirli senaryolar için örneklere bakın.

Kurumsal politikaları kullanarak özel ağ erişimi kontrollerini devre dışı bırakma

Kullanıcılarınız üzerinde yönetici denetiminiz varsa Özel Ağ Erişimi kontrollerini aşağıdaki politikalardan birini kullanarak devre dışı bırakabilirsiniz:

Daha fazla bilgi için Chrome politika yönetimini anlama başlıklı makaleyi inceleyin.

Görüşlerinizi bizimle paylaşın

Herkese açık ağlardan istek bekleyen bir web sitesini özel bir ağda barındırıyorsanız Chrome Ekibi'nin geri bildirimlerinizden ve kullanım alanlarınızdan haberdar olması gerekir. crbug.com adresinde Chromium ile ilgili bir sorun göndererek ve bileşeni Blink>SecurityFeature>CORS>PrivateNetworkAccess olarak ayarlayarak bize bildirin.

Sırada ne var?

Bir sonraki aşamada Chrome, Özel Ağ Erişimi kontrollerini web çalışanlarını (özel çalışanları, paylaşılan çalışanları ve hizmet çalışanları) kapsayacak şekilde genişletecektir. Uyarıları Chrome 107'de göstermeyi planlıyoruz.

Ardından Chrome, Özel Ağ Erişimi denetimlerini iframe'ler ve pop-up'lar dahil olmak üzere gezinmeleri kapsayacak şekilde genişletir. Uyarıları göstermeye başlamak için Chrome 108'i hedefliyoruz.

Her iki durumda da, web geliştiricilerin uyumluluğu değerlendirmesi ve uyumluluk riskini tahmin etmesi için zaman tanımak amacıyla benzer bir aşamalı kullanıma sunma yöntemiyle dikkatli bir şekilde ilerleyeceğiz.

Teşekkür ederiz

Unsplash'taki Mark Olsen tarafından çekilen kapak fotoğrafı.