Đối với mọi regex 'ác', có tồn tại một sự thay thế không xấu xa, hay là ma quỷ trong ngữ pháp?


16

Rõ ràng, các cuộc tấn công ReDos khai thác các đặc điểm của một số biểu thức chính quy (nếu không hữu ích) ... về cơ bản gây ra sự bùng nổ các đường dẫn có thể thông qua biểu đồ được xác định bởi NFA.

Có thể tránh những vấn đề như vậy bằng cách viết một biểu thức tương đương 'không xấu xa' không? Nếu không (do đó, ngữ pháp không thể được xử lý trong không gian / thời gian thực tế bằng NFA), phương pháp phân tích cú pháp nào sẽ tốt hơn? Tại sao?


Nếu tôi quản lý để sử dụng ngôn ngữ kỹ thuật chính xác, đó là một tai nạn. Xin hãy bỏ qua câu trả lời của bạn cho một người không học thuật :-)
David Bullock

1
Tôi thực sự chỉ đang cố gắng tìm một cách thiết thực để tránh bị ReDos'd , và câu hỏi này đã được đưa ra.
David Bullock

Để viết lại câu hỏi của bạn (?): Có phải mọi ngôn ngữ thông thường đều có biểu thức chính quy có độ dài được giới hạn bởi một đa thức trong số trạng thái của NFA tối thiểu của nó?
A.Schulz

1
@ A.Schulz. Tôi không nghĩ đó là câu hỏi. Đó không phải là cách các cuộc tấn công của ReDos hoạt động. Trong một cuộc tấn công ReDos, regrec được mã hóa cứng vào mã nguồn chương trình và được cung cấp bởi nhà phát triển, người được cho là đáng tin cậy. Sau đó, đối thủ được cung cấp một chuỗi đầu vào, mà chương trình khớp với biểu thức chính quy. Nếu đối thủ có thể tìm thấy một chuỗi đầu vào khiến trình so khớp chạy trong một thời gian thực sự dài, thì đối thủ sẽ thắng. Vì vậy, chúng tôi quan tâm đến các yếu tố đầu vào bất lợi, không phải các biểu thức chính quy đối nghịch. (còn tiếp)
DW

Do đó, tôi nghĩ rằng câu hỏi là thay vào đó: Có phải mọi ngôn ngữ thông thường đều có biểu thức chính quy sao cho khớp chuỗi -character với biểu thức chính quy đó mất thời gian O ( f ( n ) ) , trong đó f ( n ) là một số không quá- chức năng phát triển nhanh chóng của n (nói, đa thức, hoặc một cái gì đó như thế)? [Ngẫu nhiên, công thức lại này làm rõ rằng câu trả lời sẽ phụ thuộc vào thuật toán được sử dụng để khớp ... như tôi đã đề cập trong câu trả lời của mình.] Kích thước của biểu thức chính quy như một hàm của kích thước của NFA tối thiểu không thực sự quan trọng ở đây nO(f(n))f(n)n
DW

Câu trả lời:


14

Nó phụ thuộc vào việc bạn có biểu hiện chính quy hay biểu thức chính quy: biểu thức chính là xấu, nhưng biểu thức chính quy là một điều hay và sẽ không bao giờ trở thành xấu xa đối với bạn.

Theo regrec, tôi có nghĩa là một biểu thức chính quy hiện đại: nghĩa là một biểu thức chính quy với các tính năng hiện đại bổ sung như phản hồi - ví dụ: biểu thức chính quy tương thích Perl. Điều này mạnh hơn một biểu thức chính quy cổ điển từ sách giáo khoa lý thuyết / ngôn ngữ chính thức, vì các biểu thức chính quy cổ điển không cho phép phản hồi, nhìn, nhìn, v.v.

nO(n)

Điều này không phụ thuộc vào việc thực hiện trình so khớp biểu thức chính quy. Nếu bạn có một triển khai trình so khớp ngây thơ hoặc kém, thì việc khớp có thể mất thời gian theo cấp số nhân; chắc chắn có các thuật toán với tài sản đó. Nhưng câu trả lời tốt nhất cho điều đó có lẽ là không thay đổi biểu thức chính quy; Có lẽ tốt hơn để chọn một công cụ đối sánh tốt hơn, nếu bạn lo ngại về các cuộc tấn công từ chối dịch vụ.

Trong so sánh, một số regexps hiện đại là không thể tránh khỏi cái ác. Nếu bạn có một biểu thức chính quy hiện đại, thì kết hợp có thể yêu cầu thời gian theo cấp số nhân. Cụ thể, biểu thức chính quy với phản hồi có thể nhận ra ngôn ngữ NP-hard. Do đó, theo các giả định hợp lý, tồn tại một lớp các biểu thức xấu xa trong đó việc kiểm tra một trận đấu mất thời gian theo cấp số nhân. Do đó, một số biểu thức hiện đại là không thể tránh khỏi sự xấu xa: không có cách nào khả thi để tìm một biểu thức chính quy tương đương mà sẽ không gây ra sự bùng nổ theo cấp số nhân trong thời gian chạy.

(Một lý thuyết tương đương như vậy có thể tồn tại và thậm chí có thể tìm thấy trên lý thuyết, nhưng theo các giả định hợp lý, việc tìm ra biểu thức chính quy tương đương sẽ mất thời gian theo cấp số nhân, điều này không khả thi trong thực tế. Nếu bạn có một quy trình có hệ thống để tìm ra biểu thức tương đương trong thời gian đa thức , sau đó bạn có thể giải quyết vấn đề NP-hard trong thời gian đa thức, chứng minh rằng P = NP. Sẽ không có ích gì khi tồn tại một regrec tương đương nếu không có cách nào thực sự tìm thấy nó trong suốt cuộc đời của bạn.)


Bối cảnh và nguồn:


Không phải dễ dàng hơn để tìm một sự thay thế không xấu bằng cách chia regex thành nhiều regex nhỏ hơn và sử dụng chúng kết hợp?
inf3rno

1

Câu trả lời này sẽ có cái nhìn bao quát hơn về tình huống giao thoa bất thường này, trong đó lý thuyết phức tạp được áp dụng cho an ninh mạng và ví dụ này chứa một số sắc thái / sự tinh tế đáng kể có thể xảy ra trong lĩnh vực này. Điều này về cơ bản tương tự như một "cuộc tấn công tiêm chích" trong đó một số yếu tố đầu vào bất ngờ gây ra hành vi bệnh lý hoặc làm sập hệ thống hoặc khiến nó mất nhiều thời gian bất thường.

Wikipedia có 15 loại tấn công từ chối dịch vụcuộc tấn công này rơi vào "lũ cấp ứng dụng" trong danh sách đó. Một ví dụ khác có phần tương tự là một cuộc tấn công lấp đầy nhật ký ứng dụng.

Một cách khắc phục cho các cuộc tấn công tiêm là "làm sạch đầu vào". Nhà thiết kế ứng dụng có thể đánh giá lại nếu cần thiết phải biên dịch các biểu thức tùy ý được cung cấp bởi người dùng có khả năng gây hại. Chỉ cần tước bỏ các biểu thức lồng nhau trong biểu thức chính quy hoặc một số giới hạn tương tự khác có lẽ là đủ để tránh cuộc tấn công này. Mặc dù chúng là bản chất của rất nhiều phần mềm hiện đại, một lượng lớn chức năng có thể được cung cấp mà không cần đánh giá các biểu thức thông thường. Các vấn đề bối cảnh, một số ứng dụng sẽ không yêu cầu bảo mật như vậy.

Một cách tiếp cận khác để cải thiện khả năng chịu lỗi / khả năng phục hồi được áp dụng ở đây là thời gian chờ được chỉ định ở các cấp khác nhau của ngăn xếp / phân cấp phần mềm. Ý tưởng sẽ là chỉ định giới hạn thời gian / cpu hoặc hướng dẫn trong đánh giá biểu thức chính quy "trung bình" và chấm dứt sớm nếu vượt quá. Chúng có thể được thực hiện với các giải pháp tùy chỉnh nhưng không có nhiều phần mềm hoặc ngôn ngữ lập trình có thời gian chờ tích hợp hoặc khung cho mục đích này.

Dưới đây là một ví dụ hay về việc sử dụng thời gian chờ để cải thiện khả năng chịu lỗi và hiển thị thiết kế / kiến ​​trúc / POV ở mức độ cao để giảm thiểu các vấn đề như vậy: Dung sai lỗi trong khối lượng lớn, Hệ thống phân tán / Netflix. Nó không có gì liên quan cụ thể đến các biểu thức thông thường nhưng đó là điểm chính ở đây: hầu như bất kỳ / tất cả logic cấp độ ứng dụng có thể phù hợp với khung này hoặc một cái gì đó tương tự.

Bài viết này chỉ ra cách quay lại cụ thể có thể dẫn đến kết hợp regrec chậm. Regexps có nhiều tính năng khác nhau và người ta có thể cố gắng đánh giá cái nào dẫn đến hành vi xấu nhất.

Dưới đây là một khảo sát khoa học tốt đẹp về chủ đề cụ thể này với (các) giải pháp phân tích tĩnh được đề xuất:

  • Phân tích tĩnh cho thời gian chạy biểu thức theo hàm mũ thông thường thông qua các logic logic cấu trúc / Rathnayake, Thielecke

    Kết hợp biểu thức chính quy bằng cách sử dụng quay lui có thể có thời gian chạy theo cấp số nhân, dẫn đến một cuộc tấn công phức tạp thuật toán được gọi là REDoS trong tài liệu bảo mật hệ thống. Trong bài báo này, chúng tôi xây dựng trên một phân tích tĩnh được công bố gần đây để phát hiện xem một biểu thức chính quy đã cho có thể có thời gian chạy theo cấp số nhân cho một số đầu vào hay không. Chúng tôi xây dựng một cách có hệ thống một phân tích chính xác hơn bằng cách hình thành các quyền hạn và sản phẩm của các mối quan hệ chuyển đổi và do đó làm giảm vấn đề REDoS thành khả năng tiếp cận. Tính chính xác của phân tích được chứng minh bằng cách sử dụng phép tính cấu trúc của các cây tìm kiếm, trong đó sự phân nhánh của cây gây ra hiện tượng nổ theo cấp số nhân được đặc trưng như một dạng phi tuyến tính.


Câu trả lời này có vẻ bối rối về một số khía cạnh của ReDos. 1. ReDoS không liên quan gì đến một cuộc tấn công tiêm chích. Các cuộc tấn công tiêm chích (ví dụ: XSS, SQL tiêm, lệnh tiêm, v.v.) hoàn toàn khác nhau. 2. ReDos không phải là về regexps độc hại được gửi bởi một kẻ thù. Thông thường, biểu thức chính quy được mã hóa cứng trong chương trình (do nhà phát triển cung cấp) và chuỗi đầu vào được cung cấp bởi người dùng. Vấn đề không thể được giải quyết một cách hợp lý bằng xác nhận đầu vào, bởi vì thông thường không có chính sách xác thực đầu vào rõ ràng nào đủ để loại bỏ vấn đề.
DW

nghĩ rằng số điểm của bạn cho kỹ thuật / tách tóc dựa trên tài liệu tham khảo ReDos & nhớ rừng cho cây. nó tương tự như "các cuộc tấn công tiêm thủ công". câu trả lời chỉ ra rằng có những lựa chọn thay thế cho việc sử dụng regexps trong mã. phân tích tĩnh có thể tìm thấy "regexps ác". tất cả các điểm của câu trả lời là hợp lệ. một câu như "điển hình là regrec được mã hóa cứng trong chương trình (do nhà phát triển cung cấp) và chuỗi đầu vào được cung cấp bởi người dùng" không khớp chính xác với bản ghi ReDos mơ hồ hơn ở những nơi và không đề cập đến kẻ tấn công độc hại, v.v. .
vzn
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.