Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
280 KB
Nội dung
NHẬN XÉT CỦA GIÁO VIÊN MỤC LỤC NHẬN XÉT CỦA GIÁO VIÊN MỤC LỤC LỜI NÓI ĐẦU Tổng quan lỗi tràn đệm Error! Bookmark not defined Kỹ thuật công lỗi tràn đệm 2.1 Ví dụ 2.2 Tràn nhớ đệm stack 10 Phương pháp phòng chống công tràn đệm 13 3.1 Lựa chọn ngơn ngữ lập trình .13 3.2 Sử dụng thư viện an toàn 15 3.3 Chống tràn nhớ đệm stack 16 3.4 Bảo vệ không gian thực thi 16 3.5 Ngẫu nhiên hóa sơ đồ khơng gian địa 17 3.6 Kiểm tra sâu gói tin 17 Kết Luận 19 LỜI NÓI ĐẦU Trong lĩnh vực an ninh máy tính lập trình, lỗi tràn nhớ đệm hay gọi tắt lỗi tràn đệm lỗi lập trình gây ngoại lệ truy nhập nhớ máy tính chương trình bị kết thúc, người dùng có ý phá hoại, họ lợi dụng lỗi để phá vỡ an ninh hệ thống Năm 1988, cố máy tính thu hút ý tồn thể cộng đồng sử dụng mạng internet, đời sâu internet (Internet Worm) Con sâu làm 6000 máy chủ phải ngưng hoạt động lỗi biết đến “tràn đệm” (buffer overflow) Cho đến nay, lỗi tràn đệm tiếp tục tìm thấy nhiều phần mềm nhiều hệ điều hành khác Đó thực nguy nghiêm trọng, vấn đề tồn lâu cần quan tâm cách nghiêm túc Đa phần lỗi tràn đệm dẫn đến việc chiếm quyền điều khiển toàn hệ thống nên thực lỗi chết người Tràn đệm xảy nhiều hệ điều hành, đặc biệt UNIX Windows, nhiều ứng dụng khác web, mail, ftp, dns, telnet, ssh, database, Tháng 8-2001, sâu máy tính Code Red khiến giới thiệt hại hàng tỉ USD bắt nguồn từ lỗ hổng tràn đệm phần mềm máy chủ Microsoft Internet Information Server (IIS) Vậy tràn đệm? Tại xảy tràn đệm? Tại tràn đệm tạo lỗ hổng bảo mật? Làm để ngăn chặn lỗi tràn đệm? Đó lý chúng em nghiên cứu đề tài Nghiên cứu xây dựng phương pháp chống công tràn stack Trong trình thực đề tài nhóm em khơng khỏi mắc phải thiếu sót Mong thầy đóng góp ý kiến để chúng em hồn thiện tốt đề tài sau Em xin chân thành cảm ơn! Sinh viên thực hiện: Vũ Hoàng Đạt Lê Văn Phương Lê Thị Linh CHƯƠNG I TỔNG QUAN VỀ LỖI TRÀN BỘ ĐỆM 1.1 Tổ chức nhớ cho tiến trình Bộ nhớ phân thành phần là: • user mode • kernel mode Mặc định GB không gian nhớ ảo cung cấp cho user mode, vùng địa 0x00000000 – 0x7fffffff, phần lại, 0x80000000 – 0xBfffffff dành cho kernel mode 1.2 Tổ chức nhớ tiến trình Mỗi tiến trình thực thi hệ điều hành cấp cho không gian nhớ ảo (logic) giống Không gian nhớ gồm vùng: • Vùng text • Vùng data • Vùng stack Ý nghĩa vùng sau: Vùng text vùng cố định, chứa mã lệnh thực thi (instruction) liệu đọc (read-only) Vùng chia sẻ tiến trình thực thi file chương trình tương ứng với phân đoạn text file thực thi Dữ liệu vùng đọc, thao tác nhằm ghi lên vùng nhớ gây lỗi segmentation violation Vùng data chứa liệu khởi tạo chưa khởi tạo giá trị Các biến toàn cục biến tĩnh chứa vùng Vùng data tương ứng với phân đoạn data-bss file thực thi Vùng stack vùng nhớ dành riêng thực thi chương trình dùng để chứa giá trị biến cục hàm, tham số gọi hàm giá trị trả Thao tác nhớ stack thao tác theo chế "vào sau trước" - LIFO (Last In, First Out) với hai lệnh quan trọng PUSH POP Trong phạm vi viết này, tập trung tìm hiểu vùng stack 1.3 Lỗi tràn đệm Bộ đệm (buffer): vùng nhỏ RAM, lưu trữ mã thực thi, liệu chương trình thực thi CPU Một lỗi tràn nhớ đệm hay gọi tắt lỗi tràn đệm lỗi lập trình gây ngoại lệ truy nhập nhớ máy tính chương trình bị kết thúc, người dùng có ý phá hoại, họ lợi dụng lỗi để phá vỡ an ninh hệ thống Lỗi tràn đệm điều kiện bất thường tiến trình lưu liệu vượt biên nhớ đệm có chiều dài cố định Kết liệu đè lên vị trí nhớ liền kề Dữ liệu bị ghi đè bao gồm nhớ đệm khác, biến liệu điều khiển luồng chạy chương trình (program flow control) Các lỗi tràn đệm làm cho tiến trình đổ vỡ cho kết sai Các lỗi kích hoạt liệu vào thiết kế đặc biệt để thực thi đoạn mã phá hoại để làm cho chương trình hoạt động cách khơng mong đợi Bằng cách đó, lỗi tràn đệm gây nhiều lỗ hổng bảo mật (vulnerability) phần mềm tạo sở cho nhiều thủ thuật khai thác (exploit) Việc kiểm tra biên (bounds checking) đầy đủ lập trình viên trình biên dịch ngăn chặn lỗi tràn đệm Ví dụ chương trình thực thi gồm vùng mã thực thi (program instructions), vùng lưu trữ liệu số (buffer storing integer data), vùng lưu trữ liệu chuỗi (buffer storing character data), địa quay chương trình (return address pointer) Với chương trình bình thường sau thực thi xong, dựa vào địa quay về, chương trình trả lại quyền điều khiển cho chương trình gọi Người cơng làm tràn đệm (ví dụ: vùng lưu trữ liệu chuỗi) làm cho địa quay bị chép đè địa đoạn mã phá hoại Kết quả, thay trả quyền điều khiển cho chương trình gọi thực thi đoạn mã chương trình phá hoại Chương II Kỹ thuật công lỗi tràn đệm Một lỗi tràn nhớ đệm xảy liệu viết vào nhớ đệm, mà không kiểm tra biên đầy đủ nên ghi đè lên vùng nhớ liền kề làm hỏng giá trị liệu địa nhớ kề với vùng nhớ đệm Hiện tượng hay xảy chép xâu ký tự từ nhớ đệm sang vùng nhớ đệm khác 2.1 Ví dụ Trong ví dụ sau, chương trình định nghĩa hai phần tử liệu kề nhớ: A nhớ đệm xâu ký tự dài byte B số nguyên kích thước byte Ban đầu, A chứa tồn byte giá trị 0, cịn B chứa giá trị Các ký tự có kích thước byte A A A A A A A A B B 0 0 0 0 Bây giờ, chương trình ghi xâu ký tự "excessive" vào đệm A, theo sau byte để đánh dấu kết thúc xâu Vì khơng kiểm tra độ dài xâu, nên xâu ký tự đè lên giá trị B: A A A A A A A A B 'e' 'x' 'c' 'e' 's' 's' 'i' B 'v' 'e' Tuy lập trình viên khơng có ý định sửa đổi B, giá trị B bị thay số tạo nên từ phần cuối xâu ký tự Trong ví dụ này, hệ thống big-endian sử dụng mã ASCII, ký tự "e" byte trở thành số 25856 Nếu B phần tử liệu lại số biến chương trình định nghĩa, việc viết xâu ký tự dài vượt phần cuối B gây lỗi chẳng hạn segmentation fault (lỗi phân đoạn) tiến trình kết thúc 2.2 Tràn nhớ đệm stack Bên cạnh việc sửa đổi biến khơng liên quan, tượng tràn đệm cịn thường bị lợi dụng (khai thác) tin tặc để làm cho chương trình chạy thực thi đoạn mã tùy ý cung cấp Các kỹ thuật để tin tặc chiếm quyền điều khiển tiến trình tùy theo vùng nhớ mà đệm đặt Ví dụ, vùng nhớ stack, nơi liệu tạm thời "đẩy" xuống "đỉnh" ngăn xếp (push), sau "nhấc ra" (pop) để đọc giá trị biến Thông thường, hàm (function) bắt đầu thực thi, phần tử liệu tạm thời (các biến địa phương) đẩy vào, chương trình truy nhập đến liệu suốt thời gian chạy hàm Khơng có tượng tràn stack (stack overflow) mà cịn có tràn heap (heap overflow) Trong ví dụ sau, "X" liệu nằm stack chương trình bắt đầu thực thi; sau chương trình gọi hàm "Y", hàm đòi hỏi lượng nhỏ nhớ cho riêng mình; sau "Y" gọi hàm "Z", "Z" đòi hỏi nhớ đệm lớn: Z Z Z Z Z Z Y X X X : / / / Nếu hàm "Z" gây tràn nhớ đệm, ghi đè liệu thuộc hàm Y hay chương trình chính: Z Z Z Z Z Z YXXX / / Điều đặc biệt nghiêm trọng hầu hết hệ thống Ngoài liệu thường, nhớ stack lưu giữ địa trả về, nghĩa vị trí phần chương trình chạy trước hàm gọi Khi hàm kết thúc, vùng nhớ tạm thời lấy khỏi stack, thực thi trao lại cho địa trả Như vậy, địa trả bị ghi đè lỗi tràn đệm, trỏ tới vị trí khác Trong trường hợp tượng tràn đệm khơng có chủ ý ví dụ đầu tiên, chắn vị trí vị trí khơng hợp lệ, khơng chứa lện Một người dùng thạo kỹ thuật có ý đồ xấu khai thác lỗi tràn đệm stack để thao túng chương trình theo cách sau: • Ghi đè biến địa phương nằm gần nhớ đệm stack để thay đổi hành vi chương trình nhằm tạo thuận lợi cho kẻ cơng • Ghi đè địa trả khung stack (stack frame) Khi hàm trả về, thực thi tiếp tục địa mà kẻ công rõ, thường đệm chứa liệu vào người dùng Nếu địa phần liệu người dùng cung cấp, biết địa lưu ghi, ghi đè lên địa trả giá trị địa opcode mà opcode có tác dụng làm cho thực thi nhảy đến phần liệu người dùng Cụ thể, địa đoạn mã độc hại muốn chạy ghi ghi R, lệnh nhảy đến vị trí chứa opcode cho lệnh jump R, call R (hay lệnh tương tự với hiệu ứng nhảy đến địa chi ghi R) làm cho đoạn mã phần liệu người dùng thực thi Có thể tìm thấy địa opcode hay byte thích hợp nhớ thư viện liên kết động (DLL) hay file thực thi Tuy nhiên, địa opcode thường khơng chứa ký 11 tự null (hay byte 0) nào, địa opcode khác tùy theo ứng dụng phiên hệ điều hành Dự án Metasploit sở liệu chứa opcode thích hợp, liệt kê opcode hệ điều hành Microsoft Windows Chương III Phương pháp phòng chống công tràn đệm Để chống lại công theo kiểu tràn đệm, người lập trình phải viết đọan mã để bảo vệ chương trình ứng dụng Đối với hệ thống chạy hệ điều hành Windows có lựa chọn để chống lại kiểu cơng là: • DEP – Data Execution Prevention: không thực thi thị nằm vùng liệu • ASLR – Address Space Layout Randomization: máy tính khởi động khởi động lại, ASLR gán vùng nhớ cách ngẫu nhiên cho tiến trình hệ thống, tập tin DLL Có tổng cộng 256 vùng khác gán Điều gây khó khăn cho người cơng việc định vị lợi dụng chương trình thực thi Để phịng chống cơng tràn đệm có hiệu nên kết hợp DEP ASLR Nhiều kỹ thuật đa dạng với nhiều ưu nhược điểm sử dụng để phát ngăn chặn tượng tràn đệm Cách đáng tin cậy để tránh ngăn chặn tràn đệm sử dụng bảo vệ tự động mức ngơn ngữ lập trình Tuy nhiên, loại bảo vệ áp dụng cho mã thừa kế (legacy code), nhiều ràng buộc kỹ thuật, kinh doanh hay văn hóa lại địi hỏi sử dụng ngơn ngữ khơng an tồn Các mục sau mô tả lựa chọn cài đặt có 3.1 Lựa chọn ngơn ngữ lập trình Lựa chọn ngơn ngữ lập trình có ảnh hưởng lớn xuất lỗi tràn đệm Năm 2006, C C++ nằm số ngơn ngữ lập trình thơng dụng nhất, với lượng khổng lồ phần mềm viết hai ngôn ngữ C C++ không cung cấp sẵn chế chống lại việc truy nhập ghi đè liệu lên phần nhớ thông qua trỏ bất hợp lệ; cụ thể, hai ngôn ngữ không kiểm tra xem liệu ghi vào mảng (cài đặt nhớ đệm) có nằm biên mảng hay khơng Tuy nhiên, cần lưu ý thư viện chuẩn C++, thư viện khuôn mẫu chuẩn - STL, cung cấp nhiều cách an toàn để lưu trữ liệu đệm, lập trình viên C tạo sử dụng tiện ích tương tự Cũng tính khác C hay C++, lập trình viên phải tự xác định lựa chọn xem họ có muốn chấp nhận hạn chế tốc độ chương trình để thu lại lợi ích tiềm (độ an tồn chương trình) hay không Một số biến thể C, chẳng hạn Cyclone, giúp ngăn chặn lỗi tràn đệm việc chẳng hạn gắn thơng tin kích thước mảng với 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ỏ 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 gửi cảnh báo ngoại lệ C C++ ghi đè liệu Ví dụ ngôn ngữ đa dạng, từ Python tới Ada, từ Lisp tới Modula-2, từ Smalltalk tới OCaml Các môi trường bytecode Java NET đòi hỏi kiểm tra biên tất mảng Gần tất ngôn ngữ thông dịch bảo vệ chương trình trước tượng tràn đệm cách thông báo trạng thái lỗi định rõ (well-defined error) Thông thường, ngôn ngữ cung cấp đủ thông tin kiểu để thực kiểm tra biên, ngơn ngữ thường cho phép lựa chọn kích hoạt hay tắt chế độ Việc phân tích tĩnh (static analysis) loại nhiều kiểm tra kiểu biên động, cài đặt tồi trường hợp rối rắm giảm đáng kể hiệu Các kỹ sư phần mềm phải cẩn thận cân nhắc phí tổn cho an toàn hiệu định sử dụng ngơn ngữ cấu cho trình biên dịch 3.2 Sử dụng thư viện an toàn Vấn đề tràn đệm thường gặp C C++ ngơn ngữ để lộ chi tiết biểu diễn mức thấp nhớ đệm với vai trò chỗ chứa cho kiểu liệu Do đó, phải tránh tràn đệm cách gìn giữ tính đắn cao cho phần mã chương trình thực việc quản lý đệm Việc sử dụng thư viện viết tốt kiểm thử, dành cho kiểu liệu trừu tượng mà thư viện thực tự động việc quản lý nhớ, có kiểm tra biên, làm giảm xuất ảnh hưởng tượng tràn đệm Trong ngôn ngữ này, xâu ký tự mảng hai kiểu liệu mà tượng tràn đệm thường xảy ra; đó, thư viện ngăn chặn lỗi tràn đệm kiểu liệu cung cấp phần che chắn cần thiết Dù vậy, việc sử dụng thư viện an toàn cách khơng dẫn đến tràn đệm số lỗ hổng khác; tất nhiên, lỗi thư viện lỗ hổng Các cài đặt thư viện "an toàn" gồm The Better String Library, Arri Buffer API Vstr Thư viện C hệ điều hành OpenBSD cung cấp hàm hữu ích strlcpy strlcat, hàm nhiều hạn chế nhiều so với cài đặt thư viện an toàn đầy đủ Tháng năm 2006, Báo cáo kỹ thuật số 24731 hội đồng tiêu chuẩn C công bố; báo cáo mô tả tập hàm dựa hàm vào liệu hàm xử lý xâu ký tự thư viện C chuẩn, hàm bổ sung tham số kích thước đệm 3.3 Chống tràn nhớ đệm stack Stack-smashing protection kỹ thuật dùng để phát hiện tượng tràn đệm phổ biến Kỹ thuật kiểm tra xem stack bị sửa đổi hay chưa hàm trả Nếu stack bị sửa đổi, chương trình kết thúc lỗi segmentation fault Các hệ thống sử dụng kỹ thuật gồm có Libsafe, StackGuard vá lỗi (patch) ProPolice gcc Chế độ Data Execution Prevention (cấm thực thi liệu) Microsoft bảo vệ thẳng trỏ tới SEH Exception Handler, không cho chúng bị ghi đè Có thể bảo vệ stack cách phân tách stack thành hai phần, phần dành cho liệu phần cho bước trả hàm Sự phân chia dùng ngơn ngữ lập trình Forth, khơng phải định thiết kế dựa theo tiêu chí an tồn Nhưng dù khơng phải giải pháp hoàn chỉnh vấn đề tràn đệm, liệu nhạy cảm địa trả bị ghi đè 3.4 Bảo vệ không gian thực thi Bảo vệ không gian thực thi cách tiếp cận việc chống tràn đệm Kỹ thuật ngăn chặn việc thực thi mã stack hay heap Một kẻ công sử dụng tràn đệm để chèn đoạn mã tùy ý vào nhớ chương trình, với bảo vệ khơng gian thực thi, cố gắng chạy đoạn mã gây ngoại lệ (exception) Một số CPU hỗ trợ tính có tên bit NX ("No eXecute" - "Khơng thực thi") bit XD ("eXecute Disabled" - "chế độ thực thi bị tắt" ) Khi kết hợp với phần mềm, tính dùng để đánh dấu trang liệu (chẳng hạn trang chứa stack heap) đọc không thực thi Một số hệ điều hành Unix (chẳng hạn OpenBSD, Mac OS X) có kèm theo tính bảo vệ khơng gian thực thi (ví dụ W^X) Các biến thể Microsoft Windows hỗ trợ bảo vệ không gian thực thi, với tên gọi Data Execution Prevention (ngăn chặn thực thi liệu) 3.5 Ngẫu nhiên hóa sơ đồ khơng gian địa Ngẫu nhiên hóa sơ đồ khơng gian địa (Address space layout randomization - ASLR) tính an ninh máy tính có liên quan đến việc xếp vị trí vùng liệu quan trọng (thường bao gồm nơi chứa mã thực thi vị trí thư viện, heap stack) cách ngẫu nhiên không gian địa tiến trình Việc ngẫu nhiên hóa địa nhớ ảo mà hàm biến nằm làm cho việc khai thác lỗi tràn đệm trở nên khó khăn hơn, khơng phải khơng thể Nó cịn buộc kẻ công phải điều chỉnh khai thác cho hợp với hệ thống cụ thể, điều làm thất bại cố gắng sâu Internet Một phương pháp tương tự hiệu hơn, kỹ thuật rebase tiến trình thư viện không gian địa ảo 3.6 Kiểm tra sâu gói tin Biện pháp kiểm tra sâu gói tin (deep packet inspection - DPI) phát cố gắng từ xa để khai thác lỗi tràn đệm từ biên giới mạng Các kỹ thuật có khả chặn gói tin có chứa chữ ký vụ cơng biết chứa chuỗi dài lệnh No-Operation (NOP - lệnh rỗng khơng làm gì), chuỗi thường sử dụng vị trí nội dung quan trọng (payload) cơng có biến đổi Việc rà gói tin khơng phải phương pháp hiệu ngăn chặn cơng biết, có nhiều cách để mã hóa lệnh NOP Các kẻ cơng sử dụng mã alphanumeric, metamorphic, shellcode tự sửa để tránh bị phát việc rà gói tin KẾT LUẬN Trong thời đại công nghệ thông tin phát triển vũ bão, vấn đề an tồn thơng tin trở nên cấp thiết Lỗi tràn đệm hiểm họa gây an tồn cho hệ thống Do đó, nghiên cứu cách phịng chống cơng tràn đệm phải trọng để đảm bảo hệ thống an toàn Đến nay, lỗi tràn đệm tiếp tục tìm thấy nhiều phần mềm nhiều hệ điều hành khác Đó thực nguy nghiêm trọng, vấn đề tồn lâu cần quan tâm cách nghiêm túc.Qua đề tài này, chúng em tìm hiểucách phịng chống công này, kỹ thuật chống công tràn đệm TÀI LIỆU THAM KHẢO http://vi.wikipedia.org/wiki/lỗi_tràn_bộ_đệm/ http://timtailieu.vn/tai-lieu/do-an-tim-hieu-ky-thuat-tan-cong-thong-qua-loi-tranbo-dem-tren-window-7330/ http://luanvan.co/luan-van/tim-hieu-ve-loi-tran-bo-dem-cach-khai-thac-cac-phongchong-demo-51752/ ... gói tin KẾT LUẬN Trong thời đại công nghệ thông tin phát triển vũ bão, vấn đề an tồn thơng tin trở nên cấp thiết Lỗi tràn đệm hiểm họa gây an toàn cho hệ thống Do đó, nghiên cứu cách phịng chống. .. bảo mật? Làm để ngăn chặn lỗi tràn đệm? Đó lý chúng em nghiên cứu đề tài Nghiên cứu xây dựng phương pháp chống công tràn stack Trong q trình thực đề tài nhóm em khơng khỏi mắc phải thiếu sót Mong... Tổng quan lỗi tràn đệm Error! Bookmark not defined Kỹ thuật công lỗi tràn đệm 2.1 Ví dụ 2.2 Tràn nhớ đệm stack 10 Phương pháp phòng chống công tràn đệm 13