Làm thế nào để ngăn chặn các cuộc tấn công ô nhiễm nguyên mẫu?

Lam The Nao De Ngan Chan Cac Cuoc Tan Cong O Nhiem Nguyen Mau



Cuộc tấn công ô nhiễm nguyên mẫu khai thác cách các đối tượng JavaScript xử lý các nguyên mẫu tương ứng của chúng. Trong JavaScript, Nguyên mẫu là một đối tượng khác xác định các thuộc tính và phương thức mặc định cho đối tượng được chọn. Kẻ tấn công khai thác ô nhiễm nguyên mẫu bằng cách tiêm mã độc vào các nguyên mẫu này bằng cách thao túng các thuộc tính của đối tượng hoặc bằng cách sử dụng chức năng hợp nhất đệ quy các đối tượng.

Hướng dẫn này giải thích các cách ngăn chặn các cuộc tấn công ô nhiễm nguyên mẫu.







Ngăn chặn các cuộc tấn công ô nhiễm nguyên mẫu?

Nguyên nhân sâu xa của các cuộc tấn công ô nhiễm nguyên mẫu là do các đối tượng JavaScript kế thừa các thuộc tính từ nguyên mẫu của chúng. Điều này có nghĩa là nếu kẻ tấn công có thể tiêm mã độc vào nguyên mẫu, nó sẽ được kế thừa bởi tất cả các đối tượng được kế thừa từ nguyên mẫu đó. Điều này dẫn đến việc đánh cắp dữ liệu, thực thi mã tùy ý hoặc chiếm quyền kiểm soát các ứng dụng khác.



Trong đoạn mã dưới đây, mã ô nhiễm nguyên mẫu sẽ được đưa vào:



hằng số y = { Một: 1 , b: 2 } ;
dữ liệu const = JSON.parse ( '{'__proto__': { 'bị lỗi': đúng}}' ) ;

const c = Object.gán ( { } , và, dữ liệu ) ;
console.log ( c.bị lỗi ) ;


Mô tả đoạn mã trên:





    • Đầu tiên, danh sách có tên “ ” được tạo và lưu trữ các giá trị trong cặp khóa-giá trị.
    • Với sự giúp đỡ của ' -Vì vậy- ”, mã ô nhiễm ngẫu nhiên được triển khai ở định dạng khóa-giá trị. Khóa được đặt thành “ bị lỗi ” và giá trị được gán của “ ĐÚNG VẬY ”.
    • Sau đó, mã bị ô nhiễm này được gán cho “ ” danh sách bằng cách gọi “ giao phó() ” và danh sách kết quả được lưu trữ trong một danh sách mới có tên “ c ”.
    • Cuối cùng, mã bị ô nhiễm được đưa vào trong “ c ” danh sách được truy xuất và giá trị của nó được hiển thị trên bảng điều khiển. Để đảm bảo rằng dữ liệu ô nhiễm hoặc độc hại đã được đưa vào.

Sau khi thực thi file chứa, kết quả đầu ra cho thấy mã độc đã được chèn thành công và đã lấy được giá trị:



Làm thế nào để ngăn chặn các cuộc tấn công ô nhiễm nguyên mẫu?

Có một số cách tiếp cận có thể ngăn chặn cuộc tấn công ô nhiễm nguyên mẫu:

Hợp nhất đệ quy không an toàn:

Tránh việc hợp nhất đệ quy không an toàn vì chúng có thể dẫn đến các cuộc tấn công ô nhiễm nguyên mẫu:

nơi hợp nhất = ( nhận , thư mục ) = > {
( thuộc tính var TRONG src ) {
nếu như ( loại ( nhận [ thuộc tính ] ) === 'obj' && loại ( src [ thuộc tính ] ) === 'obj' )
{
hợp nhất ( nhận [ thuộc tính ] , thư mục [ thuộc tính ] ) ;
} khác {
nhận [ thuộc tính ] = src [ thuộc tính ] ;
}
}
trở lại nhận ;
} ;


Trong đoạn mã trên:

    • Đầu tiên, chức năng tùy chỉnh “ hợp nhất() ” được tạo để chấp nhận hai tham số mảng “ nhận ' Và ' src ”.
    • Tính năng nâng cao “ Vòng lặp ” được sử dụng để lặp lại biến “ thuộc tính ” trên mức được cung cấp “ src ' tham số.
    • Bên trong vòng lặp, hãy sử dụng “ nếu như ” câu lệnh điều hướng qua cả hai lỗi và liệu bất kỳ phần tử nào nằm trong cả hai mảng có cùng kiểu dữ liệu hay không. Sau đó, những phần tử đó được truyền dưới dạng tham số cho cùng một “ hợp nhất() ” hàm tạo tính chất đệ quy.
    • Nếu các loại không giống nhau thì giá trị phần tử nằm trong phần “ src ” mảng tham số được truyền tới “ nhận ' tham số.
    • Cuối cùng ' nhận ” mảng tham số được trả về.

Đóng băng nguyên mẫu

Một biện pháp ngăn chặn khác đối với các cuộc tấn công gây ô nhiễm nguyên mẫu là đóng băng chu trình thực thi của chúng. Việc này được thực hiện thông qua “ Object.freeze() ' phương pháp. Trong đoạn mã bên dưới, mã bị ô nhiễm nguyên mẫu được chèn ở trên sẽ bị đóng băng:

hằng số y = { Một: 1 , b: 2 } ;
dữ liệu const = JSON.parse ( '{'__proto__': { 'bị lỗi': đúng}}' ) ;

const c = Object.gán ( { } , và, dữ liệu ) ;
console.log ( c.bị lỗi ) ;

console.log ( Đối tượng.freeze ( c.bị lỗi ) ) ;
console.log ( Object.isFrozen ( c.bị lỗi ) ) ;


Giải thích về đoạn mã trên được hiển thị dưới đây:

    • Ban đầu, mã ô nhiễm nguyên mẫu giả sẽ được đưa vào danh sách giả “ ” đúng như đã giải thích ở phần trên.
    • Sau đó, phím bị ô nhiễm được tiêm vào “ bị lỗi ” được chuyển đến “ đông cứng() ” Phương pháp đóng băng phần bị ô nhiễm.
    • Cuối cùng, để xác nhận phần ô nhiễm nguyên mẫu đông lạnh. Các ' bị lỗi ” khóa của danh sách “ c ” được chuyển đến “ Đông cứng() ' phương pháp. Phương thức này trả về “ ĐÚNG VẬY ” trong trường hợp đông lạnh và “ SAI ” trong trường hợp không đóng băng:

Sau khi thực thi mã chứa, đầu ra cho thấy việc tiêm, đóng băng và xác minh mã bị ô nhiễm bị đóng băng:


Lời khuyên bổ sung để ngăn chặn cuộc tấn công ô nhiễm nguyên mẫu

Dưới đây là một số mẹo bổ sung có thể ngăn chặn cuộc tấn công ô nhiễm nguyên mẫu bằng cách sử dụng:

    • Tùy chọn “ –vô hiệu hóa-proto ” có thể được sử dụng để vô hiệu hóa hoặc hủy hoạt động của “ nguyên mẫu.__proto__ ' tài sản.
    • Không sử dụng các phương pháp với sự trợ giúp của “ nguyên mẫu ”.
    • Qua ' Vệ sinh đầu vào của người dùng ” liên quan đến việc xác thực và lọc đầu vào của người dùng để loại bỏ bất kỳ mã độc hại hoặc ô nhiễm nào.
    • Sử dụng “ danh sách trắng ”, là danh sách các thuộc tính và phương thức được phép cho một đối tượng. Mọi nỗ lực đặt hoặc lấy các thuộc tính hoặc phương thức không phải là thành viên của danh sách trắng sẽ bị chặn.

Đó là tất cả về việc ngăn chặn các cuộc tấn công ô nhiễm nguyên mẫu trong Node.js.

Phần kết luận

Để ngăn chặn các cuộc tấn công ô nhiễm Nguyên mẫu, các phương pháp tiếp cận như tránh hợp nhất đệ quy không an toàn, đóng băng nguyên mẫu và sử dụng danh sách trắng để ngăn chặn “ __Vì vậy__ ” Thuộc tính được thiết lập có thể được sử dụng. Cùng với việc sử dụng “ –vô hiệu hóa-proto ” tùy chọn, tránh sử dụng “ Object.prototype ', Và ' vệ sinh đầu vào của người dùng ” cho mã bị ô nhiễm. Hướng dẫn này đã minh họa việc ngăn chặn các cuộc tấn công gây ô nhiễm nguyên mẫu trong Nodejs.