Đề tài Sự tràn bộ nhớ đệm

Một lỗi tràn bộ đệm xảy ra khi một chương trình hay một quy trình cố gắng lưu trữ nhiều hơn dữ liệu trong một bộ đệm (khu vực lưu trữ dữ liệu tạm thời) hơn mức định lượng mà nó có thể giữ Các cuộc tấn công tràn bộ đệm phụ thuộc vào: thiếu sót trong việc kiểm tra ranh giới, và một máy tính có thể thực hiện một mã thường trú trong phân đoạn ngăn xếp hoặc dữ liệu. Lỗ hổng tràn bộ đệm có thể được phát hiện bởi kỹ năng kiểm toán mã cũng như việc kiểm tra ranh giớ

pdf58 trang | Chia sẻ: hao_hao | Lượt xem: 3020 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Đề tài Sự tràn bộ nhớ đệm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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. "Hủy bỏ" một mục trên cùng của ngăn xếp Pop Các hoạt độ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ứ đượ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ố. Hoạt Động Của Stack Shellcode là một mã nhỏ được sử dụng trong việc khai thác lỗ hổng của một phần mềm. Bộ đệm là mục tiêu ưu thích của các kẻ tấn công vì chúng rất dễ tràn nếu xảy ra điều kiện phù hợp. Shellcode gây tràn bộ đệm, viết bằng hợp ngữ, khai thác các lỗ hổng trong ngăn xếp và bộ nhớ quản lí heap. Không Xử Lý (NOPs) Hầu hết các CPU đều có một lệnh No Operation (Không hoạt động) – nó không làm gì nhưng thúc đẩy lệnh con trỏ. Thông thường, bạn có thể đặt một trong số chúng trước chương trình của bạn (trong chuỗi). Hầu hết các xâm nhập hệ thống phát hiện (IDSs) bằng cách tìm kiếm chữ ký trượt của NOP. Kẻ tấn công các miếng đệm nhằm mục đích bắt đầu lỗi tràn bộ đệm bằng các lệnh dài hạn của NOP (một NOP chuyển động hoặc trượt) vi thế CPU sẽ không làm gì cả cho tới khi nó nhận được “sự kiện chính” (trước “con trỏ quay về). ADMutate (bởi K2) chấp nhận một lỗi tràn bộ đệm nhằm khai thác như là đầu vào và ngẫu nhiên tạo ra một phiên bản có chức năng tương đương (đa hình). Phương pháp luận tràn bộ nhớ đệm Khái niệm tràn bộ nhớ đệm Phát hiệ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 Bút kiểm tra tràn bộ nhớ đệm Biện pháp đối phó tràn bộ đệm BIỂU ĐỒ MODULE Kiến Thức Cần Thiết Để Khai Thác Lỗi Tràn Bộ Đệm Trong 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 ngữ máy 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 2 Ghi nhiều dữ liệu vào bộ đệm hơn mức mà nó có thể xử lý. Bước 4 Thay đổi luồng thực hiện hàm bằng các mã hacker. Bước 3 Ghi đè lên địa chỉ quay về của hàm. Tấn Công Một Chương Trình Thực 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 Đề Trong C, xét ví dụ của chuỗi định dạng có vấn đề. Int func(char *user) { Fprintf ( stdout, user); } Có vấn đề nếu người dùng =“%%%%%%%%%%%” Chương trình có thể sụp đổ gây ra một Dos. Nếu không, chương trình sẽ in nội dung bộ nhớ Lỗi toàn diện xảy ra bằng cách sử dụng người dùng =“%n” Hình thức đúng Int func (char *user) { Fprintf ( stdout, “%s”, user) ; } Gây Tràn Bộ Đệm Bằng Cách Sử Dụng Chuỗi Định Dạng Trong C, xét ví dụ của BoF sử dụng chuỗi định dạng có vấn đề. Như thế nào nếu người dùng = “%500d ” Sẽ bỏ qua giới hạn “%400s” Sẽ tràn biến outbuf. Phá Vỡ Stack Ý tưởng chung là gây ra tràn bộ đệm để sau đó ghi đè lên địa chỉ trả về. Khi hàm được thực hiện xong nó sẽ nhảy tới bất kz địa chỉ nào trên ngăn xếp. Tràn bộ nhớ đệm cho phép chúng ta thay đổi địa chỉ trả về của một hàm. Đặ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 hoặc cô ta có thể khai thác một lỗi tràn bộ đệm cục bộ để đạt được quyền truy cập của siêu người dùng. Tạo một cửa sau Sử dụng (UNIX cụ thể) inetd Sử dụng FTP ít quan trọng (TFTP) bao gồm cả Windows 2000 và một số UNIX đặc thù. Sử dụng Netcat Sử dụng Netcat để làm thô và kết nối tương tác. Giao diện UNIX cụ thể. Chụp lại một kết nối đầu cuối X. bút kiểm tra tràn bộ nhớ đệm Khái niệm tràn bộ nhớ đệm Phương pháp luận tràn bộ nhớ đệm Biện pháp đối phó tràn bộ đệm Công cụ bảo mật tràn bộ nhớ đệm Phát hiện tràn bộ nhớ đệm Ví dụ tràn bộ nhớ đệm Bút kiểm tra tràn bộ nhớ đệm BIỂU ĐỒ MODULE Lỗi Tràn Bộ Đệm Không Thể Kiểm Soát Đơn Giản Ví dụ của việc tràn ngăn xếp không thể kiểm soát. Ví dụ của việc tràn heap không thể kiểm soát /*Đây là một chương trình cho thấy một lỗi tràn không thể kiểm soát đơn giản trên ngăn xếp*/ /*sao chép 20 bytes của A và bộ đệm*/ Return 1; /*quay trở lại, điều này sẽ gây ra một truy cập trái phép do việc các ngăn xếp tham nhũng*/ /*gọi các chức năng của chúng ta*/ /*rời khỏi các chức năng chính*/ /*in ra một tin nhắn ngắn, việc thực thi sẽ không thể tiến hành được vì thời điểm này bộ đệm bị tràn*/ /*đơn giản nhất của việc tràn heap*/ Tràn Bộ Đệm Đơn Giản Trong C Điều đầu tiên của bất kì chương trình nào là khai báo hai chuỗi biến và cấp phát bộ nhớ cho chúng. “Tên” biến sẽ lấy 10 byte của bộ nhớ (mà sẽ cho phép nó giữ một chuỗi 10 ký tự). “Các lệnh nguy hiểm tới hệ thống” có biến dài 128 byte. Bạn phải hiểu rằng trong C, khối bộ nhớ cho các biến sẽ được đặt trực tiếp bên cạnh nhau trong không gian bộ nhớ ảo dành cho chương trình. Chương trình C dễ bị tổn thương overrun.C Mã Phân Tích “Mã nhận được”, thứ đọc một chuỗi từ đầu vào tiêu chuẩn đế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 kz lệnh nào mà anh ấy hay cô ấy muốn. Để biên dịch chương trình overrun.c, chạy lệnh này trong Linux. Tràn đầu ra bộ đệm 6 byte thêm là chi phí được sử dụng bởi hệ thống “maHoc” để cho phép bộ nhớ trở lại để sử dụng chung khi nó được giải phóng Địa chỉ cho biến “lệnh hệ thống nguy hiểm” là 16 byte bắt đầu từ biến “tên”. Khai Thác Ngữ Nghĩa Của Các Giải Thích Trong C (Chú Thích) Thêm “@” sau “/*” Chú thích có thể được định nghĩa bởi các mệnh đề sử dụng LCLint. Thêm “@” sau “/*” (được xem là chú thích trong C) được công nhận như cú pháp các thực thể bởi công cụ LCLint. Như vậy, trong một tham số khai báo, nó cho giá trị thông qua tham số này có thể không trống. VD: /*@ this value need not be null@*/ 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 Đối với “Các sự kiện chính” Đối với “Con trỏ quay về” Ngẫu nhiên thay thế các NOPs với các phân đoạn chức năng tương đương của mã (e.g.: x++; x-; ?NOP NOP) Á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. Ngẫu nhiên chỉnh sửa LSB của con trỏ hướng tới khu vực của NOP. Khái niệm tràn bộ nhớ đệm phương pháp luận tràn bộ nhớ đệm biện pháp đối phó tràn bộ đệm công cụ bảo mật tràn bộ nhớ đệm phát hiện tràn bộ nhớ đệm ví dụ tràn bộ nhớ đệm bút kiểm tra tràn bộ nhớ đệm BIỂU ĐỒ MODULE Xác Định Tràn Bộ Nhớ Đệm Bước 1 Bước 2 Bước 3 Bước 6 Bước 5 Bước 4 Chạy máy chủ web trên máy cục bộ Phát yêu cầu với mọi thẻ dài, thẻ kết thúc với “$$$$$” Sử dụng IDA-Proto để xây dựng lại nơi bị khai thác Sử dụng bộ phận phân tách và trình gỡ rối 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. 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 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ụ BOU có thể được sử dụng bởi một kẻ tấn công nhằm kiểm tra các ứng dụng Web để tạo điều kiện cho lỗi tràn bộ đệm. Công cụ này cần hai đầu vào Các tập tin “yêu cầu”, dùng để kiểm tra Cách thức để nhiều mã cùng tấn công (quy định trong một tập tin gọi là “lệnh”). Nó lấy một tập tin yêu cầu để kiểm tra và xuất ra tất cả các hoạt động tới STDOUT dựa trên mức độ của quy định tính dài dòng. Ví dụ của tập tin ‘command’ Ví dụ của tập tin ‘request’ Kiểm Tra Điều Kiện Tràn Heap Các biến thể của tràn heap (tham nhũng heap) Kiểm tra tràn heap bằng cách cung cấp các chuỗi đầu vào dài hơn dự kiến. Hai thanh ghi EAX và ECX, có thể được đặt cùng với địa chỉ mà người sử dụng cung cấp. 1. Cho phép ghi đè lên con trỏ hàm 2.Khai thác cấu trúc quản lý bộ nhớ để thực thi mã tùy ý 1. Một trao đổi con trỏ diễn ra sau khi trình quản lí thường xuyên heap đi vào hoạt động. 1. Một trong các địa chỉ có thể hướng tới một con trỏ hàm để tiến hành ghi đè, ví dụ UEF (bộ lọc ngoại lệ chưa xử lý). . 2. Các địa chỉ khác có thể là địa chỉ của mã người dùng cung cấp cần phải được thực hiện. Khi lệnh MOV hiển thị trong khung bên trái của ảnh chụp màn hình được thực hiện, việc ghi đè được diễn ra. Khi các hàm được gọi, mã người dùng cung cấp được thực thi. Thử Nghiệm Điều Kiện Tràn Heap Các Bước Thử Nghiệm Tràn Ngăn Xếp Trong OllyDbg Debugger. Thử Nghiệm Tràn Ngăn Xếp Trong OllyDbg Debugger. Bước 1 Bước 2 Bước 3 Bước 4 Bước 5 Biểu diễn cách thức mà một kẻ tấn công có thể ghi đè lên con trỏ lệnh Kiểm tra “sample.exe” của lỗi tràn ngăn xếp. Khởi động “sample.exe” trong một trình sửa lỗi. Một dãy lớn các ký tự chẳng hạn như “A”, có thể được cung cấp trong trường tham số được hiển thị. Mở trình thực thi với các đối số được cung cấp (AAAAAAAA …) và tiếp tục thực hiện, kết quả được hiển thị trong fig. EIP bao gồm các giá trị “41414141” tượng trưng cho hệ thập lục phân “AAAA”. Thử Nghiệm Tràn Ngăn Xếp Trong OllyDbg Debugger. Thử Nghiệm Định Dạng Chuỗi Điều Kiện Sử Dụng IDA Pro. Lỗ hổng định dạng chuỗi Thao tác với các tham số đầu vào Lỗ hổng định dạng chuỗi thể hiện chủ yếu trong:  Các máy chủ Web Các máy chủ ứng dụng Các ứng dụng web sử dụng dựa trên mã C/C++ Tập lệnh CGI viết bằng C Kẻ tấn công thao tác với các tham số đầu vào bao gồm các loại cụ thể như %x hoặc %n. Ví dụ một yêu cầu chính đáng như Thử Nghiệm Định Dạng Chuỗi Điều Kiện Sử Dụng IDA Pro. Kẻ tấn công xác định sự hiện diện của một lỗ hổng định dạng chuỗi bằng cách kiểm tra các trường hợp của mã (ráp mảnh) Khi rã mảnh được kiểm tra bằng cách sử dụng IDA Pro. • Địa chỉ của một loại định dạng xác định được đẩy vào ngăn xếp hiển thị rõ trước khi lệnh gọi tới printf được thực hiện. Công Cụ Phát Hiện Tràn Bộ Nhớ Đệm (BoF) BOU (Tiện ích tràn bộ đệm) OllyDbg Flawfinder RATS (Công cụ bảo mật kiểm soát thô) BLAST (Công cụ xác minh phần mềm trừu tượng lười biếng Berkeley) Stack Shield (Lá chắn ngăn xếp) Splint BOON Khái niệm tràn bộ nhớ đệm Phương pháp luận tràn bộ nhớ đệm Biện pháp đối phó tràn bộ đệm Công cụ bảo mật tràn bộ nhớ đệm Phát hiện tràn bộ nhớ đệm Ví dụ tràn bộ nhớ đệm Bút kiểm tra tràn bộ nhớ đệm BIỂU ĐỒ MODULE Phòng Chống Tràn Bộ Đệm Hướng dẫn sử dụng kiểm soát bộ mã Trình biên dịch kỹ thuật Hỗ trợ thư viện an toàn hơn C Vô hiệu hóa thực thi ngăn xếp Ngăn Chặn Tấn Công BoF Sử dụng các loại ngôn ngữ an toàn (Java, ML) Thực hiện kiểm tra thời gian thực Đặt ngẫu nhiên vị trí của hàm trong libc Địa chỉ rắc rối Đánh dấu ngăn xếp như là không được thực hiện, đặt vị trí ngăn xếp ngẫu nhiên Phân tích mã nguồn tĩnh Thiết kế chương trình với trọng tâm bảo mật Vô hiệu hóa việc thực thi ngăn xếp (có thể thực hiện trên Solaris) Kiểm tra và sửa mã để tìm lỗi Ngăn chặn sử dụng các hàm nguy hiểm: gets, strcpy, … Xem xét việc sử dụng các trình biên dịch “an toàn” như StackGuard. Ngăn chặn địa chỉ trả về bị ghi đè Xác nhận các tham số và giảm số lượng của các mã chạy với đặc quyền root Ngăn ngừa tất cả các thông tin nhạy cảm không bị ghi đè Lập Trình Các Biện Pháp Đối Phó Lập Trình Các Biện Pháp Đối Phó Hãy thay đổi bản thân ngôn ngữ C ở cấp độ ngôn ngữ để giảm nguy cơ tràn bộ đệm Sử dụng phân tích mã nguồn tĩnh hoặc động ở cấp độ mã nguồn để kiểm tra mã của các vấn đề tràn bộ đệm Thay đổi các trình biên dịch ở cấp độ biên dịch để giới hạn kiểm tra hoặc bảo vệ các địa chỉ từ thanh ghi đè. Thay đổi các quy tắc ở cấp độ hệ điều hành để các trang bộ nhớ được phép chứa các số liệu thực thi Hãy sử dụng các thư viện an toàn Hãy sử dụng các công cụ có thể phát hiện lỗ hổng tràn bộ đệm Chống Thực Thi Dữ Liệu (DEP) DEP là một tập hợp của các công nghệ phần cứng và phần mềm theo dõi chương trình để xác minh xem chúng có sử dụng hệ thống bộ nhớ an toàn và bảo mật. Nó ngăn chặn các ứng dụng truy cập bộ nhớ không được giao của tiến trình này và gian dối trong tiến trình khác Khi một tiến trình xảy ra phần cứng thi hành lệnh DEP phát hiện mã đang chạy từ các địa điểm này và đặt ra một ngoại lệ. Để ngăn chặn các mã độc hại lợi dụng cơ chế xử lý ngoại lệ trong Windows cần sự giúp đỡ bởi phần mềm thi hành lệnh DEP. DEP giúp sức trong việc ngăn chặn các mã thực thi từ các trang dữ liệu, chẳng hạn như các trang heap mặc định, các trang bộ nhớ pool, và các trang stack khác nhau, nơi mà mã không thực hiện được từ heap và stack mặc định. Enhanced Mitigation Experience Toolkit (EMET) Enhanced Mitigation Experience Toolkit (EMET) được thiết kế để tăng khó khăn cho kẻ tấn công trong việc khai thác các lỗ hổng của phần mềm và truy cập vào hệ thống. Nó hỗ trợ các kỹ thuật giảm thiểu nhằm ngăn ngừa các kỹ thuật tấn công phổ biến, chủ yếu liên quan đến tràn ngăn xếp và các kỹ thuật được sử dụng bởi malware để tương tác với hệ điều hành bằng phương pháp thỏa hiệp. Nó cải thiện khả năng phục hồi của Windows để khai thác lỗi tràn bộ đệm Nó ngăn ngừa các kỹ thuật phổ biến sử dụng để khai thác lỗi tràn ngăn xếp trong Windows bằng việc thực hiện xác nhận chuỗi SHE. Nó đánh dấu các phần của một tiến trình bộ nhớ không được thực thi, gây khó khăn trong việc khai thác các lỗ hổng tham nhũng bộ nhớ. Điều mới trong EMET 2.0 là bắt buộc địa chỉ không gian bố trí ngẫu nhiên (ASLR), cũng như các module phi nhận thức ASLR trên tất cả các phiên bản Windows mới. Bộ xử lý cấu trúc ngoại lệ bảo vệ việc ghi đè (SEHOP) Phòng chống thực thi dữ liệu động (DDEP) Địa chỉ không gian bố trí ngẫu nhiên (ASLR) Cài Đặt Cấu Hình Hệ Thống EMET Cửa Sổ Application Configuration EMET Sử dụng hộp thoại Application Configuration, chúng ta có thể thêm các ứng dụng để cấu hình cho EMET. Điều này giúp cho các ứng dụng cứng không bị biên dịch (bởi nhà cung cấp gốc) với các biện pháp bảo mật cụ thể. phát hiện tràn bộ nhớ đệm Ví dụ tràn bộ nhớ đệm Khái niệm tràn bộ nhớ đệm Phương pháp luận tràn bộ nhớ đệm Biện pháp đối phó tràn bộ đệm Công cụ bảo mật tràn bộ nhớ đệm Phát hi n tràn bộ nhớ đệm Bút kiểm tra tràn bộ nhớ đệm BIỂU ĐỒ MODULE Tấn công tràn bộ đệm tận dụng các bài tập áp dụng mã hóa kém của các lập trình viên khi viết và xử lý các hàm chuỗi C và C++. Trình biên dịch chuyển đổi /GS có thể được kích hoạt từ trang tùy chọn thế hệ mã trên thẻ C/C++ Bộ chuyển đổi /GS cung cấp một “va chạm tốc độ”, hoặc cookie, giữa bộ đệm và địa chỉ trở về hữu ích trong ngăn chặn tràn bộ đệm Nếu một lỗi tràn ghi lên địa chỉ trả về, nó sẽ phải ghi đè lên các tập tin cookie đặt giữa nó và bộ đệm, kết quả ở trong một ngăn xếp được bố trí mới. Cookie Khung xử lý ngoại lệ Các thanh ghi lưu Calle Công Cụ Bảo Mật BoF: BufferShield BufferShield cho phép bạn phát hiện và ngăn chặn việc khai thác lỗi tràn bộ đệm, chịu trách nhiệm về phần lớn các vấn đề bảo mật liên quan Các Tính Năng  Phát hiện mã thực thi trên ngăn xếp, heap mặc định, bộ nhớ ảo và các phân đoạn dữ liệu  Chấm dứt các ứng dụng nghi vấn nếu một lỗi tràn bộ đệm bị phát hiện. Các Công Cụ Bảo Mật BoFư Các Công Cụ Bảo Mật BoF Ví dụ tràn bộ nhớ đệm Khái niệm tràn bộ nhớ đệm Phương pháp luận tràn bộ nhớ đệm Biện pháp đối phó tràn bộ đệm Công cụ bảo mật tràn bộ nhớ đệm Phát hiện tràn bộ nhớ đệm Bút kiểm tra tràn bộ nhớ đệm BIỂU ĐỒ MODULE Thử Nghiệm Độ Thâm Nhập Tràn Bộ Đệm Kĩ năng của một người kiểm tra độ thâm nhập Hiểu biết nguyên tắc làm việc của tấn công tràn bộ đệm Thành thạo trong việc sử dụng trình sửa lỗi, tháo rời và ngăn chặn Hiểu biết về ngôn ngữ lập trình như C/C++, lắp ráp và ngôn ngữ máy. Hiểu biết về quản lý bộ nhớ trong các môi trường điều hành khác nhau. Kiểm Tra Độ Thâm Nhập Tràn Bộ Đệm Xác định vị trí các ứng dụng mục tiêu Nguồn có sẵn? Xem xét mã Tìm kiếm các cuộc gọi tới các thư viện hàm không an toàn Thực hiện phân tích mã tĩnh bằng các công cụ Đảo ngược kiến trúc ứng dụng bằng cách phân tách. Đính kèm một trình gỡ lỗi vào ứng dụng mục tiêu Cung cấp một lượng lớn dữ liệu đầu vào Kiểm tra trả lời trong trình ứng dụng Tìm kiếm các cuộc gọi tới thư viện các hàm không an toàn như gets(), strcpy(), strcatf(), printf, fprintf, sprintf, snprintf, vf printf, vprintf, vsprintf, và vsnprintf có thể dẫn tới lỗi tràn bộ đệm nếu không sử dụng đúng cách. Thực hiện phân tích các mã tĩnh bằng cách sử dụng các công cụ như RATS và Flawfinder. Đảo ngược kiến trúc ứng dụng bằng cách phân tách như IDA Pro và OllyDbg để phân tích các mã của trình biên dịch theo thứ tự để xác định lỗi tràn bộ đệm. Đính kèm một trình sửa lỗi (OllyDbg, IDA Pro) vào ứng dụng mục tiêu, cung cấp một lượng lớn dữ liệu đầu vào, và kiểm tra trả lời trong trình sửa lỗi để xác địnhnguồn lỗi tràn bộ đệm; lặp lại các bước này với các đầu vào khác nhau của độ dài biến. Kiểm Tra Độ Thâm Nhập Tràn Bộ Đệm Cấp định dạng xác định tại đầu vào Sử dụng kỹ thuật ngăn chặn tràn dữ liệu ứng dụng Chuyển văn bản tất cả các phát hiện Cung cấp các định dạng xác định tới đầu vào như %x hoặc %n Sử dụng kỹ thuật ngăn chặn các việc cung cấp dữ liệu trái phép, bất ngờ, hoặc ngẫu nhiên của các ứng dụng đầu vào và quan sát hành vi của ứng dụng Sử dụng các công cụ ngăn chặn như Spike và Brute Force Binary Tester (BFB) để thực hiện kiểm tra ngăn chặn tự động Bất kz hành vi hoặc sự sụp đổ bất thường của ứng dụng cho thấy một cuộc tấn công thành công gây tràn bộ đệm. Một lỗi tràn bộ đệm xảy ra khi một chương trình hay một quy trình cố gắng lưu trữ nhiều hơn dữ liệu trong một bộ đệm (khu vực lưu trữ dữ liệu tạm thời) hơn mức định lượng mà nó có thể giữ Các cuộc tấn công tràn bộ đệm phụ thuộc vào: thiếu sót trong việc kiểm tra ranh giới, và một máy tính có thể thực hiện một mã thường trú trong phân đoạn ngăn xếp hoặc dữ liệu. Lỗ hổng tràn bộ đệm có thể được phát hiện bởi kỹ năng kiểm toán mã cũng như việc kiểm tra ranh giới Biện pháp đối phó bao gồm kiểm tra mã, vô hiệu hóa thực thi ngăn xếp, hỗ trợ bằng một thư viện tốt hơn C, và sử dụng các trình biên dịch an toàn hơn Các công cụ như stackguard, Immunix và quét lỗ hổng dễ tổn thương rất hữu ích trong việc bảo mật hệ thống. TÓM TẮT Trích Dẫn “Thiết kế không phải là trông thấy và cảm nhận. Thiết kế là xem nó hoạt động như thế nào”

Các file đính kèm theo tài liệu này:

  • pdfmodule_17_6076.pdf
Tài liệu liên quan