Nghiên cứu và xây dựng phương pháp tấn công tràn stack 1. Tổng quan về lỗi tràn bộ đệm Bộ đệm (buffer): là vùng nhỏ trên RAM, lưu trữ mã thực thi, dữ liệu của chương trình đang được thực thi bởi CPU. Một lỗi tràn bộ nhớ đệm hay gọi tắt là lỗi tràn bộ đệm là một lỗi lập trình có thể gây ra một ngoại lệ truy nhập bộ nhớ máy tính và chương trình bị kết thúc, hoặc khi người dùng có ý phá hoại, họ có thể lợi dụng lỗi này để phá vỡ an ninh hệ thống. Lỗi tràn bộ đệm là một điều kiện bất thường khi một tiến trình lưu dữ liệu vượt ra ngoài biên của một bộ nhớ đệm có chiều dài cố định. Kết quả là dữ liệu đó sẽ đè lên các vị trí bộ nhớ liền kề. Dữ liệu bị ghi đè có thể bao gồm các bộ nhớ đệm khác, các biến và dữ liệu điều khiển luồng chạy của chương trình (program flow control). Các lỗi tràn bộ đệm có thể làm cho một tiến trình đổ vỡ hoặc cho ra các kết quả sai. Các lỗi này có thể được kích hoạt bởi các dữ liệu vào được thiết kế đặc biệt để thực thi các đoạn mã phá hoại hoặc để làm cho chương trình hoạt động một cách không như mong đợi. Bằng cách đó, các lỗi tràn bộ đệm gây ra nhiều lỗ hổng bảo mật (vulnerability) đối với phần mềm và tạo cơ sở cho nhiều thủ thuật khai thác (exploit). Việc kiểm tra biên (bounds checking) đầy đủ bởi lập trình viên hoặc trình biên dịch có thể ngăn chặn các lỗi tràn bộ đệm. Ví dụ như một chương trình đang thực thi gồm vùng mã thực thi (program instructions), vùng lưu trữ dữ liệu số (buffer storing integer data), vùng lưu trữ dữ liệu chuỗi (buffer storing character data), và địa chỉ quay về của chương trình (return address pointer). Với 1 chương trình bình thường sau khi thực thi xong, dựa vào địa chỉ quay về, chương trình sẽ trả lại quyền điều khiển cho chương trình đã gọi nó. Người tấn công sẽ làm tràn bộ đệm (ví dụ: tại vùng lưu trữ dữ liệu chuỗi) làm cho địa chỉ quay về bị chép đè bởi địa chỉ của 1 đoạn mã phá hoại. Kết quả, thay vì trả quyền điều khiển về cho chương trình đã gọi nó thì sẽ thực thi đoạn mã của chương trình phá hoại. 2. Kỹ thuật tấn công lỗi tràn bộ đệm Một lỗi tràn bộ nhớ đệm xảy ra khi dữ liệu được viết vào một bộ nhớ đệm, mà do không kiểm tra biên đầy đủ nên đã ghi đè lên vùng bộ nhớ liền kề và làm hỏng các giá trị dữ liệu tại các địa chỉ bộ nhớ kề với vùng bộ nhớ đệm đó. Hiện tượng này hay xảy ra nhất khi sao chép một xâu ký tự từ một bộ nhớ đệm này sang một vùng bộ nhớ đệm khác. 2.1. Ví dụ Trong ví dụ sau, một chương trình đã định nghĩa hai phần tử dữ liệu kề nhau trong bộ nhớ: A là một bộ nhớ đệm xâu ký tự dài 8 byte và B là một số nguyên kích thước 2 byte. Ban đầu, A chỉ chứa toàn các byte giá trị 0, còn B chứa giá trị 3. Các ký tự có kích thước 1 byte. A A A A A A A A B B 0 0 0 0 0 0 0 0 0 3 Bây giờ, chương trình ghi một xâu ký tự excessive vào bộ đệm A, theo sau là một byte 0 để đá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ự mới đã đè lên giá trị của B: A A A A A A A A B B e x c e s s i v e 0 Tuy lập trình viên không có ý định sửa đổi B, nhưng giá trị của B đã bị thay thế bởi một số được tạo nên từ phần cuối của xâu ký tự. Trong ví dụ này, trên một hệ thống bigendian sử dụng mã ASCII, ký tự e và tiếp theo là một byte 0 sẽ trở thành số 25856. Nếu B là phần tử dữ liệu duy nhất còn lại trong số các biến được chương trình định nghĩa, việc viết một xâu ký tự dài hơn nữa và vượt quá phần cuối của B sẽ có thể gây ra một lỗi chẳng hạn như segmentation fault (lỗi phân đoạn) và tiến trình sẽ kết thúc. 2.2. Tràn bộ nhớ đệm trên stack Bên cạnh việc sửa đổi các biến không liên quan, hiện tượng tràn bộ đệm còn thường bị lợi dụng (khai thác) bởi tin tặc để làm cho một chương trình đang chạy thực thi một đoạn mã tùy ý được cung cấp. Các kỹ thuật để một tin tặc chiếm quyền điều khiển một tiến trình tùy theo vùng bộ nhớ mà bộ đệm được đặt tại đó. Ví dụ, vùng bộ nhớ stack, nơi dữ liệu có thể được tạm thời đẩy xuống đỉnh ngăn xếp (push), và sau đó được nhấc ra (pop) để đọc giá trị của biến. Thông thường, khi một hàm (function) bắt đầu thực thi, các phần tử dữ liệu tạm thời (các biến địa phương) được đẩy vào, và chương trình có thể truy nhập đến các dữ liệu này trong suốt thời gian chạy hàm đó. Không chỉ có hiện tượng tràn stack (stack overflow) mà còn có cả tràn heap (heap overflow). Trong ví dụ sau, X là dữ liệu đã từng nằm tại stack khi chương trình bắt đầu thực thi; sau đó chương trình gọi hàm Y, hàm này đòi hỏi một lượng nhỏ bộ nhớ cho riêng mình; và sau đó Y gọi hàm Z, Z đòi hỏi một bộ nhớ đệm lớn: Z Z Z Z Z Z Y X X X : Nếu hàm Z gây tràn bộ nhớ đệm, nó có thể ghi đè dữ liệu thuộc về hàm Y hay chương trình chính: Z Z Z Z Z Z Y X X X . . . . . . . . Điều này đặc biệt nghiêm trọng đối với hầu hết các hệ thống. Ngoài các dữ liệu thường, bộ nhớ stack còn lưu giữ địa chỉ trả về, nghĩa là vị trí của phần chương trình đang chạy trước khi hàm hiện tại được gọi. Khi hàm kết thúc, vùng bộ nhớ tạm thời sẽ được lấy ra khỏi stack, và thực thi được trao lại cho địa chỉ trả về. Như vậy, nếu địa chỉ trả về đã bị ghi đè bởi một lỗi tràn bộ đệm, nó sẽ trỏ tới một vị trí nào đó khác. Trong trường hợp một hiện tượng tràn bộ đệm không có chủ ý như trong ví dụ đầu tiên, hầu như chắc chắn rằng vị trí đó sẽ là một vị trí không hợp lệ, không chứa một lện Một người dùng thạo kỹ thuật và có ý đồ xấu có thể khai thác các lỗi tràn bộ đệm trên stack để thao túng chương trình theo một trong các cách sau: • Ghi đè một biến địa phương nằm gần bộ nhớ đệm trong stack để thay đổi hành vi của chương trình nhằm tạo thuận lợi cho kẻ tấn công. • Ghi đè địa chỉ trả về trong một khung stack (stack frame). Khi hàm trả về, thực thi sẽ được tiếp tục tại địa chỉ mà kẻ tấn công đã chỉ rõ, thường là tại một bộ đệm chứa dữ liệu vào của người dùng. Nếu không biết địa chỉ của phần dữ liệu người dùng cung cấp, nhưng biết rằng địa chỉ của nó được lưu trong một thanh ghi, thì có thể ghi đè lên địa chỉ trả về một giá trị là địa chỉ của một opcode mà opcode này sẽ có tác dụng làm cho thực thi nhảy đến phần dữ liệu người dùng. Cụ thể, nếu địa chỉ đoạn mã độc hại muốn chạy được ghi trong một thanh ghi R, thì một lệnh nhảy đến vị trí chứa opcode cho một lệnh jump R, call R (hay một lệnh tương tự với hiệu ứng nhảy đến địa chi ghi trong R) sẽ làm cho đoạn mã trong phần dữ liệu người dùng được thực thi. Có thể tìm thấy địa chỉ của các opcode hay các byte thích hợp trong bộ nhớ tại các thư viện liên kết động (DLL) hay trong chính file thực thi. Tuy nhiên, địa chỉ của opcode đó thường không được chứa một ký tự null (hay byte 0) nào, và địa chỉ của các opcode này có thể khác nhau tùy theo các ứng dụng và các phiên bản của hệ điều hành. Dự án Metasploit là một trong các cơ sở dữ liệu chứa các opcode thích hợp, tuy rằng trong đó chỉ liệt kê các opcode trong hệ điều hành Microsoft Windows.
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 .4 Kỹ thuật công lỗi tràn đệm 2.1 Ví dụ .6 2.2 Tràn nhớ đệm stack Phương pháp phòng chống công tràn đệm 3.1 Lựa chọn ngơn ngữ lập trình 3.2 Sử dụng thư viện an toàn 10 3.3 Chống tràn nhớ đệm stack 11 3.4 Bảo vệ không gian thực thi 11 3.5 Ngẫu nhiên hóa sơ đồ khơng gian địa 12 3.6 Kiểm tra sâu gói tin 12 Kết Luận 13 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: Hà văn Trường Nguyễn việt Long Đỗ văn Tiền Nguyễn Tỉnh Nghiên cứu xây dựng phương pháp công tràn stack Tổng quan 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 ngồi 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 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 toàn byte giá trị 0, B chứa giá trị Các ký tự có kích thước byte A A A A A A A A B 0 0 0 0 B 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 B 'e' 'x' 'c' 'e' 's' 's' 'i' '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 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 Y X X X / / Đ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ý 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 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ệ khơng thể á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 đủ 10 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 đổ, 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) 11 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 12 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 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ểu cách phịng chống cơng này, kỹ thuật chống công tràn đệm 13 ... Tiền Nguyễn Tỉnh Nghiên cứu xây dựng phương pháp công tràn stack Tổng quan 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... 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 .4 Kỹ thuật công lỗi tràn đệm 2.1 Ví dụ .6 2.2 Tràn nhớ đệm stack Phương pháp phòng chống công tràn đệm 3.1 Lựa chọn