Эксперымент са стварэннем NPM-пакета, залежнага ад усіх пакетаў у рэпазітары

Адзін з распрацоўшчыкаў JavaScript-пакетаў правёў эксперымент са стварэннем і размяшчэннем у рэпазітары NPM пакета «everything», які ахоплівае залежнасцямі ўсе існуючыя пакеты ў рэпазітары. Для рэалізацыі падобнай магчымасці пакет "everything" звязаны прамымі залежнасцямі з пяццю пакетамі "@everything-registry/chunk-N", якія ў сваю чаргу прывязваюцца залежнасцямі да больш за 3000 пакетаў "sub-chunk-N", у кожным з якіх ажыццяўляецца прывязка да 800 існуючых пакетаў у рэпазітары.

Размяшчэнне "everything" у NPM прывяло да двух цікавых эфектаў. Па-першае пакет «everything» стаў своеасаблівай прыладай для здзяйснення DoS-нападаў, бо спроба яго ўсталёўкі прыводзіць да загрузкі мільёнаў размешчаных у NPM пакетаў і вычарпанню наяўнай дыскавай прасторы або прыпынку выканання зборачных працэсаў. Па статыстыцы NPM пакет быў загружаны каля 250 раз, але ніхто не мяшае дадаць яго ў залежнасці да іншага пакета пасля ўзлому ўліковага запісу распрацоўніка для здзяйснення дыверсіі. Акрамя таго, мімаволі нападу апынуліся схільныя некаторыя службы і прылады якія ажыццяўляюць маніторынг і праверку новых пакетаў, якія размяшчаюцца ў NPM.

Па-другое публікацыя пакета "everything" фактычна заблакавала магчымасць выдалення любых пакетаў у NPM, якія апынуліся ў спісе яго залежнасцяў. Пакет з NPM можа быць выдалены аўтарам толькі калі ён яшчэ не выкарыстоўваецца ў залежнасцях іншых пакетаў, але пасля публікацыі "everything" залежнасцямі апынуліся ахоплены ўсе пакеты ў рэпазітары. Характэрна, што выдаленне самога пакета "everything" таксама аказалася заблакаваным, бо 9 гадоў таму ў рэпазітары быў размешчаны тэставы пакет "everything-else", у якім быў указаны радок "everything" у спісе залежнасцяў. Такім чынам, пакет "everything" пасля публікацыі апынуўся ў залежнасцях у іншага пакета.

Крыніца: opennet.ru

Дадаць каментар