File disclosure — dastur yoki serverning foydalanuvchiga ko‘rish vakolati bo‘lmagan fayl mazmunini ochib qo‘yadigan xavfsizlik zaifligidir. U path traversal, noto‘g‘ri web server sozlamasi, backup faylning ommaviy katalogda qolishi, xato xabari yoki authorization tekshiruvining yetishmasligi orqali yuz berishi mumkin. Oqibat source code, konfiguratsiya, credential va shaxsiy ma’lumot sizishi bo‘ladi.
Asosiy sabablar
Fayl yuklab beruvchi endpoint foydalanuvchi yuborgan nomni server yo‘liga bevosita qo‘shsa, .. singari segmentlar kutilgan ildizdan tashqariga chiqishi mumkin. URL encoding, Unicode, aralash slash va symbolic link oddiy satr almashtirishni chetlab o‘tadi. Yo‘l kanoniklashtirilgandan keyin ruxsat etilgan ildiz ichida qolishi tekshiriladi, ammo tekshiruv bilan ochish orasidagi symlink almashuvi ham race yaratishi mumkin.
Yaxshiroq dizayn foydalanuvchidan filesystem yo‘lini qabul qilmaydi. API opaque file ID oladi, ma’lumotlar bazasidan egasi va saqlash obyektini topadi, authorizationdan keyin aniq handle orqali o‘qiydi. Storage service pre-signed URL bersa, uning muddati, metod, obyekt va content-disposition doirasi cheklanadi.
Tasodifiy nashr
Web root ichida .env, repository metadata, editor backupi, database dump yoki source map qolsa, server uni static fayl sifatida tarqatishi mumkin. Directory listing papka tarkibini ochadi. Build pipeline faqat kerakli artefaktlarni yangi toza katalogga joylaydi; butun repositoryni serverga ko‘chirishdan qochiladi. Default deny static konfiguratsiya va aniq extension allowlist foydalidir.
Xato sahifasi stack trace, absolute path, konfiguratsiya va query mazmunini ko‘rsatishi mumkin. Production klientiga umumiy xato identifikatori beriladi, batafsil diagnostika himoyalangan logda saqlanadi. Logning o‘zi ham ommaviy download endpoint orqali ochilmasligi kerak.
Himoya va aniqlash
Har fayl so‘rovida obyekt darajasidagi authorization bajariladi; “login bo‘lgan” degan umumiy tekshiruv yetarli emas. Multi-tenant tizimda tenant filtri server tomonda majburiy. Jarayon least privilege bilan faqat xizmat kataloglarini o‘qiydi. Secretlar source daraxtidan tashqarida secret managerda saqlansa, disclosure ta’siri kamayadi.
Testlar normal fayl bilan birga encoded traversal, absolute path, symlink, null byte talqini, yashirin fayl va boshqa tenant identifikatorini qamrab oladi. Scanner ma’lum backup extensionlarini topishi mumkin, lekin biznes authorizationini qo‘lda testlash kerak. Monitoring noodatiy path pattern, ko‘p 404/403 va katta fayl o‘qishlarini ko‘rsatadi.
Zaiflik aniqlansa, endpointni yopish bilan cheklanilmaydi. Qaysi fayl qachon ochilgani loglardan baholanadi, sizgan credentiallar rotatsiya qilinadi, shaxsiy ma’lumot hodisasi tegishli tartibda boshqariladi. Kesh va CDN’da saqlangan nusxalar ham tozalanadi.
+## Range va content disposition
Download endpoint HTTP Range’ni qo‘llasa, ruxsat tekshiruvi har partial so‘rovda ham bajariladi. Cache key authorization va tenantni noto‘g‘ri chetlab o‘tmasligi kerak; private javob shared CDN’da umumiy saqlanmaydi. Content-Disposition filename’i header injection va brauzer talqiniga qarshi xavfsiz kodlanadi. Inline ko‘rsatish faqat ishonchli media type uchun beriladi, aks holda attachment va X-Content-Type-Options: nosniff ishlatiladi. SVG yoki HTML kabi faol format boshqa origin’da xizmat qilinishi mumkin. Fayl ID’lari ketma-ket bo‘lsa, ularni taxmin qilish authorization zaifligini yaratmasligi kerak; unguessable ID yordamchi qatlam, asosiy himoya emas.
Source map frontend debuggingni yaxshilaydi, ammo original source va ichki endpoint nomlarini ochishi mumkin. Public deployda alohida private symbol server yoki nosources variant tanlanadi. Agar map brauzerga kerak bo‘lmasa, build artefaktdan chiqariladi va monitoring xato stackini server tomonda symbolicate qiladi.
Bog‘liq tushunchalar
Path traversal, Authorization, Static file server, Secret management, Information disclosure, Symlink, Least privilege