Lỗi tràn bộ đệm của phần mềm flexnet
Lỗi tràn bộ đệm (Buffer Overflow) là một điều kiện bất thường khi tiến trình lưu trữ dữ liệu vượt ra ngoài biên của bộ nhớ đệm có chiều dài cố định. Kết quả là dữ liệu có thể đè lên các bộ nhớ liền kề. Dữ liệu bị ghi đè có thể bao gồm các bộ nhớ đệm khác, các biến và dữ liệu điều khiển luồng chảy của cả chương trình (program flow control). Show 2. Nguyên Nhân
3. Tác HạiLỗi tràn bộ đệm xảy ra khi một ứng dụng cố gắng ghi dữ liệu vượt khỏi phạm vi bộ đệm (giới hạn cuối hoặc cả giới hạn đầu của bộ đệm). Lỗi tràn bộ đệm có thể khiến ứng dụng ngừng hoạt động, gây mất dữ liệu hoặc thậm chí giúp kẻ tấn công kiểm soát hệ thống hoặc tạo cơ hội cho kẻ tấn công thực hiện nhiều thủ thuật khai thác khác nhau. 4. Các kiểu lỗi Buffer Overflow thường gặp.
5. Các kiểu khai thác lỗi Buffer OverflowKhai thác lỗi tràn bộ đệm trên stack:
Khai thác lỗi tràn bộ đệm trên heapMột hiện tường tràn bộ đệm xảy ra trong khu vực dữ liệu heap được gọi là hiện tượng tràn heap và có thể khai thác được bằng các kỹ thuật khác với các lỗi tràn stack.
Một số cách khai thác khác.
6. CÁCH PHÁT HIỆN LỖI Buffer Overflow.Công nghệ biên dịch lý tưởng nhất để phát hiện là dùng chương trình C hoặc C++ để biết được thông tin về kích thước của dữ liệu trong mã nguồn. Một số thông tin có thể xuất phát từ lời khai báo của các biến, mô tả kiểu biến được sử dụng. Các thông tin khác đến từ các lệnh gọi chức năng trong chương trình. Trình biên dịch cần phải hiểu tất cả các thông tin này để tạo ra mã đúng. Trong ví dụ trên, trình biên dịch có thể hiểu một đại diện trong gian (IR) có kích thước bộ đệm là 10 và nó biết rằng dữ liệu đến từ một tham số quen thuộc. Tuy nhiên, nếu chỉ nhìn vào các tham số đó sẽ không đủ thông tin để biết làm thế nào các dữ liệu được đại diện từ số bé đến số lớn. Trình biên dịch tối ưu hóa điều này bằng các bước tạo mã code. Đầu tiên, nhìn vào tất cả các mã code trong dòng tiếp theo. Tiếp theo là tìm vào các đoạn mã từ những lệnh gọi thường xuyên. Và nó được gọi là phân tích interprocedural. Hoặc: Các yourfunc() gọi myfunc() trong bộ đệm địa phương của mình chứa đầu vào dữ liệu. Sử dụng phân tích interprocedural, trình biên dịch xây dựng một đồ thị kết nối yourfunc() với myfunc() bằng cách kết hợp kiến thức của yourfunc() và myfunc(). Và có thể hiểu rằng nó đang cố gắng để sao chép 50 byte dữ liệu vào bộ đệm 10byte dữ liệu. Và như vậy lỗi tràn bộ đệm có thể xảy ra. Tưởng tượng “ yourbuffer” sẽ bị đầy như sau: fread (yourbuffer, 1, 49, file); Một trình biên dịch mà hiểu các thuộc tính của thư viện thời gian tiêu chuẩn sẽ biết rằng bộ đệm bây giờ chứa dữ liệu từ một thời điểm không xác định trong hệ thống tập tin bên ngoài chương trình và có khả năng bị nguy hiểm. Mã myfunc() chính là mã mở cửa cho một cuộc tấn công độc hại và yourbuffer được làm đầy với một chuỗi liên tục. Sử dụng phân tích mã nguồn để tìm lỗi tràn bộ đệm trong mã thực thi một cách chính xác đòi hỏi phải hiểu biết sâu về code. Và công nghệ của trình biên dịch được thiết kế với mục đích tìm kiếm lỗi tràn bộ đệm. Nó hiệu quả và chính xác hơn các phương pháp khác và cung cấp các cách nhìn sâu sắc về tình trạng bảo mật của từng đoạn mã mà nó phân tích. 7. Biện pháp ngăn chặnViệc xử lý bộ đệm trước khi đọc hay thực thi có thể làm thất bại các cuộc khai thác lỗi tràn bộ đệm nhưng vẫn không ngăn chặn được một cách tuyệt đối. Việc xử lý bao gồm: |