2010-10-03 28 views
6

Tôi đã nghe lý thuyết. Địa chỉ không gian Địa chỉ Ngẫu nhiên nhận thư viện và tải chúng tại các vị trí ngẫu nhiên trong không gian địa chỉ ảo, để trong trường hợp hacker tìm thấy lỗ hổng trong chương trình của bạn, anh ta không có địa chỉ đã biết trước để thực thi một cuộc tấn công trở về-libc chống lại, ví dụ. Nhưng sau khi suy nghĩ về nó trong một vài giây, nó không có ý nghĩa như một biện pháp phòng thủ.ASLR có thể có hiệu quả như thế nào?

Giả sử TargetLib giả định của chúng tôi (libc hoặc bất kỳ thứ gì khác mà hacker tìm kiếm) được tải tại địa chỉ ngẫu nhiên thay vì địa chỉ xác định. Bây giờ các hacker không biết trước thời gian mà TargetLib và các thói quen bên trong nó, nhưng cũng không phải mã ứng dụng. Nó cần phải có một số loại bảng tra cứu một nơi nào đó trong nhị phân để tìm các thói quen bên trong của TargetLib, và đó phải được ở một vị trí xác định. (Hoặc tại một địa điểm ngẫu nhiên, được chỉ định bởi một thứ khác. Bạn có thể thêm bao nhiêu người theo ý muốn, nhưng cuối cùng bạn phải bắt đầu tại một địa điểm đã biết.)

Điều này có nghĩa là thay vì chỉ mã tấn công của mình vị trí được biết đến của TargetLib, tất cả các hacker cần làm là trỏ mã tấn công của mình vào mục tra cứu của bảng ứng dụng cho TargetLib và dereference con trỏ đến thường trình đích, và cuộc tấn công không bị cản trở.

Có điều gì đó về cách ASLR hoạt động mà tôi không hiểu không? Bởi vì như được mô tả, tôi không thấy nó là gì hơn là một vết sưng tốc độ, cung cấp hình ảnh về an ninh nhưng không có chất thực sự. Tui bỏ lỡ điều gì vậy?

Trả lời

2

Tôi tin rằng điều này có hiệu quả vì nó thay đổi địa chỉ cơ sở của thư viện được chia sẻ. Nhớ lại rằng các hàm đã nhập từ một thư viện chia sẻ được vá vào ảnh thực thi của bạn khi nó được nạp, và do đó không có bảng, chỉ các địa chỉ cụ thể trỏ vào dữ liệu và mã nằm rải rác trong suốt mã của chương trình.

Nó tăng thanh cho một cuộc tấn công hiệu quả bởi vì nó làm cho một overrun đệm đơn giản (nơi địa chỉ trả về trên ngăn xếp có thể được đặt) vào một nơi overrun phải chứa mã để xác định vị trí chính xác và sau đó jmp vào nó . Có lẽ điều này chỉ làm cho nó khó hơn. Hầu như tất cả các tệp DLL trong Windows đều được biên dịch cho một địa chỉ cơ sở mà chúng có thể sẽ không chạy và sẽ được di chuyển, nhưng các Windows lõi có khuynh hướng được tối ưu hóa địa chỉ cơ sở của chúng để không cần di chuyển.

+1

Bạn đã bao giờ gỡ lỗi Windows EXE ở cấp ASM chưa? Có một bảng nhập thực sự trong đó. Trình nạp không vá mã, (tất cả các nơi mã của bạn có thể gọi một số thường trình bên ngoài), nó vá bảng nhập khẩu, về cơ bản là một chuỗi dài các lệnh JMP, trình biên dịch tạo ra các CALL. –

+0

Bộ nhớ không chỉ chia sẻ của nó ... – rook

+0

@Mason Wheeler - không phải trong một thời gian dài, nhưng đó là điều tốt để biết. Trong khi đó làm cho nó dễ dàng hơn để xác định một địa chỉ cụ thể hiệu ứng ròng là giống nhau phải không? Nó thay đổi được biết đến là một ẩn số, mà chỉ đơn giản là làm cho cuộc tấn công khó khăn hơn. –

1

Tôi không biết liệu bạn có đúng câu hỏi hay không nhưng tôi sẽ giải thích khi nào ASLR có hiệu quả và khi nào thì không.

Giả sử chúng ta có app.exe và TargetLib.dll. app.exe đang sử dụng (liên kết đến) TargetLib.dll. Để giải thích đơn giản, giả sử rằng không gian địa chỉ ảo chỉ có 2 mô-đun này.

Nếu cả hai đều được bật ALSR, địa chỉ cơ sở của app.exe không xác định. Nó có thể giải quyết một số địa chỉ cuộc gọi chức năng khi nó được tải nhưng kẻ tấn công không biết vị trí của hàm cũng như các biến được giải quyết ở đâu. Điều tương tự cũng xảy ra khi TargetLib.dll được tải. Mặc dù app.exe có bảng tra cứu, kẻ tấn công không biết bảng đó ở đâu.

Vì kẻ tấn công không thể biết nội dung của địa chỉ cụ thể anh ta phải tấn công ứng dụng mà không sử dụng bất kỳ thông tin địa chỉ cố định nào. Nó thường khó hơn nếu anh ta sử dụng phương pháp tấn công thông thường như tràn ngăn xếp, tràn heap, sử dụng sau khi miễn phí ...

Mặt khác, nếu app.exe KHÔNG được kích hoạt ASLR, nó dễ dàng hơn nhiều đối với kẻ tấn công để khai thác ứng dụng. Bởi vì có thể có một cuộc gọi hàm tới một API thú vị tại địa chỉ cụ thể trong ứng dụng.exe và kẻ tấn công có thể sử dụng địa chỉ như một địa chỉ đích để nhảy. (Tấn công một ứng dụng thường bắt đầu từ nhảy đến địa chỉ tùy ý.).

Bổ sung: Có thể bạn đã hiểu nhưng tôi muốn làm rõ một điều. Khi kẻ tấn công khai thác một ứng dụng bằng lỗ hổng như tham nhũng bộ nhớ, anh ta thường bị buộc phải sử dụng fixed address jump instruction. Họ không thể sử dụng hướng dẫn relative address jump để khai thác. Đây là lý do tại sao ALSR thực sự hiệu quả cho việc khai thác như vậy.

+0

Được rồi. Đó là điểm cuối cùng mà tôi không nhận được. Tại sao kẻ tấn công có thể sử dụng 'địa chỉ cố định nhảy' (đó là một opcode ASM) nhưng không phải' địa chỉ tương đối nhảy' (mà chỉ là một opcode ASM)? Có một số khác biệt kỳ diệu ở đó mà tôi không biết? –

+1

Vâng, để giải thích nó trước tiên bạn hiểu cách khai thác như vậy hoạt động. Một ví dụ điển hình là tràn bộ đệm điển hình và địa chỉ trả về sẽ ghi đè lên. Tôi không giải thích chi tiết ở đây nhưng điểm chính là những gì kẻ tấn công làm là ghi đè lên 'địa chỉ trả về' với một số giá trị cố định. Khi dòng chảy thực hiện thoát khỏi hàm dễ bị tấn công, nó nhảy tới địa chỉ ghi đè. Bước nhảy này luôn luôn là 'nhảy địa chỉ cố định' chứ không phải' nhảy tương đối'. Có thể có một số lỗ hổng mà bạn có thể sử dụng 'jump tương đối' để khai thác nhưng chúng hiếm khi xảy ra. –

+1

Nói cách khác, những gì một kẻ tấn công có thể làm là chỉ làm hỏng 'dữ liệu' không' chỉ dẫn'. Để khai thác một ứng dụng, chúng làm hỏng 'dữ liệu' được sử dụng bởi lệnh 'nhảy địa chỉ cố định'. Kẻ tấn công làm gì là giải mã shellcode (mã họ muốn thực hiện) và nhảy vào shellcode. Trong shellcode, chúng có thể sử dụng các bước nhảy tương đối nhưng trong trường hợp ASLR nhảy tới shellcode thì chính nó là vấn đề khó. –

Các vấn đề liên quan