# VC-101 · Güvenlik açığını bildirmek isteyen kişi ulaşacağı özel kanalı bulamıyor

Bir kullanıcı güvenlik sorunu buluyor fakat nereye özel bildirim göndereceğini anlayamıyor. Bildirim gecikiyor veya açık bir yorumda paylaşılıyor, ekibin güvenle inceleme fırsatı azalıyor.

- Önem: DÜŞÜK. Etkisi sınırlı. Nadiren tetiklenir.
- Önem notu: Özel bildirim yolunun bulunamaması nedeniyle incelemenin gecikmesi esas alınır. Bu durum tek başına sömürülebilir açık kanıtı değildir. Güncel ve takip edilen başka kanal varsa eksik dosya otomatik bulgu sayılmaz.
- Eksen ve kategori: Sağlamlık, 15 Gözlem, yedek ve kurtarma
- Yığın: Her yığın
- Yapay zekâ kodunda: ölçülmedi. Dayanak: uzman görüşü.
- Ne zaman bakılır: İlk yayından önce, Her ay
- CWE: yok. Güvenlik bildirimi kabul etme sürecinin eksikliği için doğrudan CWE eşlemesi yapılmaz. Kanalın keşfi ve güncelliği RFC 9116 üzerinden değerlendirilir.
- Checklist ifadesi: Güvenlik açığı bildirmek isteyen biri özel bir iletişim kanalı bulabiliyor.
- Son inceleme: 4 Ekim 2026, Komünite editörlüğü
- Adres: https://vibecheck.komunite.com.tr/madde/guvenlik-acigi-bildirim-kanali-yok

## 60 saniyelik kontrol

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

1. Sitede özel güvenlik bildirim adresi veya formu bulunabiliyor mu kontrol et.
2. security.txt kullanılıyorsa Contact ve Expires alanlarını incele.
3. Depodaki SECURITY.md ile sitedeki kanalın aynı sürece ulaştığını doğrula.
4. Kanalı takip eden sorumluyu ve son zararsız teslim denemesini bul.

## Ne oluyor

Bir kullanıcı başkasının kaydına erişebildiğini fark ediyor ve sana özel olarak haber vermek istiyor. Sitede yalnız genel iletişim formu var, depoda güvenlik politikası yok, destek adresinin takip edilip edilmediği bilinmiyor. Kullanıcı vazgeçebilir veya sorunu herkese açık bir yorumda anlatabilir. Ekip, inceleyebileceği bir bulguyu zamanında alamaz.

Bildirim kanalı, bir açığın varlığını önlemez. Ancak dışarıdan gelen bilgiyi doğru kişiye ve uygun gizlilikle ulaştırır. Kanalın adı kadar onu izleyen kişi, alternatif erişim yolu ve ne beklendiğini anlatan kısa açıklama da önemlidir. Var olmayan bir posta kutusunu dosyaya yazmak iletişim kurmak değildir.

`security.txt`, web sitesinin güvenlik bildirim bilgilerini standart bir yerde sunmasına yardımcı olur. Depodaki `SECURITY.md` ise proje için hangi sürümlerin desteklendiğini ve sorunların nasıl bildirileceğini anlatabilir. İkisinin aynı süreçle tutarlı olması gerekir. Sadece dosya oluşturulduğu için gelen bildirimlerin değerlendirildiği varsayılamaz. Buradaki kontrol bulunabilirlik, geçerlilik ve takip edilen iletişim yolunu birlikte ele alır.

## Gerçek olay

Bu madde belirli bir AI ürününün olay kaydına dayanmıyor. RFC 9116, güvenlik bildirim bilgisinin keşfedilebilmesi için `security.txt` biçimini tanımlar. İletişim alanı ve geçerlilik tarihi zorunludur. Standart ayrıca güncelliğini yitirmiş iletişim bilgisinin raporun yanlış kişiye gitmesine veya ulaşmamasına yol açabileceğini belirtir. [RFC 9116](https://www.rfc-editor.org/rfc/rfc9116.html)

GitHub belgesi, depoya güvenlik politikası eklemeyi ve bildirim yolunun burada açıklanmasını destekliyor. [Depo güvenlik politikası](https://docs.github.com/en/code-security/how-tos/report-and-fix-vulnerabilities/configure-vulnerability-reporting/add-security-policy) Bu iki kaynak bir posta kutusunun gerçekten izlendiğini kanıtlamaz. Biçim denetimiyle işletim kanıtını ayırmak gerekir. Uygun başka bir özel kanal zaten bulunabiliyorsa yalnız belirli dosyanın yokluğunu otomatik zafiyet saymıyoruz. Süreç eksikliğine ilgisiz CWE numarası eklemiyoruz.

## Yapay zekâ bunu neden üretiyor

**Model ürünün normal akışlarını tamamlar.** Giriş, ödeme ve profil ekranları açıkça istendiğinde ajan bunları önceliklendirir. Dışarıdan güvenlik bulgusu bildirmek isteyen kişinin yolu tasarımda görünmeyebilir. Bu kullanıcı ürünü normal amaçla kullanmadığı için kabul senaryolarına da girmez. Bildirim kanalı ayrı bir işletim gereksinimi olarak yazılmadığında teslimden düşebilir. Bu eksik, sayfanın görsel olarak tamamlanmasıyla anlaşılmaz.

**Şablon iletişim adresi gerçek sanılabilir.** Ajan örnek alan adına ait bir adresi dosyaya koyup işi tamamlandı diye raporlayabilir. Dosya biçim açısından doğru olsa da adresin sahibi ve alıcısı yoktur. Dağıtım yapılandırması gerçek ve izlenen bir kanal sağlamalıdır. Örnek adresin canlı iletişim yolu olarak yayımlanmaması kabul kontrolünde açıkça belirtilmelidir.

**Genel destek özel bildirimle eşitlenebilir.** Herkese açık issue bağlantısı normal ürün geribildirimi için yararlı olabilir. Güvenlik bulgusunda kullanıcı bu alana sır veya başka kişinin verisini koyabilir. Model mevcut iletişim yolunu yeniden kullanırken görünürlük farkını atlayabilir. İstenen bilgi, paylaşım yeri ve özel iletişime geçiş yolu önceden tarif edilmelidir. Gereksiz gerçek veri istenmemelidir.

**Bir defalık dosya kalıcı çözüm sayılabilir.** İletişim adresi veya ekip sorumlusu değiştiğinde dosya eski kalabilir. Ajan dosyanın varlığını denetleyen test yazdıysa güncellik sorununu yakalayamaz. Geçerlilik tarihi ve düzenli teslim denemesi bu nedenle ayrı kabul koşullarıdır. Bu mekanizmalar birer çıkarımdır. AI araçlarında ölçülmüş yaygınlık veya belli bir ürün hakkında olay iddiası olarak sunulmaz.

## Etki

Özel bildirim yolu bulunmadığında bulgunun incelenmesi gecikebilir. Araştırmacı farklı kanallara yazarken aynı bilgiyi gereksiz kişilere açabilir. Ekip, açık yorumdaki ayrıntıları sonradan taşımak ve paylaşılmış verinin kapsamını anlamak zorunda kalabilir.

Kanalın varlığı bütün bildirimlerin doğru olacağını garanti etmez. Gürültü, spam ve eksik raporlar gelebilir. Basit bir ilk değerlendirme süreci ve sorumlu belirlemek bu yükü yönetmeye yardımcı olur. Bu madde tek başına sömürülebilir açık kanıtı değildir. Önemi, sorun bilgisinin zamanında ve uygun yere ulaşabilmesi üzerindedir.

## Nasıl anlarsın

Uygulamayı dışarıdan gören biri gibi güvenlik bildirim yolunu ara. Site açıklaması, `security.txt` ve depo politikası aynı alıcıya veya aynı sürece yönlendiriyor mu? Kanalın sahibi belli mi? Son zararsız teslim denemesi kaydı var mı? Gerçek bir açık ayrıntısını veya kullanıcı verisini deneme mesajı olarak kullanma.

Dosya kullanılıyorsa HTTPS üzerinden doğru konumda ve düz metin türünde sunulduğunu kontrol et. Geçerlilik tarihinin geçmişte kalmadığını incele. Yerel örnek bir `Response` nesnesi üretir. Test yanıt durumunu, alanları ve bozuk yapılandırmanın reddini denetler. Gerçek web yönlendirmesi veya posta teslimi sınanmış sayılmaz.

## Nasıl düzeltirsin

1. **Takip edilen kanalı seç.** Gerçek alıcısı olan özel adres veya form belirle. Sorumlu değiştiğinde bilgiyi kimin güncelleyeceği belli olsun.
2. **Bulunabilir hale getir.** Siteden ve depodan aynı bildirim sürecine bağlan. `security.txt` kullanıyorsan standart konum, `Contact` ve tek `Expires` alanını koru.
3. **Beklentiyi açık yaz.** Hangi ürünlerin kapsamda olduğunu, hangi bilgilerin yararlı olduğunu ve özel verinin nasıl paylaşılmaması gerektiğini belirt. Yerine getiremeyeceğin yanıt süresini vaat etme.
4. **Güncelliği denetle.** Son tarih yaklaşınca içeriği yeniden incele. Yerel biçim testiyle gerçek teslim denemesini ayrı kayıtlar olarak tut.
5. **İlk değerlendirmeyi hazırla.** Bildirimi alacak kişi, doğrulama yöntemi ve gerekli iç yönlendirme yolu belli olsun. Dosya yayımlamayı sürecin sonu sayma.

## Bir daha olmasın

Alan adı, destek sistemi veya ekip sorumlusu değiştiğinde güvenlik iletişimini de kontrol et. Kamuya açık kanalda sır veya gerçek kullanıcı verisi isteme.

## Sınır

`security.txt` bir hata ödül programı, araştırma izni veya hukuki güvence oluşturmaz. Çalışan alternatif özel kanal varken dosya yokluğu tek başına bulgu değildir. Örnekte yalnız posta ve HTTPS iletişimi desteklenir, RFC'nin bütün URI seçenekleri uygulanmaz. Örnek adres gerçek alıcı değildir. Yayından önce gerçek kanal, HTTPS yolu ve sorumlu takibi ayrıca doğrulanmalıdır.

## Düzeltme kodları

### Node.js: Güncel security.txt yanıtı

Önce:

```js
// iletisim/security.js, açıklama amaçlı. Gerçek uç bağlaması ayrıca yapılır.
export function securityResponse(config, now = Date.now()) {
  // Genel iletişim sayfası özel güvenlik bildirim yolunu belirtmiyor.
  return new Response('Görüşlerinizi herkese açık issue olarak yazın.', {
    status: 404,
    headers: { 'Content-Type': 'text/plain; charset=utf-8' },
  });
}
// Bu örnek bilerek security.txt yanıtı üretmez.
// config yalnız güvenilir dağıtım yapılandırmasından gelmelidir.
// Bildirim kanalı olmayan üründe dosya adı tek başına çözüm değildir.
// Test gerçek mesaj veya e-posta göndermez.
// RFC alan denetimi, bir alıcının mesajı okuduğunu kanıtlamaz.
// Üretimde özel kanalın sorumlusu ayrıca belirlenmelidir.
// Örnek gerçek kişiye ait iletişim bilgisi içermez.
```

Sonra:

```js
// iletisim/security.js, açıklama amaçlı. HTTPS /.well-known/security.txt yoluna bağla.
export function securityResponse({ contact, expires }, now = Date.now()) {
  if (typeof contact !== 'string' || /[\r\n]/.test(contact)) throw new Error('İletişim geçersiz');
  const uri = new URL(contact);
  if (!['mailto:', 'https:'].includes(uri.protocol) ||
      (uri.protocol === 'mailto:' && !/^[^@\s]+@[^@\s]+$/.test(uri.pathname))) {
    throw new Error('İletişim geçersiz');
  }
  const end = Date.parse(expires);
  if (!Number.isFinite(end) || end <= now || end - now > 365 * 86400000) {
    throw new Error('Geçerlilik tarihi hatalı');
  }
  const body = `Contact: ${uri.href}\nExpires: ${new Date(end).toISOString()}\nPreferred-Languages: tr, en\n`;
  return new Response(body, { status: 200,
    headers: { 'Content-Type': 'text/plain; charset=utf-8', 'Cache-Control': 'no-store' } });
}
// RFC telefon URI'sine de izin verir. Bu ürün örneği yalnız posta ve HTTPS seçer.
// Gerçek ve izlenen iletişim adresi dağıtım önkoşuludur.
```

Düzeltmeyi kanıtlayan test:

```js
// iletisim/security.test.mjs, açıklama amaçlı. Ağ ve posta teslimi sınanmaz.
import test from 'node:test';
import assert from 'node:assert/strict';
const { securityResponse } = await import(process.env.ORNEK_DOSYA);
test('iletişim, tek son tarih ve metin türü doğru üretilir', async () => {
  const now = Date.parse('2026-10-04T00:00:00Z');
  const config = { contact: 'mailto:security@example.invalid', expires: '2027-01-04T00:00:00Z' };
  const response = securityResponse(config, now);
  assert.equal(response.status, 200);
  assert.equal(response.headers.get('content-type'), 'text/plain; charset=utf-8');
  const body = await response.text();
  assert.match(body, /^Contact: mailto:security@example\.invalid$/m);
  assert.equal(body.match(/^Expires:/gm).length, 1);
  assert.match(body, /Expires: 2027-01-04T00:00:00.000Z/);
  for (const expires of ['invalid', '2020-01-01', '2030-01-01']) {
    assert.throws(() => securityResponse({ ...config, expires }, now));
  }
  for (const contact of ['http://example.invalid', 'mailto:missing', 'mailto:a@b\nExpires: fake']) {
    assert.throws(() => securityResponse({ ...config, contact }, now));
  }
  assert.equal(securityResponse({ ...config, contact: 'https://example.invalid/security' }, now).status, 200);
});
```

## Ajan kuralı (AGENTS.md)

```md
## Açık bildirim kanalı yok (vibecheck VC-101)
- Güvenlik bildirimi için bulunabilir özel kanal yayımla.
- Kanalın sorumlusunu ve takip düzenini belirle.
- security.txt iletişim ve geçerlilik tarihini güncel tut.
- Açık issue üzerinden sır veya kullanıcı verisi isteme.
- Yalnız yerine getirebileceğin yanıt süresini yaz.
```

## Kaynaklar

1. [RFC 9116 A File Format to Aid in Security Vulnerability Disclosure](https://www.rfc-editor.org/rfc/rfc9116.html), IETF, Nisan 2022
2. [Adding a security policy to your repository](https://docs.github.com/en/code-security/how-tos/report-and-fix-vulnerabilities/configure-vulnerability-reporting/add-security-policy), GitHub

---

vibecheck · Komünite editörlüğü. Metin CC BY 4.0, prompt ve kural parçaları MIT-0. Kaynak: https://vibecheck.komunite.com.tr/madde/guvenlik-acigi-bildirim-kanali-yok
