CyberFlow Logo CyberFlow BLOG
Postgresql Pentest

PostgreSQL'de Search Path Hijacking: Güvenlik Açıkları ve Önlemler

✍️ Ahmet BİRKAN 📂 Postgresql Pentest

PostgreSQL'de search_path güvenliği üzerine derinlemesine bir inceleme. Riskleri belirleyin ve önlemlerinizi alın.

PostgreSQL'de Search Path Hijacking: Güvenlik Açıkları ve Önlemler

PostgreSQL'de search_path güvenliği üzerine kapsamlı bir rehber. Geçici nesnelerden, şema yetkilerine kadar önemli noktaları öğrenin ve güvenliğinizi artırın.

Giriş ve Konumlandırma

PostgreSQL, dünya genelinde pek çok işletme ve kuruluş tarafından veri yönetimi için tercih edilen güçlü ve esnek bir veritabanı yönetim sistemidir. Ancak, bu güçlü altyapının arkasında yer alan bazı yapılandırmalar, özellikle de "search_path" ayarları, siber güvenlik açısından risk taşıyabilir. Search path, PostgreSQL'de, belirli bir şema adı belirtilmediğinde veritabanı nesnelerinin (tablolar, fonksiyonlar vb.) hangi sırayla aranacağını belirleyen bir ayardır. Bu ayarın yanlış yönetimi, kötü niyetli kullanıcıların veya dış saldırganların sistem üzerinde beklenmedik davranışlar gerçekleştirmesine neden olabilir.

Neden Önemli?

Search path hijacking, saldırganların hedef sistemde hangi nesnelerin ne zaman ve hangi sırayla erişileceğini manipüle etmelerini sağlayarak güvenlik zafiyetlerine yol açar. Özellikle, kullanıcıların yetkilendirmeleri ve uygulama yapılandırmalarıyla bir araya geldiğinde, bu durum ciddi sonuçlar doğurabilecek bir güvenlik açığı yaratır. Birçok kurulumda "public" isimli ortak şemanın varsayılan olarak kullanılması, yöneticilerin bu şemanın yetkilerini sıkı bir şekilde kontrol etmemesi durumunda, bu tür saldırılara davetiye çıkarabilir.

Özellikle işletmeler için kritik öneme sahip olan verilerin korunması, güvenli yazılım geliştirme süreçleri ve siber savunma açısından bu konunun derinlemesine ele alınması gerekmektedir. Pentest (penetrasyon testi) süreçlerinde, bu tür güvenlik açıklarının tespit edilmesi, organizasyonun siber güvenlik duruşunu güçlendirmek için elzemdir. Bu bağlamda, search_path yapısının incelenmesi ve gerektiğinde düzeltilebilir yapılandırmaların yapılması, siber güvenlik stratejilerinin vazgeçilmez bir parçasını oluşturur.

Pentest ve Savunma Açısından Bağlamlandırma

Pentest süreçlerinde, PostgreSQL’deki search_path ayarlarının gözden geçirilmesi, kullanıcı rollerinin ve şema yetkilerinin kontrol edilmesi, kritik bir önceliktir. Kullanıcıların, hangi şemalarda hangi yetkilere sahip olduğu doğru bir şekilde değerlendirildiğinde, potansiyel riskler minimize edilebilir. Örneğin, bazı kullanıcıların "CREATE" yetkisine sahip olduğu ortak şemalar, yetkisiz nesne yaratma potansiyeli taşır, bu da sistem genelinde çeşitli güvenlik açıklarına yol açabilir.

Search path, yalnızca bir sıralama meselesi değildir; aynı zamanda doğru şema adlarının kullanımıyla, kritik nesnelerin erişimi ve güvenliği sağlanabilir. Örnek olarak, belirli bir şemanın nesnesini çağırırken, tam nitelikli (schema-qualified) çağrılar yaparak belirsizlik ortadan kaldırılabilir. Bu yaklaşım, şemanın yanlışlıkla karıştırılmasını ve olası bir ihlali önlemek için etkin bir yöntemdir.

Sonuç olarak, PostgreSQL'deki search_path hijacking riski, dikkatlice ele alınması gereken bir konudur. Geliştirme ve sistem yönetim süreçlerinde bu tür güvenlik açıklarının düzenli olarak denetlenmesi, veritabanı yöneticileri ve siber güvenlik uzmanları için hayati önem taşır. Kapsamlı bir güvenlik durumu oluşturmak için güvenlik önlemleriyle birlikte kullanıcı yetkilerinin gözden geçirilmesi, hem mevcut sistemin zorluklarına yanıt vermek hem de gelecekteki güvenlik açıklarını azaltmak için gereklidir. Bu blog yazısında, search_path hijacking'e dair temel kavramlar, risk göstergeleri ve alınabilecek önlemler üzerinde durulacaktır.

Teknik Analiz ve Uygulama

Mevcut Search Path Değerini Görme

PostgreSQL'deki güvenlik denetimlerinin ilk adımı, mevcut search_path yapılandırmasını kontrol etmektir. Kullanıcılar veya uygulamalar, şema adını belirtmeden nesneleri çağırdıklarında bu yapılandırma devreye girer. search_path ayarı, nesnelerin hangi sırayla aranacağını belirler. Bu nedenle, potansiyel güvenlik açıklarını belirlemek için öncelikle search_path değerini öğrenmek gerekmektedir. Aşağıdaki SQL komutunu kullanarak mevcut search_path değerini görebilirsiniz:

SHOW search_path;

Bu komut, oturumunuza tanımlanmış mevcut şema sıralamasını gösterecektir. Eğer burada istenmeyen şemalar veya yanlış bir yapılandırma varsa, bu durum hijacking saldırıları için bir zemin oluşturabilir.

Search Path ile İlgili Temel Kavramlar

search_path, PostgreSQL'de önemli bir yapılandırma özelliğidir ve kullanıcıların şemalar üzerinde ne derece kontrole sahip olduğunu belirler. Temel kavramları bilmek, güvenlik denetimlerinin sağlıklı yapılabilmesi açısından kritik öneme sahiptir. İşte bazı anahtar kavramlar:

  • public schema: PostgreSQL'de varsayılan olarak barındırılan ve izinler nedeniyle güvenlik açığına dönüşebilen ortak şema.
  • schema-qualified call: Fonksiyon ya da tablo çağrısında, nesnenin tam şema adıyla birlikte kullanılması.
  • Rol bazlı kontrolsüz search_path: Beklenmedik şemaların arama önceliğine sahip olmasına ve uygulama davranışının değişmesine yol açabilir.

Bu kavramların anlaşılması, siber güvenlik açısından kritik bir öneme sahiptir. Özellikle uygulamalarınızda kullanılacak nesnelerin hangi şemalar altında yer aldığını ve bu şemalarda hangi izinlerin olduğunu belirlemek önemlidir.

Kullanıcının Varsayılan Search Path Ayarını İnceleme

Kullanıcılara ve rollere atanmış search_path ayarlarını incelemek, potansiyel güvenlik açıklarını tespit etmek için önemlidir. Aşağıdaki sorgu, mevcut rollerin search_path ayarlarını listelemekte kullanılabilir:

SELECT rolname, rolconfig FROM pg_roles;

Bu sorgu, her bir kullanıcının veya rolün yapılandırmasını gösterir. Belirli bir rolün beklenmeyen şemaları öncelikli olarak arayıp aramadığını kontrol etmek, potansiyel güvenlik açıklarını değerlendirmek için önemlidir.

Şema Yetkilerini Kontrol Etme

Şema bazında yetkilerin kontrol edilmesi, PostgreSQL güvenliğinin önemli bir parçasını oluşturur. Her kullanıcının hangi şemalarda hangi yetkilere sahip olduğunu sorgulamak için aşağıdaki gibi bir komut çalıştırabilirsiniz:

SELECT * FROM information_schema.schema_privileges WHERE grantee = '<kullanıcı_adı>';

Burada <kullanıcı_adı>, yetkilerini sorgulamak istediğiniz kullanıcının adıdır. Kullanıcının public gibi ortak şemalarda CREATE yetkisi olup olmadığını kontrol etmek dikkat edilmesi gereken bir noktadır; zira bu, güvenlik açıkları oluşturabilir.

Riskli Göstergeler

Güvenlik denetiminde belirli risk göstergeleri vardır. Örneğin, public şemasında gereksiz yere CREATE yetkisi verilmesi, yetkisiz nesnelerin oluşturulmasına yol açabilir. Bu tür durumları değerlendirmek için aşağıdaki sorgu kullanılabilir:

SELECT has_schema_privilege('public', 'CREATE');

Bu sorgu, eğer kullanıcıya public şemasında nesne oluşturma yetkisi verilmişse true dönecektir. Bu tür yetkilerin kontrol edilmesi, sistemin güvenliğini sağlamak adına kritik bir aşamadır.

Geçici Şema Kavramı

PostgreSQL, belirli oturumlarda geçici nesneler için özel bir temp şeması kullanır. Bu şemanın search_path içinde nasıl yer aldığını incelemek, geçici nesneler ile kalıcı nesnelerin etkileşimini anlamak açısından önemlidir. Geçici şemanın etkin olduğu durumlarda, aşağıdaki biçimde sorgulama yaparak test edebilirsiniz:

SHOW search_path;

Geçici şemanın varlığı, uygulama üzerindeki etkileri konusunda henüz bir bilgi sağlamayabilir; ancak, bu durumda şemaların nasıl çözümleneceği kritik hale gelir.

psql ile Search Path Kontrolü

PostgreSQL istemcisi olan psql, oturum bazında search_path ve şema yetkilerini incelemek için etkili bir araçtır. psql üzerinden denetim yapmak, kullanıcının erişim durumunu hızlıca kontrol etmenize olanak sağlar. Örneğin, etkin oturumda search_path ayarını kontrol etmek için yukarıda belirtilen SHOW search_path; komutu kullanılabilir.

Defansif Sıkılaştırma

Son aşama olarak, risklerin azaltılması için defansif sıkılaştırma stratejileri uygulanmalıdır. Veri tabanı yapılandırmasının yanı sıra uygulama geliştirme pratikleri, güvenli bir ortam yaratmak adına göz önünde bulundurulmalıdır. Özellikle, kritik nesnelerin tam şema adı ile çağrılması (schema qualification) ve public şemasındaki gereksiz CREATE yetkilerinin kaldırılması, güvenliği artıran temel yaklaşımlardandır.

Bu bütünsel yaklaşım, PostgreSQL veritabanlarındaki güvenlik açıklarının minimize edilmesine katkı sağlayacaktır.

Risk, Yorumlama ve Savunma

Riskler ve Etkileri

PostgreSQL'ün kullanıcıların nesne arama sırasını belirlemek için kullandığı search_path, güvenlik açısından dikkate alınması gereken önemli bir parametredir. Yanlış yapılandırma durumlarında, kötü niyetli kullanıcılar benzer isimli nesneleri kullanarak yetkisiz erişim sağlayabilir. Bu tür durumlar, veritabanı güvenliğini ciddi şekilde tehdit edebilir.

Örneğin, public şemasında bir kullanıcı yanlışlıkla kötü niyetli bir fonksiyon oluşturabilirse, başka bir kullanıcı bu fonksiyonu çağırmayı deneyebilir ve bu durumda kullanıcı tarafından beklenmedik sonuçlarla karşılaşabilir. Kötü niyetli bir kullanıcı, search_path üzerinde kontrol sahibi olduğunda, sistemin davranışını değiştirme potansiyeline sahip olacaktır.

Yanlış Yapılandırmalar

Yanlış yapılandırma, genellikle iki temel faktörden kaynaklanır: yetersiz şema yetkilendirmesi ve yanlış search_path ayarları. Eğer bir kullanıcı, public şemasına CREATE yetkisine sahipse, bu durum kötü amaçlı nesnelerin oluşturulmasına olanak tanır.

Aşağıdaki sorgu, public şemasında CREATE izinlerine sahip olan kullanıcıları belirlemek için kullanılabilir:

SELECT grantee
FROM information_schema.role_schema_grants
WHERE schema_name = 'public' AND privilege_type = 'CREATE';

Sızıntı ve Servis Tespiti

Bir search_path saldırısı sonucunda elde edilebilecek veriler arasında kullanıcı kimlik bilgileri, istemci uygulama bilgileri veya diğer hassas bilgiler yer alabilir. Bunun yanında, kullanıcıların hangi verilere erişim sağladığına dair toplu bilgiler elde edilebilir.

Veri sızıntısı durumlarında, kullanıcıların hangi nesnelere erişim sağladıkları ve bunun hangi şema üzerinden gerçekleştirildiği de dikkate alınmalıdır. Eğer veritabanı topolojisiyle ilgili bilgiler ele geçirilirse, daha kapsamlı saldırılar gerçekleştirilebilir.

Savunma Önlemleri

Veritabanı güvenliğini artırmak için yapılabilecek bazı önemli önlemler arasında şunlar bulunmaktadır:

Search Path Konfigürasyonu

  • Doğru search_path Ayarları: Kullanıcı bazında search_path ayarlarının dikkatlice yapılandırılması gereklidir. Her kullanıcı için olabildiğince kısıtlayıcı ayarlar tercih edilmelidir.

  • Tam Şema Adıyla Çağrılar: Kritik fonksiyon ve tabloların, tam şema adları ile çağrılması güvenliği artırır. Bu yaklaşım, search_path belirsizliğini ortadan kaldırır.

Örneğin, aşağıdaki gibi bir çağrı yapıldığında, şemanın belirtilmesi durumunda arama sırasına dair belirsizlik ortadan kalkmaktadır:

SELECT public.my_function();

Rol Bazlı İncelemeler

  • Düzenli Kontroller: Rol bazında search_path ayarları ve şema izinleri için düzenli döngüsel kontroller yapılmalıdır. Bu, yetkisiz erişimlerin önlenmesine yardımcı olacaktır.

  • Public CREATE İzinlerinin Kaldırılması: public şemasında gerekli olmadıkça CREATE izinlerinin kaldırılması, bu şema üzerindeki yetkisiz nesne oluşturma ihtimalini azaltacaktır.

Geçici Şema Kavramı

  • Geçici Şemaların Kullanımı: Geçici şemaların etkili bir şekilde kullanılmasını sağlamak, özellikle geçici nesnelerin yönetimi açısından kritik öneme sahiptir. Kullanıcıların bu şemalardaki yetkilerini zorunlu kılmak, güvenliği artırabilir.

Sonuç

PostgreSQL'de search_path hijacking potansiyeli, birçok güvenlik açığını barındırmaktadır. Yanlış yapılandırmalar ve yetersiz izinler, siber saldırganlar için fırsat tanıyabilir. Bu tür riskleri azaltmak için dikkat edilmesi gereken başlıca önlemler arasında, search_path konfigürasyonları, rol bazlı incelemeler ve güvenli geliştirme yöntemleri yer almaktadır. Bu maddelerin uygulanması, veritabanı güvenliğini önemli ölçüde artıracaktır.