Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 18 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
18
Dung lượng
675,75 KB
Nội dung
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG BÁO CÁO TIỂU LUẬN CƠ SỞ AN TOÀN THÔNG TIN Đề tài: Tìm hiểu về cơng gây tràn đệm buffer overflow Giảng viên: Hoàng Xuân Dậu Nhóm Bài Tập Lớn: 03 Danh sách thành viên: Lê Thị Đính B14DCAT046 Đinh Duy Đông B14DCAT217 Đào Mạnh Đức B14DCAT043 Lê Hoàng Đức B14DCAT218 Mục Lục I TỔNG QUAN VỀ LỖI TRÀN BỘ ĐỆM BUFFER OVERFLOW .2 Khái niệm 2 Lỗi Buffer Overflow và nguyên nhân gây lỗi 3 Stack Overflow 3.1 Định nghĩa: 3.2 Mục đích Stack buffer overflow: HEAP OVERFLOW: 4.1 Định nghĩa: 4.2 OVERWRINGTING POINTERS (viết lại trỏ): .9 4.3 Khai thác thư viện malloc(): 10 4.4 Mục đích việc làm hỏng cấu trúc DLMALLOC: 11 II CÁCH PHÁT HIỆN BUFFER OVERFLOW 12 III CÁCH PHÒNG TRÁNH BUFFER OVERFLOW 13 Lựa chọn ngơn ngữ lập trình: 14 Sử dụng thư viện an toàn: 14 Chống tràn đệm Stack: 15 Bảo vệ không gian thực thi: 15 Ngẫu nhiên hóa sơ đồ khơng gian địa chỉ: .15 Kiểm tra sâu gói tin 15 IV DEMO 16 V KẾT LUẬN 16 VI TÀI LIỆU THAM KHẢO 17 I TỔNG QUAN VỀ LỖI TRÀN BỘ ĐỆM BUFFER OVERFLOW Khái niệm Lỗi tràn đệm là điều kiện bất thường tiến trình lưu liệu vượt ngoài biên nhớ đệm có chiều dài cố định Kết quả là liệu có thể đè lên các nhớ liền kề Dữ liệu bi ghi đè có thề bao gồm các nhớ đệm khác, các biến và liệu điều khiển luồng chảy chương trình (program flow control) Các lỡi tràn đệm có thề làm cho tiến trình bị đổ vỡ cho kết quả sai Các lỗi này có thể kích hoạt các liệu vào thiết kế đặc biệt để thưc thi các đoạn mả phá hoại để làm cho chương trình hoạt động khơng mong đợi Bằng cách đó các lỗi tràn đệm gây nhiều lổ hổng bảo mật đối với phần mềm và tạo sở cho nhiều thủ thuật khai thác Chương trình nạp nhớ: Khi tiến trình nạp đến nhớ, chúng chia thành phân đoạn sau: Hình 1.1: Các phân đoạn chương trình thực thi - text: phân đoạn này tương ứng là phần file thực thi nhị phân Nó chứa các thị lệnh (mã máy) để thực các tác vụ chương trình Phân đoạn này đánh dấu là đọc và gây lỗi ghi phân đoạn này Kích thước là cố định lúc thực thi tiến trình lần nạp - data: là phân đoạn sử dụng để lưu trữ các biến toàn cục và có khởi tạo giá trị ban đầu là: int a=0; kích thước này cố định lúc thực thi chương trình - bss (Below stack section) là sử dụng để lưu trữ các biến toàn cục không có khởi tạo giá trị ban đâu là: int a Kích thước phân đoạn này cố định lúc thực thi chương trình - Heap: Phân đoạn này sử dụng để cấp phát các biến động và phát triển từ vùng địa thấp đến vùng địa cao nhớ Trong ngôn ngữ C việc cấp phát và giải phóng thực qua hai hàm malloc() và free() Ví dụ: int i = malloc(sizeof (int)); - Stack: phân đoạn stack có tác dụng giữ lời gọi hàm thủ tục đệ quy và phát triển theo địa vùng nhớ cao đến địa vùng nhớ thấp hầu hết các hệ thống - Phân đoạn biến môi trường và đối số: phân đoạn này lưu trữ bản chép các biến cấp độ hệ thống mà có thể yêu cầu tiến trình trung quá trình thực thi Phân đoạn này có khả ghi Trong các ngơn ngữ lập trình ngơn ngữ C dễ sinh các lỗi tràn nhớ mà attacker có thể khai thác Trong ngôn ngữ C, các chuỗi (string) hay các buffer thể sau: Con trỏ (pointer) trỏ vào byte chuỗi hay buffer đó,và xác định kết điểm kết thúc trỏ trỏ đến byte null → không xác định độ dài đối tượng nhập vào → có thể copy buffer có độ dài lớn vào buffer có độ dài nhỏ → gây tràn nhớ đệm (buffer overflow) Ví dụ lỡi đơn giản: #include Int main (int argc, char **argv) { char target [5] = “TTTT”; char attacker [11] = “AAAAAAAA”; strcpy(attacker, “DDDDDDDDDDDDD”); printf(“% \n”,target); return 0; } Lỗi Buffer Overflow và nguyên nhân gây lỗi Thông thường có cách khai thác lỗi buffer overflow mà attacker có thể sử dụng: - Khai thác dựa vào các lỗ hỏng phần mền thơng qua ngơn ngữ lập trình (phần mềm viết ngôn ngữ C) - Khai thác các trang web có tương tác người dùng không ràng buộc liệu nhập vào các trường username, password Nguyên nhân gây các lỗi buffer overflow các chương trình và ứng dụng: - Phương thức kiểm tra biên (boundary) không thực đầy đủ, là bỏ qua - Các ngơn ngữ lập trình, là ngôn ngữ C, bản thân nó tiềm ẩn các lỗi mà hacker có thể khai thác Các phương thức strcat(), strcpy(), sprintf(), bcopy(), gets(), và canf() ngơn ngữ C có thể khai thác các hàm này không kiểm tra xem buffer cấp phát stack có kích thước lớn liệu copy vào buffer hay khơng - Những chương trình ứng dụng lập trình khơng tốt tạo nó (khả lập trình kém) Một lỡi buffer overflow xuất buffer cố gắng cấp phát không gian lưu trữ có liệu lớn khả lưu trữ nó Có kiểu Buffer Overflow chính: - Stack overflow - Heap overflow Stack (nơi lưu trữ tĩnh không gian nhớ) Heap (nơi lưu trữ động không gian nhớ, sinh chạy chương trình) là địa điểm lưu trữ cung cấp cho các biến chạy chương trình Biến lưu trữ stack heap chương trình có nhu cầu sử dụng Stack Overflow 3.0 Định nghĩa: Stack là kiểu cấu trúc liệu hoạt động theo chế LIFO (last in first out) máy tính sử dụng để truyền các đối số vào các hàm để tham chiếu đến các biến cục Stack lưu giữ tất cả các thông tin mà hàm cần Stack khởi tạo bắt đầu hàm và “phóng thích” hàm kết thúc Stack overflow xuất buffer tràn stack space Đoạn code độc hại push vào stack Lỗi tràn nhớ có thể viết lại giá trị return pointer, hacker có thể điều khiển trỏ tới các đoạn code độc hại mà họ muốn thực thi Hình 2.1: Stack mỢT 3.0 Mục đích Stack buffer overflow: Ghi đè biến địa phương nằm gần nhớ đệm stack đê thay đổi hành vi chương trình nhằm phục vụ cho ý đồ hacker Ghi đè địa trả về khung stack (stack frame) Khi hàm trả về thưc thi tiếp tục địa mà hacker rõ, thường là đệm chứa liệu vào người dùng Ví dụ: void thung(){ char bia[10]; //chai bia chứa 10ml gets(bia); //nhập vào số bia } Với chương trình này chúng ta, nhiệm vụ chương trình này là yêu cầu người dùng nhập vào số bia cần bỏ vô chai với chai bia có 10ml Điều xảy người dùng tham lam nhập vào số bia là 20ml? Nếu người dùng tham lam, lấy 20ml chắn chắn nó bị tràn, gây lỗi Vậy gọi hàm thung(), nó làm chỗ trống cho biến bia[] stack Cách xếp liệu stack Nhiệm vụ là ghi đè bia[] với mã độc biến bia[] tràn Khi bị tràn, có thể ghi đè cả địa trả về địa biết bia[] Thì mà hàm thung() thực thi xong, thay nó trở về nơi nó cần thực thi tiếp thì, nó quay lại địa biến bia[] và thực thi mã độc đó Và là stack làm điều Hình 2.2: Stack bị công Atacker Người dùng thông thạo có ý đồ xấu: - Khai thác dựa vào các lỗ hổng phần mềm thơng qua ngơn ngữ lập trình (phần mềm thường viết ngôn ngữ C) - Ghi đè địa trả về khung (stack frame) Khi hàm trả về, thực thi tiếp tục địa mà kẻ công rõ, thường là đệm chứa liệu vào người dùng - Khai thác các trang web có tương tác người dùng không ràng buộc liệu nhập các trường hợp username, password, HEAP OVERFLOW: 4.0 Định nghĩa: Heap là khu vực nhớ sử dụng ứng dụng và cấp phát động thời gian chạy các hàm, chẳng hạn malloc() Heap lưu trữ tất cả các trường thuộc tính, hàm tạo và phương thức lớp đối tượng Các biến cấp phát tự động hàm, malloc() tạo heap Hình 2.3: Heap Trong cách cơng heap overflow, attacker làm tràn nhớ có thể overwrite các dynamic variables, có thể dẫn đến các hiệu ứng không mong muốn Trong hầu hết các môi trường ứng dụng, việc này có thể giúp attacker có thể điều khiển các thực thi chương trình Ví dụ: Hình 2.4: Ví dụ Heap Overflow Heap trước và sau bị lỡi Buffer Overflow: Hình 2.5: Heap Overflow 4.0 OVERWRINGTING POINTERS (viết lại trỏ): Kẻ công có thể sử dụng phương pháp này để viết lại filename, password ,uid Các dạng công dựa vào heap: 10 Cuộc công kiểu này cần số điều kiện tiên mã nguồn vulnerable binary: định nghĩa buffer và pointer Khó khăn phương pháp này là tìm hai điều kiện tiên trên.Một khó khăn khác là xác định địa vulnerable program Overwriting function pointers Mục đích: attacker muốn ghi đè lên trỏ và làm cho nó trỏ đến họ muốn Nó có thể trỏ đến chương trình nào đó 4.0 Khai thác thư viện malloc(): Dlmalloc gọi là thư viện Doug Lea malloc, và là malloc thư viện sử dụng LIBC 11 U: Used chunk F: Free chunk Wilderness: top most free chunk Định nghĩa cấu trúc đoạn (trunk) là: struct malloc_chunk { size_t prev_size; // only used when previous chunk is free size_t size; // size of chunk in bytes + status-bits struct malloc_chunk *fd; // only used for free chunks: pointer to next chunk struct malloc_chunk *bk; // only used for free chunks: pointer to previous chunk } ; 4.0 Mục đích việc làm hỏng cấu trúc DLMALLOC: Attacker làm tràn nhớ,sau đó ghi đè liệu lên các mục tiêu họ Yêu cầu đặc biệt cho dlmalloc khai thác là có hai khối nhớ thu malloc Ví dụ: vudu2.c int main(void) { char * buf ; char * buffer1 = (char *)malloc(666) ; 12 char * buffer2 = (char *)malloc(2); printf(Enter something: ); gets(buf); strcpy (buffer1, buf); free(buffer1); free(buffer2); return (1); } Sau thực thi khai thác lỗi ta có kết quả sau: II CÁCH PHÁT HIỆN BUFFER OVERFLOW Có cách bản để phát các lỗi buffer overflow mà hacker có thể sử dụng : - Nhìn vào source code: Hacker tìm kiếm các string là các biến cục các hàm chương trình, xem xét chúng có kiểm tra biên (boundary check) chưa Kiểm tra tiêu chuẩn các hàm có liên quan đến phần các chuỗi phần input, output 13 - Nhập vào các ứng dụng liệu lớn và xem xét ứng dụng có biểu không bình thường nào khơng Các bước xác định Buffer Overflow: - Bước 1: chạy máy chủ web máy cục - Bước 2: Phát yêu cầu với thẻ dài thẻ kết thúc với “$$$$$” - Bước 3: máy chủ web bị treo, tìm kiếm bãi tập kết lõi “$$$$$” để tìm kiếm vị trí tràn - Bước 4: sử dụng các công cụ tự động codeBlocker, eEye Retina, … - Bước 5: Sử dụng phận phân tách và trình gỡ rối - Bước 6: Sử dụng IDA-Proto để xây dựng lại nơi bị khai thác Hình 2.6: Các bước xác định Buffer Overflow III CÁCH PHÒNG TRÁNH BUFFER OVERFLOW Các cách có thể cản trở đối các kĩ thuật khai thác lỗi buffer overflow: xử lý đệm trước đọc hay thực thi có thể làm thất bại các cố gắng khai thác lỗi tràn đệm không ngăn chặn cách tuyệt đối + Chuyển từ chữ hoa thành chữ thường 14 + Loại bỏ các kí tự đặc biệt và lọc các xâu khơng chứa kí tự là chữ số chữ cái Tuy nhiên có các kĩ thuật để tránh việc lọc và xử lý này: - alphanumeric code :mã gồm toàn chữ và số - polumorphic code : mã đa hình - Self-modifying code : mã tự sửa đổi - Tấn cơng kiểu return-to-libc Vì để tránh các nguy bị khai thác lỗi buffer overflow cần sử dụng các biện pháp phịng tránh hiệu quả Lựa chọn ngơn ngữ lập trình: Ngơn ngữ lập trình có ảnh hưởng lớn đối với xuất lỗi tràn đệm: - Ngơn ngữ lập trình C và C++ là hai ngơn ngữ lập trình thơng dụng, hạn chế nó là không kiểm tra việc truy cập ghi đè liệu thông qua các trỏ Cụ thể nó không kiểm tra liệu copy vào mảng có phù hợp kích thước mảng hay khơng - Cyclone, biến thể C, giúp ngăn chặn các lỗi tràn đệm việc gắn thông tin về kích thước mảng với các mảng - Ngơn ngữ lập trình D sử dụng nhiều kĩ thuật đa dạng để tránh gần hết việc sử dụng trỏ và kiểm tra biên người dùng xác định - Nhiều ngôn ngữ lập trình khác cung cấp việc kiểm tra thời gian chạy Việc kiểm tra này cung cấp ngoại lệ hay cảnh báo C hay C++ ghi đè liệu, ví dụ như: Pythol, Ada, Lisp - Ngoài các môi trường Java hay NET đòi hỏi kiểm tra biên đối với tất cả các mảng Sử dụng thư viện an toàn: Sử dụng các thư viện viết tốt và kiểm thử dành cho các kiểu liệu trừu tượng mà các thư viện này thực tự động việc quản lý nhớ, đó có kiểm tra biên có thể làm giảm xuất và ảnh hưởng các tượng tràn đệm Các thư viện an toàn gồm có: The Better String Library, Arri Buffer API và Vstr 15 Chống tràn đệm Stack: Stack-smashing protection là kỹ thuật dùng để phát các tượng tràn đệm phổ biến Kỹ thuật này kiểm tra xem stack bị sửa đổi hay chưa hàm trả về Nếu stack bị sửa đổi, chương trình kết thúc lỡi segmentation fault Chế độ Data Execution Prevention (cấm thưc thi liệu) Microsoft bảo vệ các trỏ và không cho chúng bị ghi đè Có thể bảo vệ stack cách phân tán stack thành phần, phần dành cho liệu và phần dành cho các bước trà về hàm Sự phân chia này dùng ngôn ngữ Forth Bảo vệ không gian thực thi: Kĩ thuật này ngăn chăn việc thực thi mã stack hay heap Hacker có thể sử dụng tràn đệm để chèn đoạn mã tùy ý vào nhớ chương trình, với việc bảo vệ không gian thực thi cố gắng chạy doặn mã đó gây ngoại lệ Một số CPU hỡ trợ tính có tên bit NX (No eXecute) bit XD (eXecute Disable) Khi kết hợp với phần mềm các tính này có thể dùng để đánh dấu các trang liệu (chẳng hạn các trang chứa stack và heap) là đọc không thực thi Các biến thể mới Microsoft Windows hỗ trợ bảo vệ không gian thực thi với tên gọi Data Execution Prevention và các phần mềm gắng kèm bao gồm: SecureStack, OverflowGuard, BufferShield Ngẫu nhiên hóa sơ đồ khơng gian địa chỉ: Ngẫu nhiên hóa sơ đồ không gian địa (Address space layout randomization ASLR) là tín an ninh máy tính có liên quan tới việc xếp các vùng liệu quan trọng (thường bao gồm nơi chúa mã thưc thi và vị trí các thư viện, heap va stack) cách ngẫu nhiên không gian địa tiến trình Kiểm tra sâu gói tin 16 Biện pháp kiểm tra sâu đối với gói tin (deep packet inspection-DPI) có thể phát việc cố gắng khai thác lỗi trán đệm từ xa từ biên giới mạng Các kĩ thuật này có khả ngăn chặn các gói tin có chứa chữ ký vụ công biết chứa các chuỗi dài các lệnh No-Operation (NOP- lệnh rỗng không làm gì) Việc rà gói tin khơng phải là phương pháp hiệu quả nó có thể ngăn chặn các công biết và có nhiều cách để mã hóa lệnh NOP IV DEMO Code chương trình C #include greeting(char *temp1, char *temp2) { char name[400]; strcpy(name, temp2); printf("Xin chao %s %s\n", temp1, name); } main(int argc, char *argv[]) { greeting(argv[1], argv[2]); printf("Tam biet %s %s\n", argv[1], argv[2]); } Nhiệm vụ chương trình đơn giản là thực nhận hai tham số và chuyển cho hàm getting(), hàm getting() có sử dụng hàm strcpy có nhiệm vụ copy biến temp2 đến biến name Tại biến name cấp phát 400 byte Do vậy biến temp2 không lớn 400 khơng có việc xảy ra, ngược lại biến temp2 có giá trị lớn 400, nó ghi đè lên địa EBP và EIP, nó lại ghi đè lên hai địa này giới thiệu phần cách hoạt động stack Từ có thể xuất lỗi V KẾT LUẬN 17 Thực tế rằng, các công tràn đệm thường xuyên xảy và gây hậu quả nghiêm trọng cho hệ thống nó có thể can thiệp trực tiếp vào mã nguồn Tuy bài viết các dạng bản công Buffer Overflow và các cách phòng chống với phát triển công nghệ, các hacker không ngừng phát triển các cách cơng mới vào hệ thống Vì vậy, bài viết có thể giúp người đọc phần nào biết đến cách công Buffer Overflow và mức độ nguy hiểm các công phương pháp Buffer Overflow VI TÀI LIỆU THAM KHẢO “Kỹ thuật khai thác lỗi tràn đệm” Website: https://vi.wikipedia.org/wiki/Lỗi_tràn_bộ_nhớ_đệm 18