2010-05-26 44 views
16

Có ai có giải thích chi tiết về cách số nguyên có thể được khai thác không? Tôi đã đọc rất nhiều về khái niệm, và tôi hiểu nó là gì, và tôi hiểu tràn bộ đệm, nhưng tôi không hiểu cách người ta có thể sửa đổi bộ nhớ một cách đáng tin cậy, hoặc theo cách sửa đổi luồng ứng dụng, bằng cách tạo một số nguyên lớn hơn bộ nhớ được xác định của nó ....Làm thế nào là tràn số nguyên có thể khai thác?

+0

Một [có thể khai thác không liên quan đến thao tác mảng/bộ nhớ] (http://news.cnet.com/8301-17852_3-57341753-71/man-wins-$57-million-casino-says-software-glitch /). Số tiền chiến thắng của anh ấy, 43 triệu euro là đáng ngờ gần với 2^32 = 4294967296 mà chúng ta đều quen thuộc, và đánh giá cao rằng sự trục trặc có thể do một số nguyên tràn. –

Trả lời

14

Nó chắc chắn là có thể khai thác, nhưng phụ thuộc vào hoàn cảnh của khóa học.

Phiên bản cũ ssh có tràn số nguyên có thể được khai thác từ xa. Khai thác đã gây ra ssh daemon để tạo ra một hashtable có kích thước bằng không và ghi đè lên bộ nhớ khi nó cố gắng lưu trữ một số giá trị trong đó.

tin chi tiết về tràn ssh số nguyên: http://www.kb.cert.org/vuls/id/945216

tin chi tiết về tràn số nguyên: http://projects.webappsec.org/w/page/13246946/Integer%20Overflows

+4

+1 Thông tin thêm có tại đây http://www.owasp.org/index.php/Integer_overflow – Shaji

+1

như ví dụ được giải thích dưới đây bởi Ira Baxter, nó phải là một tình huống cụ thể như thế - nơi bạn trên/dưới dòng một số nguyên khi phân bổ một mảng băm/đệm/mảng cho phép bạn truy cập vào bộ nhớ mà bạn không có quyền truy cập, sau đó có cách tính FP, v.v. – wuntee

+0

@wuntee: Tôi không nghĩ có bất kỳ điểm nào cố thu hẹp bộ nhớ như vậy . Mỗi tình huống là khác nhau. Những người có tài nguyên tìm mọi cách mà người ta không thể tưởng tượng được! Tôi nhớ trong netscape có một lỗi off-by-one duy nhất ghi đè một byte đơn với một khoảng trắng. Mọi người đã có thể khai thác nó! –

3

Nó phụ thuộc vào cách biến được sử dụng. Nếu bạn không bao giờ đưa ra bất kỳ quyết định bảo mật nào dựa trên số nguyên bạn đã thêm vào với số nguyên đầu vào (nơi đối thủ có thể kích hoạt tràn), thì tôi không thể nghĩ bạn sẽ gặp rắc rối như thế nào (nhưng loại công cụ này có thể tinh tế).

Sau đó, một lần nữa, tôi đã thấy rất nhiều mã như thế này mà không xác thực người dùng nhập vào (mặc dù ví dụ này là giả tạo):

int pricePerWidgetInCents = 3199; 
int numberOfWidgetsToBuy = int.Parse(/* some user input string */); 
int totalCostOfWidgetsSoldInCents = pricePerWidgetInCents * numberOfWidgetsToBuy; // KA-BOOM! 

// potentially much later 
int orderSubtotal = whatever + totalCostOfWidgetInCents; 

Mọi thứ đều hunky-dory cho đến ngày bạn bán 671.299 widget cho - $ 21,474,817,95. Boss có thể khó chịu.

+1

có, nhưng làm thế nào để bạn sử dụng điều đó cho lợi thế của bạn? làm thế nào bạn có thể làm điều đó để ghi đè lên con trỏ khung - ví dụ ... – wuntee

+0

một ví dụ tốt hơn sẽ là: int arraySize = [một số người dùng đầu vào]; int array [arraySize]; – wuntee

+3

Bạn không thể sử dụng ví dụ này để ghi đè con trỏ khung.Bạn có thể, tuy nhiên, sử dụng nó để ăn cắp 42 triệu đô la, mà vẫn đang khai thác một vấn đề an ninh. –

11

Tôi đã sử dụng APL/370 vào cuối những năm 60 trên IBM 360/40. APL là ngôn ngữ, trong đó chủ yếu mọi thứ đều là mảng đa chiều và có các toán tử tuyệt vời để thao tác mảng, bao gồm định lại kích thước từ thứ nguyên N sang kích thước M, v.v.

Không có gì đáng ngạc nhiên, một tham số N có chỉ số 1. .k với một khác nhau dương k cho mỗi trục .. và k là hợp pháp luôn luôn nhỏ hơn 2^31 (giá trị dương trong một từ máy 32 bit đã ký). Bây giờ, một mảng các tham số N có vị trí được chỉ định trong bộ nhớ. Cố gắng truy cập vào một khe mảng bằng cách sử dụng một chỉ mục quá lớn cho một trục được kiểm tra đối với mảng trên bị ràng buộc bởi APL. Và tất nhiên điều này được áp dụng cho một loạt các thứ nguyên N trong đó N == 1.

APL không kiểm tra xem bạn có làm điều gì đó vô cùng ngu ngốc với nhà điều hành RHO (mảng định hình lại) hay không. APL chỉ cho phép tối đa 64 thứ nguyên. Vì vậy, bạn có thể tạo một mảng có kích thước 1-64 và APL sẽ làm điều đó nếu các tham số mảng đều nhỏ hơn 2^31. Hoặc, bạn có thể thử tạo một mảng có kích thước là . Trong trường hợp này, APL bị bẻ cong, và đáng ngạc nhiên đã trả về một mảng 64 chiều, nhưng không thể kiểm tra kích thước trục. (Điều này có hiệu lực khi xảy ra "tràn số nguyên"). Điều này có nghĩa là bạn có thể tạo một mảng có kích thước trục từ 2^31 trở lên ... nhưng được hiểu là số nguyên đã ký, chúng được coi là số âm.

Câu lệnh toán tử RHO phù hợp được áp dụng cho một mảng như vậy để có thể giảm thứ nguyên theo 1, với giới hạn trên, lấy giá trị này, "-1". Gọi ma trận này là "wormhole" (bạn sẽ thấy tại sao trong giây lát). Mảng wormhole như vậy có một vị trí trong bộ nhớ, giống như bất kỳ mảng nào khác. Nhưng tất cả các truy cập mảng được kiểm tra dựa trên giới hạn trên ... nhưng kiểm tra ràng buộc mảng hóa ra được thực hiện bởi một số unsigned được so sánh bởi APL. Vì vậy, bạn có thể truy cập WORMHOLE [1], WORMHOLE [2], ... WORMHOLE [2^32-2] mà không bị phản đối. Trong thực tế, bạn có thể truy cập toàn bộ bộ nhớ của máy.

APL cũng có một thao tác gán mảng, trong đó bạn có thể điền vào một mảng có giá trị. WORMHOLE [] < -0 do đó số không tất cả bộ nhớ.

Tôi chỉ thực hiện thao tác này một lần, vì nó xóa bộ nhớ chứa không gian làm việc APL của tôi, trình thông dịch APL và rõ ràng phần quan trọng của APL đã bật hẹn giờ (trong những ngày không được người dùng bảo vệ) ... thiết bị đầu cuối phòng đi từ trạng thái bình thường của máy móc rất ồn (chúng tôi đã có 2741 thiết bị đầu cuối Selectric APL) để chết im lặng trong khoảng 2 giây. Thông qua kính vào phòng máy tính tôi có thể thấy các nhà điều hành nhìn lên giật mình tại đèn trên 370 khi tất cả chúng đi ra ngoài. Rất nhiều runnning xung quanh sau đó.

Mặc dù lúc đó thật buồn cười, tôi vẫn ngậm miệng lại.

Với một số dịch vụ chăm sóc, người ta rõ ràng có thể đã giả mạo hệ điều hành theo các cách tùy ý.

+0

tôi chắc chắn có thể xem làm thế nào người ta có thể tận dụng lợi thế này (như bạn có thể truy cập tất cả bộ nhớ của máy). Tôi đoán ý tưởng là tất cả phụ thuộc vào tình hình cụ thể - trong này, ứng dụng không giới hạn kiểm tra việc phân bổ một mảng, nơi kích thước của mảng là một số nguyên. Tâm trí của tôi bị kẹt trên 'tràn bộ đệm' đơn giản và nghĩ rằng có một số cách để có 'int x = y + z * w' trong đó y và z và w là tất cả người dùng được định nghĩa, và trong câu lệnh đó bằng cách nào đó có thể ghi đè lên bộ nhớ một cách đáng tin cậy. – wuntee

+1

Vâng, ví dụ của tôi có ứng dụng * thực hiện * kiểm tra giới hạn về phân bổ mảng, nhưng thực tế việc kiểm tra bị đánh bại do có tràn trong mảng bị ràng buộc. Bạn có thể làm ví dụ của bạn làm việc như thế này: x = y + z; dữ liệu [x] trong đó tính toán cho x tràn. Trong C, không có khiếu nại; bạn nhận được theo định nghĩa @ (& data + x). Nếu bạn có thể đặt thành x thành bất kỳ thứ gì (do tràn), bạn có thể truy cập mọi thứ. –

3

Trường hợp thông thường sẽ là mã ngăn chặn tràn bộ đệm bằng cách yêu cầu số lượng đầu vào sẽ được cung cấp và sau đó cố gắng thực thi giới hạn đó. Hãy xem xét một tình huống mà tôi yêu cầu được cung cấp 2^30 + 10 số nguyên. Hệ thống nhận phân bổ bộ đệm 4 * (2^30 + 10) = 40 byte (!). Kể từ khi cấp phát bộ nhớ thành công, tôi được phép tiếp tục. Kiểm tra bộ đệm đầu vào sẽ không dừng tôi khi tôi gửi đầu vào thứ 11 của mình, kể từ 11 < 2^30 + 10. Tuy nhiên, tôi sẽ tràn bộ đệm thực sự được phân bổ.

2

Tôi chỉ muốn tóm tắt mọi thứ tôi đã tìm hiểu về câu hỏi ban đầu của mình.

Lý do thứ đều khó hiểu đối với tôi là vì tôi biết làm thế nào bộ đệm tràn công việc, và có thể hiểu được làm thế nào bạn có thể dễ dàng khai thác đó. Một tràn số nguyên là một trường hợp khác - bạn không thể khai thác tràn số nguyên để thêm mã tùy ý và buộc thay đổi trong luồng của ứng dụng.

Tuy nhiên, nó có thể tràn một số nguyên, được sử dụng - ví dụ - để chỉ một mảng để truy cập phần độc đoán của bộ nhớ. Từ đây, bạn có thể sử dụng mảng được lập chỉ mục sai đó để ghi đè bộ nhớ và làm cho việc thực thi một ứng dụng thay đổi mục đích độc hại của bạn.

Hy vọng điều này sẽ hữu ích.

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