Tổng quanMột điều kiện tràn bộ đệm tồn tại khi một chương trình cố gắng để đặt thêm dữ liệu vào một bộ đệm hơn nó có thể lưu trữ hoặc khi một chương trình cố gắng để các dữ liệu trong một khu vực bộ nhớ qua một bộ đệm. Trong trường hợp này, một bộ đệm là đoạn tuần tự của bộ nhớ được cấp phát cho có chứa bất cứ điều gì từ một nhân vật chuỗi để một loạt các số nguyên. Viết bên ngoài giới hạn của một khối được phân bổ bộ nhớ có thể làm hỏng dữ liệu, tai nạn chương trình, hoặc gây ra việc thực hiện các mã độc hại.Mô tảLỗi tràn bộ đệm có lẽ là hình thức nổi tiếng nhất của phần mềm bảo mật dễ bị tổn thương. Hầu hết các nhà phát triển phần mềm biết những gì một lỗ hổng tràn bộ đệm là, nhưng tấn công tràn bộ đệm chống lại cả cũ và mới được phát triển các ứng dụng vẫn còn khá phổ biến. Một phần của vấn đề là do sự đa dạng trong cách tràn bộ đệm có thể xảy ra, và một phần là do các kỹ thuật dễ bị lỗi thường được sử dụng để ngăn chặn chúng.Tràn bộ đệm không phải là dễ dàng để khám phá và ngay cả khi một phát hiện, nó nói chung là vô cùng khó khăn để khai thác. Tuy nhiên, kẻ tấn công có quản lý để xác định tràn bộ đệm trong một mảng đáng kinh ngạc của sản phẩm và thành phần.Trong một khai thác lỗi tràn bộ đệm cổ điển, những kẻ tấn công sẽ gửi dữ liệu đến một chương trình, nó lưu trữ trong một bộ đệm nhỏ hơn cở thường ngăn xếp. Kết quả là rằng thông tin trên chồng gọi ghi đè, bao gồm các chức năng trả lại con trỏ. Các dữ liệu bộ giá trị của con trỏ trở lại vì vậy rằng khi chức năng trả về, nó chuyển kiểm soát để mã độc hại có trong dữ liệu của kẻ tấn công.Mặc dù loại lỗi tràn bộ đệm ngăn xếp là vẫn còn phổ biến trên một số nền tảng và trong một số cộng đồng phát triển, có rất nhiều của các loại lỗi tràn bộ đệm, bao gồm cả đống lỗi tràn bộ đệm và Off-của-một lỗi trong số những người khác. Một lớp học rất tương tự như lỗ hổng được gọi là định dạng chuỗi tấn công. Có là một số cuốn sách tuyệt vời mà cung cấp thông tin chi tiết về làm thế nào lỗi tràn bộ đệm tấn công việc, bao gồm cả tòa nhà an toàn phần mềm [1], viết mã an toàn [2], và The Shellcoder Handbook [3].Ở mức độ mã, bộ đệm tràn lỗ hổng thường liên quan đến việc vi phạm của các giả định một lập trình viên. Nhiều chức năng thao tác bộ nhớ bằng C/C++ không thực hiện các giới hạn kiểm tra và có thể dễ dàng ghi đè lên các giới hạn được phân bổ của bộ đệm họ hoạt động on. Chức năng thậm chí bị chặn, chẳng hạn như strncpy(), có thể gây ra lỗ hổng khi được sử dụng không chính xác. Sự kết hợp của thao tác bộ nhớ và các giả định sai lầm về kích thước hoặc trang điểm của một phần dữ liệu là nguyên nhân gốc rễ của hầu hết các tràn bộ đệm.Lỗi tràn bộ đệm lỗ hổng thường xảy ra trong mã đó:Dựa trên các dữ liệu bên ngoài để kiểm soát hành vi của nóPhụ thuộc vào tính chất của các dữ liệu được thi hành bên ngoài phạm vi ngay lập tức của mãLà rất phức tạp rằng một lập trình viên không thể dự đoán chính xác hành vi của nóLỗi tràn bộ đệm và ứng dụng WebKẻ tấn công sử dụng tràn bộ đệm để tham nhũng chồng thực hiện một ứng dụng web. Bằng cách gửi một cách cẩn thận crafted đầu vào cho một ứng dụng web, một kẻ tấn công có thể gây ra các ứng dụng web để thực thi mã tùy ý-có hiệu quả việc trên máy.Lỗi tràn bộ đệm có thể được xuất hiện trong máy chủ web hoặc máy chủ ứng dụng sản phẩm phục vụ các khía cạnh tĩnh và năng động của các trang web, hoặc các ứng dụng web riêng của mình. Tràn bộ đệm tìm thấy trong các máy chủ được sử dụng nhiều sản phẩm có khả năng trở thành được biết đến rộng rãi và có thể gây nguy hiểm đáng kể cho người dùng của các sản phẩm này. Khi ứng dụng web sử dụng thư viện, chẳng hạn như một thư viện đồ họa để tạo ra hình ảnh, họ mở bản thân để tiềm năng tấn công tràn bộ đệm.Tràn bộ đệm cũng có thể được tìm thấy trong ứng dụng web tùy chỉnh mã, và có thể thậm chí được nhiều khả năng cho thiếu của giám sát ứng dụng web thường đi qua. Lỗi tràn bộ đệm trong ứng dụng web tùy chỉnh ít có khả năng được phát hiện bởi vì sẽ thường có ít hơn đến nay tin tặc cố gắng tìm và khai thác các lỗ hổng trong một ứng dụng cụ thể. Nếu phát hiện trong một ứng dụng tùy chỉnh, khả năng khai thác lỗ hổng (khác hơn để sụp đổ các ứng dụng) được giảm đáng kể bởi thực tế là các mã nguồn và thông báo lỗi chi tiết cho các ứng dụng thường không có sẵn để các hacker.Hậu quảThể loại: tình trạng sẵn có: Tràn bộ đệm thường dẫn đến tai nạn. Các cuộc tấn công dẫn đến thiếu sẵn có là có thể, bao gồm cả việc đưa chương trình vào một vòng lặp vô hạn.Truy cập điều khiển (hướng dẫn chế biến): tràn bộ đệm thường có thể được sử dụng để thực thi mã tùy ý, mà thường là bên ngoài phạm vi của chính sách bảo mật tiềm ẩn của chương trình.Khác: Khi các hậu quả là tùy ý mã thực hiện, điều này có thể thường được sử dụng để subvert bất kỳ dịch vụ nào khác của an ninh.Thời gian tiếp xúcYêu cầu đặc điểm kỹ thuật: sự lựa chọn có thể được thực hiện để sử dụng một ngôn ngữ đó không phải là dễ bị những vấn đề này.Thiết kế: Giảm nhẹ các công nghệ như Két an toàn-chuỗi thư viện và container abstractions có thể được giới thiệu.Thực hiện: Nhiều logic lỗi có thể dẫn đến tình trạng này. Nó có thể trầm trọng hơn do thiếu hoặc mis¬use của giảm nhẹ công nghệ.Môi trường bị ảnh hưởngHầu như tất cả các máy chủ web nổi tiếng, máy chủ ứng dụng và web ứng dụng môi trường là dễ bị tràn bộ đệm, ngoại lệ đáng chú ý là môi trường viết bằng các ngôn ngữ diễn giải như Java hay Python, đó là miễn dịch với các cuộc tấn công (ngoại trừ tràn trong Interpretor chính nó).Nền tảngNgôn ngữ: C, c + +, Fortran, lắp rápHoạt động nền tảng: tất cả, mặc dù các biện pháp phòng ngừa một phần có thể được triển khai, tùy thuộc vào môi trường.Yêu cầu tài nguyênBất kỳMức độ nghiêm trọngRất caoKhả năng khai thácCao rất caoLàm thế nào để xác định xem bạn dễ bị tổn thươngĐối với sản phẩm máy chủ và thư viện, theo kịp với các báo cáo lỗi mới nhất cho các sản phẩm bạn đang sử dụng. Phần mềm ứng dụng tùy chỉnh, tất cả các mã chấp nhận đầu vào từ người dùng thông qua yêu cầu HTTP phải được xem xét để đảm bảo rằng nó có thể xử lý đúng tùy tiện lớn đầu vào.Làm thế nào để tự bảo vệ mìnhTheo kịp với các báo cáo lỗi mới nhất cho trang web của bạn và sản phẩm máy chủ ứng dụng và các sản phẩm khác trong cơ sở hạ tầng Internet của bạn. Áp dụng các bản vá lỗi mới nhất cho các sản phẩm này. Định kỳ quét trang web của bạn với một hoặc nhiều các máy quét phổ biến có sẵn mà tìm lỗi tràn bộ đệm trong sản phẩm máy chủ của bạn và các ứng dụng web tùy chỉnh của bạn. Cho mã tùy chỉnh các ứng dụng của bạn, bạn cần phải xem xét tất cả các mã chấp nhận đầu vào từ người dùng thông qua yêu cầu HTTP và đảm bảo rằng nó cung cấp kích thước phù hợp kiểm tra trên tất cả các đầu vào như vậy. Điều này nên được thực hiện ngay cả đối với môi trường mà không phải là dễ bị tấn công như vậy như đầu vào quá lớn mà còn tự do vẫn còn có thể gây ra từ chối dịch vụ hoặc các vấn đề hoạt động khác.Yếu tố nguy cơTBDVí dụVí dụ 1.aMẫu mã sau đây cho thấy một lỗi tràn bộ đệm đơn giản thường được gây ra bởi các kịch bản đầu tiên trong đó mã dựa trên các dữ liệu bên ngoài để kiểm soát hành vi của nó. Mã sử dụng các chức năng gets() để đọc một lượng dữ liệu tùy ý vào bộ đệm ngăn xếp. Vì không có cách nào để hạn chế số lượng dữ liệu được đọc bởi chức năng này, sự an toàn của bộ luật phụ thuộc vào người sử dụng để luôn luôn nhập ít hơn so với BUFSIZE nhân vật. ... Char buf [BUFSIZE]; Gets(BUF); ...Ví dụ 1.bVí dụ này cho thấy cách dễ dàng nó là bắt chước hành vi không an toàn của các chức năng gets() trong C++ bằng cách sử dụng các >> nhà điều hành để đọc đầu vào thành một chuỗi char []. ... Char buf [BUFSIZE]; cin >> (buf); ...Ví dụ 2Mã trong ví dụ này cũng dựa vào người dùng nhập vào để kiểm soát hành vi của nó, nhưng nó thêm một mức độ về mình với việc sử dụng bộ nhớ bị chặn sao chép chức năng memcpy(). Chức năng này chấp nhận một bộ đệm điểm đến, một bộ đệm nguồn, và số lượng byte để sao chép. Bộ đệm đầu vào là đầy bằng một cuộc gọi bị chặn để read(), nhưng người dùng chỉ định số byte memcpy() đó sao. ... Char buf [64], tại [MAX_SIZE]; printf ("Enter đệm nội dung:
"); đọc (0, trong, MAX_SIZE-1); printf ("byte để bản sao:
"); scanf ("%d", & byte); memcpy (buf, theo, byte); ...Lưu ý: Loại dễ bị tổn thương tràn bộ đệm (nơi một chương trình đọc dữ liệu và sau đó tín thác một giá trị từ dữ liệu trong bộ nhớ sau đó hoạt động trên các dữ liệu còn lại) đã bật lên với một số tần suất trong hình ảnh, âm thanh, và tập tin xử lý thư viện.Ví dụ 3Đây là một ví dụ về các kịch bản thứ hai, trong đó mã phụ thuộc vào tính chất của dữ liệu chưa được xác minh tại địa phương. Trong ví dụ này là một hàm được đặt tên theo lccopy() mất một chuỗi như là đối số của nó và trả về một bản sao đống phân bổ của chuỗi với tất cả các ký tự chữ hoa chuyển đổi sang chữ thường. Các chức năng thực hiện không có giới hạn kiểm tra trên đầu vào của nó bởi vì nó sẽ str để luôn luôn nhỏ hơn BUFSIZE. Nếu một kẻ tấn công đi qua kiểm tra trong mã mà gọi lccopy(), hoặc nếu một sự thay đổi trong rằng mã sẽ làm công việc giả định về kích thước của str sai sự thật, sau đó lccopy() sẽ tràn buf với cuộc gọi chặn để strcpy(). Char * lccopy (const char * str) {} Char buf [BUFSIZE]; Char * p; strcpy (buf, str); cho (p = buf; * p; p ++) {} Nếu (isupper(*p)) {} * p = tolower(*p); } } trở lại strdup(buf); }Ví dụ 4Mã sau đây cho thấy các kịch bản thứ ba, trong đó mã là rất phức tạp, hành vi của nó không thể được dễ dàng dự đoán. Mã này từ bộ giải mã hình ảnh phổ biến libPNG, được sử dụng bởi một mảng rộng các ứng dụng, bao gồm một số phiên bản của Internet Explorer và Mozilla.Các mã xuất hiện để thực hiện một cách an toàn các giới hạn kiểm tra vì nó kiểm tra kích thước của độ dài biến, nó sau đó sử dụng để kiểm soát số lượng dữ liệu đã sao chép bởi png_crc_read(). Tuy nhiên, ngay lập tức trước khi nó kiểm tra chiều dài, mã thực hiện một kiểm tra về png_ptr -> chế độ, và nếu điều này kiểm tra thất bại một cảnh báo đã được ban hành và tiếp tục xử lý. Bởi vì chiều dài được thử nghiệm trong một khác nếu khối, chiều dài sẽ không được kiểm tra nếu là người đầu tiên kiểm tra thất bại, và được dùng một cách mù quáng trong các cuộc gọi đến png_crc_read(), có khả năng cho phép một lỗi tràn bộ đệm ngăn xếp.Mặc dù mã trong ví dụ này không phải là phức tạp nhất, chúng tôi đã thấy,
đang được dịch, vui lòng đợi..