JulesJacker: ყალბი npm ჭია ჯულსის ხელოვნურ ინტელექტს იმიტაციას უკეთებს

JulesJacker: ყალბი PoC npm ჭია, რომელიც Google-ის ჯულსის აგენტს ამსგავსებს — და მის ანალიზს სენდბოქსის საშუალებით რთავს

სარჩევი

აუცილებლად წასაკითხი პოსტები

საინტერესო უახლესი პოსტები

TL; DR

ერთმა npm ოპერატორმა ექვსი კვირა დახარჯა TypeScript-ის ყალბი „სასარგებლო“ პაკეტების გამოქვეყნებაზე, როგორიცაა ts-form-utils, ts-project-lintდა ts-enum-helper.

მიუხედავად იმისა, რომ პაკეტები ავლენს პატარა, ლეგიტიმური გარეგნობის ვალიდაციის დამხმარეებს, რეალური დატვირთვა სრულდება ინსტალაციის ან პირველი მოთხოვნის დროს და ასრულებს ჰოსტის თითის ანაბეჭდს, GitHub ორგანიზაციის აღმოჩენას, საცავის კლონირებას და საწყისი კოდის ექსფილტრაციას.

მავნე პროგრამა კონკრეტულად მაღალი ღირებულების GitHub ორგანიზაციებს, მათ შორის მრავალ ორგანიზაციას, ესხმის თავს. Shopify საცავებს, შემდეგ არქივს უქმნის და გადააქვს ხელმისაწვდომი წყაროს ხეები ცენტრალიზებულ კოლექციის საბოლოო წერტილში.

კომპრომისის სამუშაო პროცესის ნაწილად, დატვირთვა commitsa ფაილის მსხვერპლის საცავებში დაბრუნება Google-ის ავტონომიური კოდირების იდენტობის იმიტაციის პარალელურად google-labs-jules[bot].

ჩვენ ვაკვირდებოდით კამპანიას — სახელწოდებით ჯულს ჯეკერი — მრავალი გამომცემლის არეალში და მინიმუმ ხუთი დატვირთვის თაობაში, მათ შორის დაშიფრული და sandbox-ის მხარდაჭერით აღჭურვილი ვარიანტები.

უახლესი ვარიანტი კონკრეტულად მავნე პროგრამების ანალიზის ინფრასტრუქტურას ისახავს მიზნად: ის აქტიურდება მხოლოდ ანალიზის გარემოში, იპარავს ღრუბლოვან მეტამონაცემებს სერვისის ანგარიშის ტოკენებს და იკვლევს Kubernetes-ის საკონტროლო პლანშეტებსა და ღრუბლოვან საცავის ბუკეტებს.

ყველა დატვირთვის თაობისთვის გაზიარებული ძირითადი IOC არის შეგროვების საბოლოო წერტილი. aaronstack[.]com/jules-collect.

სიმძიმე: კრიტიკული.

შეტევა: როგორ მუშაობს ის

JulesJacker-ის ყველა პაკეტი ერთსა და იმავე შაბლონს მიჰყვება. პაკეტი.json რეკლამას უწევს კეთილთვისებიან TypeScript დამხმარეს MIT ლიცენზიით და ბმულით დაკავშირებული წყაროს საცავი არ გააჩნია. index.js ახორციელებს რეალური, მოქმედი ფუნქციების მცირე რაოდენობის ექსპორტს — ელფოსტის რეგულარულ ფუნქციებს, enum რუკებს, lint წესების ცხრილებს — რათა დეველოპერმა, რომელიც რეალურად ახორციელებს პაკეტის იმპორტს, დაინახოს დამაჯერებელი ქცევა. ბოროტება სხვაგან იმალება: ა პოსტინსტალაცია კაუჭი, ან ბლოკში ბოლოში index.js რომელიც შესრულდება მოდულის საჭიროების მომენტში.

ტვირთები განვითარდა მკაფიოდ დანომრილი შიდა ეტაპების გავლით (ოპერატორი საკუთარ ტელემეტრიულ მოვლენებს ასახელებს) sc1-, sc3-, sc4-და ა.შ.), და ამ ევოლუციის დაკვირვება კამპანიის გასაგებად ყველაზე ნათელი გზაა.

 თაობა 1–2: დაზვერვა და git-config-ის ქურდობა

ადრეული პაკეტები მარტივი ინფორმაციის მოპარვის მოწყობილობები იყო. ინსტალაციისას ისინი იღებდნენ გარემოს ცვლადებს, GitHub CLI hosts ფაილს და გლობალურ git კონფიგურაციას (git config –global –list, git remote -v), შემდეგ კი პაკეტი კოლექციის საბოლოო წერტილში გააგზავნა. ამან დაადგინა ოპერატორის ხელმოწერა: „TypeScript ფორმის ვალიდაციის კომუნალური პროგრამების“ სამოტივაციო სტატია, გამავალი შუქურა ერთ დომენზე და მომხმარებლის მონაცემების ნაცვლად დეველოპერის სერთიფიკატებისადმი მიდრეკილება.

თაობა 3: ჰიპერვიზორის და ბირთვის გაქცევის ზონდები

კამპანიის შუა პერიოდის ერთ-ერთი ვერსია ინფრასტრუქტურულ შეტევებზე გადავიდა. კონფიგურაციის მოპარვის ნაცვლად, მან სადაზვერვო აღკაზმულობა გამოიყენა. AF_VSOCK სოკეტები, virtio MMIO რეგიონები, /dev/memდა ბირთვის გამკვრივების დროშები და sysrq-ით გამოწვეული ბირთვის კრახის მცდელობებიც კი — ქცევა, რომელიც დაკავშირებულია ვირტუალური მანქანიდან ან კონტეინერიდან გასვლის მცდელობებთან. ტელემეტრიის ტეგები (s0-vmm-რეკონსულტაცია, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-kernel-probe) განზრახვა ცხადად გამოკვეთა. ეს ვარიანტი აშკარად მიზნად ისახავდა ღრუბლოვანი და სერვერის გარეშე გაშვებული გარემო — ეფემერული ვირტუალური მანქანის ტიპი, რომელიც ქმნის და ტესტირებს არასანდო კოდს.

თაობა 3 (SC3): ჯვარედინი საცავის ჩაწერის ჭია

კამპანიის სიმძიმის ცენტრი თვითგავრცელებად საცავის ქურდად იქცა. ინსტალაციისას, დატვირთვა ხუთსაფეხურიან დროში განსაზღვრულ თანმიმდევრობას ასრულებს:

  • სცენა 0 (~100 ms): ჰოსტის თითის ანაბეჭდი — ჰოსტის სახელი, მომხმარებლის ინფორმაცია, git identity.
  • სცენა 1 (~3 წმ): დაადგინეთ, თუ რომელ ორგანიზაციას ეკუთვნის მსხვერპლი შემოწმების გზით git remote -v, შემდეგ მოძებნეთ მყარი კოდირებული ORG_CONFIG ცხრილისა და სატესტო რეპოზიტორის წვდომის ფუნქცია git ls-remote — გადამისამართებულია თავდამსხმელის მიერ კონტროლირებადი SSRF პროქსის მეშვეობით http://git@192.168.0.1:8080.
  • სცენა 2 (~10 წმ): git clone სამიზნე სიის ყველა ხელმისაწვდომ რეპოზიტორს, ხეს tarball-ით და gzip-ით აკოდირებს, base64-ით დაშიფვრავს და chunk-ით აშორებს.
  • სცენა 3 (~45 წმ): „წვდომის დადასტურება“ — ჩასაწერი საცავის კლონირება, SECURITY-POC.md სახელით ფაილის ჩამოშლა და commit ავტორის google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> მისამართზე დაყენებით და შემდეგი შეტყობინებით: განაახლეთ დამოკიდებულების ქეში, შემდეგ გადაიტანეთ მსხვერპლის მთავარ ფილიალში.

სამიზნეების მყარი კოდირებული სია არ არის ზოგადი. ის ოცდაათზე მეტს მოიცავს. Shopify საცავები სახელით — Shopify/shopify, Shopify/იდენტობა, Shopify/ბილინგი, Shopify/სარდაფში, Shopify/საიდუმლოებები, Shopify/ინფრასტრუქტურა, Shopify/.githubდა მრავალი სხვა — ტესტირების ორგანიზაციასთან ერთად, აარონ სტეკბარნსი, რომელსაც, როგორც ჩანს, ოპერატორი აკონტროლებს და ჩაწერის სამიზნედ იყენებს.

თაობა 4 (SC4): დაშიფრული და კარიბჭით დაცული

დეველოპერებისთვის განკუთვნილი უახლესი ვარიანტი SC3 ჭიის გარდა, თავის არიდების ორ ფენას ამატებს.

პირველ რიგში, დატვირთვა აღარ იგზავნება როგორც უბრალო ტექსტი. რეალური ლოგიკა AES-256-CBC-ით დაშიფრულ ბლობშია, lib/.perf.dat, IV პირველ თექვსმეტ ბაიტშია. ჩამტვირთავი index.js ახდენს გაშიფვრის გასაღების რეკონსტრუირებას გაერთიანებული სტრიქონის ფრაგმენტებიდან, შიფრავს blob-ს და ამუშავებს მას ახალი ფუნქცია()სტატიკური სკანერებისგან თავის ასარიდებლად, მოდულების სახელებიც კი იყოფა — require('crypt' + 'o'), მოითხოვს('f' + 's').

მეორეც, ის ჰოსტ-კარით არის დამოუკიდებელი. ერთი ვარიანტი მხოლოდ მაშინ გაშიფრავს და მუშაობს, როდესაც os.hostname() ტოლია devbox or ubuntu-fc-uvm (Firecracker microVM ნაგულისხმევია) ან შეიცავს ქვესტრიქონს devboxკიდევ ერთი კარიბჭე ა-ს არსებობაზე .ჯულსი/ სამუშაო დირექტორია:

სხვა სიტყვებით რომ ვთქვათ, SC4 დატვირთვა შექმნილია ისე, რომ უმოქმედოდ დარჩეს ჩვეულებრივი დეველოპერის ლეპტოპზე და გაიღვიძოს მხოლოდ ავტომატიზირებულ ხელოვნური ინტელექტის აგენტში და სავარჯიშო გარემო ოპერატორს რეალურად სურს კომპრომისზე წასვლა.

ლაბორატორიის ჩართვა: ანალიზი-ინფრასტრუქტურის ვარიანტი

კამპანიის ყველაზე ნოვატორული პაკეტი, ts-enum-დამხმარე, საერთოდ არ ესხმის თავს დეველოპერებს ან Shopify-ს. ეს postinstall.sh იხსნება კარიბჭით, რომელიც თამაშს გასცემს:

სკრიპტი არაფერს აკეთებს, თუ არ არის დაყენებული მავნე პროგრამების ანალიზის პლატფორმისთვის სპეციფიკური გარემოს ცვლადი. როდესაც ეს დაყენებულია, დატვირთვამ იცის, რომ ის მუშაობს sandbox-ში, რომელიც არსებობს პაკეტების ასაფეთქებლად და შესასწავლად ზუსტად ამის მსგავსად — და ის კონტრშეტევას ახორციელებს.

ის თავდაპირველად იღებს GCP სერვისის ანგარიშის OAuth ტოკენს ეგზემპლარის მეტამონაცემების სერვერიდან და აშორებს მას. შემდეგ, ამ ტოკენის გამოყენებით, ის ამოწმებს კუბერნეტესის საკონტროლო თვითმფრინავი მისაწვდომია kubernetes.default.svc:

  • ჩამოთვლილია ClusterRoleBindings, ClusterRoles და Nodes;
  • ზონდების პოდები, საიდუმლოებები და კონფიგურაციის რუკები კუბე-სისტემა, პოსტი, კუბე-საზოგადოება, კუბე-კვანძის-ლიზინგიდა ანალიზის სახელთა სივრცე;
  • პრობლემები SelfSubjectAccessReview-ის ძახილებით, რომლებიც ზუსტად ასახავს მოპარული იდენტობის უფლებებს.

და ბოლოს, ის იძულებით იყენებს Google Cloud Storage-ის თაიგულების სახელებს, რომლებიც აგებულია მყარი კოდირებული GCP პროექტის ID-დან (იშვიათი-ხელმომწერი-437603-p9) და პროექტის ნომერი, ისეთი კომბინაციების გამოცნობა, როგორიცაა *-builds, *-არტეფაქტებიდა რამდენიმე მალიზი- პრეფიქსები (მალიზის შედეგები, მალიზის პაკეტები, მელიზური სკანირება). ყველა პასუხის კოდი და ტექსტი აღირიცხება და POST-ით იგზავნება იმავე მისამართზე. ჯულს-კოლექტი საბოლოო წერტილი.

ეს იშვიათი შემთხვევაა მიწოდების ჯაჭვის ტიპის დატვირთვისა, რომელიც სპეციალურად შექმნილია დამცველების საკუთარ ინფრასტრუქტურაზე თავდასხმისთვის. მთელი კამპანიის მთავარი სტატია — რომლის ფრაგმენტებიც დატვირთვებში ჩნდება კომენტარების სახით, რომლებიც ქცევას აღწერენ, როგორც „უსაფრთხოების კვლევის PoC ... ჯვარედინი რეპოზიტორის ჩაწერას გადაჭარბებული git პროქსი ტოკენის საშუალებით“ — იგივე თვითგამართლებაა, იქნება ეს გაშვების სამიზნე Shopify მონორეპო თუ ანალიზის კლასტერის მეტამონაცემების სერვერი.

ვადები და მასშტაბის მიგრაცია

JulesJacker ერთჯერადი ოპერაცია არ არის. ეს არის მდგრადი ოპერაცია, რომელმაც რეესტრის გაუქმებას უბრალოდ სახელის შეცვლით გადაურჩა.

როდესაც თარიღის
2026 წლის აპრილის შუა რიცხვები პირველი პაკეტები ორიგინალური გამომცემლის ფარგლებში ჩნდება: TS-utility facade, environment და git-config exfiltration.
2026 წლის მაისის დასაწყისი გამოქვეყნდა ჰიპერვიზორი და kernel-escape-ის სადაზვერვო ვარიანტი.
2026 წლის მაისის შუა რიცხვებიდან ბოლომდე SC3 cross-repo ჩაწერის ჭია ჩნდება Shopify-ისთვის მიზნობრივ დატვირთვებთან ერთად და google-labs-jules[bot] იმპერსონაცია. SC4 წარმოგიდგენთ AES-დაშიფრულ და ჰოსტ-კარით დაფარულ ჩამტვირთავებს.
2026 წლის მაისის ბოლოს npm შლის გამომცემლის თავდაპირველ მასშტაბს; პაკეტის სახელები ცარიელებს უსაფრთხოების შემცველ ჩანაცვლების ველებს.
იმავე კვირაში ოპერატორი გადადის თითქმის იდენტურ, მსგავს არეალში და ხელახლა აქვეყნებს ჭიას, ანალიზის ინფრასტრუქტურის ვარიანტის ჩათვლით.

მიგრაცია ის ნაწილია, რომელიც დამცველებმა უნდა გაითვალისწინონ. პირველი სამიზნეს მოხსნამ არც კამპანია დაასრულა და არც შეანელა. ოპერატორს უკვე ჰქონდა დადგმული პარალელური სამიზნე, რომლის სახელიც ორიგინალისგან ერთი სიმბოლოთი განსხვავდება და იმავე კვირაში განაგრძო გამოქვეყნება. ამ წერის მომენტისთვის, ახალი სამიზნე... ts-ფორმის-უტილიტები (ვერსიები 1.0.0-დან 1.1.0-მდე), მისი ts-პროექტი-ლინტი (1.0.0 და 1.1.0) და დამოუკიდებელი ვერსია ts-enum-დამხმარე (1.0.0) ინსტალაციადი რჩება.

კომპრომისის ინდიკატორები

ქვემოთ მოცემული ყველა ინდიკატორი დადასტურდა პაკეტის წყაროსთან შედარებით.

ტიპი ინდიკატორი შენიშვნები
ქსელი (C2) aaronstack[.]com/jules-collect ყველა თაობის ერთიანი კოლექციის საბოლოო წერტილი; იღებს JSON ტელემეტრიას და base64-gzip რეპოზიტორიის tarball ნაწილებს.
ქსელი (SSRF პროქსი) http://git@192.168.0.1:8080 წინა მხარე გადაჭარბებული სკოპინგის მქონე git პროქსი ტოკენისთვის, რომელიც გამოიყენება სამიზნე ორგანიზაციის საცავების მისაღწევად.
ქსელი (ღრუბელი) metadata.google.internal/computeMetadata/v1
kubernetes.default.svc
storage.googleapis.com/storage/v1/b
გამოიყენება მხოლოდ ანალიზის ინფრასტრუქტურის ვარიანტის მიერ ტოკენების ქურდობისა და Kubernetes-ის საკონტროლო სიბრტყის დაზვერვისთვის.
პირადობის google-labs-jules[bot]
161369871+google-labs-jules[bot]@users.noreply.github.com
ყალბი commit ავტორის ვინაობა დაზარალებულის მთავარ ფილიალებშია გადატანილი.
ფაილი lib/.perf.dat AES-256-CBC-ით დაშიფრული დატვირთვის ბლობი; IV შენახულია პირველ 16 ბაიტში და გასაღები დინამიურად რეკონსტრუირებულია index.js.
ფაილი SECURITY-POC.md დაეცა და commitშეტყობინებით დააბრუნეს მსხვერპლის საცავებში chore: update dependency cache.
ფაილი scripts/postinstall.sh კარიბჭით $MALYSIS_ANALYSIS_ID; განსაზღვრავს ანალიზი-ინფრასტრუქტურის დამიზნების ვარიანტს.
ქცევა os.hostname() ჩეკები devbox / ubuntu-fc-uvm სენდბოქსის და ხელოვნური ინტელექტის აგენტის გარემოს გეითინგი დატვირთვის გაშიფვრამდე და შესრულებამდე.
ქცევა .jules/ მდე /app/.jules დირექტორიის წაკითხვა ხელოვნური ინტელექტის აგენტის სამუშაო გარემოს აშკარა მიზნობრივი გამოყენება.
ქცევა sc1-, sc3-, sc4-, s0-vmm-recon ოპერატორის მიერ განსაზღვრული ტელემეტრიული ეტაპის ეტიკეტები, რომლებიც სასარგებლოა აღმოჩენისა და ნადირობისთვის.
ღრუბლოვანი სამიზნე rare-signer-437603-p9
malysis-* ვედროს გამოცნობა
ანალიზის ინფრასტრუქტურის ვარიანტში ჩაშენებული მყარი კოდირებული GCP პროექტის იდენტიფიკატორები და შენახვის ბაკეტების ჩამოთვლის ნიმუშები.
შეფუთვის ფორმა TS-უტილიტის პაკეტის ფასადი საცავის ველის გარეშე თანმიმდევრული კამპანიის შაბლონი: ყალბი TypeScript უტილიტის პაკეტები ჩაშენებული მავნე დატვირთვით postinstall hooks ან დამატებულია index.js.
sca-tools-software-composition-analysis-tools
თქვენი პროგრამული უზრუნველყოფის რისკების პრიორიტეტიზაცია, გამოსწორება და დაცვა
მიიღეთ თქვენი უფასო ანგარიში.
საკრედიტო ბარათი არ არის საჭირო.

უზრუნველყავით თქვენი პროგრამული უზრუნველყოფის შემუშავება და მიწოდება

Xygeni Product Suite-თან ერთად