-
27/04/2017
-
30
-
76 bài viết
Khai thác lổ hỗng Remote code execution (RCE) trong Nodejs (Phần 2)
Hi mọi người, trong bài viết trước với mục định tạo nhận thức cho mọi người về lỗ hổng RCE trong nodejs. Các bạn có thể đọc bài đó ở đây.
Với việc nodejs thịnh hành thì điều đó cũng có nghĩa là các package hay module của nodejs phát triển không kém. Vì vậy, việc các lổ hổng đến từ các package là điều không thể lơ là được.
Để chứng minh cho các lổ hỗng cũng có thể đến từ các module hay package thì mình sẽ làm phân tích CVE trong năm có thể dẫn đến lỗ hổng RCE:
Trong quá trình mình phân tích thì sẽ bao gồm các bước sau:
CVE-2021-21414:
Module tên: @prisma/sdk
Đầu tiên hãy cùng nhau xem đoạn code bị bug trong hình:
Như trong hình thì trong getPackedPackage method có execa.command function có param (tham số) packCMD và callback. Nhưng ở đây packdCMD không được validate( xác thực ) và nó chấp nhận tất cả các thông số mà người dùng nhập vào. Vậy nên nó sẽ có thể dùng để chạy bất kỳ cmd nào được nhập vào.
Cho những bạn chưa biết execa.command là gì: https://www.npmjs.com/package/execa thì execa là phiên bản cải thiện của child_process method trong nodejs.
Để chứng minh mình có thể khai thai được lổ hỗng này thì dưới đây là demo:
Đầu tiên, thì cài đặt paclkage:
Tạo 1 file exploit.js với nội dung sau:
Và chạy nó để xem kết quả:
Vậy để khắc phục nó thì làm thế nào?
Để khắc phục nó thì mình validate mọi dự liệu được nhập vào. Đối với các command lên thì nên escape hoặc là filter các cmd nguyên hiểm. Nhưng ở đây thì bên phía package dùng shell-quote để mà validate (xác thực) các cmd
Code fix:
Đây là thư viện shell-quote cho các bạn muốn tìm hiểu. https://www.npmjs.com/package/shell-quote
Vì vậy để phòng tránh rủi ro lỗ hổng RCE thì mình nên làm gì?
Với việc nodejs thịnh hành thì điều đó cũng có nghĩa là các package hay module của nodejs phát triển không kém. Vì vậy, việc các lổ hổng đến từ các package là điều không thể lơ là được.
Để chứng minh cho các lổ hỗng cũng có thể đến từ các module hay package thì mình sẽ làm phân tích CVE trong năm có thể dẫn đến lỗ hổng RCE:
- CVE-2021-21414 https://nvd.nist.gov/vuln/detail/CVE-2021-21414
Trong quá trình mình phân tích thì sẽ bao gồm các bước sau:
- Tên module hay package bị lổ hổng
- Nguyên nhân dẫn đến lỗ hổng
- Khai thác lỗ hổng
- Cách khắc phục
CVE-2021-21414:
Module tên: @prisma/sdk
- https://www.prisma.io/docs/
- https://github.com/prisma/prisma
- https://www.npmjs.com/package/@prisma/sdk
Đầu tiên hãy cùng nhau xem đoạn code bị bug trong hình:
Như trong hình thì trong getPackedPackage method có execa.command function có param (tham số) packCMD và callback. Nhưng ở đây packdCMD không được validate( xác thực ) và nó chấp nhận tất cả các thông số mà người dùng nhập vào. Vậy nên nó sẽ có thể dùng để chạy bất kỳ cmd nào được nhập vào.
Cho những bạn chưa biết execa.command là gì: https://www.npmjs.com/package/execa thì execa là phiên bản cải thiện của child_process method trong nodejs.
Để chứng minh mình có thể khai thai được lổ hỗng này thì dưới đây là demo:
Đầu tiên, thì cài đặt paclkage:
Mã:
npm install @prisma/sdk
Tạo 1 file exploit.js với nội dung sau:
Mã:
const sdk = require("@prisma/sdk");
sdk.getPackedPackage("newbie", "Hello", "world`mkdir /tmp/exploit`");
Và chạy nó để xem kết quả:
Mã:
node exploit.js
Vậy để khắc phục nó thì làm thế nào?
Để khắc phục nó thì mình validate mọi dự liệu được nhập vào. Đối với các command lên thì nên escape hoặc là filter các cmd nguyên hiểm. Nhưng ở đây thì bên phía package dùng shell-quote để mà validate (xác thực) các cmd
Code fix:
Đây là thư viện shell-quote cho các bạn muốn tìm hiểu. https://www.npmjs.com/package/shell-quote
Vì vậy để phòng tránh rủi ro lỗ hổng RCE thì mình nên làm gì?
- Ngoài những các phòng tránh có ở bài viết đầu tiên: https://whitehat.vn/threads/khai-thac-lo-hong-remote-code-execution-rce-trong-nodejs.14697/
- Thường xuyên kiểm tra lại các thư viện bạn đang dùng. Và cập nhật thư viện nếu như thư viện có lổ hổng mới.
Chỉnh sửa lần cuối bởi người điều hành: