# VC-084 · Yetki denetimi hata verince korunan işlem izinli sayılıyor

Yetki servisi cevap veremediğinde uygulama kullanıcının işini kesmemek için erişime izin veriyor. Denetimin sonucu bilinmediği halde korunan yazı başlıyor ve servis arızası yetki sınırını kaldırıyor.

- Önem: YÜKSEK. Etkisi büyük. Trafik artınca ya da istek tekrarlanınca tetiklenir.
- Önem notu: Yük altında yetki bağımlılığının hata verdiği ve korunan yazının açıldığı akış temel alınır. Hata her istekte oluşuyorsa önem acile yükselir. Saldırganın denetimi bozabildiği yollar ayrıca güvenlik açısından incelenir.
- Eksen ve kategori: Sağlamlık, 12 Hata yolları ve dış çağrılar
- Yığın: Node.js, Her yığın
- Yapay zekâ kodunda: ölçülmedi. Dayanak: uzman görüşü.
- Ne zaman bakılır: İlk yayından önce, Kişisel veri toplamadan önce
- CWE: CWE-636
- OWASP Top 10:2025: A10:2025 Mishandling of Exceptional Conditions
- Checklist ifadesi: Yetki denetimi hata verdiğinde korunan işlem başlamıyor.
- Son inceleme: 4 Ekim 2026, Komünite editörlüğü
- Adres: https://vibecheck.komunite.com.tr/madde/yetki-kontrolu-hata-verince-kapiyi-aciyor

## 60 saniyelik kontrol

Yalnız kendi uygulamanda ya da yazılı izin aldığın sistemde dene. Bu bir sızma testi değildir.

1. Yetki okumasındaki catch, varsayılan izin ve önbellek yedeği yollarını bul.
2. Yerel testte yetki denetiminin kontrollü hata vermesini sağla.
3. Hata ve bozuk yanıtta korunan yazının hiç başlamadığını doğrula.
4. Açık ret ile denetim arızasının ayrı hata sonuçları döndüğünü kontrol et.
5. Açık izinli kullanıcının olağan işlemi hâlâ yapabildiğini doğrula.

## Ne oluyor

Bir ekip yöneticisinin kayıt değiştirmeden önce yetkisi denetleniyor. Denetim servisi bazen cevap veremiyor. Kullanıcıların işini kesmemek için hata dalına izin veren bir varsayılan ekleniyor. Servis çalışırken her şey doğru görünüyor. Servis bozulduğu anda ise korunan yazı, kullanıcının gerçekten yetkili olup olmadığı bilinmeden başlıyor.

Bu davranış erişim denetimini bağımlılığın sağlığına bağlı hale getirir. Denetim cevap verirse izin kararı uygulanır. Cevap vermezse kapı açılır. İşlem yapamamak can sıkıcı olsa da denetimin yokluğunu izin olarak yorumlamak ürünün güvenlik sözleşmesini değiştirir. Arıza sırasında hangi işlemlerin duracağı önceden belirlenmelidir.

Hata yalnız istisna biçiminde gelmez. Yardımcı fonksiyon beklenen boolean yerine boş sonuç, metin veya eksik nesne döndürebilir. Kod yalnız açık `false` değerini reddediyorsa bu sonuçlar da izin sayılabilir. Korunan işin başlaması için denetimin başarılı olması ve açık izin üretmesi gerekir. Yetkisiz olmakla yetkinin şu anda doğrulanamaması aynı sonuç değildir, fakat ikisi de doğrulanmamış korunan yazıyı başlatmamalıdır.

## Gerçek olay

Bu metin belirli bir ürün ihlalini örnek göstermiyor. [CWE-636](https://cwe.mitre.org/data/definitions/636.html), hata durumunda güvenli sınırın korunmamasını tanımlar. [OWASP yetkilendirme rehberi](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html) varsayılan ret ve yetki denetimi hatalarının güvenli ele alınmasını önerir. Bu kaynaklar somut hata desenini destekler, AI üretim sıklığını ölçmez.

Yerel deneyde yetki denetimi bir bağdaştırıcı taklidiyle kontrollü hata verir. Korunan işin çağrı sayısı ayrı tutulur. İyi sürüm hizmet hatası döndürürken sayaç değişmez. Açık ret ve bozuk yanıt da yazı üretmez. Açık izin verildiğinde aynı iş başarıyla çalışır. Gerçek kimlik sağlayıcı, ağ kesintisi veya dağıtık izin önbelleği bu deneyin parçası değildir.

## Yapay zekâ bunu neden üretiyor

**Kesintisiz deneyim yanlış yerde uygulanır.** Ajan geçici servis hatasında kullanıcı işini sürdürmek isteyebilir. Genel bir içerik listesinin eski kopyasını göstermekle korunan yazıya izin vermek benzer yedek davranışlar gibi görünür. Oysa ikinci karar yetki sınırını değiştirir. Ürün bağlamı belirtilmezse erişilebilirlik hedefi denetimin önüne geçebilir.

**Hata dalı olumlu yoldan kopyalanır.** Ajan önce çalışan izinli yolu kurar. Sonradan hata yakalama eklerken aynı devam değerini kullanabilir. Kod kısa kalır ve kullanıcı yeni hata görmez. Ancak denetimin başarıyla tamamlanmadığı bilgi kaybolur. Bu dalı ayrı test etmek, olumlu yolun yanlışlıkla hata yoluna taşındığını gösterir.

**Eksik sonuç ret sayılmaz.** Denetim yardımcıları farklı veri biçimleri döndürebilir. Ajan yalnız `false` kontrolü yaparsa boş sonuç veya metin değerinin anlamını tanımlamamış olur. JavaScript'in doğruluk dönüşümleri bunu daha da belirsizleştirebilir. İzin sözleşmesi açık olmalı ve gelen değer bu sözleşmeyi karşılamalıdır.

**Tek hesapla deneme sınırı göstermez.** Ajan kendi yetkili hesabıyla denediğinde normal işin çalıştığını görür. Denetim servisini hata vermeye zorlamadığı için korunan etkinin hatada da oluştuğunu fark etmeyebilir. Hata testi yalnız yanıtı değil bu etkiyi de izlemelidir. Bu paragraflar olası üretim mekanizmalarıdır. Bir modelin davranışına ilişkin ölçülmüş yaygınlık iddiası değildir.

## Etki

Yetki kaynağına ulaşılamayan süre boyunca izin sınırı uygulanmayabilir. Normalde kayıt değiştiremeyen kullanıcı, hata yolundan aynı işlemi yapabilir. Etki korunan işin kapsamına bağlıdır. Ekip ayarı değiştirmek, başkasının kaydını silmek veya yönetim işlemi başlatmak farklı büyüklükte sonuçlar doğurur. Yalnız okunan kamuya açık veri aynı sınıfta değerlendirilmez.

Arızanın ne zaman tetiklendiği de önem taşır. Örnek yük altında denetim bağımlılığının hata verdiği koşulu temel alır. Bu nedenle hesaplanan önem yüksektir. Hata sürekli oluşuyorsa veya saldırgan tarafından güvenilir biçimde tetiklenebiliyorsa öncelik artar. Servisin normal çalıştığı denemedeki izin kontrolü, arıza sırasında da aynı sınırın korunduğunu göstermez.

## Nasıl anlarsın

Yetki bilgisinin kaynağından korunan işleme kadar ilerle. `catch` içinde izin veren değer, varsayılan yönetici rolü veya süresi bilinmeyen eski izin var mı? Eksik kayıt ile olumlu izin nasıl ayrılıyor? Denetim kodu hata döndürse bile çağıran bu hatayı görmezden gelip devam ediyor mu?

Yerel testte denetim hatası, açık ret ve bozuk yanıtı ayrı üret. Korunan yazı veya araç çağrısı hiç başlamamalıdır. Ardından açık izinli yolu çalıştır. Düzeltme herkesi reddederek başarılı sayılmamalıdır. Gerçek uçta fonksiyonun ürettiği durumun HTTP yanıtına da taşındığını kontrol et. Nesne içinde hata kodu bulunması tek başına ağ yanıtının doğru olduğunu kanıtlamaz.

## Nasıl düzeltirsin

1. **Açık izin iste.** Korunan işi yalnız denetimin başarılı ve olumlu sonucundan sonra çalıştır. Eksik, bozuk veya çözülemeyen sonucu izinle doldurma. Örnekte yalnız gerçek boolean değer kabul edilir.
2. **Sonuçları ayır.** Açık ret için yasak sonucu, denetim hizmeti arızası için geçici hizmet hatası üret. Her hatayı kullanıcının yetkisizliği gibi sunma. Kullanıcıya güvenli bilgi ver, işletim kaydında denetim arızasını izlenebilir tut.
3. **Hata kapsamını daralt.** Yetki kontrolünün hata bloğu korunan yazıyı da kapsamasın. Yazma sırasında oluşan sorun yetki servisi arızası gibi etiketlenmemelidir. Örnek bu iki aşamayı ayrı tutar ve yazma hatasını üst sınıra bırakır.
4. **Önbellek sözleşmesini yaz.** Daha önce doğrulanmış izin kullanılacaksa kimlik, kaynak, işlem ve geçerlilik süresi açık olsun. İzin geri alındığında ne olacağını belirle. Süresiz eski izin, belirsiz sonucu güvenilir hale getirmez.

## Bir daha olmasın

Yetki bağımlılığının hata deneyini korunan işlem testlerine ekle. İzinli yolun çalışmasıyla hata yolunda yan etki oluşmamasını aynı değişiklikte doğrula.

## Sınır

Bu madde denetim hatasında açılan erişimi kapsar. Kimlik doğrulaması, nesne sahipliği, izinlerin güncelliği ve denetim ile yazı arasındaki yarış ayrıca incelenir. Örnek kimliği doğrulanmış çağıran varsayar. Ürünce kamuya açık yol veya kapsamı doğrulanmış süreli izin önbelleği tek başına bulgu değildir.

## Düzeltme kodları

### Node.js: Yetki bilinmiyorsa işlemi durdur

Önce:

```js
// yetki/korumali-is.js, açıklama amaçlı. Kimlik doğrulaması çağıranda yapılır.
export async function guardedWrite(checkPermission, write) {
  let allowed;
  try {
    allowed = (await checkPermission()) !== false;
  } catch {
    // Geçici servis arızasında kullanıcı işine devam edebilsin.
    allowed = true;
  }
  if (!allowed) return { status: 403, code: 'FORBIDDEN' };
  const id = await write();
  return { status: 200, id };
}
// Olumlu örnekte hata görülmediği için bu dal fark edilmeyebilir.
// Denetimin cevapsız kalması izin verilmiş gibi yorumlanıyor.
```

Sonra:

```js
// yetki/korumali-is.js, açıklama amaçlı. Kimlik doğrulaması çağıranda yapılır.
export async function guardedWrite(checkPermission, write) {
  let allowed;
  try {
    allowed = await checkPermission();
  } catch {
    // Denetim hizmetine ulaşılamadı, korunan işlem başlamaz.
    return { status: 503, code: 'AUTHZ_UNAVAILABLE' };
  }
  if (typeof allowed !== 'boolean') {
    return { status: 503, code: 'AUTHZ_UNAVAILABLE' };
  }
  if (!allowed) return { status: 403, code: 'FORBIDDEN' };
  const id = await write();
  return { status: 200, id };
}
// write hatası yetki hatası gibi ele alınmaz, üst sınıra çıkar.
// Gerçek uç bu nesneyi aynı HTTP durum koduyla yanıtlamalıdır.
```

Düzeltmeyi kanıtlayan test:

```js
// yetki/korumali-is.test.mjs, açıklama amaçlı. Dış servis taklidi ve yazı sayacı.
import test from 'node:test';
import assert from 'node:assert/strict';
const { guardedWrite } = await import(process.env.ORNEK_DOSYA);
test('yetki belirsizse yazılmaz, açık izinli yol çalışır', async () => {
  let writes = 0;
  const write = async () => { writes++; return 'yapay-kayit'; };
  const failed = await guardedWrite(async () => { throw new Error('Yapay kesinti'); }, write);
  assert.deepEqual(failed, { status: 503, code: 'AUTHZ_UNAVAILABLE' });
  assert.equal(writes, 0);
  for (const invalid of [undefined, null, 'true', 1]) {
    assert.equal((await guardedWrite(async () => invalid, write)).status, 503);
  }
  assert.equal((await guardedWrite(async () => false, write)).status, 403);
  assert.equal(writes, 0);
  assert.deepEqual(await guardedWrite(async () => true, write), { status: 200, id: 'yapay-kayit' });
  assert.equal(writes, 1);
  await assert.rejects(guardedWrite(async () => true, async () => {
    throw new Error('Yapay yazma hatası');
  }), /Yapay yazma hatası/);
});
```

## Ajan kuralı (AGENTS.md)

```md
## Yetki hatası kapıyı açıyor (vibecheck VC-084)
- Korunan işi yalnız doğrulanmış açık izinle başlat.
- Yetki denetimi hatasını varsayılan izne çevirme.
- Bozuk veya eksik denetim yanıtını belirsiz sonuç say.
- Açık ret ile denetim hizmeti arızasını ayrı temsil et.
- Hata testinde yanıtla birlikte korunan etkinin oluşmadığını doğrula.
- Önceden doğrulanmış izin önbelleğinin geçerlilik kuralını açık tanımla.
```

## Kaynaklar

1. [CWE-636: Not Failing Securely](https://cwe.mitre.org/data/definitions/636.html), MITRE
2. [OWASP Authorization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html), OWASP

---

vibecheck · Komünite editörlüğü. Metin CC BY 4.0, prompt ve kural parçaları MIT-0. Kaynak: https://vibecheck.komunite.com.tr/madde/yetki-kontrolu-hata-verince-kapiyi-aciyor
