Hacker Directory — Understand what you hack.Hacker Directory — Understand what you hack.
Öğrenmeye devam et
EN
İçindekiler15 bölüm · 82 ders
DERS 05.04DERİN TEKNİK İNCELEME

Allow, deny ve inheritance: Etkili erişim kararını anlamak.

Etkili erişim, DACL'deki ACE'lerin istenen access mask'e karşı sırayla değerlendirilmesiyle çıkar: sistem talep edilen hakları biriktirir, eşleşen bir access-denied ACE'de durup reddeder ya da tüm istenen haklar allow ACE'leriyle karşılandığında verir. Bu ders aynı ACE kümesinin farklı sıralarda farklı sonuç ürettiğini, canonical order'ın (deny önce, explicit önce) neden önemli olduğunu, explicit allow'un inherited deny'i nasıl geçtiğini ve NULL DACL ile empty DACL'in taban tabana zıt anlamlarını sentetik SDDL fixture'ları üzerinden gösterir.

1. Core Mechanism / Temel mekanizma

Bu ders erişim kararının nasıl üretildiğini işler: istenen access mask, ACE'lerin sıralı değerlendirmesi, allow/deny etkileşimi ve inheritance. 05.02 access check'in var/yok kararını (DACL var mı, hak var mı) tanıttı; 05.03 bir descriptor'ı alan alan okumayı öğretti. Burada odak, birden çok ACE bir arada olduğunda sonucun sıraya ve inheritance'a göre nasıl belirlendiğidir. NULL ve empty DACL uç durumları da burada netleşir. Access check algoritmasının kaynağı How AccessCheck Works; ACE sıralaması Order of ACEs in a DACL belgesidir; ikisi de yorumlanmaz, olduğu gibi öğretilir.

Arabirimler ve belirtimler

  • Requested access mask: erişim isteğinin talep ettiği haklar kümesi (ör. FILE_READ_DATA + FILE_WRITE_DATA); access check bu maskeye göre yürütülür.
  • Remaining rights: istenen haklardan henüz allow ACE'siyle karşılanmamış olanlar; değerlendirme ilerledikçe azalır, sıfıra inince erişim verilir.
  • Sıralı değerlendirme: DACL'deki ACE'ler göründükleri sırada incelenir; karar ilk belirleyici eşleşmede (yeterli allow toplandı ya da istenen bir hakka deny geldi) kesinleşir.
  • Canonical order: tercih edilen sıra — explicit ACE'ler inherited'lardan önce; her grupta access-denied ACE'ler access-allowed'lardan önce.
  • Inheritance: bir ACE explicit (nesnede doğrudan tanımlı) veya inherited (üst nesneden gelen, ID bayraklı) olabilir; canonical sırada inherited ACE'ler explicit'lerden sonra gelir.
  • NULL DACL: DACL'in hiç bulunmaması (SDDL: NO_ACCESS_CONTROL); herkese full access anlamına gelir.
  • Empty DACL: DACL vardır ama sıfır ACE içerir (SDDL: D:); allow ACE’leri üzerinden istenen hakları vermez. AD DS’te current owner için READ_CONTROL ve WRITE_DAC gibi haklar ayrıca örtük olabilir; SE_TAKE_OWNERSHIP_PRIVILEGE WRITE_OWNER doğurabilir.

Erişim kararı bir birikimdir

Access check, istenen access mask'i tek bir hak gibi değil, bir talep listesi gibi ele alır. Nesnenin DACL'i yoksa (NULL DACL) erişim doğrudan verilir. DACL varsa, sistem ACE'leri göründükleri sırada inceler ve talep edilen hakları biriktirir: her access-allowed ACE, eşleştiği trustee için istenen haklardan bazılarını 'karşılanmış' işaretler.

Karar iki yoldan biriyle kesinleşir. Eğer bir access-denied ACE, hâlâ karşılanmamış (remaining) istenen bir hakla eşleşen bir trustee için gelirse, erişim o noktada reddedilir. Eğer değerlendirme, istenen tüm hakları karşılayacak kadar allow topladıysa erişim verilir. İkisi de olmadan liste biterse, kalan istenen haklar için allow bulunamadığından erişim implicit olarak reddedilir. Kritik nokta: karar ilk belirleyici eşleşmede durur, bu yüzden ACE'lerin sırası sonucu belirleyebilir.

Aynı ACE'ler, farklı sıra, farklı sonuç

İki ACE düşünün: aynı gruba önce bir access-denied (write) ve bir access-allowed (full). Canonical sırada deny allow'dan önce yazılır: bir write isteğinde sistem önce deny'i görür, istenen write hakkıyla eşleşir ve erişimi reddeder. Bu, 'explicit deny explicit allow'u yener' sezgisinin mekanizma karşılığıdır — ama bu sezgi yalnız canonical sıra korunduğunda geçerlidir.

Aynı iki ACE non-canonical sırada (allow önce, deny sonra) saklanırsa sonuç değişir: write isteğinde sistem önce allow (full) ACE'sini görür, istenen write dahil tüm hakları karşılar ve erişimi verir — deny ACE'sine hiç ulaşılmaz. Windows'un grafik arayüzü DACL'leri her zaman canonical sırada yazar, ama descriptor'lar API veya elle non-canonical hale getirilebilir; access check depolanan sırayla çalıştığı için bu, sessiz ve tehlikeli bir davranış farkı üretir.

Explicit, inherited'ı geçer

Inheritance, canonical order'ın ikinci boyutudur. Tercih edilen sırada explicit ACE'ler (nesnede doğrudan tanımlı) her zaman inherited ACE'lerden (üst nesneden gelen, ID bayraklı) önce gelir. Bu, çok pratik bir sonuç doğurur: bir nesnede explicit bir allow varken, üst klasörden gelen inherited bir deny bu allow'dan sonra değerlendirilir.

Dolayısıyla explicit allow, inherited deny'e ulaşılmadan istenen hakkı karşılayıp erişimi verebilir — yani explicit allow, inherited deny'i geçer. Bu, 'deny her zaman kazanır' basitleştirmesinin ikinci istisnasıdır: kural deny'in allow'u değil, canonical sıranın explicit'i inherited'dan önce koymasıdır. Sonucu belirleyen, ACE'nin allow/deny türü kadar explicit/inherited konumu ve sırasıdır.

Hiç DACL ile boş DACL zıttır

İki uç durum sık karıştırılır. NULL DACL, nesnenin hiç DACL'i olmaması demektir; access check bu durumda erişimi kısıtlayacak hiçbir kayıt bulamaz ve herkese full access verir. SDDL'de bu D:NO_ACCESS_CONTROL ile gösterilir ve parser bunu ayrı bir uyarıyla işaretler.

Empty DACL ise nesnenin bir DACL'i olması ama içinde sıfır ACE bulunması demektir. Bu DACL, istenen haklar için hiçbir allow ACE sağlamaz ve ACE-temelli denetimde implicit deny üretir. AD DS'te current owner için READ_CONTROL ve WRITE_DAC gibi örtük haklar ayrıca tanımlıdır; SE_TAKE_OWNERSHIP_PRIVILEGE de WRITE_OWNER hakkı doğurabilir. Bu nedenle empty DACL, DACL üzerinden hak vermese de bağlam dışı biçimde “kimse hiçbir erişim alamaz” diye genellenmemelidir. SDDL'de bu yalnızca D: ile (ACE'siz) yazılır; NULL DACL’den anlamı zıttır.

Durum ve veri akışı

  1. İstek gelir: caller bir requested access mask ile handle ister (ör. write içeren bir istek). Remaining rights = istenen tüm haklar.
  2. NULL DACL fixture'ı (D:NO_ACCESS_CONTROL): DACL yok → değerlendirme yapılmadan full access verilir; remaining anlamsızdır.
  3. Canonical fixture'ı ((D;;FW)(A;;FA), RID 2902): sıra deny→allow; write isteğinde ilk ACE deny FW remaining write ile eşleşir → erişim reddedilir; allow'a ulaşılmaz.
  4. Non-canonical fixture'ı ((A;;FA)(D;;FW), RID 2902): sıra allow→deny; write isteğinde ilk ACE allow FA tüm remaining'i karşılar → erişim verilir; deny'e ulaşılmaz. Aynı ACE kümesi, ters sonuç.
  5. Inheritance fixture'ı ((A;;FA)(D;ID;FW), RID 2902): explicit allow FA inherited deny FW'den önce; write remaining explicit allow ile karşılanır → erişim verilir; inherited deny geçilir.
  6. Empty DACL fixture'ı (D:): DACL var, 0 ACE; DACL üzerinden allow yok → istenen haklar ACE-temelli denetimde implicit deny olur. AD DS owner/privilege hakları ayrıca uygulanabilir.

2. Exploitation / İstismar

Broken trust assumption

Kırılan varsayım: Bir DACL'e bir kullanıcı için access-denied ACE koymak, o kullanıcının o hakkı almasını kesin olarak engeller. Gerçekte sonuç ACE'lerin sırasına ve explicit/inherited konumuna bağlıdır: DACL non-canonical sırada (allow, deny'den önce) yazılırsa access check istenen hakkı karşılayan allow ACE'sini önce görüp erişimi verir ve deny ACE'sine hiç ulaşmaz; benzer biçimde explicit allow, inherited deny'i geçer.

Technical prerequisites

  • Hedef nesnenin DACL'inin non-canonical sırada (access-allowed ACE, aynı hakka ait access-denied ACE'den önce) saklanabilmesi; bu GUI dışı API veya elle düzenlemeyle mümkündür.
  • İzin incelemesinin ACE varlığına bakıp sırasını denetlememesi ('deny var, demek ki engellendi' varsayımı).
  • Geniş kapsamlı bir allow ACE'sinin (ör. FullControl) istenen dar hakları da kapsaması, böylece sonraki deny'lerin etkisiz kalması.
  • Inherited deny'lere güvenilip explicit allow'ların gözden kaçması; explicit'in inherited'dan önce değerlendirildiğinin bilinmemesi.

Exploitation mechanism / İstismar mekanizması

Access check ACE'leri depolanan sırayla değerlendirir ve ilk belirleyici eşleşmede durur (How AccessCheck Works). Canonical order (Order of ACEs in a DACL) tam da bu yüzden vardır: access-denied ACE'leri access-allowed'lardan, explicit ACE'leri inherited'lardan önce koyarak deny'lerin ve explicit kısıtların önce görülmesini sağlar. Bir DACL non-canonical sıraya sokulursa — örneğin bir kullanıcı için geniş bir allow ACE'si, onu kısıtlaması beklenen deny ACE'sinden önce yazılırsa — write isteği ilk ACE'de karşılanır ve deny ACE'sine hiç ulaşılmaz; sonuç, mevcut deny'e rağmen erişim verilmesidir. Aynı mantık inheritance'ta da işler: explicit allow inherited deny'den önce geldiği için explicit allow kazanır. Kapsam, hangi nesnelerin DACL'inin non-canonical veya beklenenden geniş olduğudur; engelleyici kontrol, DACL'lerin canonical sırada ve least-privilege ile tutulması, geniş allow ACE'lerinin daraltılması ve descriptor değişimlerinin (4670) izlenmesidir.

Deny'in varlığı yeterli değildir

Bir izin incelemesi 'bu kullanıcı için deny ACE'si var, öyleyse engellenmiş' diye sonuçlanırsa yanılabilir. Access check kararı, ACE'nin varlığına değil, istenen hakka göre hangi ACE'nin önce eşleştiğine bağlıdır. Non-canonical sırada bir allow ACE'si deny'den önce geldiğinde, istenen hakkı karşılar ve deny hiç değerlendirilmez.

Bu yüzden inceleme iki şeyi denetlemelidir: ACE'lerin sırası canonical mı (deny'ler ve explicit'ler önce mi) ve allow ACE'leri beklenenden geniş hak mı veriyor. NewSd/OldSd farkı (4670) bir descriptor'ın non-canonical hale getirilip getirilmediğini görünür kılabilir, ancak sıra analizi olayın dışında SDDL üzerinde yapılır.

3. Defense & Detection / Savunma ve tespit

Telemetry scope

  • Bir network share isteğinde 5145, istenen hakları (AccessMask/AccessList) share access-check sonucundan (AccessReason ve ilgili ACE) ayırır. Bu alanlar tüm DACL’i içermez ve NTFS düzeyindeki grant’i kanıtlamaz.
  • 5145 belgeye göre Failure olayı yalnız erişim file-share düzeyinde reddedildiğinde üretilir; NTFS düzeyinde reddedilen erişim 5145 Failure üretmez. Bu, share ile NTFS katmanının ayrı değerlendirildiğini gösterir.
  • Bir DACL'in içeriği veya sırası değiştiğinde (ör. bir allow ACE'sinin deny'den öne alınması) bu, 4670 (Permissions on an object were changed) olarak OldSd/NewSd farkıyla kaydedilir; non-canonical sıraya geçiş bu iki SDDL karşılaştırılarak yüzeye çıkarılır.
  • 4670 üretimi nesnenin SACL'indeki Change Permissions audit ACE'lerine ve ilgili audit alt kategorisine bağlıdır; bu kapsam yoksa descriptor değişimi sessiz kalır ve sıra bozulması olaydan görülmez.

Events and relevant fields

  • 5145: AccessMask ve AccessList istenen hakları gösterir. AccessReason, istenen hak için share düzeyindeki grant/deny sonucunu ve ilgili ACE’yi açıklar. İstenen hak tek başına grant, anomali veya non-canonical DACL kanıtı değildir.
  • 5145 SubjectLogonId, ShareName ve RelativeTargetName ile hangi oturumun hangi paylaşımda hangi kaynağa eriştiğini bağlar; requested vs granted farkı bu bağlamda değerlendirilir.
  • 4670: OldSd ve NewSd SDDL'leri karşılaştırılarak bir DACL'in non-canonical sıraya sokulup sokulmadığı veya geniş bir allow ACE'sinin eklenip eklenmediği belirlenir; sıra analizi olay dışında yapılır.
  • Olayın yokluğu “değişiklik olmadı” veya “erişim verildi” anlamına gelmez. 5145 paylaşım kontrolünü kapsar. Dosya/registry izin değişiminde 4670 için ilgili audit policy ve uygun SACL audit ACE’si gerekir; SACL’in kendisi değiştiğinde 4670 üretilmez. NTFS retlerini ve AD nesnelerinin audit yolunu ayrıca incele.

İstenen ile verileni karşılaştır

5145’i okurken isteği sonuçtan ayır: AccessMask ve AccessList istenen hakları, AccessReason paylaşım düzeyindeki grant/deny sonucunu ve ilgili ACE gerekçesini gösterir. Bunlar tam DACL veya NTFS erişim kararı değildir. ACE sırasını incelemek için gerçek descriptor’ı, bir değişikliği incelemek için ilgili 4670 OldSd/NewSd kayıtlarını ayrıca karşılaştır.

İkinci katman, kararın girdisi olan descriptor'ın kendisini izlemektir. 4670'in OldSd→NewSd farkı, bir DACL'in ne zaman non-canonical hale getirildiğini veya geniş bir ACE eklendiğini gösterebilir; ancak bu iki olay da kapsam sınırlıdır (5145 yalnız share, 4670 yalnız SACL kapsamı) ve yoklukları 'sorun yok' anlamına gelmez.

Detection logic · KQL

// Inventory / triage: all collected 5145 events, not an anomaly detector
SecurityEvent
| where EventID == 5145
| project TimeGenerated, Computer, SubjectLogonId, ShareName, RelativeTargetName, AccessMask, EventData

Query assumptions

  • Bu sorgu geniş bir 5145 envanteri/triage görünümüdür. Rutin erişim kayıtlarının gelmesi beklenir; şüpheli grant veya non-canonical descriptor seçmez.
  • SecurityEvent belgesinde sorgudaki sütunlar bulunur. AccessList ve AccessReason ham 5145 XML alanlarıdır; bu tablonun belgelenmiş üst düzey sütunları değildir. Saklanan EventData’yı veya doğrulanmış ingestion eşlemesini incele. Eşleme eksikliği, ret veya boş hak talebi anlamına gelmez.
  • AccessMask ve AccessList isteği, AccessReason share access-check sonucunu anlatır. AccessMask’in dolu olması normal erişimi anomaliden ayırmaz.
  • 5145 Failure, share düzeyindeki ret içindir; NTFS düzeyindeki ret 5145 Failure üretmez. Descriptor sırası için gerçek descriptor’ı ve ilgili değişiklik kanıtını ayrıca incele.
  • Gerçek SIEM çalıştırması, veri kümesi, zaman penceresi veya ölçülmüş tespit kalitesi yoktur. Daraltma için doğrulanmış share/path, principal, beklenen haklar ve sonuç baseline’ı gerekir.

False positives

  • Meşru geniş yetkilendirmeler (yönetici erişimi, uygulama servis hesapları) rutin olarak geniş AccessMask talep eder; tek olay kötü niyet göstermez.
  • Paylaşım tabanlı yedekleme/tarama araçları çok sayıda 5145 üretir ve benign baseline olarak ayrılmalıdır.
  • AccessReason kodları ortam ve dil paketine göre değişebilir; ham kod eşlemesine dayanan kurallar yanlış pozitif/negatif üretebilir.
  • Olayın yokluğu güvenlik değildir: NTFS-düzeyi ret veya SACL kapsamı dışı descriptor değişimi bu olaylarda görünmez.

Hardening

  • DACL'leri canonical sırada (deny'ler ve explicit ACE'ler önce) ve least-privilege ile tut; non-canonical sıraya sokulmuş veya beklenenden geniş allow ACE'leri içeren descriptor'ları düzenli olarak tara ve düzelt.
  • Geniş kapsamlı allow ACE'lerini (ör. gereksiz FullControl) daraltarak sonraki deny'lerin ve inherited kısıtların etkisiz kalmasını önle; inheritance'ı bilinçli kur, gereksiz protected (P) DACL'lerden kaçın.
  • Yüksek değerli nesnelerin SACL'ini descriptor değişimlerini yakalayacak biçimde yapılandır ve 4670 OldSd/NewSd farkını izleyerek non-canonical sıraya geçişleri işaretle; share erişim kararlarını 5145 ile gözle.
  • NULL DACL (herkese full access) ve istenmeyen empty DACL durumlarını envanterle; kontrolleri uygulamadan önce audit hacmini ve iş etkisini pilot kapsamda ölç ve geri dönüş planı tut.

Örnekler üzerinde oku / Read the examples

ÖRNEĞİ BİRLİKTE OKUYALIM

EĞİTİM İÇİN HAZIRLANDI

Hangi kayıt erişim, hangisi audit veya integrity kuralı?

Canonical sıra · explicit deny, explicit allow'dan önce

01
S-1-5-21-1002233445-2244556677-3366778899-2902D · File Write

Reddeden kayıt. Maske trustee’ye yönelik allow/deny kaydının kapsamıdır. İstek, token, sıra ve nesne türü incelenmeden effective access sonucu çıkarılmaz.

02
S-1-5-21-1002233445-2244556677-3366778899-2902A · File All

İzin veren kayıt. Maske trustee’ye yönelik allow/deny kaydının kapsamıdır. İstek, token, sıra ve nesne türü incelenmeden effective access sonucu çıkarılmaz.

03
Nesnenin sahibiBuilt-in Administrators

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

04
Primary groupBuilt-in Users

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

Buradan çıkaracağın fikir

Bir kuralı okumak ile “bu kişi kesin erişebilir” demek farklıdır. Erişim isteği, token, ACE sırası ve nesne türüyle birlikte değerlendirme gerekir.

Bu görünüm SDDL’deki kuralları açıklar; Windows’un erişim kararını çalıştırmaz. SACL audit ve mandatory label kurallarını taşır; izin veren DACL’in yerine geçmez.

Bu örneğin kapsamı

Sentetik SDDL'dir; gerçek bir nesnenin descriptor'ı değildir. Owner BA (Built-in Administrators), group BU (Built-in Users). DACL iki ACE içerir, aynı trustee (RID 2902) için: önce access-denied FW (File Write), sonra access-allowed FA (File All). Bu canonical sıradır (deny önce). Öğretici nokta: bir write isteğinde access check önce deny FW ACE'sini görür, istenen write hakkıyla eşleşir ve erişimi reddeder; allow FA ACE'sine ulaşılmaz. 05.04'ün non-canonical fixture'ı ile birebir aynı ACE kümesini ters sırada kullanır ve zıt sonucu gösterir. Parser SDDL'i ayrıştırır ve rights adlarını çözer; erişim kararını hesaplamaz — sonuç açıklaması metindedir.

Ham kaydı aç · SDDL
O:BAG:BUD:(D;;FW;;;S-1-5-21-1002233445-2244556677-3366778899-2902)(A;;FA;;;S-1-5-21-1002233445-2244556677-3366778899-2902)

ÖRNEĞİ BİRLİKTE OKUYALIM

EĞİTİM İÇİN HAZIRLANDI

Hangi kayıt erişim, hangisi audit veya integrity kuralı?

Non-canonical sıra · explicit allow, explicit deny'den önce

01
S-1-5-21-1002233445-2244556677-3366778899-2902A · File All

İzin veren kayıt. Maske trustee’ye yönelik allow/deny kaydının kapsamıdır. İstek, token, sıra ve nesne türü incelenmeden effective access sonucu çıkarılmaz.

02
S-1-5-21-1002233445-2244556677-3366778899-2902D · File Write

Reddeden kayıt. Maske trustee’ye yönelik allow/deny kaydının kapsamıdır. İstek, token, sıra ve nesne türü incelenmeden effective access sonucu çıkarılmaz.

03
Nesnenin sahibiBuilt-in Administrators

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

04
Primary groupBuilt-in Users

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

Buradan çıkaracağın fikir

Bir kuralı okumak ile “bu kişi kesin erişebilir” demek farklıdır. Erişim isteği, token, ACE sırası ve nesne türüyle birlikte değerlendirme gerekir.

Bu görünüm SDDL’deki kuralları açıklar; Windows’un erişim kararını çalıştırmaz. SACL audit ve mandatory label kurallarını taşır; izin veren DACL’in yerine geçmez.

Bu örneğin kapsamı

Sentetik SDDL'dir. Canonical fixture'ıyla aynı iki ACE'yi (RID 2902 için deny FW ve allow FA) ters sırada içerir: önce access-allowed FA, sonra access-denied FW. Öğretici nokta: bir write isteğinde access check önce allow FA ACE'sini görür, istenen tüm hakları (write dahil) karşılar ve erişimi verir; deny FW ACE'sine hiç ulaşılmaz. Böylece mevcut bir deny'e rağmen erişim verilir. Standart security editor’lar genellikle canonical sırayı korur; ACL API’lerinde doğru sırayı sağlamak çağıranın sorumluluğudur. Özel araç/API ile non-canonical sıra oluşabilir ve access check depolanan sırayla çalıştığı için sonucu değiştirir. Parser sırayı ve rights'ı ayrıştırır; erişim kararını hesaplamaz.

Ham kaydı aç · SDDL
O:BAG:BUD:(A;;FA;;;S-1-5-21-1002233445-2244556677-3366778899-2902)(D;;FW;;;S-1-5-21-1002233445-2244556677-3366778899-2902)

ÖRNEĞİ BİRLİKTE OKUYALIM

EĞİTİM İÇİN HAZIRLANDI

Hangi kayıt erişim, hangisi audit veya integrity kuralı?

Inheritance · explicit allow, inherited deny'i geçer

01
S-1-5-21-1002233445-2244556677-3366778899-2902A · File All

İzin veren kayıt. Maske trustee’ye yönelik allow/deny kaydının kapsamıdır. İstek, token, sıra ve nesne türü incelenmeden effective access sonucu çıkarılmaz.

02
S-1-5-21-1002233445-2244556677-3366778899-2902D · File Write

Reddeden kayıt. Maske trustee’ye yönelik allow/deny kaydının kapsamıdır. İstek, token, sıra ve nesne türü incelenmeden effective access sonucu çıkarılmaz.

03
Nesnenin sahibiBuilt-in Administrators

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

04
Primary groupBuilt-in Users

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

Buradan çıkaracağın fikir

Bir kuralı okumak ile “bu kişi kesin erişebilir” demek farklıdır. Erişim isteği, token, ACE sırası ve nesne türüyle birlikte değerlendirme gerekir.

Bu görünüm SDDL’deki kuralları açıklar; Windows’un erişim kararını çalıştırmaz. SACL audit ve mandatory label kurallarını taşır; izin veren DACL’in yerine geçmez.

Bu örneğin kapsamı

Sentetik SDDL'dir. DACL üzerinde AI (auto-inherited) bayrağı vardır. İki ACE, RID 2902 için: explicit access-allowed FA (bayraksız) ve ardından inherited access-denied FW (ID = INHERITED_ACE bayraklı). Canonical order explicit ACE'leri inherited'lardan önce koyduğu için bu sıra canonical'dır. Öğretici nokta: bir write isteğinde explicit allow FA istenen hakkı karşılar ve erişim verilir; inherited deny FW'ye ulaşılmadan karar kesinleşir — yani explicit allow, inherited deny'i geçer. Parser ACE flags alanındaki ID değerini ham olarak taşır; explicit/inherited semantiğini veya erişim kararını hesaplamaz.

Ham kaydı aç · SDDL
O:BAG:BUD:AI(A;;FA;;;S-1-5-21-1002233445-2244556677-3366778899-2902)(D;ID;FW;;;S-1-5-21-1002233445-2244556677-3366778899-2902)

ÖRNEĞİ BİRLİKTE OKUYALIM

EĞİTİM İÇİN HAZIRLANDI

Hangi kayıt erişim, hangisi audit veya integrity kuralı?

NULL DACL · DACL yok, herkese full access

01
Nesnenin sahibiBuilt-in Administrators

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

02
Primary groupBuilt-in Users

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

03
Erişim kuralları / DACLNO_ACCESS_CONTROL

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

Buradan çıkaracağın fikir

Bir kuralı okumak ile “bu kişi kesin erişebilir” demek farklıdır. Erişim isteği, token, ACE sırası ve nesne türüyle birlikte değerlendirme gerekir.

Bu görünüm SDDL’deki kuralları açıklar; Windows’un erişim kararını çalıştırmaz. SACL audit ve mandatory label kurallarını taşır; izin veren DACL’in yerine geçmez.

Bu örneğin kapsamı

Sentetik SDDL'dir. D:NO_ACCESS_CONTROL, nesnenin hiç DACL'i olmadığını (NULL DACL) gösterir. Öğretici nokta: access check kısıtlayacak bir DACL bulamadığından herkese full access verir. Parser bunu ayrı bir uyarıyla ('NULL ACL; boş ACL ile aynı değildir') işaretler. Bu fixture, empty DACL fixture'ı (D:) ile bir karakter farkıyla zıt anlam taşır. Parser erişim kararını hesaplamaz; yalnız NULL ACL'i yapısal olarak tanır.

Ham kaydı aç · SDDL
O:BAG:BUD:NO_ACCESS_CONTROL

ÖRNEĞİ BİRLİKTE OKUYALIM

EĞİTİM İÇİN HAZIRLANDI

Hangi kayıt erişim, hangisi audit veya integrity kuralı?

Empty DACL · DACL var ama 0 ACE, ACE üzerinden grant yok

01
Nesnenin sahibiBuilt-in Administrators

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

02
Primary groupBuilt-in Users

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

03
Erişim kuralları / DACLBoş bölüm

Bu bölüm security descriptor’ın bir parçasıdır. Owner, primary group, DACL ve SACL farklı bilgi taşır.

Buradan çıkaracağın fikir

Bir kuralı okumak ile “bu kişi kesin erişebilir” demek farklıdır. Erişim isteği, token, ACE sırası ve nesne türüyle birlikte değerlendirme gerekir.

Bu görünüm SDDL’deki kuralları açıklar; Windows’un erişim kararını çalıştırmaz. SACL audit ve mandatory label kurallarını taşır; izin veren DACL’in yerine geçmez.

Bu örneğin kapsamı

Sentetik SDDL. D: (ACE’siz) bir empty DACL’dir: nesnede DACL vardır ama ACE yoktur. DACL üzerinden allow ile istenen hakları vermez ve ACE-temelli denetim bunları implicit deny eder. AD DS’te current owner için READ_CONTROL/WRITE_DAC örtük olabilir; SE_TAKE_OWNERSHIP_PRIVILEGE WRITE_OWNER doğurabilir. Bu, NULL DACL fixture’ının (D:NO_ACCESS_CONTROL, full access) karşıtıdır. Parser sıfır ACE’li DACL’i tanır ama access decision hesaplamaz.

Ham kaydı aç · SDDL
O:BAG:BUD:

İki yanlış kanı / Two reality checks

Sanılan: Bir kullanıcı için hem allow hem deny ACE'si varsa, deny her zaman kazanır.
Gerçekte: Access check ACE'leri depolanan sırayla değerlendirir ve ilk belirleyici eşleşmede durur; sonuç sıraya bağlıdır. 'Deny kazanır' yalnız canonical sıra korunduğunda (access-denied ACE'ler access-allowed'lardan önce) doğrudur. DACL non-canonical sıraya sokulup allow ACE'si deny'den önce yazılırsa, istenen hakkı karşılayan allow önce görülür ve deny'e ulaşılmadan erişim verilir. Ayrıca canonical sırada explicit ACE'ler inherited'lardan önce geldiği için explicit allow, inherited deny'i geçer.
Sanılan: Bir nesnenin DACL'i boşsa (hiç izin tanımlı değilse) herkes erişebilir.
Gerçekte: NULL DACL ile empty DACL zıt anlamlıdır. NULL DACL (nesnenin hiç DACL'i yok; SDDL: D:NO_ACCESS_CONTROL) herkese full access verir. Empty DACL (DACL var ama 0 ACE; SDDL: yalnız D:) DACL üzerinden hiçbir allow hakkı içermez ve ACE-temelli denetimde implicit deny üretir. AD DS’te owner/privilege kaynaklı örtük haklar ayrıca uygulanabilir. 'Boş DACL' ifadesi bu ikisini karıştırır; erişim sonucu taban tabana zıttır.

SIRA SENDE

Bu hikâyeyi sen çöz.

Bilgiyi hatırlamaktan bir adım ileri: koşulu değiştir, kanıtı oku, kararın nedenini anlat.

1 / 5 · SONUCU TAHMİN ET

Stored order’da ilk allow bütün requested rights’ı karşılıyor. Sonraki deny için ne olur?

Bir cevap seç

Bir ipucu

Bu sınırlı model karar verince değerlendirme durur.

Cevabın gerekçesini oku

Grant kararı verilir; sonraki deny’e ulaşılmaz.

Doğru. Bu non-canonical örneği normal canonical sıra diye yorumlama.

2 / 5 · KANITI OKU

Bu sırada WRITE sonucu nedir?

Yeni sentetik pratik örneği; ders artifact’inden bağımsızdır.
Requested right
WRITE
ACE 1 — teaching summary
deny WRITE for matching trustee
ACE 2 — teaching summary
allow ALL for matching trustee
İlgili bypass / Relevant bypass
none in this limited example
Bir cevap seç

Bir ipucu

İlk ACE remaining WRITE ile eşleşiyor mu?

Cevabın gerekçesini oku

Deny’de reddedilir; allow’a ulaşılmaz.

Doğru. İlk deny kalan requested WRITE ile eşleşir.

3 / 5 · SONUCU TAHMİN ET

İlgili owner/privilege bypass’ı olmayan ACE-temelli örnekte NULL DACL ile empty DACL aynı mı?

Bir cevap seç

Bir ipucu

DACL yokluğu ile mevcut ama sıfır ACE’yi ayır.

Cevabın gerekçesini oku

NULL DACL grant; empty DACL’de ACE grant’i yok.

Doğru. “Boş izin” ifadesi iki state’i ayırmadan yeterli değildir.

4 / 5 · OLAYLARI SIRALA

Bu sınırlı değerlendirme mantığını sırala.

  1. ACE’leri stored order’da trustee ve remaining rights’a göre değerlendir.
  2. Requested rights ile remaining rights’ı başlat.
  3. Eşleşen deny veya tamamlanan grant’de dur; hak kalırsa implicit deny.

Bir ipucu

Önce istek, sonra stored ACE, sonra kalan hak/karar.

Cevabın gerekçesini oku
  1. Requested rights ile remaining rights’ı başlat.
  2. ACE’leri stored order’da trustee ve remaining rights’a göre değerlendir.
  3. Eşleşen deny veya tamamlanan grant’de dur; hak kalırsa implicit deny.

Sıra önemlidir: grant kalan hakkı tamamlayabilir; eşleşen deny reddeder. Tüm ACE’ler sonunda kalan hak grant edilmemişse implicit denial vardır.

5 / 5 · KENDİN ANLAT

“Deny kazanır” ezberi yerine canonical ve non-canonical örneği anlat.

Bir ipucu

Aynı ACE kümesinde ilk belirleyici eşleşme değişebilir.

Cevabın gerekçesini oku

Bu modelde deny WRITE önceyse remaining WRITE ile eşleşip reddeder. Allow ALL önceyse requested rights tamamlanıp grant verilir, sonraki deny’e ulaşılmaz. Canonical sıra kuralları ve inheritance bu yüzden önemlidir; örnek gerçek Windows AccessCheck çalıştırmaz.

  • Stored order ile remaining rights’ı belirttim.
  • Sınırlı model sonucunu gerçek Windows testi diye sunmadım.

Açıklaman otomatik puanlanmaz. Kontrol noktalarını kendi cevabınla karşılaştır.

Vaka terminalini aç · PowerShell / CMD

Eğitim simülasyonu · Komutlar ve çıktılar bu vakaya aittir.

FS01 üzerindeki dosyanın DACL kaydını oku; etkin erişim hesabı ayrıca değerlendirilir.

Hazır script’i değiştirmeden çalıştırabilir veya aşağıdaki günlük komutları deneyebilirsin.

FS01 · Windows PowerShell 5.1ÖRNEK OTURUM
IYELABS\tunahanstudent0504 · ders çalışma alanı

Ctrl / ⌘ + Enter: çalıştır · Shift + Enter: yeni satır

Merak edersen: günlük komutları dene

Bir komuta dokun, sonra Çalıştır’a bas. Kullanıcı ve ağ bilgileri seçili örnek bilgisayara göre değişir.

Bu pratikler öğrenme amaçlıdır; sertifika sınavının puanını etkilemez.

Kaynaklar / Sources