deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

Telegram bot tokenları VITE_ ve NEXT_PUBLIC_ ortam değişkenleri üzerinden client bundle'larına sızıyor

Bir dev.to analizi, binlerce GitHub projesinde VITE_ veya NEXT_PUBLIC_ önekli Telegram bot token değişkenleri bulunduğunu ve Vite ile Next.js'in bu değerleri siteyi ziyaret eden herkesin indirebileceği JavaScript koduna gömdüğünü ortaya koyuyor.

Telegram bot tokenları VITE_ ve NEXT_PUBLIC_ ortam değişkenleri üzerinden client bundle'larına sızıyor

Form-backend sağlayıcısı Formgong'un dev.to'da yayımladığı bir yazı, tekrarlanan bir güvenlik hatasını belgeliyor: iletişim formlarını Telegram'a bağlayan geliştiriciler, bot token'ını Vite'ın VITE_ veya Next.js'in NEXT_PUBLIC_ önekini taşıyan değişkenlerde saklıyor ve her iki önek de bu değeri ziyaretçinin indirdiği JavaScript koduna derliyor.

Sızıntı nasıl gerçekleşiyor

Her iki framework de bu önekleri değerin kamuya açık olduğuna dair bir sinyal olarak ele alıyor. Yazıya göre Lovable'ın secrets üzerine dokümantasyonu VITE_ değerlerini build zamanında tarayıcıya açık olarak tanımlıyor ve Next.js dokümantasyonu NEXT_PUBLIC_ değerlerinin tarayıcıya gönderilen JavaScript'e kopyalandığını söylüyor. .env dosyası özel ve commit edilmemiş kalabilir; build yine de değeri çıktı bundle'ına yazıyor.

Formgong ekibi bunu, import.meta.env.VITE_TELEGRAM_BOT_TOKEN üzerinden sahte bir değerle token okuyan minimal bir Vite 8.3.1 uygulamasında test etti. Production build'in ardından sahte token'ın tamamı dist/assets altındaki bir JavaScript dosyasında göründü. Aynı .env dosyasındaki öneksiz ikinci bir değişken ise çıktıda hiçbir yerde belirmedi.

Ne kadar yaygın

Yazıda aktarıldığı üzere 9 Kasım'da yapılan bir GitHub kod araması, VITE_TELEGRAM_BOT_TOKEN geçen 1.708, NEXT_PUBLIC_TELEGRAM_BOT_TOKEN geçen 668 ve Create React App'ın eşdeğer önekine ait REACT_APP_TELEGRAM_BOT_TOKEN geçen 237 dosya saydı. Discord webhook'ları da aynı örüntüyü izliyor: VITE_DISCORD_WEBHOOK_URL geçen 489 ve NEXT_PUBLIC_DISCORD_WEBHOOK_URL geçen 191 dosya var.

Bir geçiş, sızıntı kanıtı olmadığından Formgong, her Telegram değişken adı için ilk 100 sonucu elle inceledi. Vite sürümünde 58 dosya, okuyuculara bot token'larını bu değişkene koymalarını söyleyen README veya kurulum notuydu; 33'ü ise onu okuyan koddan oluşuyordu ve yalnızca 4'ü bir sunucu klasöründeydi. 84 depodan yedisi, package.json'daki lovable-tagger paketinden tanınabilen Lovable projeleriydi. NEXT_PUBLIC_TELEGRAM_BOT_TOKEN için ise 100 dosyadan 65'i onu okuyan koddandı; 12'si API route'u ya da başka sunucu dosyalarıydı — önek tek başına orada sızıntı sayılmaz — ama kalan 53'ü, bir client sayfası içe aktardığı anda tarayıcıya ulaşan component veya paylaşılan modüllerdi.

Commit edilmiş token'lar nadirdi: .env dosyaları genellikle gitignore'da bulunduğundan, ilk 100 Vite dosyasından yalnızca 4'ünde ve Next.js dosyalarından 9'unda gerçek bir token'a benzeyen bir şey vardı. Gerçek token'lar, kod aramasının göremediği ama her ziyaretçinin görebildiği, deploy edilmiş sitelerin JavaScript'inde duruyor.

Geliştiriciler neden bu tuzağa düşüyor

Bir Vite uygulamasında öneksiz bir ortam değişkeni tarayıcı kodunda undefined olarak okunur ve hatayı en hızlı yok etme yolu, değeri de yayımlayan VITE_ önekini eklemektir. Next.js'te aynı tuzak NEXT_PUBLIC_ ile var.

Yazı ayrıca ChatGPT ile yapılan gayri resmi bir deneyi anlatıyor. Düz bir şekilde Telegram bot'una mesaj gönderen bir HTML iletişim formu istendiğinde, asistan 5 yeni sohbetin 4'ünde token'ı sayfaya koydu ve uyarıyı ancak koddan sonra ekledi. Prompt'ta Lovable geçince 5 denemenin tamamında token'ı secret olarak saklayan bir Supabase Edge Function önerdi; Vercel üzerinde Next.js geçince 5 kez de sunucu tarafında bir API route üretti ve bu cevapların 3'ü NEXT_PUBLIC_'e ismiyle karşı çıktı.

Nasıl kontrol edilir ve düzeltilir

Formgong, canlı siteyi tarayıcı DevTools'ta açıp tüm kaynaklarda api.telegram.org — Discord kurulumları için discord.com/api/webhooks — aramayı öneriyor. Bot artı uzun bir sayısal tanımlayıcı içeren bir URL ya da yakınında onu tutan bir değişken, token'ın kamuya açık olduğu anlamına gelir. Bu durumda olan herkes /revoke ile @BotFather'a mesaj atmalı; değişkeni yeniden adlandırmak ve yeniden deploy etmek yeterli değildir, çünkü eski bundle'ı indirmiş olan eski token'ı elinde tutar.

Düzeltmelerin hepsi token'ı sunucu tarafına taşıyor. Lovable, gateway'inin proje adına token'ı enjekte ettiği bir Telegram connector'ı ya da secret'ın .env dışında tutulduğu bir edge function sunuyor. Next.js'te token ve chat ID, bir route handler'ın okuduğu öneksiz ortam değişkenlerine aittir; Formgong'un örnek handler'ı formun FormData'sını alır, alanları doğrular ve kısaltır, gizli bir honeypot alanını dolduran gönderileri ise çöpe atar. Ekip ayrıca, build çıktısında bir Telegram token'ı ya da Discord webhook URL'si ortaya çıktığında deploy'u başarısız kılan bot-token-check adlı bir build adımı yayımladı. Yazarlar, şaşırtıcı olmayan bir şekilde, token'ı projeden tamamen uzak tutan kendi form backend'lerine de işaret ediyor.

Neden önemli

Bu hata sessizce gerçekleşiyor: form çalışıyor, undefined hatası kayboluyor ve build loglarında yeni bir kimlik bilgisinin yayımlandığına dair hiçbir ipucu olmuyor. .env dosyaları normalde git dışında kaldığından, ne GitHub araması ne de tipik secret tarayıcıları token'ı fark eder; token yalnızca her ziyaretçinin indirdiği deploy edilmiş bundle'da var olur. Bir Telegram bot token'ı bot'un tam kontrolünü verir, dolayısıyla açığa çıkması, sahip iptal edene kadar herkesin onu kullanabileceği anlamına gelir. Ders, Telegram'ın ötesinde herkese açık bir önekin arkasına konan her secret için geçerli; ve ChatGPT deneyi, soru güvenli bir örüntüye sahip bir stack belirtmedikçe, AI asistanlara verilen genel prompt'ların güvensiz sürümü üretme eğiliminde olduğunu gösteriyor.

  • #security
  • #vite
  • #next-js
  • #javascript
  • #telegram

İlgili yazılar