Windows Vista UAC Tasarımı ve Linux Riskleri

14-5-2008

Bildiğiniz gibi daha önceden Vista’ yı kullandım ama beğenmedim. Vista SP1’ in çıkması artık bir çok driver’ ın sorunsuz çalışması, yazılım sorunlarının giderilmesi ve artık Vista’ nın sektörde geniş olarak yerini almaya başlamasının sonucu bende bu akımı kabul edip Vista’ yı kullanmaya başladım. Mac Book Pro’ dan HP’ ye geçmemle, hem masa üstü hem de diz üstü sistemlerimde Vista kullanmaya başladım.

Genel olarak Vista’ dan gayet memnunum ama ilginç bir şekilde özellikle UAC’ den memnunum. Bunun yanında Vista’ nın hala bir çok tuhaf yanı var ama onlara da alışmaya çalışıyorum.

Bu yazıda Windows Vista’ nın UAC tasarımını incelemeye ve anlatmaya çalışacağım ek olarak Linux kullanıcı yapısı ile benzerliği, farklılıkları ve de özellikle sudo benzeri implementasyonuna eğileceğim. Ek olarak tasarımdan gelen güven sorunlarını ve İşletim Sistemlerindeki hak değiştirme güvenliğine değinmeye çalışacağım. Yazının devamında Linux sistemler ile karşılaştırma yapacağım, şimdiden söyleyeyim ki konu Linux Windows’ a karşı gibi algılanmasın, yapmaya çalıştığım şey UAC’ i anlamak ve Linux’ un implementasyonunu irdeleyip bazı bilinen risklerin üzerine basmak.

UAC Nedir?

clip_image002

User Account Control Windows Vista’ nın en çok tanıtılan yeni özelliklerinden biri, temel olarak aynı kullanıcı altında çalışan yazılımların farklı haklar ile çalışabilmesini sağlıyor. Bunu genelde Linux’ da sudo nun benzeri olarak algılayabilirsiniz ancak durum bundan biraz daha farklı.

Mesela bir program yönetici (administrator) hakları gerektiriyorsa o program çalışmadan önce sizden yönetici haklarını onaylamanızı istiyor. Bu yönetici hakları Vista kullanıcısı tarafından onaylanırsa program yönetici olarak çalışıyor. Aynı şey Windows’ un kendi uygulamaları için de geçerli, mesela sistem dosyalarını değiştirmek isterseniz Windows Explorer sizden yönetici onayı istiyor. Aşağıda bu onay penceresinin bir örneğini görebilirsiniz. (resim wikipedia’ dan alınmıştır)

Neden UAC’ ye ihtiyaç olduğunu sanırım açıklamaya gerek yok, düşük kullanıcı hakları (Least Priviliged User Account / LUA) ile yazılımları çalıştırmak güvenliğin temel noktalarından biri (principle of least priviliged). Maalesef Vista’ dan önceki Windows işletim sistemleri bu özelliği yeterli derecede vurgulayamamıştı. Yanlış anlaşılmasın bu mümkündü ama varsayılan olarak bu şekilde değildi ve düşük haklara sahip olarak Windows işletim sistemi kullanmak ciddi derecede zor bir işti.

Windows Vista bir çok başka güvenlik değişikliği ile birlikte bu temel sorunu da çözmek için UAC’ yi sisteme ekledi. UAC muhtemelen Vista’ nın üzerinden en büyük değişikliklerden biridir.

Normalde Windows’ un bu kötü geçmişi yüzünden tüm yazılımlar genelde sizin sistemde yönetici olduğunuzu varsayarlar eğer bu yazılımlar Vista’ da hala nasıl çalışıyor diye merak ediyorsanız Eski Yazılımlar Vista’ da Nasıl Çalışıyor? yazımı okuyabilirsiniz.

UAC, Şifre ve Sudo

UAC implementasyon yapısı ile sudo’ ya benziyor dedik ancak ciddi farklılıkları var. Mesela Vista üzerinden eğer bir yönetici (administrator) hesabı ile sisteme giriş yaptıysanız ve bir program yönetici haklarına ihtiyaç duyduysa UAC size bir ekran gösterecek ve bu ekranda “OK” butonuna basmanız yeterli olacak. Siz bu pencereyi onayladıktan sonra program otomatik olarak yönetici hakları ile çalışacak. Bu pencereyi onaylayabilmeniz için şifreye ihtiyacınız yok.

Eğer aktif kullanıcı yönetici değilse ve çalıştırılan program yönetici hakları gerektiriyorsa, UAC penceresi gözükecek ve yönetici şifresini isteyecek.

clip_image004

Bu durumda Linux’ ta KDE ve Gnome gibi masaüstü yöneticileri genelde benzer bir yöntem izliyorlar. Mesela KDE 4.0 da örnek bir sudo penceresi (kdesu):

kdesu

Resimde gözüktüğü gibi Linux masaüstü implementasyonları şifre istiyor ancak Vista şifre istemiyor. Ek olarak eğer istenirse Vista her seferinde şifre istemeye Local Policy üzerinden ayarlanabilir.

Vista UAC Onay Ekranı Güvenliği

Vista şifre istemiyor ve sadece bir “OK” butonu ile yönetici haklarına erişmenizi sağlıyor, dolayısıyla burada bir kaç güvenlik sorununun çözülmesi gerekiyor. Eğer Windows’ un nasıl çalıştığı hakkında detaylı bilginiz varsa aklınıza hemen “Shatter” saldırıları aklınıza gelecektir yani Windows’ un iç mesajlarını kullanarak diğer yazılımlara istek göndermek ve bunun aracılığı ile haklarınızı yükseltmek (privilige escelation).

Bu yüzden bu UAC penceresi ayrı bir masaüstü olan “Session 0” da çalışıyor. Bunun anlamı iki masaüstünün tamamen ayrı olduğu ve birbirlerine windows mesajları ile mesaj gönderemediği. Dolayısıyla shatter saldırılarının hepsi burada geçersiz hale geliyor. Hatta arkadaki siyah plan bile aslında gerçek değil, isteğin yapıldığı anda arka planın kaydedilmiş bir resmi.

Vista UAC Onay Ekranındaki Güvenlik Sorunları

· Geçici Fiziksel Erişim
Vista varsayılan olarak yönetici hakları gerektiren işlemlerde şifre sormuyor dedik. Bu da açık olan bir sisteme 1-2 dakikalığına erişim şansı olan birinin sistemde basitçe kod çalıştırabilmesine izin veriyor. Bu da anlık olarak sisteme erişen birinin sistemi tamamen ele geçirebilmesi demek. Bu açıdan Linux masaüstü daha güvenli çünkü saldırganın şifreyi bilmesi gerekiyor.
Bunun yanında tabii ki bilgisayarı kitlemeden bırakmak güvenli açısından kötü bir fikir.

· Potansiyel Yazılım Seviyesindeki Açıklar
Her ne kadar Vista UAC ekranlarını ayrı olarak gözükmesi için tasarladıysa da her zaman bu sistemde açıklar çıkabilir ve bu açıkların çıkma olasılığı yapısı gereği sudo implementasyonlarına göre çok daha yüksek. Vista’ nın beta sürecinde benzer bir açık tespit edilmişti.

Linux Sudo Güvenlik Sorunları

İki yöntemde kullanıcının sudoer olduğunu ve sudo haklarının gayet geniş olduğunu varsayıyor ya da bu hakların başka vi üzerinden kod çalıştırma gibi privilige escelation’ lara neden olabileceğini. Bu tanım genel bir Linux masaüstü kullanısının tanımı.

· Sudo Bekleyerek Yönetici Haklarına Erişmek (privilige escelation)
Varsayılan kurulumunda masaüstü yöneticilerinin sudo işlemleri belli bir süre için hafızada tutuluyor, bu sayede yönetici her işlem için tekrar tekrar şifresini girmek zorunda kalmıyor. Bunun anlamı birinci sudo işlemi gerçekleştikten sonra masaüstü yöneticisi tarafından yönetilen tüm diğer yazılımların sudo hakkına sahip olması demek.
Bu durumda herhangi bir şekilde sisteme bulaşmış bir yazılım herhangi bir sudo işleminin yapılmasını bekleyebilir ve kullanıcı sudo işlemini yapar yapmaz yönetici hakları ile sudo haklarına kavuşabilir.
Bu bilinen bir sorun ve çözümü şifrenin belirli bir süre içerisinde hafızada kalmasını engellemek ve her seferinde tekrar girmek. Ancak varsayılan olarak bu zaman 5 dk. kadar ve bunu değiştirip “0” yapmak pek yaygın bir pratik değil.

· PATH üzerinden Sudo Bekleyerek Yönetici Haklarına Erişmek (privilige escelation)
Bu yukarıdaki saldırının benzeri ancak command line’ da çalışıyor. Temel olarak saldırgan aktif kullanıcının bash profil’ ini değiştirerek kullanıcıyı önceden hazırlanmış ve bir backdoor içeren bir sudo / su kodu çalıştırmasını sağlıyor. Bu backdoorlanmış sudo bir rootkit yükleyebilir ya da basitçe şifreyi kaydedip saldırgana gönderebilir.

Dolayısıyla bu noktada saldırgan sudo haklarını elde etmiş oluyor. Bu gene bilinen bir açık ve bu saldırıdan korunulabilir. Buna rağmen varsayılan olarak neredeyse hiç bir Linux dağıtımı bu saldırıya karşı korumuyor.

Temel olarak genel varsayılan ayarlar ile Linux’ ta düşük kullanıcıdan sudo haklarını elde etmeye iki tane bilinen yol var ve bunlar derinden gelen tasarımsal sorunlar, muhtemelen de uzun yıllar daha bu şekilde gidecekler.

Şifre İstemek ya da İstememek

Daha önceden de belirttiğim gibi yönetici hakları almanın iki yolu var, birincisi şifre istemek ikincisi istememek. Linux her zaman istiyor ve Windows Vista’ da opsiyonel.

Eğer yukarıdaki Linux implementasyon sorunlarını saymaz ve Vista tasarımını düşünürsek şifre istemek kesinlikle daha güvenli gibi gözüküyor ancak bu biraz kurulumun yapısı ve mekanı ile ilgili bir durum.

Şifre istemek şifrenizin başkaları tarafından yakalanmasına neden olabilir.

· Eğer şifrenizi yavaş yazıyorsanız her şifrenizi girişinizde etraftakilerin görme ihtimali yükseliyor,

· Çeşitli nedenlerden dolayı güvenlik kameraları olan firmalarda kameraya erişimi olan kişilerin şifrenizi okuma ihtimali. Bu ihtimal size çok saçma gelebilir ancak gerçek bir testte bir webcam erişimi üzerinden bunu yaptık. Dolayısıyla bu gerçek bir sorun.

· Şifreniz bir cep telefonu ile kaydedilebilir, arda arda hızlı çekim yapabilen küçük bir cihaz ile bu işlem yapılabilir. Biz bunu Iphone ile denedik, sallama sorununu çözebilirseniz çalışıyor. Ancak Iphone’ un çekim kalitesi gerçekten kötü. Profesyonel bir kamera ile bu işlemi çok rahat yapabilirsiniz.

Gördüğünüz bariz şekilde daha güvenli gözüken bir çözüm aslında çok daha güvensiz olabilir. Bunun yanında eğer sistemi kitlemeden uzaklaşırsanız ve biri sisteminize erişebilirse şifre girmeden yönetici hakları işlem yapabilir!

Dolayısıyla sistemin nerede olduğu ve nasıl olduğu bu kararı vermede ölümcül bir önem taşıyor.

Integrity Level

UAC’ nin en kritik özelliklerinden biri Integrity Seviyeleri. Vista’ da uygulamalar aslında dört farklı seviyede çalışıyor, düşükten yükseğe:

  1. Low – Potected Mode
  2. Medium – LUA
  3. High - Elevated
  4. System

Her Integrity mode’ un objeye göre hakları olabilir (obje çalışan bir uygulama ya da normal bir dosya olabilir). Mesela IE genelde sorun çıkarmaya müsait olduğu için en düşük haklar ile çalışıyor yani Low – Protected Mode ile.

Normal yazılımlar özel olarak belirtilmedikçe Medium seviyede çalışıyorlar. High ise özel olarak UAC penceresi ile elevate edilmiş yazılımlar. System ise sistem uygulamaları için. Dolayısıyla bu integerity seviyeleri sadece çalışan programlar ile ilgili değil aynı zamanda dosya sistemindeki erişim haklarıyla da ilgili.

Tüm seviyeler kendileri ile aynı olan ve alt seviyelerindeki objelere yazabilir ve okuyabilirler. Eğer ulaşılmaya çalışan obje dosya sistemi değilse seviyenin önemi olmadan o obje okunabilir. Bu da muhtemel olarak başka bir yüksek yazılımın memory’ sine erişim demek (bunu maalesef henüz test edemedim bu konuda kesin bir bilgi de bulamadım). Diğer bir yüksek seviye yazılımın memory’ sine ulaşmak bazen faydalı olabilir ama genelde pek bir sonuç çıkmayacaktır, çünkü bu data sadece okunabilir ve yazılamaz. Dolayısıyla “shatter” saldırıları burada da çalışmayacak.

Eğer okunmaya çalışan obje dosya sistemindeki bir obje ise çalışan uygulama sadece kendi seviyesindeki ve altında objeleri okuyabilir.

Programların hangi integrity seviyesinde çalıştığını görebilmek için AccessChk yi kullanabilirsiniz. Ek olarak dosya sisteminde bu hakları görmek için de icacls işinizi görecektir.

İmzalı / Signed Uygulama Ekranları ve İmzasız Uygulamalar

UAC geçerli olarak imzalanmış bir programı çalıştırırken ve imzalanmamış bir programı çalıştırma arasında görsel olarak bilgi veriyor. Burada unutulmaması gereken şey, aynı bir sitenin SSL kullanıyor olması sitenin güvenli olduğu anlamına gelmediği gibi bir yazılımın imzalı olduğu onun güvenli olduğu anlamına gelmiyor.

Vista’ da Yönetici Hakları İstemek

Şu şartlarda bir program yönetici haklarını isteyecektir:

· Program manifest dosyasında bunu belirtirse;

· Program Vista’ nın Uyumluluk listesindeyse;

· Kullanıcı özel olarak bir programın “Run As Administrator” ile çalıştırırsa,

· API ile bu istek yapılırsa,

· Vista bir programın “installer” programı olduğunu düşünürse.

Powershell ile API isteği yapmak : (Kaynak)

PS> $psi = new-object System.Diagnostics.ProcessStartInfo "notepad.exe"
PS> $psi.Verb = "runas"
PS> [System.Diagnostics.Process]::Start($psi)

Kapanış

UAC ve Sudo işletim sistemlerinde yönetici haklarını limitli ve güvenli şekilde kullanıcılara sunmak için değişik tasarımlar kullanıyorlar. İki tasarımında kendi içlerindeki zayıflıklıklarını ve potansiyel sorunları ele almaya çalıştım, bu sırada Vista’ nın UAC’ si pek bilinmediğinden bunu da detaylı şekilde ekstra notlar ile yazmaya çalıştım. Belki de UAC veya benzeri implementasyonları ileride daha çok işletim sisteminde göreceğiz. Integrity Seviyeleri ise henüz bir muamma, iyi ve değişik yönleri var yazılımları 4-5 farklı kullanıcı olarak kullanmak gibi. Buna rağmen bunu daha iyi tasarlamanın yolları olabilirdi.

UAC’ nin iyi tasarımına rağmen hala tüm uygulamalar birbirlerinden bağımsız değil ve birbirlerine her zaman okuma hakları var, bu bir açık olmamasına rağmen sorunlara gebe bir tasarım. Maalesef genel yazılımların buna gerçekten ihtiyaç duyduğunu, mükemmel izolasyonun işletim sistemini çok daha kompleksleştireceğini ve bir çok yazılımın buna uyumlu yazılmasının zor olduğunu düşünürsek sanırım bu mantıklı bir seçim.

Recent Blog Posts

See all of the blog posts