Binlerce Eklentide cURL SSL / TLS Sertifika Doğrulaması Devre Dışı!

Binlerce Eklentide cURL SSL / TLS Sertifika Doğrulaması Devre Dışı!

Hazır kütüphaneler, framework ya da eklentiler, bize zaman ve işlevsellik kazandırabilir. Peki ya Güvenlik! Yayınlanan binlerce CMS eklentisi ve PHP kütüphanesinde kullanılan cURL sertifika doğrulama ayarları devre dışı olarak geliyor.

Bu önemli, ancak geliştiriciler tarafından çok fazla dikkat edilmiyor ve bu da milyonlarca kullanıcının bilgilerini riske sokuyor. Scott Arciszewski tarafından yayınlanan buradaki makaleye göre tehlike her geçen gün çoğalarak devam ediyor.

cURL Nedir?

Web geliştirme topluluğunda yoğun bir şekilde kullanılan cURL, uzak sunuculara veri aktarmak için kullanılan ve tüm web sunucularında bulunan komut satırı yardımcı yazılımıdır. Birçok CMS eklentisinde, PHP kütüphanesinde ya da farklı yazılım dillerinde, uzak sunucu ile yapılacak olan her bağlantıda gerçek tarayıcı oturumu açmak yerine, cURL ile bağlantı sağlayarak uzak sunuculardan veri indirmek, göndermek ya da yüklemek için kullanılan güzel bir özelliktir.

cURL ile HTTP, FTP, POP3, SMTP, LDAP ve daha birçok protokol üzerinden bağlantı açılabilmektedir. Bu da oldukça fazla bir alan da kullanım imkanı sağlamaktadır.

Örneğin, bir ödeme sayfasında girdiğiniz bilgileri, ödeme sağlayıcısına ait sunucuya göndermek için arkaplanda cURL bağlantıları kullanılır. Bu bağlantılar genellikle HTTPS ile gerçekleştirilir. Ayrıca cURL, SSL/TLS sertifika doğrulamasını da gerçekleştirir. Bu gerçekten HTTPS sunucusu ile iletişime geçildiğini doğrulamak için önemli bir adımdır. Ancak cURL güvenlik ayarları birçok geliştirici tarafından devre dışı bırakılıyor.

cURL Güvenlik Ayarları Neden Devre Dışı Bırakılıyor?

Bunun en büyük nedeni, yazılım geliştiricisinin, geliştirdiği eklentinin ya da yazılımın tüm sunucularda en az hatayla çalışmasını istiyor ve bu da güvenlik açıklarının oluşmasına sebep oluyor. Çünkü güvenlik ayarları etkinleştirildiğinde, cURL uzak sunucu ile arasındaki bağlantıyı, SSL/TLS sertifika doğrulamasını dener. Eğer doğrulama yapmazsa bağlantı başarısız olur ve yazılım veri alıp göndermeyi iptal eder. Bir çok geliştirici bunu bilmesine rağmen ne yazık ki bu ayarları devre dışı bırakmaktadır.

cURL Güvenlik Ayarları Nelerdir?

1- Devre dışı bırakılan ilk güvenlik ayarımız CURLOPT_SSL_VERIFYHOST değeridir. Bu ayar eğer cURL bağlantısında belirtilmezse varsayılan değeri 2'dir. Ancak bir çok geliştirici bu ayarı false ya da 0 olarak eklemektedir.

Bu ayar, uzak sunucudaki sertifikanın, güvenilir bir Sertifika Yetkilisi (CA) tarafından imzalanmış geçerli bir TLS sertifikası ile yanıt verip vermediğini kontrol eder. Eğer devre dışı bırakılırsa, cURL ile bağlandığınız sitenin adresini doğrulamadan bağlantıyı başarılı bir şekilde gerçekleştirir. Yani, siz güvenli.com sitesi ile bağlantı kurmak için istek gönderdiniz ancak sunucudaki sertifika güvensiz.com sitesine ait olsa da veri aktarımı başarıyla gerçekleşir.

2- Devre dışı bırakılan ikinci güvenlik ayarımız CURLOPT_SSL_VERIFYPEER değeridir. Bu ayar eğer cURL bağlantısında belirtilmezse varsayılan değeri true ya da 1'dir. Ancak bir çok geliştirici bu ayarı false ya da 0 olarak eklemektedir.

Bu ayar devre dışı bırakıldığında, bağlantının başarılı olması için sunucuda herhangi bir SSL/TLS sertifikasının olması yeterlidir. Bu sertifikayı kimin yayınladığına bakılmadan, kendinden imzala sertifikaları kullanarak sunucu bağlantısını kabul eder ve veri aktarımı gerçekleşir.

Özellikle PHP geliştiricileri tarafından oldukça yoğun olarak kullanılan cURL bağlantısının, göz ardı edilebilecek küçük bir sorun olmadığını anlamak için GitHub üzerinde ufak bir arama yaptığınızda, karşınıza güvenlik ayarları devre dışı bırakılmış binlerce kütüphane çıkacaktır. Bu da sorunun ne kadar büyük olduğunu göstermektedir.

cURL Güvenlik Sorunlarından Nasıl Kurtulabiliriz?

Geliştirdiğiniz ya da kullandığınız yazılımda cURL bağlantı kodlarını kontrol edin ve CURLOPT_SSL_VERIFYHOST değerini 2CURLOPT_SSL_VERIFYPEER değerini true olarak değiştirin.

Ayrıca bazı sistemlerde CA-Cert paketi yüklü olmayabilir, güncel kök sertifikalarını içermiyor olabilir ya da daha farklı bir neden dolayı sertifika doğrulama hatası oluşabilir. Bunu önlemek için cURL bağlantınıza CURLOPT_CAINFO değerini ekleyerek sertifika bilgisi gönderebilirsiniz. cURL bağlantısındaki bu üç değerin son hali aşağıdaki örnekteki gibi olmalıdır.

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_CAINFO, 'path/to/yourcacert.pem');

Ayrıca, Scott Arciszewski tarafından geliştirilen ve açık kaynak olarak dağıtılan Certainty kütüphanesini uygulamanıza dahil ederek kök sertifikalarının belirli aralıklarla güncel kalmasını sağlayabilirsiniz.

Bilginin ve güvenliğin önemli olduğu bu günlerde, büyük bir güvenlik sorunu oluşturan ama birçok yazılım geliştiricisinin görmezden geldiği bu hatadan bir an önce vazgeçilir.


Daha önce 2 kişi oy verdi. Sizde oy vermek ister misiniz?