Bảo vệ đầu vào của người dùng biểu thức thông thường chống lại các cuộc tấn công


9

Tôi biết về từ chối dịch vụ thường xuyên (ReDoS). Có cách nào hợp lý để cho phép người dùng tạo các biểu thức tùy chỉnh trong khi đảm bảo rằng họ không gửi mẫu chậm theo cấp số nhân không?


Bạn đang thiếu chi tiết. Nền tảng, cách sử dụng, v.v.
whatsisname

8
Thay vì cố gắng tránh người dùng gửi regex xấu, có lẽ là một giải pháp mà sau một khoảng thời gian nhất định bạn hủy thực thi?
Samuel

Câu trả lời:


8

Vấn đề với các biểu thức thông thường không phải là bản thân regex, mà là công cụ regex có tất cả các loại tính năng tiện lợi của thành phố như như quay lui. Do đó, sử dụng công cụ regex mà không có các tính năng này sẽ tránh được.

Các biểu thức chính quy, khái niệm khoa học máy tính luôn có thể được khớp trong thời gian tuyến tính sau khi chúng được biên dịch thành một máy trạng thái hữu hạn. Vì vậy, một công cụ regex dựa trên máy trạng thái không thể được sử dụng cho ReDoS. Tuy nhiên, các máy trạng thái cần thiết có thể trở nên khá lớn trong các ví dụ bệnh lý. Nhưng việc giới hạn bộ nhớ khả dụng có xu hướng dễ dàng hơn là giới hạn thời gian tính toán khả dụng.

Công cụ RE2 được phát triển đặc biệt để đối phó với các biểu thức không tin cậy và được thiết kế để thực hiện theo thời gian tuyến tính.

Một cách khác là tự lắp ráp các biểu thức chính từ một ký hiệu đơn giản hóa. Ví dụ: bạn có thể cho phép người dùng sử dụng các mẫu toàn cầu (như *.txt). Sau đó, bạn có thể phân tích điều đó theo cách ngăn chặn quay lui, ví dụ bằng cách không cho phép lồng và chỉ sử dụng các bộ lượng hóa tham lam. Đối với nhiều trường hợp sử dụng, ký hiệu mẫu đơn giản là hoàn toàn đủ.


11

Phân tích một biểu thức chính quy để xem liệu nó sẽ chậm hay không, mà không có phân tích trở nên chậm , chính là cách giải quyết vấn đề tạm dừng. Nói cách khác, không thể tìm ra giải pháp chính xác và đầy đủ.

Bạn có thể, tất nhiên, tìm một giải pháp đó là chính xác và trong hoàn tất. Chẳng hạn, bạn có thể làm việc với một danh sách trắng các tính năng hạn chế an toàn để sử dụng (ví dụ: các lớp ký tự có, lặp lại không ...). Điều này sẽ cho phép bạn vượt qua rất nhiều chế độ không chính xác, từ chối tất cả các quy tắc quan trọng và (sai) từ chối một số điều không ổn, nhưng quá phức tạp để tự động chứng minh an toàn.


3
Bạn có một trích dẫn cho tuyên bố đầu tiên của bạn? Tôi sẽ quan tâm đến việc xem một bằng chứng như vậy. Regexes không hoàn thành Turing, vì vậy vấn đề tạm dừng có thể không được áp dụng.
Sebastian Redl

3
@SebastianRedl Đúng là nói đúng, các biểu thức chính quy không hoàn chỉnh Turing, nhưng tất cả các thư viện regex trong sử dụng phổ biến đều có các tiện ích mở rộng khiến chúng không còn đều đặn. Hạn chế người dùng của bạn theo nghĩa đen biểu thức thông thường có thể, trên thực tế, là một giải pháp tốt cho tình trạng này.
Kilian Foth

2
@KilianFoth: IIRC, ngay cả các biểu thức chính quy thực sự (theo nghĩa CompSci của từ này) có thể yêu cầu số lượng quay lại theo cấp số nhân. Nhưng vì chúng không hoàn thành Turing, nên đối với bất kỳ regex nào, về mặt lý thuyết đều có thể thiết lập giới hạn trên này. Tuy nhiên, điều này mở ra hai vấn đề: tự động xác định giới hạn trên là một nhiệm vụ không hề nhỏ và kết quả có thể cho kết quả cao một cách vô lý (như trong, giới hạn trên cao hơn nhiều so với thời gian dự kiến ).
MSalters

@msalters bất kỳ biểu thức chính quy thực sự nào đều có thể chuyển đổi cơ học thành tự động trạng thái hữu hạn xác định, nghĩa là luôn luôn có thể khớp với biểu thức mà không cần quay lại. Dĩ nhiên, FSA của bạn có thể trở nên lớn một cách vô lý, nhưng điều đó cho thấy rằng giới hạn về số lượng trạng thái trong FSA được tạo là một giải pháp đủ để ngăn chặn cuộc tấn công đang được đề cập.
Jules

1

Là tác giả của trình phân tích lại cho dự án lazarus, tôi sẽ nói rằng không có cách nào để hiểu đối với bất kỳ biểu thức chính quy định nào mà tài nguyên mà nó sẽ tiêu thụ trên một văn bản nhất định.

Tôi không sử dụng cùng một nguồn tài nguyên (ít nhất là theo nghĩa lớn-O).

Vì vậy, cách tiếp cận tốt nhất - chạy trình phân tích lại trong luồng riêng biệt và tiêu diệt nó sau khi hết thời gian.


0

Ngoài các câu trả lời khác, một giải pháp cũng có thể là cuộn thư viện regex của riêng bạn, cho phép thiết bị đo hiệu suất trong khi thực hiện, và do đó cung cấp phương tiện để giết chết việc thực thi giữa chừng nếu một số tiêu chí được đáp ứng.

Tương tự, bạn có thể chạy regexes trên một luồng khác và giết các luồng nếu chúng mất quá nhiều thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.