Bitwarden'ın kasasını sızdıran Nginx açığı
(labs.hakaioffsec.com)- 2004'ten bu yana baskın pazar payına sahip çok amaçlı web sunucusu Nginx
- Nginx'in yanlış yapılandırılması güvenlik açıklarına ve veri ifşasına yol açabilir
- Nginx'teki açıkları tespit etmeye yönelik otomasyon aracı NavGix tanıtılıyor
- Bu açık, amaçlananın dışındaki dosya ve dizin kapsamına erişim sağlayabilir
- Bitwarden ve Google'ın HPC Toolkit'i üzerine vaka çalışmaları, bu açığın ciddiyetini gösteriyor
1 yorum
Hacker News yorumları
Bilginize, gixy (nginx yapılandırma denetleyicisi) bu sorunu yakalıyor: https://github.com/yandex/gixy/blob/master/docs/en/plugins/a...
Ayrıca NixOS, kendi üzerinden üretilen yapılandırmalarda gixy’yi otomatik çalıştırıyor ve bir sorun varsa sistem derlemesini reddediyor
$urikullanıyormuşumAma daha iyi bir seçenek arayıcısı olup olmadığını merak ediyorum. Binlerce seçeneğin tamamında arama yapmak pek iyi gelmedi;
sshgibi yalnızca bir pakete bakıp sadece onunla ilgili seçenekleri görmek istiyorum ama alakasız sonuçlar çok fazla karışıyorAptalca bir soru olabilir ama nginx’in URL yolunda
..ile üst dizine çıkılmasına izin vermesi için iyi bir neden var mı? Bu, sadece sorun bekleyen bir davranış gibi görünüyorDüzeltme: Orijinal açıktaki tam olarak ne olduğunu biraz karıştırıyorum. http://localhost/foo../secretfile.txt sanki
/var/www/foo/../secretfile.txtolarak yorumlanıyor gibi; ama açık olmayan bir sunucuda neden http://localhost/foo/../secretfile.txt da aynı şekilde yorumlanmıyor? Yoldaki..neden yalnızca bazı durumlarda çalışıyor, anlayamıyorumBu durumda URL’nin bir kısmı, yapılandırmada yerel dosya sistemine eşlenme biçimi nedeniyle nginx tarafından bir dizin olarak yorumlanıyor (http://localhost/foo). Dizin gösteriyor gibi göründüğü için nginx, istenen kaynağın tam yolunu oluştururken
"${mapped_path}/../secretfile.txt"elde ediyor; bu URL açısından anlamsız olsa da yerel dosya sistemi açısından geçerli hale geliyor. URL’ler gerçek yol öğeleri değil, yalnızca dizgelerdir; bu yüzden eğik çizginin yeri de özünde önemli değildirWeb ortaya çıktığından beri, bu web sunucularında çok sık görülen bir sorun. URL’leri doğrudan dosya yollarına eşlemek, dizinli basit dosya sunucularıyla başladığı için popülerdi; ama kısa sürede, URL’nin bir yol değil uygulama tanımlayıcısı olduğu karma ortamlara geçildi. Yolun bir kısmıyla uygulama seçilir, geri kalanı da parametre ya da argüman gibi ele alınır
Ve genel olarak, dosya sistemi nesneleri için URL içindeki
.ya da..öğelerine saygı göstermek çoğu zaman mantıklı değildir. Benim uygulamalarım, doğru eşleme için istek yolunu temizler. Tarayıcılar göreli bağlantılar oluştururken URL’yi yol gibi ele aldığından, sondaki/işaretini ne zaman ve nasıl kullandığınıza da dikkat etmeniz gerekir. Sunucu tarafında anlamı farklı olan bir kaynağa işaret edebilirlocationiçindeallow_parent_traversal on;gibi bir bayrak konup açıkça etkinleştirilen bir davranış haline getirilmesi daha doğru görünüyor"/foo/bar/.."ifadesini denetleyip yasaklar ya da"/foo/"biçimine normalleştirir. Ama"/foo/bar.."tamamen geçerli bir dosya adı olduğundan, bu tür bir denetimi atlatıp gözden kaçıyor gibi..öğesinin ne zaman çalışacağı tamamen dosya izinlerine bağlıdırBu durumda, web indeks dizininden (
../index.html) kök dizine (/) kadar dosya okuma yetkiniz olduğunu varsayalım; köke kadar çıkabildiğiniz için artık kökten erişilebilen tüm world-readable dosyaları, örneğin/etc/passwddosyasını da görebilirsinizBunu üç çatallı bir çatal gibi düşünün; web sunucusu en sağdaki dişte duruyor. Dişlerin birleştiği sap kısmı dosya sistemi olsun; web sunucusunun bulunduğu sağ dişten sap kısmına kadar uzanan dosya ve dizinlere erişim izni varsa, sap kısmına ulaştıktan sonra diğer dişlerdeki dosyalara da erişmeye devam edebilir
Bunun neden nginx açığı olarak görülmediğini anlayamıyorum. Bu davranış tamamen saçma, faydalı bir amacı da yok gibi ve doğrudan istismar edilebilir
Nginx’in, Apache2’den daha fazla “web ölçeğinde” olduğunu gösteren benchmark’lar sayesinde popüler hale geldiğini de hatırlamak gerekir
İnsan şöyle bir şey düşünüyor: Linux çekirdeğinin dosya adı ayrıştırıcısına,
..seçeneğini kaldıran Linux capability benzeri bir seçenek koymak.Web uygulamalarında, telefon modemlerinin kullanıldığı dönemlerden beri iki noktayı bir şekilde araya sokan çeşitli bypass yöntemleri çıkıp durdu. Linux çekirdeğinin diğer pek çok kullanıcı alanı hata sınıfında yaptığı gibi, artık bu sorunu da tek hamlede kapatmanın bir yolunu bulma zamanı geldi
RESOLVE_BENEATHvarFreeBSD'de bu özellik normal
openat(2)içinO_RESOLVE_BENEATHolarak bulunuyornginx'i yetkileri çok kısıtlı ayrı bir kullanıcıyla çalıştırmak ya da Docker içinde çalıştırmak yeterli. Buna düzenli güncellemeleri de ekleyince genelde güvenlik sorunlarının %90'ı çözülür
/some/../pathneredeyse %100 yasaklanmalı. “Birinin çirkin kod yazmış olması” dışında makul bir kullanım senaryosu yok../some/pathise en azından bazen anlamlı olabilirYine de sanıldığı kadar faydalı olmayabilir. Birçok uygulama işletim sistemine iletmeden önce
..öğesini zaten kendi içinde çözümlüyorBir klasörden web'e dosya servis ediyorsanız, web framework'ünün kendisine verilen açık kök klasörün dışına çıkmamasını sağlaması gerekir. Bunu kendiniz yapıyorsanız, buna benzer her türlü durumu hesaba katmanız gerekir
“Google VRP Team bu açığı bulan kişiye 500 dolar ödül verdi. Uygulama üzerindeki etkiyi daha yüksek ödülü gerektirecek kadar ciddi görmedi” deniyor; GCP hesap e-postası ve özel anahtarın ifşası sadece 500 dolar mı ediyor? Bu da ne böyle. Tam Google'lık iş
Sızan verilerin hâlâ şifreli olması sevindirici. Bu alanda uzmanlaşmış bir şirket bile sızıntıdan kaçamıyorsa, dürüst olmak gerekirse bu neredeyse en iyi senaryo
Başlık epeyce değiştirilmiş. Orijinal başlık Hunting for Nginx Alias Traversals in the wild
HN gönderi başlığı Bitwarden açığını öne çıkarıyor ama yazıda Google örneği de birlikte ele alınıyor
Kaynak kullanımını en aza indirirken güvenli şekilde yalnızca statik dosya sunumu yapmak gerekiyorsa bugün en iyi seçenek ne olur? Eskiden olsa Nginx seçerdim, ama güvenlik açısından daha dar amaçlı ve daha az yapılandırma ihtimali olan bir araç daha iyi olabilir mi diye merak ediyorum
Çok platformlu, Rust ile yazılmış, yapılandırması basit ve güvenli varsayılanlara sahip. Güçlendirilmiş container imajı ve güçlendirilmiş NixOS modülü de var
Caddy'yi önermem. Resmi Docker imajı varsayılan olarak root ile çalışıyor [1] ve düzgün sandbox edilmiş bir systemd unit dosyası da sunmuyor [2]
[1]: https://github.com/caddyserver/caddy-docker/issues/104
[2]: https://github.com/caddyserver/dist/blob/master/init/caddy.s...
Düzenleme: ifade düzeltildi
file_servermodülüne sahipAptalca bir soru olabilir ama Bitwarden neden baştan kimlik doğrulaması olmadan
/attachmentsisteklerine izin verdi? Nginx hatası olsa bile bu URL kimlik doğrulaması isteseydi istek başarısız olmaz mıydı?Yine de Docker üzerinden riskli bir yapılandırma dağıttıkları için sorumluluk Bitwarden'da. Görünüşe göre Bitwarden da bunu kabul etti ve sonradan düzeltti
Aptalca bir soruyu mazur görün. Uygun dizin ve dosya sahipliği varsa bu tür bir gezinme engellenmez mi?
nginx root olarak çalışmıyorsa, nginx kullanıcısına açıkça atanmış dosyalar dışında başka dosyaları nasıl okuyabilir?
go-rwxuygular, “static” dosyaların grubunuwww-datayapıp sadeceg+rverirseniz web sunucusu uygulama dosyalarına erişemezBu kelimenin tam anlamıyla uygulama barındırma 101 ve insanlar bunu 20 yıl önce de böyle yapıyordu
/homealtı gibi önemli dizinlerde bunu yapınGrup üyelikleriyle biraz daha uğraşmanız gerekebilir ama kesinlikle değer
Belki de gerçekten çok kötü bir şey yapıyorumdur. Ah
www-datagibi bir kullanıcıya açıkça atanması da gerekmez. Uygulama hassas veri üretiyorsa tabii ki 077 umask kullanmak daha iyidirNe yazık ki nginx ve diğer web sunucularının tipik web uygulamalarında çoğu zaman root olarak çalışması gerekir. Çünkü 80 veya 443 portlarında dinleme yapmaları gerekir. 1024 altındaki portları yalnızca root açabilir
Daha ayrıntılı açıklama burada: https://unix.stackexchange.com/questions/134301/why-does-ngi...