Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 58 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
58
Dung lượng
5,02 MB
Nội dung
SỰ TRÀN BỘ NHỚ ĐỆM GVHD: Ths Lê Tự Thanh Nhóm 13: Phạm Nguyễn Thanh Hưng Hà Xuân Hải TIN TỨC BẢO MẬT THÔNG TIN TRONG TUẦN Lỗi ngày trở về 0 vượt qua sự kiểm soát của Người sử dụng Windows. Sự tràn bộ nhớ đệm cục bộ là thủ thuật đánh lừa hệ điều hành của Microsoft để hệ thống cấp quyền sử dụng riêng cho kẻ tấn công. Nhiều phiên bản của hệ điều hành Microsoft dễ bị tổn thương nhưng không được tiết lộ, việc tràn bộ đệm ngày về 0 có nguy cơ bị tổn thương mà qua đó cho phép một kẻ tấn công chiếm được quyền của hệ thống và kiểm soát máy tính. Theo nghiên cứu của công ty bảo mật Vupen, “vấn đề này gây ra bởi một lỗi tràn bộ đệm trong bộ xử lý ‘win32k.sys’ khi lưu trữ các giá trị registry đã được xử lý với ‘reg_binary’, mà qua đó có thể cho phép người dùng không có đặc quyền phá bỏ sự quản lý của hệ thống hoặc thực thi mã nhị phân với hạt nhân (hệ thống) đặc quyền, bằng cách thay đổi các giá trị registry liên quan tới người dùng cuối được xác định bằng ký tự (EUDC) qua phông chữ. Theo tổ chức nghiên cứu an ninh Chester Wisniewski tại Sophos, một kẻ tấn công có thể sử dụng mã khóa liên quan tới EUDC “để mạo danh tài khoản hệ thống, và có quyền truy cập gần như không giới hạn cho tất cả các thành phần của hệ thống Windows”. Sự tràn bộ nhớ đệm (BoF). Tràn bộ nhớ đệm trên stack (ngăn xếp) Tràn bộ nhớ đệm trên heap Điều khiển stack Các bước tràn bộ nhớ đệm Cách thức tấn công một chương trình thực Sự phá vỡ stack Ví dụ của tràn bộ nhớ đệm Làm cách nào khai thác sự biến đổi của việc tràn bộ nhớ đệm Xác định tràn bộ nhớ đệm Điều kiện kiểm tra tràn bộ nhớ đệm trên heap: heap.exe Các bước kiểm tra việc tràn bộ nhớ đệm trên stack trong chương trình sửa lỗi OllyDbg Công cụ phát hiện tràn bộ nhớ đệm Phòng chống tràn bộ nhớ đệm Công cụ đối phó với việc tràn bộ nhớ đệm Bút kiểm tra tràn bộ nhớ đệm CÁC CHỦ ĐỀ TRONG MODULE Khái niệm tràn bộ nhớ đệm Phương pháp luận tràn bộ nhớ đệm Ví dụ tràn bộ nhớ đệm Công cụ bảo mật tràn bộ nhớ đệm Phát hiện tràn bộ nhớ đệm Biện pháp đối phó tràn bộ đệm Bút kiểm tra tràn bộ nhớ đệm BIỂU ĐỒ MODULE Lỗi tràn bộ đệm tổng quát xảy ra khi một bộ nhớ đệm đã được phân chia cho một không gian lưu trữ cụ thể có chứa nhiều dữ liệu được sao chép vào lớn hơn mức mà nó có thể xử lý. Khi chương trình được biên dịch và chạy, nó sẽ chỉ định một phần của bộ nhớ có độ dài 11 bytes để chứa chuỗi tấn công. Hàm Strcpy sẽ sao chép chuỗi “DDDDDDDDDDDDDD” vào chuỗi tấn công, lúc này bộ đệm sẽ vượt quá kích thước 11 bytes, dẫn tới tràn bộ đệm. Đây là loại dễ bị tổn thương trong hệ thống dựa trên UNIX và NT. Phương thức kiểm tra biên không được thực hiện đầy đủ hoặc, trong nhiều trường hợp, chúng bị bỏ qua hoàn toàn. Ngôn ngữ lập trình, chẳng hạn như C, có các lỗ hổng bảo mật trong chính chúng. Chương trình và các ứng dụng không tuân thủ đúng các hoạt động mà chúng được lập trình. Các chức năng trong ngôn ngữ lập trình C như strcat(), strcpy(), sprintf(), vsprintf(), bcopy(), gets() và scanf() có thể bị khai thác như việc chúng không kiểm tra kích thước của bộ đệm. Tại Sao Các Chương Trình Và Ứng Dụng Dễ Bị Tổn Thương ? Stack sử dụng cơ chế Last-In- First-Out (vào sau ra trước) để truyền hàm tham số và tham chiếu với các biến cục bộ. Nó hoạt động như một bộ đệm, giữ tất cả các thông tin mà hàm cần. Được tạo ra vào thời điểm bắt đầu của hàm và giải phóng lúc kết thúc hàm. Phần dưới của bộ nhớ BP tại các nơi bên trong khung stack Phần trên của bộ nhớ Các điểm SP ở đây Hướng đi vào Hướng tăng của stack Tìm Hiểu Về Stack Bộ Đệm2 (biến cục bộ 2) Bộ Đệm1 (biến cục bộ 1) Điểm quay trở về Chức năng gọi các đối số Một Stack bình thường Stack khi bị kẻ tấn công gọi một chức năng Stack sau khi bị một chức năng phá hoại. Phần dưới của Stack Phần dưới của Stack Phần dưới của Stack Dữ liệu trên đoạn stack. Dữ liệu trên đoạn stack. Dữ liệu trên đoạn stack. Địa chỉ quay về Địa chỉ quay về mới Các dữ liệu khác trên đoạn stack Dữ liệu bị ghi đè trên đoạn stack Phần cuối của Stack Phần cuối của Stack Dữ liệu mới Một số dữ liệu có thể bị ghi đè Heap là một khu vực của bộ nhớ được sử dụng bởi một ứng dụng và được cấp phát động tại thời gian chạy của các hàm, chẳng hạn như malloc(). Các biến tĩnh được lưu trữ trên stack cùng với dữ liệu được giao, sử dụng giao diện malloc. Heap lưu trữ tất cả các trường hoặc thuộc tính, hàm tạo và phương thức của một lớp hoặc một đối tượng. Tìm Hiểu Về Heap Dung lượng Heap đơn giản Dung lượng bộ nhớ Trường điều khiển Trường điều khiển Dung lượng bộ nhớ Dung lượng bộ nhớ Trường điều khiển Nếu một ứng dụng sao chép dữ liệu mà không kiểm tra dù nó phù hợp với nơi được sao chép tới, thì kẻ tấn công có thể cung cấp một lượng lớn dữ liệu cho ứng dụng đó, thực hiện ghi đè lên thông tin quản lý của heap. Kẻ tấn công làm một bộ nhớ đệm bị tràn trên phần dưới của heap, ghi đè lên các biến động khác gây nên các biến đổi bất ngờ và không mong muốn. Sự Tràn Bộ Nhớ Đệm Trên Heap Lưu ý: trong hầu hết các môi trường, điều này sẽ cho phép kẻ tấn công kiểm soát được việc thực thi của chương trình. [...]... Chương Trình Hiểu biết về hoạt động của bộ nhớ stack và heap Hiểu biết về cách hệ thống gọi công việc ở cấp độ mã máy Kiến thức về lắp ráp và ngôn ngữ máy Quen với các công cụ biên dịch và sửa lỗi như gdb Kiến thức ngôn ngữ lập trình C và Perl Các Bước Tràn Bộ Đệm Bước 1 Tìm sự hiện diện và vị trí của lỗ hổng tràn bộ đệm Bước 3 Ghi đè lên địa chỉ quay về của hàm Bước 2 Ghi nhiều dữ liệu vào bộ đệm hơn... Giả sử rằng một hàm chuỗi bị khai thác, kẻ tấn công có thể gửi một chuỗi dài đầu vào Con trỏ trả về của hàm tiến hành ghi đè, và kẻ tấn công thành công trong việc thay đổi luồng thực hiện lệnh Nếu người sử dụng chèn vào mã đầu vào, anh ta hoặc cô ta có thể biết chính xác địa chỉ và kích thước của ngăn xếp và làm con trỏ trở về hướng tới đoạn mã của mình để thực hiện chỉ thị Chuỗi Định Dạng Có Vấn Đề... động quan trọng của ngăn xếp Push Đặt một mục lên trên đỉnh của ngăn xếp Hoạt động của Push và Pop Quay trở về nội dung được chỉ bởi con trỏ và thay đổi con trỏ Mở rộng con trỏ lệnh hiện hành (EIP) EIP trỏ đến đoạn mã mà bạn đang thực hiện Khi bạn gọi một hàm, chúng sẽ được lưu trữ trên ngăn xếp để sử dụng sau Mở rộng con trỏ Stack (ESP) ESP trỏ đến vị trí hiện tại trên ngăn xếp và cho phép vài thứ... chỉ trả về Tràn bộ nhớ đệm cho phép chúng ta thay đổi địa chỉ trả về của một hàm Khi hàm được thực hiện xong nó sẽ nhảy tới bất kỳ địa chỉ nào trên ngăn xếp Đặt một số mã trong bộ đệm và thiết lập địa chỉ trở về Một Khi Stack Bị Phá Vỡ Được phép truy cập Một khi quy trình dễ tổn thương bị chiếm, kẻ tấn công có các đặc quyền tương tự như quy trình và có thể điều khiển truy cập bình thường Sau đó anh ta... mã (e.g.: x++; x-; ?NOP NOP) Đối với “Các sự kiện chính” Áp dụng XOR để kết hợp mã với một khóa khó hiểu ngẫu nhiên cho IDS Các mã CPU cũng phải giải mã các mã không hiểu được trong thời gian chạy chương trình giải mã.Bởi thế, bộ giải mã trở thành đa hình và rất khó để phát hiện Đối với “Con trỏ quay về Ngẫu nhiên chỉnh sửa LSB của con trỏ hướng tới khu vực của NOP BIỂU ĐỒ MODULE Khái niệm tràn bộ... biến cục bộ trong các hàm hoặc các phương thức, và xác nhận sự có mặt của các ranh giới kiểm tra Nó là điều kiện cần thiết để kiểm tra việc sử dụng có phù hợp với các hàm tiêu chuẩn, đặc biệt là các việc liên quan tới chuỗi và đầu vào hoặc đầu ra Các hàm tiêu chuẩn Một cách khác là cung cấp các ứng dụng với số lượng lớn dữ liệu và kiểm tra các hành vi bất thường BOU (Tiện Ích Tràn Bộ Đệm) Các công cụ... đến vị trí quy định của bộ nhớ, không có đặc điểm kỹ thuật “chiều dài” Điều này có nghĩa là nó sẽ đọc các ký tự mà nó thấy cần thiết để kết thúc dòng, ngay cả khi nó vượt qua vị trí cuối cùng được phân bổ của bộ nhớ Nếu biết được điều này, một kẻ tấn công có thể gây tràn bộ nhớ “tên” hướng tới bộ nhớ “các lệnh nguy hiểm”, và chạy bất kỳ lệnh nào mà anh ấy hay cô ấy muốn Để biên dịch chương trình overrun.c,... this value need not be null@*/ Chú thích có thể được định nghĩa bởi các mệnh đề sử dụng LCLint Các giả định miêu tả về bộ đệm có thể được thông qua hàm Các trạng thái của bộ đệm bị hạn chế khi các hàm giả định quay trở về và bị hạn chế sử dụng trong các ví dụ sau: minSet, maxSet, minRead và maxRead Làm Thế Nào Để Khai Thác Lỗi Tràn Bộ Đệm Đối với phần NOP Ngẫu nhiên thay thế các NOPs với các phân đoạn... con trỏ Stack (ESP) ESP trỏ đến vị trí hiện tại trên ngăn xếp và cho phép vài thứ được thêm vào và loại bỏ từ ngăn xếp bằng cách sử dụng hoạt động push và pop hoặc thao tác trực tiếp con trỏ ngăn xếp Mở rộng con trỏ nền (EBP) Các máy chủ EBP như một điểm tĩnh để tra cứu thông tin trên ngăn xếp giống như các biến và dữ liệu trong một hàm sử dụng các hiệu số Shellcode là một mã nhỏ được sử dụng trong việc... tách và trình gỡ rối Bước 3 Nếu máy chủ web bị treo, tìm kiếm nơi tập kết lõi của “$$$$$” để tìm kiếm vị trí tràn Bước 4 Sử dụng các công cụ tự động như codeBlocker, eEye Retina, … Làm Thế Nào Để Phát Hiện Lỗi Tràn Bộ Đệm Trong Một Chương Trình ? Biến cục bộ Trong trường hợp này, kẻ tấn công có thể làm cho các chuỗi khai báo trông giống như các biến cục bộ trong các hàm hoặc các phương thức, và xác . Chương Trình Hiểu biết về hoạt động của bộ nhớ stack và heap Hiểu biết về cách hệ thống gọi công việc ở cấp độ mã máy Quen với các công cụ biên dịch và sửa lỗi như gdb Kiến thức về lắp ráp và ngôn. luồng thực hiện lệnh. Nếu người sử dụng chèn vào mã đầu vào, anh ta hoặc cô ta có thể biết chính xác địa chỉ và kích thước của ngăn xếp và làm con trỏ trở về hướng tới đoạn mã của mình để thực hiện. bộ nhớ Các điểm SP ở đây Hướng đi vào Hướng tăng của stack Tìm Hiểu Về Stack Bộ Đệm2 (biến cục bộ 2) Bộ Đệm1 (biến cục bộ 1) Điểm quay trở về Chức năng gọi các đối số Một Stack bình thường Stack