Oktyabr oyining oxirida, nole.js juda mashhur noleemon vositasida konsolga kiritilgan eskirgan ogohlantirishni tasvirlaydigan muammo paydo bo'ldi.

Bunday ogohlantirishlar kam emas. Bu zararsiz tuyuldi. Bu hatto nodemon loyihasiga ham aloqasi yo'q edi, aksincha uning bog'liqliklaridan biri edi. Buni osongina e'tiborsiz qoldirish mumkin edi, chunki ko'p hollarda bunday ogohlantirishlar ko'pincha o'z-o'zidan hal qilinadi.

Dastlabki hisobotdan taxminan uch hafta o'tgach, Ayrton Sparling jurnalning chiqishini o'zi boshdan kechirdi va ogohlantirishga bir necha qatlam chuqur bo'lgan yangi bog'liqlik sabab bo'ldi. Natijada minifikatsiya qilingan JavaScript faylining oxirida g'alati bir kod kodi paydo bo'ldi, u avvalgi versiyada mavjud emas va undan keyingi versiyada olib tashlangan (taqqoslang flatmap-stream@0.1.0, flatmap-stream@0.1.) 1, va flatmap-stream@0.1.2). Ayrtonning izlanishlari uni mashhur npm kutubxonasiga olib bordi, u haftasiga ikki million marta yuklab olinadi va yaqin vaqtga qadar nufuzli ochiq manbali dasturchi tomonidan qo'llab-quvvatlanadi.

Bir necha oy oldin, voqealar oqimini boshqarish elektron pochta orqali nashr etish huquqini so'ragan nisbatan noma'lum foydalanuvchiga qonuniy ravishda qo'lni o'zgartirdi. Ushbu foydalanuvchi ekspluatatsiya qilingan tekis xarita oqimiga bog'liqlikni yamoq versiyasida kiritish uchun voqea oqimini yangilagan va o'zgarishlarning ko'rinishini cheklash uchun voqealar oqimining asosiy versiyasini o'ziga qaram qilib qo'ygan. Taxminlarga ko'ra, qaramlik savoliga biroz ko'proq moyil bo'lgan yangi foydalanuvchilar so'nggi versiyasini olishadi (ushbu yozuvga ko'ra 4.x) va oldingi versiyaga bog'liq bo'lgan foydalanuvchilar npm-ni qayta ishga tushirganda avtomatik ravishda zararlangan patch versiyasini yangilaydilar ( keng tarqalgan konfiguratsiyalar bilan).

Foydaning tafsilotlari

Flatmap-stream-dagi yuklanish ma'lumotlarning uzatilishi uchun tuzilgan, ba'zi bir ahamiyatsiz simlar orasida ikkita shifrlangan yuk tushumlari bor, ular faqat ma'lum parol bilan shifrlanishi mumkin edi.

Ushbu yuklama parolni npm_package_description nomli muhit o'zgaruvchisida, npm, tugun paketi menejeri tomonidan o'rnatiladigan parolni qidirdi. Ushbu muhit o'zgaruvchisi ildiz paketining tavsifiga o'rnatiladi, bu ushbu yukni ma'lum bir maqsadli paketga ta'sirini oshirishga imkon beradi. Aqlli! Bunday holda, paket bitcoin hamyoni uchun mijozning ilova dasturi va yukni echish uchun parol - "Xavfsiz Bitcoin hamyon" (Github foydalanuvchisi tomonidan maths22 tomonidan shafqatsiz kuch bilan topilgan) iborasi.

A yuklamasi sinov ma'lumotlaridagi birinchi yozuvni muvaffaqiyatli hal qilgandan so'ng, quyida keltirilgan B yuklamasini bajaradi:

Ushbu kod, agar buyruq satri argumenti bilan ishlangan bo'lsa, npm run build: ios-reliz kabi "build: * - release" naqshli biror narsa bajarilsa, bajarishni davom ettirishga ishonch hosil qiladi. Bu ijroni Copay build quvur liniyasida faqat uchta skript, gibrid iOS, Android va ish stoli dasturlarini yaratish uchun javobgar skriptlarga ajratadi.

Keyin skript, dasturning boshqa bog'liqligi, ReedSolomonDecoder.js-ni @ zxing / library-dan qidiradi. Payload B ushbu faylni bajarmaydi, shunchaki keyingi bosqichni yuklaydi, C yukini yuklaydi, shunda ushbu yakuniy yuklanish ReedSolomonDecoder yuklanganda mobil dasturning o'zida bajariladi. A chiroyli yuklangan C quyida keltirilgan.

A va B yuklamalari node.js orqali npm orqali biron bir joyda quriladigan serverda bajarilishi kerak edi, ammo C yuklamasi Cordova tomonidan boshqariladigan brauzerga o'xshash muhitda boshqarilishi kerak. Cordova (ilgari PhoneGap) bu HTML, CSS va JavaScript kabi veb-texnologiyalar yordamida mahalliy dasturlarni yaratishga imkon beruvchi tizim. Copay-ning iOS, Android va ish stoli mijozlari (FCash kabi vilkalar bilan birga) barchasi Cordova-da yaratilgan va zarar shu erda. Ushbu mahalliy ilovalar bitcoin-hamyonlarini boshqarish uchun oxirgi foydalanuvchilar tomonidan ishlatilishi kerak va aynan shu narsa o'g'irlash uchun mo'ljallangan. Ushbu skript ma'lumotni bir nechta kontekstda uzatishni boshqaradi va natijada maqsadli ma'lumotlarni copayapi.host va 111.90.151.134 serverlariga joylashtiradi.

Shunday qilib, dasturiy ta'minot bepul ishlashi kutilayotgan odamlarning orqa tomoniga qurilgan.

Bu qancha kuch sarflangani ahamiyatsiz emas edi. Ushbu ekspluatatsiya ko'p izlanishlar va rejalashtirishlarni olib bordi va ehtimol voqea oqimi o'g'irlab ketilmasa, zaxira yo'llari mavjud edi. Hujum qanday kechganini hisobga olsak, aktyor qimmatbaho kutubxonani tortib olishni va u erdan hujumni rejalashtirishni emas, balki aniq Kopayni nishonga olganligi mantiqqa to'g'ri keladi. Voqealar oqimining ommabopligi shuni anglatadiki, tajovuzkor dunyo bo'ylab yuzlab kompaniyalarda imtiyozli kompyuterlarga osonlikcha kirgan. Yaxshiyamki, u cheklangan va tezda qancha vaqt beparvolik qilganini hisobga olgan holda ushlandi, ammo nima bo'lishi mumkinligi haqida o'ylash bizni aniq xulosaga olib keladi:

Ochiq manba aql bovar qilmaydigan darajada buzilgan

Nosozliklarni aniqlab olaylik.

  1. Ilova (Copay) butun daraxtga bog'liq bo'lmagan holda tarmoq orqali bog'liqlikni iste'mol qilish orqali qurilgan.
  2. Hatto qulflangan versiyasiz ham, ushbu qaramliklar saqlanmaydi va har bir tuzilishda tortib olinadi.
  3. Boshqa minglab loyihalar bir xil yoki o'xshash konfiguratsiyalar bilan voqealar oqimiga bog'liq.
  4. Minglab loyihalar bog'liq bo'lgan kutubxona haqida g'amxo'rlik qilishni to'xtatdi.
  5. Minglab loyihalar ushbu kutubxonadan bepul foydalanishadi va uni hech qanday kompensatsiya qilinmasdan saqlashni kutishadi.
  6. Xizmat ko'rsatuvchi noma'lum ob'ektni so'rashgani sababli to'liq nazoratni ularga berdi.
  7. Nazorat o'zgarganligi haqida hech qanday xabar yo'q edi, minglab loyihalar ogohlantirishsiz paketni iste'mol qilishi kutilgan edi.
  8. Haqiqatan ham oxiri yo'q - bu noto'g'ri ishlar ro'yxati davom etishi mumkin ...

Bu etkazishi mumkin bo'lgan zarar haqida o'ylash nihoyatda qiyin. Bunga bog'liq bo'lgan loyihalar ham ahamiyatsiz emas. Microsoft-ning o'ziga xos Azure CLI hodisalar oqimiga bog'liq. Ushbu vositani ishlab chiqadigan yoki ishlatadigan tizimlar haqida o'ylang. Ehtimol, har birida ushbu zararli kod o'rnatilgan.

Ochiq manba buziladi va u qanchalik katta bo'lsa, halokatli hodisalar yuzaga kelishi ehtimoli ko'proq.

Muammo shundaki, dasturiy ta'minot shunchaki bepul ishlashi kutilayotgan odamlarning beliga qurilgan. Ular bir marta foydali dasturiy ta'minotni etkazib berishadi, ammo vaqt oxirigacha uni saqlab turishlari kutilmoqda. Agar ular buni qila olmasalar, u to'xtab qolishadi va so'rovlarni yoki xavfsizlikning zaifliklarini e'tiborsiz qoldiradilar (aybdor!) Yoki ular tayanchni boshqa hech kimga tegmasdan ketishga umid qilib boshqa birovga topshiradilar. Ba'zan ishlaydi. Ba'zan yo'q. Ammo hech qanday natija dastur ta'minoti zanjirida yuzaga keladigan xavfsizlikning zaifliklarini oqlay olmaydi. Ushbu ekspluatatsiya uchun kashfiyot, tadqiqotlar va keyinchalik zararni boshqarish asosan ochiq manbali ekotizimning to'lanmagan ko'ngillilari tomonidan amalga oshirildi.

Bunday xato shu qadar keng tarqalganki, aybni qo'yishda foydasi yo'q. Ochiq manba, o'sib ulg'aygan sayin, buzilgan. U qanchalik katta bo'lsa, falokatli voqealar yuz berishi ehtimoli ko'proq. Ushbu ekspluatatsiya bilan zarar etkazilishi mumkinligini hisobga olsak, uning juda cheklanganligi barakadir. Shuningdek, u node.js yoki npm bilan chegaralanmaydi; Python-ning pypi va Ruby-ning marvaridlari singari, va Github-ning o'ziga xizmat sifatida ekotizimlarga bo'lgan ishonchlari noto'g'ri. Har kim buni nashr qilishi mumkin va boshqaruv hech qanday ogohlantirishsiz o'zgarishi mumkin. Boshqarishisiz ham, shu qadar ko'p kod borki, uni yaxshilab tekshirib ko'rish har qanday jamoani to'xtatib qo'yishi mumkin. Vaqtni belgilash uchun ishlab chiquvchilar o'zlari o'rnatishi kerak bo'lgan narsalarni o'rnatadilar va xavfsizlik guruhlari va avtomatlashtirilgan vositalar doimo o'zgarib turadigan dasturlarning sur'atiga moslasha olmaydi.