TÌM HIỂU VỀ LỖI TRÀN BỘ ĐỆM (BUFFER OVERFLOW) KS Đào Hương Giang Tổ NCPT An toàn thông tin Tóm tắt: Tấn công Buffer Overflow có nguyên nhân gần giống với công SQL Injection, người dùng hay hacker cung cấp biên đầu vào hay liệu vượt khả xử lý chương trình làm cho hệ thống bị treo dẫn đến từ chối dịch vụ hay có khả bị hacker lợi dụng chèn thị trái phép nhằm thực đoạn mã nguy hiểm từ xa Vì vậy, báo tìm hiểu khái niệm công tràn đệm, cách công, cách phát cách phòng chống để nâng cao kiến thức kỹ phòng chống lại công Buffer Overflow Tác hại lỗi Buffer Overflow GIỚI THIỆU Lỗi tràn đệm (Buffer Overflow) điều kiện bất thường tiến trình lưu trữ liệu vượt biên nhớ đệm có chiều dài cố định Kết liệu đè lên 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) - Lỗi tràn đệm xảy ứng dụng cố gắng ghi liệu vượt khỏi phạm vi đệm (giới hạn cuối giới hạn đầu đệm) - Lỗi tràn đệm khiến ứng dụng ngừng hoạt động, gây liệu chí giúp kẻ công kiểm soát hệ thống tạo hội cho kẻ công thực nhiều thủ thuật khai thác khác NỘI DUNG 2.1 Các kiểu lỗi Buffer Overflow thường gặp Stack overflow: xuất buffer tràn stack space hình thức công phổ biến lỗi tràn đệm Mục đích: - 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ụ ý đồ hacker Nguyên nhân gây lỗi Buffer Overflow chương trình, ứng dụng: - Phương thức kiểm tra bên (boundary) không thực đầy đủ bỏ qua - Ghi đè địa trả khung stack Khi hàm trả thực thi tiếp tục địa mà hacker rõ, thường đệm chứa liệu vào người dùng - Các ngôn ngữ lập trình ngôn ngữ C, thân tiền ẩn lỗi mà hacker khai thác Ví dụ: - Các phương thức strcat(), strcpy(), sprintf(), bcopy(), gets(), canf() ngôn ngữ C khai thác hàm không kiểm tra buffer cấp phát stack có kích thước lớn liệu copy vào buffer hay không 289 2.2 Các kiểu khai thác lỗi Buffer Overflow Khai thác lỗi tràn đệm stack - 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 hai muốn chạy ghi ghi R, lệnh nhảy đến vị trí opcode cho lệnh jump R, call R (hay lệnh tương tự với hiệu ứng nhảy đến địa ghi R) làm cho đoạn mã phần liệu người dùng thực thi Format String: Tràn đệm chuỗi định dạng (thường gọi “lỗ hổng định dạng chuỗi”) lỗi tràn đệm mức chuyên môn cao, tác hại tương tự công tràn đệm khác Về bản, lỗ hổng định dạng chuỗi tận dụng lợi kiểu liệu hỗn hợp kiểm soát thông tin chức định, chẳng hạn C/C++ printf Khai thác lỗi tràn đệm heap - Một tường tràn đệm xảy khu vực liệu heap gọi tượng tràn heap khai thác kỹ thuật khác với lỗi tràn stack - Bộ nhớ heap cấp phát động ứng dụng thời gian chạy thường chứa liệu chương trình - Việc khai thác thực cách phá liệu theo cách đặc biệt để làm cho ứng dụng ghi đè lên cấu trúc liệu nội chẳng hạn trỏ danh sách liên kết Một số cách khai thác khác Chương trình đơn giản có đầu vào từ người dùng hiển thị lại hình Chuỗi %s có nghĩa tham số khác str hiển thị chuỗi Ví dụ không dễ bị công, thao đổi dòng cuối thành printf(str); dễ dàng bị khai thác - Khai thác dựa vào 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) - Khai thác trang web có tương tác người dùng không ràng buộc liệu nhập trường hợp username, password, 290 Tưởng tượng “ yourbuffer” bị đầy 2.3 Cách phát lỗi Buffer Overflow sau: Công nghệ biên dịch lý tưởng để phát dùng chương trình C C++ để biết thông tin kích thước liệu mã nguồn Một số thông tin xuất phát từ lời khai báo biến, mô tả kiểu biến sử dụng Các thông tin khác đến từ lệnh gọi chức chương trình Trình biên dịch cần phải hiểu tất thông tin để tạo mã fread (yourbuffer, 1, 49, file); Một trình biên dịch mà hiểu thuộc tính thư viện thời gian tiêu chuẩn biết đệm chứa liệu từ thời điểm không xác định hệ thống tập tin bên chương trình có khả bị nguy hiểm Mã myfunc() mã mở cửa cho công độc hại yourbuffer làm đầy với chuỗi liên tục Ví dụ: Sử dụng phân tích mã nguồn để tìm lỗi tràn đệm mã thực thi cách xác đòi hỏi phải hiểu biết sâu code Và công nghệ trình biên dịch thiết kế với mục đích tìm kiếm lỗi tràn đệm Nó hiệu xác phương pháp khác cung cấp cách nhìn sâu sắc tình trạng bảo mật đoạn mã mà phân tích Trong ví dụ trên, trình biên dịch hiểu đại diện gian (IR) có kích thước đệm 10 biết liệu đến từ tham số quen thuộc Tuy nhiên, nhìn vào tham số không đủ thông tin để biết làm liệu đại diện từ số bé đến số lớn Trình biên dịch tối ưu hóa điều bước tạo mã code Đầu tiên, nhìn vào tất mã code dòng Tiếp theo tìm vào đoạn mã từ lệnh gọi thường xuyên Và gọi phân tích interprocedural Tưởng tượng ví dụ bao gồm mã 2.4 Biện pháp ngăn chặn Việc xử lý đệm trước đọc hay thực thi làm thất bại khai thác lỗi tràn đệm không ngăn chặn cách tuyệt đối Việc xử lý bao gồm: - Chuyển từ chữ hoa thành chữ thường - Loại bỏ ký tự đặc biệt lọc xâu không chứa kí tự chữ số chữ Ngoài ra, có kỹ thuật để tránh việc lọc xử lý này: - Alphanumeric code: mã gồm toàn chữ số - Polumorphic code: mã đa hình - Seft-modifying code: mã tự sửa đổi - Tấn công kiểu return – to – libc Vì vậy, để tránh nguy bị khai thác lỗi buffer overflow cần sử dụng biện pháp phòng tránh hiệu Các yourfunc() gọi myfunc() đệm địa phương chứa đầu vào liệu Sử dụng phân tích interprocedural, trình biên dịch xây dựng đồ thị kết nối yourfunc() với myfunc() cách kết hợp kiến thức yourfunc() myfunc() Và hiểu cố gắng để chép 50 byte liệu vào đệm 10byte liệu Và lỗi tràn đệm xảy Lựa chọn ngôn ngữ lập trình: Ngôn ngữ lập trình có ảnh hưởng lớn xuất lỗi tràn đệm - Ngôn ngữ lập trình C C++ hai ngôn ngữ lập trình thông dụng, hạn chế không kiểm tra việc truy cập ghi đè liệu thông qua trỏ Cụ 291 thể không kiểm tra liệu copy vào mảng có phù hợp với kích thước mảng hay không tin bit NX (No eXecute) bit XD (eXecute Disable) 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 - Cyclone: biến thể C, giúp ngăn chặn lỗi tràn đệm việc gắn thông tin kích thước mảng với mảng 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ù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 - Ngôn ngữ lập trình 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 cung cấp ngoại lệ hay cảnh báo C hay C++ ghi đè liệu ví dụ Pythol, Ada, Lisp, Kiểm tra sâu gói tin: (deep packet inspection - DPI) 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 có khả ngăn 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ì) Việc rà quét gói tin 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 - Ngoài ra, môi trường Java hay Net đòi hỏi kiểm tra biên tất mảng Sử dụng thư viện an toàn: 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 Các thư viện an toàn gồm có: The Better String Library, Arri Buffer API, Vstr THẢO LUẬN Hiện nay, hầu hết máy tính bị công Buffer Overflow, việc tìm hiểu công Buffer Overflow cần thiết cho người quản trị, hay người dùng máy tính thông thường Như nói trên, công Buffer Overflow thực cách dễ dàng, kẻ công khai thác liệu ngôn ngữ lập trình phổ biến Vì vậy, để phòng chống, doanh nghiệp, tổ chức, cá nhân việc sử dụng ngôn ngữ lập trình cao hay thư viện an toàn, phải thường xuyên tổ chức rà quét để tìm lỗ hổng, ngăn chặn kịp thời công tràn đệm Chống tràn đệ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.Chế độ Data Execution Prevention (cấm thực thi liệu) Microsoft bảo vệ trỏ không cho chúng bị ghi đè.Có thể bảo vệ stack cách phân tán stack thành hai phần, phần dành cho liệu phần dành cho bước trả hàm, phân chia dùng ngôn ngữ Forth Bảo vệ không gian thực thi: Kỹ thuật ngăn chặn việc thực thi mã stack hay heap Hacker 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 đoạn mã gây ngoại lệ Một số CPU hỗ trợ tính có KẾT LUẬN Thực tế rằng, công tràn đệm thường xuyên xảy gây hậu nghiêm trọng cho hệ thống can thiệp trực tiếp vào mã nguồn Tuy báo dạng công Buffer Overflow cách phòng chống với phát triển công nghệ, 292 hacker không ngừng phát triển cách công vào hệ thống Vì vậy, báo giúp người đọc phần biết đến cách công Buffer Overflow mức độ nguy hiểm công phương pháp Buffer Overflow Bài báo sở phần giúp người đọc dựa vào để nghiên cứu sâu công từ đưa biện pháp phòng chống hiệu triệt để TÀI LIỆU THAM KHẢO Stack based Buffer Overflow Exploitation Tutorial – Saif IE Sherei Buffer Overflow Vulnerabilities and Attacks – Lecture Notes (Syracuse University) Different Techniques to Prevent Buffer Overflow – Kamanashis Biswas Buffer Overflow C.Foster Attacks – James https://www.owasp.org/index.php/Buffer_ overflow_attack Thông tin tác giả: Đào Hương Giang Sinh năm: 1990 Lý lịch khoa học: Tốt nghiệp đại học ngành Công nghệ Thông tin – Học viện Công nghệ Bưu Viễn thông năm 2012 Lĩnh vực nghiên cứu nay: Giải pháp bảo mật công nghệ an ninh ứng dụng Email: giangdh@ptit.edu.vn 293