ერთი პერსონაჟის შეცდომა, რომელმაც მავნე პროგრამა გამოიწვია
ეს ყველაფერი ბეჭდვითი შეცდომით დაიწყო. ფუნქციების გამოქვეყნებისა და PR-ის შერწყმის მასიური ტალღის დროს, ვიღაცამ აკრიფა @utils_core ნაცვლად @utils-core შევიდა პაკეტი.jsonერთი სიმბოლოს შეყვანის შეცდომა არ გამოუწვევია. სამაგიეროდ, მან ჩუმად გამოიტანა შეცდომა მავნე მსგავსი პაკეტი მომდევნო პერიოდში CI/CD გაშვება, მიმაგრებული ვერსიებისა და ავტომატიზაციის ნდობის გამოყენებით. კეთილი იყოს თქვენი მობრძანება ღია კოდის ტიპოსკვოტინგის სამყაროში.
ტიპოსკვოტინგი: შეტევის ვექტორი, რომელიც ადამიანურ შეცდომებზე ყვავის
ტიპოსკვოტინგი ზუსტად ისაა, რასაც ის ჟღერს: მავნე აქტორები არეგისტრირებენ პაკეტებს, რომელთა სახელები თითქმის იდენტურია ლეგიტიმური სახელების. სწრაფი ტემპის მქონე გარემოში ეს მუშაობს, რადგან დეველოპერები ენდობიან, რომ მათი პაკეტი.json მდე პაკეტი-lock.json ასახავს მათ მოლოდინს. ერთი პერსონაჟით ნაკლები? შესაძლოა, ეს PR განსხვავებაში უხილავიც კი იყოს.
NPM აქვს ტიპოსკუატინგით ექსპლუატაციის ისტორია. პაკეტები, როგორიცაა crossenv ნაცვლად ჯვარედინი კონვერტი or მოვლენების ნაკადი უკანა კარებმა უკვე აჩვენეს, რამდენად ეფექტური შეიძლება იყოს ეს მსგავსი პაკეტები. ეს ყალბი პაკეტები ხშირად გაივლის შეფასებებს უბრალოდ იმიტომ, რომ ისინი კარგად გამოიყურებიან და არ იწვევენ მყისიერ გაშვების შეცდომებს.
საერთო ხაფანგები მოიცავს:
- დეფისი ხაზგასმის წინააღმდეგ: lოდაშ-ბირთვი vs ლოდაში_კორი
- მრავლობითი რიცხვები: მოითხოვოს vs მოითხოვს
- ჩანაცვლებული სიმბოლოები: ექსპრესი ნაცვლად ექსპრესი
სადაც package-lock.json ხდება ბრმა წერტილი
დეველოპერი ასწორებს მათ შეცდომას. ყოველ შემთხვევაში, ასე ფიქრობენ. მაგრამ ახლა, პაკეტი-lock.json უკვე ჩაკეტილია თავდამსხმელის პაკეტი. და სწორედ აქ იმალება რეალური რისკი.
განსხვავებით პაკეტი.json, რომელიც ხელით არის რედაქტირებული და უფრო მეტად კონტროლდება, პაკეტი-lock.json ავტომატურად გენერირებულია NPMშედეგად, ის ხშირად ფორმალობად აღიქმება, გამოტოვებულია ან მხოლოდ ზედაპირულად არის შესწავლილი. pull request მიმოხილვები. გუნდები ხშირად აღნიშნავენ მას, როგორც „ძალიან ხმაურიანს“ ან უპირობოდ ენდობიან მას ღრმად ჩახედვის გარეშე.
თავდამსხმელებმა ეს იციან. ისინი ამაზე არიან დამოკიდებული. ერთხელ მავნე პაკეტი მითითებულია, ორთოგრაფიული შეცდომის გამო package.json, package-lock.json იწერს გადაჭრილ ვერსიას. მაშინაც კი, თუ შეცდომა მოგვიანებით გამოსწორდება, მავნე ჩანაწერი შეიძლება შენარჩუნდეს, თუ დაბლოკვის ფაილი აშკარად არ იქნება რეგენერირებული.
საქმეს ისიც ართულებს, რომ ვერსიის დაფიქსირებამ, რომელიც თანმიმდევრულობის უზრუნველყოფას ისახავს მიზნად, შეიძლება საპირისპირო შედეგი გამოიღოს. თავდამსხმელებს შეუძლიათ თავიანთი ყალბი პაკეტი ლეგიტიმური პაკეტის იდენტურად ვერსიებად აქციონ. თუ CI/CD თუ სისტემა ბრმად ენდობა მიმაგრებულ ვერსიებს, ის ვერ აღმოაჩენს, რომ ის აყენებს პაკეტს ცნობილი, კარგი ვერსიის ნომრით, მაგრამ სხვა, მავნე წყაროდან.
ეს ჩუმი დაჟინება არის ის, რაც ქმნის პაკეტი-lock.json ძალიან საშიშია. დიახ, ეს უზრუნველყოფს დეტერმინისტულ აწყობას, მაგრამ ასევე იძლევა გარანტიას, რომ დაზიანებული პაკეტი დარჩება, თუ ხელით არ იქნება აღმოჩენილი და გაწმენდილი.
CI/CD: სად ხვდება მავნე პროგრამა – package.json
ტიპიური CI/CD pipeline, მავნე პაკეტს არ სჭირდება გაშვების დრომდე ლოდინი. ის აღმოიფხვრება და გააქტიურდება ნაკადის გაცილებით ადრე:
დამოკიდებულების რეზოლუცია
ის pipeline p-დან იღებს ზუსტ დამოკიდებულ ვერსიებსackage-lock.json, რომელიც ახლა მოიცავს პაკეტი შეფუთულია შეცდომის გამო პაკეტი.json.
ინსტალაციის ფაზა
npm ci-ს დროს ყველა დამოკიდებულება ინსტალირდება, მათ შორის მავნეც. არანაირი გაფრთხილებები, არანაირი მოთხოვნა, მხოლოდ ჩუმი ინსტალაცია.
ინსტალაციის შემდგომი სკრიპტის შესრულება
მსგავსი პაკეტი მოიცავს ინსტალაციის შემდგომ სკრიპტს, რომელიც ავტომატურად ირთვება ინსტალაციის დასრულების შემდეგ. სწორედ აქ ხდება კომპრომისი.
ფსევდოკოდის მაგალითი:
if (installation_phase_active) {
runHiddenPayload()
}
ფსევდოკოდის აღწერა:
ინსტალაციის ფაზის დროს, თუ ინსტალაციის შემდგომი სასიცოცხლო ციკლის კაუჭი არსებობს, ყალბი პაკეტი ააქტიურებს თავის დაფარულ ლოგიკას — ხშირად აწყობის ან ტესტების დაწყებამდეც კი. ეს შეიძლება მოიცავდეს გარე მოთხოვნების გაგზავნას, უკანა კარების ინექციას ან სხვა არაავტორიზებული ქმედებებს.
⚠️ გაფრთხილება: ეს ფსევდოკოდი მხოლოდ დემონსტრაციისთვისაა და არ უნდა იქნას გამოყენებული რეალურ გარემოში.
შეტყობინებები არ აქტიურდება. არაფერი იშლება. გარემო უკვე კომპრომეტირებულია, სანამ თქვენ pipeline ტესტირების ეტაპსაც კი აღწევს.
განსხვავების აღმოჩენა სანამ ძალიან გვიან არ არის
გავრცელებული შეცდომა: ვარაუდი პაკეტი.json მთელ ამბავს მოგვითხრობს. არა. ნამდვილი ძალა შემდეგის კომბინაციაშია package.json + package-lock.json.
აი რა უნდა მოძებნოთ:
- არა პაკეტი-lock.json მოულოდნელი პაკეტების ჩართვა?
- რაიმე დამოკიდებულება უცნობი რეესტრიდან მომდინარეობს თუ უცნაური მასშტაბები აქვს?
- ვერსიის ნომრები ზედმეტად სპეციფიკურია თუ არასწორად განლაგებული?
გამოიყენეთ CLI ინსტრუმენტები, როგორიცაა:
- npm აუდიტი ცნობილი პრობლემების აღსანიშნავად
- npm ls სრული დამოკიდებულების ხის სანახავად
- diff ვერსიებს შორის შესადარებლად პაკეტი.json მდე პაკეტი-lock.json
გაამყარე შენი Pipeline: ეფექტური თავდაცვითი საშუალებები
ტიპოსკუატინგისგან თავის დასაცავად:
- ფარგლების შეზღუდვების აღსრულება პაკეტი.json.
- წინასწარი შერწყმის დამატება hooks დამოკიდებულებების დასადასტურებლად და დასადასტურებლად.
- გამოყენება npm ci ვერსიის უნებლიე გადახრის თავიდან ასაცილებლად.
- რეგულარულად სკანირება პაკეტი-lock.json ანომალიებისთვის.
და რაც მთავარია: დაუდასტურებელი ჩანაწერების დამუშავება პაკეტი-lock.json პოტენციურ რისკებად. ყოველი commit უნდა განიხილებოდეს, როგორც მიწოდების ჯაჭვის საკონტროლო წერტილი.
ავტომატური აღმოჩენა: როგორ გვეხმარება Xygeni-ს მსგავსი ინსტრუმენტები
მიუხედავად იმისა, რომ ეს არ არის იდეალური ვარიანტი, ავტომატიზირებული ინსტრუმენტები, როგორიცაა ქსიგენი კრიტიკულ როლს თამაშობენ ადამიანური შეცდომების ფაქტორის შემცირებაში, რომელზეც typosquatting ყვავის. Xygeni პირდაპირ ინტეგრირდება თქვენს DevOps სამუშაო პროცესში და ამატებს რეალურ დროში დაცვის ფენას დამოკიდებულების მიტაცებისგან, სანამ ის შესრულებამდე მიაღწევს.
აი, როგორ გვეხმარება Xygeni:
- საეჭვო პაკეტის სახელის აღმოჩენა:
იყენებს ჭკვიან ევრისტიკას ტიპოსკვატირების ნიმუშების აღმოსაჩენად პაკეტი.json, ეძებს მცირე ვარიაციებს ცნობილ პაკეტების სახელებში (მაგალითად, დამატებული ქვედახაზები, ტრანსპოზიციები ან ასოების შეცვლა). - უცნობი ჰეშის ვერიფიკაცია:
ადარებს ყველა დამოკიდებულების ჰეშს პაკეტი-lock.json სანდო რეესტრების ცნობილი, სასარგებლო არტეფაქტების მონაცემთა ბაზის წინააღმდეგ. მაშინაც კი, თუ პაკეტის სახელი და ვერსია ნორმალურად გამოიყურება, ჰეშის შეუსაბამობა საშიშროების სიგნალს იძლევა. - ბლოკირება მშენებლობის დაწყებამდე:
წყვეტს და ბლოკავს ნებისმიერი დაუდასტურებელი ან საეჭვო პაკეტის ინსტალაციას ინსტალაციის ან ინსტალაციის შემდგომ ფაზებამდე. CI/CD pipeline. - დამოკიდებულების გრაფიკის ანალიზი:
განუწყვეტლივ ამოწმებს სრულ დამოკიდებულების ხეს არაპირდაპირი ტიპოსკვოტინგის მცდელობების ან მავნე გარდამავალი დამოკიდებულებების აღმოსაჩენად. - შეტყობინებები და ანგარიშგება:
გთავაზობთ დეტალურ, ქმედით შეტყობინებებს, რომლებიც აჩვენებს, თუ რა იყო მონიშნული, რატომ და საიდან მოდის ის დამოკიდებულების ჯაჭვში.
პაკეტების ეკოსისტემების კომპლექსურობის ზრდასთან ერთად, Xygeni-ს მსგავსი ინსტრუმენტები აუცილებელი ხდება. ხელით განხილვა არ მასშტაბირდება დამოკიდებულებების გაფანტვის ან სწრაფი იტერაციის შესაბამისად. Xygeni ერთვება თანამედროვე კრიტიკული შემოწმებების ავტომატიზაციისთვის. pipelineსაჭიროება, ნდობასა და ვერიფიკაციას შორის უფსკრულის აღმოფხვრა.
ერთი პერსონაჟი. რეალური შედეგები.
ეს ეგზოტიკური არ იყო ნულოვანი დღე. ეს იყო შეცდომა. ერთი არასწორად განთავსებული სიმბოლო პაკეტი.json, ჩუმად გაძლიერებულია პაკეტი-lock.jsonდა მავნე პროგრამა ავტომატურად გაიგზავნა რუტინული ოპერაციის დროს. CI/CD გაუშვით.
ეს არის ტიპოსკუოტინგის რეალური საფრთხე: მას არ სჭირდება სირთულე. ის იყენებს სიჩქარეს, ნდობას და ავტომატიზაციას. ამ კომპრომისის თავიდან აცილება შესაძლებელი იქნებოდა სწორი კონტროლის მექანიზმების არსებობის შემთხვევაში:
- ავტომატური სკანირება ინსტალაციამდე საეჭვო პაკეტის სახელებისა და ვერსიების აღმოსაჩენად.
- დაბლოკილი ფაილის აუდიტი გადაუმოწმებელი ან მოულოდნელი ჩანაწერების აღმოსაჩენად პაკეტი-lock.json.
- სახელის ვერიფიკაციის ევრისტიკა სანდო პაკეტებთან თითქმის დამთხვევების მონიშვნა.
ერთი სიმბოლოც კი საკმარისი იყო. სწორი შემოწმებები მას შენს შეხებამდე შეაჩერებდა. pipelineნდობა საკმარისი არ არის. თანამედროვე DevSecOps-ში თქვენ ან ყველაფერს ამოწმებთ, ან ყველაფერს რისკავთ.







