ช่องโหว่ RCE ระดับ Critical ในแพ็คเกจ NPM ยอดนิยมของ React Native ทำให้นักพัฒนาเสี่ยงต่อการถูกโจมตี

พบช่องโหว่การรันโค้ดที่เป็นอันตรายจากระยะไกล (RCE) ระดับ Critical หมายเลข CVE-2025-11953 ในแพ็คเกจ NPM @react-native-community/cli

แพ็คเกจนี้มียอดดาวน์โหลดเกือบ 2 ล้านครั้งต่อสัปดาห์ โดยทำหน้าที่เป็นเครื่องมือ command-line interface (CLI) สำหรับ React Native ซึ่งเป็น JavaScript framework ที่นักพัฒนาใช้ในการสร้างแอปฯ มือถือแบบ cross-platform

ช่องโหว่นี้ได้คะแนน CVSS 9.8 เนื่องจากสามารถเข้าถึงได้ผ่านเครือข่าย มีความซับซ้อนในการโจมตีต่ำ และอาจสร้างความเสียหายร้ายแรง โดยทำให้ผู้โจมตีที่ไม่ต้องผ่านการยืนยันตัวตน สามารถรันคำสั่งบนระบบปฏิบัติการบนเครื่องของนักพัฒนาผ่านทาง development server ของแพ็คเกจได้

CLI ของ React Native ซึ่งถูกแยกออกจากโค้ดหลักเมื่อหลายปีก่อนเพื่อให้บำรุงรักษาง่ายขึ้น ทำหน้าที่จัดการงานที่สำคัญ เช่น การเริ่มต้นโปรเจกต์ และการรัน Metro bundler

คำสั่งอย่าง “npm start” หรือ “npx react-native run-android” จะเป็นการเปิดใช้งานเซิร์ฟเวอร์นี้ ซึ่งทำหน้าที่ bundle JavaScript สำหรับ emulators หรืออุปกรณ์

แต่นักวิจัยของ JFrog พบว่า /open-url endpoint ของเซิร์ฟเวอร์ จัดการ user input ผิดพลาด โดยส่งข้อมูลนั้นโดยตรงไปยังฟังก์ชัน open() ที่ไม่ปลอดภัยของไลบรารี NPM ที่ชื่อ “open”

บน Windows เหตุการณ์นี้ทำให้เกิดการรันคำสั่ง shell ที่สามารถควบคุมพารามิเตอร์ได้อย่างเต็มที่ ตัวอย่าง PoC พิสูจน์ด้วยการเปิดโปรแกรม calc.exe หรือการเขียนไฟล์อย่าง “pwned.txt” ส่วนบน macOS และ Linux การรันคำสั่งจะมีข้อจำกัดมากกว่า แต่ก็อาจถูกยกระดับได้ด้วยการปรับแต่ง URI schemes หรือ file handlers เพิ่มเติม

เหตุการณ์นี้ทำให้เปลี่ยนจากปัญหาภายในระดับ local ให้อันตรายมากขึ้น เนื่องจากปัญหาที่รองลงมาในแกนหลักของ React Native: นั่นคือ Metro server จะผูกเข้ากับ network interfaces ทั้งหมด (0.0.0.0) เป็นค่าเริ่มต้น แม้ว่าข้อความใน console จะอ้างว่าเข้าถึงได้เฉพาะ "localhost" ก็ตาม

ปัญหานี้เกิดจากพารามิเตอร์ host ที่ไม่ได้กำหนดค่าในฟังก์ชัน runServer ซึ่งเป็นการเปิดเผย endpoints ให้กับผู้โจมตีจากภายนอก จึงทำให้นักพัฒนาที่ใช้ CLI เวอร์ชันที่มีช่องโหว่ (4.8.0 ถึง 20.0.0-alpha.2) ในแพ็คเกจ @react-native-community/cli-server-api ตกอยู่ในความเสี่ยง โดยเฉพาะอย่างยิ่งนักพัฒนาที่ skip frameworks อย่าง Expo ซึ่งใช้เซิร์ฟเวอร์อื่น

ไม่ใช่นักพัฒนาทุกคนที่เผชิญความเสี่ยงในระดับเดียวกัน โปรเจกต์ที่ใช้ Metro สำหรับ hot reloading ในระหว่างการพัฒนา ซึ่งมักพบในการตั้งค่า React Native พื้นฐานสำหรับ Windows, macOS, iOS หรือ Android มักจะมีความเสี่ยงสูงกว่า

การติดตั้งแบบ Global หรือ bundled dependencies ยิ่งขยายความเสี่ยงจากภัยคุกคามนี้ JFrog ได้สาธิตการโจมตีช่องโหว่ของ Windows ได้อย่างง่ายดาย ในขณะที่ระบบ Unix-like ต้องใช้วิธีการที่ยากกว่า เช่น การใช้ช่องโหว่ URI handlers เพื่อรันไฟล์จากระยะไกล

มีการออกอัปเดตเพื่อแก้ไขอย่างรวดเร็ว ด้วยความช่วยเหลือจากทีมรักษาความปลอดภัยของ Meta ใน CLI เวอร์ชัน 20.0.0 นักพัฒนาควรอัปเดตผ่าน npm ในโฟลเดอร์โปรเจกต์ หรืออัปเดตแบบ global จากนั้นตรวจสอบด้วยคำสั่ง “npm list @react-native-community/cli-server-api”

สำหรับการป้องกันทันที ให้ผูกเซิร์ฟเวอร์ไว้กับ localhost ด้วยคำสั่ง: “npx react-native start –host 127.0.0.1” ช่องโหว่นี้เน้นย้ำถึงอันตรายของ sinks" จาก third-party เช่น แพ็คเกจ “open” และการเปิดเผยเครือข่ายตามค่าเริ่มต้นในเครื่องมือสำหรับนักพัฒนา

ที่มา : cybersecuritynews