JavaScript kütüphanelerinin npm ekosistemi [1] çoğu geliştiricinin düşündüğünden daha fazla iç içe geçmiş ve son zamanlarda yapılan bir akademik araştırmaya göre, her şey devasa bir kart evi, yüz binlerce projeden ödün vermekten kötü bir hack.
Almanya’daki Darmstadt Teknik Üniversitesi Bilgisayar Bilimleri Bölümü tarafından yürütülen araştırma, tüm npm ekosisteminin bağımlılık grafiğini analiz etti.
Araştırmacılar, Nisan 2018’e kadar yayınlanan tüm npm paketleri için meta veri indirdiler ve 676.539 düğüm ve 4.543.473 kenar (düğümleri bağlayan çizgiler) içeren dev bir grafik oluşturdular.
Buna ek olarak, akademisyenler aynı paketlerin farklı versiyonlarını da incelediler, tarihsel versiyonlara (676.539 paketler için 5.386.239 versiyona) değil, aynı zamanda paket muhafazalarına (199.327 npm hesabı) ve paketleri etkileyen bilinen güvenlik kusurlarına da (609 genel rapor) bakıldı .
Amaçları, bir veya daha fazla npm sürdürücü hesabını hacklemenin veya bir veya daha fazla paketteki güvenlik açıklarının npm ekosisteminde nasıl yankılandığına dair bir fikir edinmekti; ve aynı anda on binlerce npm projesinde güvenlik olaylarına neden olmak için gereken kritik kütlenin ne olduğuna bakıldı.
NPM Paketlerine Bağımlılık Çok Yüksek
Darmstadt ekibine göre, bu kritik kitleye ulaşmak kolay, çünkü normalde normal npm JavaScript paketinin anormal derecede çok sayıda bağımlılığı var. Bir paket ortalama 39 farklı bakımcının 79 üçüncü taraf paketini yükler.
Bu sayı, ortalama olarak yalnızca diğer 20 bakımcının koduna dayanan popüler paketler için daha düşüktür, ancak araştırma ekibi bazı popüler npm paketlerinin (600) 100’den fazla bakımcının yazdığı koda bağlı olduğunu buldu.
Araştırma ekibine göre, yukarı yönlü bir pakete kod sağlayan ortalama bağımlılık sayısı ve üçüncü el geliştiriciler için bu yüksek değer, temel işlevselliğin npm paketlerine ayrıldığı JavaScript programlamasındaki “mikro paket” eğiliminin bir yan etkisidir.
Olumsuz etki, npm paketlerinin, denetimsiz bırakıldığında, tümü üçüncü taraf geliştiriciler tarafından gerçekleştirilen saldırılar için giriş noktası haline gelen onlarca kaynaktan yüklediği kodudur.
20 Hesap Ekosistemin Yarısı Anlamına Geliyor
Ancak bazı npm paketleri çok fazla paketten ve çok fazla geliştiriciden kod yüklerken, npm paketi deposunda oluşan başka bir tehlikeli eğilim vardır – popüler npm paketlerinin birkaç sürdürücü hesabı altında birleştirilmesi.
Araştırma ekibi, “391 son derece etkili bakım görevlisi 10.000’den fazla paketi etkiliyor ve bu da onları saldırılar için birincil hedef haline getiriyor.” “Bir saldırgan, en etkili 391 koruyucunun hesabından ödün vermeyi başarırsa, topluluk ciddi bir güvenlik olayıyla karşılaşır.”
Ayrıca, Darmstadt ekibi birden fazla bakımcının gizlediği veya bir bilgisayar korsanının çok sayıda hesaba erişim kazandığı en kötü senaryoda, 20 yüksek profilli hesabın ele geçirilmesinin npm ekosisteminin yarısını etkileyeceğini söylüyor.
Ancak bilgisayar korsanlarının mutlaka hesaplara girmeleri gerekmez. Mevcut npm paketlerinde güvenlik açığı bulmanın alternatifi de var. Ortalama 1 npm paketinin, 230 başka npm kütüphanesine yüklendiğini göz önünde bulundurarak, orta popüler paketlerde bile istismar edilebilir güvenlik açıkları bulmak, saldırganlara bazılarında kullanılabilecek ve kritik ya da finansal sistemleri etkileyecek şekilde yüzlerce diğer kütüphanede kod çalıştırma yeteneği sağlayabilir.
Ayrıca, saldırganların yeni güvenlik açıkları aramasına gerek yoktur. Darmstadt ekibinin taramasına dayanarak, tüm paketlerin önemli bir yüzdesi (% 40’a kadar), genel olarak bilinen en az bir güvenlik açığına sahip koda bağlıdır ve birçok npm paketinin şu anda kullanıcılara yönelik tüm uygulamalarla birlikte saldırılara karşı savunmasız olabileceğini göstermektedir.
Birkaç Hesabın Güvenliği Düzeltilirse, Sorun Kolaylaşır
Ancak araştırma ekibi bu karmaşadan kurtulmanın bir yolu olabileceğini öne sürüyor. Npm ekosistemindeki tüm bu olumsuzluklara karşı koymak için en basit çözüm, kodun güvenli olduğundan ve güvenilir bir kaynaktan geldiğinden emin olmak için geliştirici hesaplarını incelemek ve popüler npm paketlerini denetlemek olacaktır.
Alman akademisyenler, 300 popüler npm kütüphanesi ile birlikte en popüler hesaplardan 140’ının incelenmesinin, npm ekosistemindeki tedarik zinciri saldırısı riskini yarıya indirmesi gerektiğini iddia ediyorlar.
[1] Npm, JavaScript dili için bir paket yöneticisidir ve JavaScript çalışma zamanı ortamı Node.js için varsayılan paket yöneticisidir. “js.Npm” olarak da adlandırılan bir komut satırı istemcisinden ve npm kaydı adı verilen genel ve ücretli özel paketlerin çevrimiçi bir veritabanından oluşur.