Tấn công tràn bộ nhớ

Một phần của tài liệu Giáo trình An toàn và bảo mật thông tin (Nghề: Công nghệ thông tin - Cao đẳng) - Trường CĐ Nghề Kỹ thuật Công nghệ (Trang 43 - 44)

1 Kẻ xâm nhập

3.9. Tấn công tràn bộ nhớ

Để làm tràn bộ đệm, kẻ tấn công cần phải phát hiện lỗ hổng tràn bộ đệm trong chương trình nào đó. Theo dõi, lần theo vết thực hiện, sử dụng các công cụ ẩn. Hiểu bộ đệm lưu trong bộ nhớ như thế nào và xác định khả năng phá hỏng

Một chút về lịch sử ngơn ngữ lập trình. Ở mức ngơn ngữ máy mọi dữ liệu là mảng các bytes, thông dịch phụ thuộc vào các chỉ lệnh được dùng. Ngôn ngữ bậc cao hiện đại có định nghĩa chặt về kiểu và các phép tốn đúng. Khơng có lỗ hổng tràn bộ đệm, được lường trước, giới hạn khi dùng.

C và ngơn ngữ liên quan có cấu trúc điều khiển bậc cao, nhưng cho phép truy cập trực tiếp đến bộ nhớ. Vì vậy có lỗ hổng tràn bộ đệm. Có kế thừa lớn các code khơng an tồn, đang được sử dụng rộng rãi, nên có lỗ hổng.

Để hiểu hơn tạo sao lại tràn bộ nhớ, mà không khắc phục được, ta xem xét cơ chế mà lời gọi hàm quản lý trạng thái cục bộ cho mỗi lời gọi. Khi một hàm gọi hàm khác, nó cần phải lưu ở đâu đó địa chỉ trả về để hàm được gọi khi kết thúc trả điều khiển cho hàm gọi. Bên cạnh đó cũng cần có chỗ để cất một số tham số mà cần truyền cho hàm được gọi và cũng cần lưu các giá trị thanh ghi của hàm gọi mà cần được sử dụng khi hàm được gọi kết thúc. Thông thường mọi dữ liệu này được cất ở khung ngăn xếp (stack frame). Mỗi lần gọi hàm lại sinh ra một khung ngăn xếp liên kết.

Tràn bộ đệm ngăn xếp xảy ra khi bộ đệm đặt trên ngăn xếp. Nó được khai thác bởi sâu Morris. Bài báo “Smashing the Stack” tuyên truyền nó. Có biến cục bộ phía dưới con trỏ khung lưu trữ và địa chỉ trả lại. Vì vậy tràn bộ đệm cục bộ có nhiều khả năng viết đè các mục điều khiển chính. Kẻ tấn cơng viết đè địa chỉ trả về với địa chỉ của đọan code cài vào. Đó có thể là địa chỉ của chương trình, thư viện hệ thống hoặc tải vào bộ đệm.

Chúng ta xem cấu tạo vùng nhớ, nơi cất chương trình đang chạy, dữ liệu tổng thể, đống và ngăn xếp. Khi chương trình chạy, hệ điều hành tạo ra một tiến trình cho nó. Tiến trình được cho bởi khơng gian ảo của riêng nó với cấu trúc như trên hình vẽ sau. Nó bao gồm nội dung chương trình đang chạy, trong đó có dữ liệu tổng thể, bảng cấp bộ nhớ, code của chương trình ở gần đáy của khơng gian nhớ này. Trên đó khơng gian cho đống tăng dần lên và trên nữa là không gian cho ngăn xếp giảm dần xuống.

Để mô tả tràn bộ đệm ngăn xếp ta xét chương trình C sau. Nó chứa biến cục bộ duy nhất, bộ đệm inp. Hàm Hello nhắc nhập tên mà được đọc vào bộ đệm nhờ hàm thư viện khơng an tồn gets(). Sau đó hiện kết quả đọc được nhờ hàm thư viện printf (). Nếu giá trị nhỏ được đọc thì ở đây khơng có vấn đề gì. Chương trình gọi hàm sẽ

chạy thành công như trong lần chạy thứ nhất trên hình sau đó. Nếu dữ liệu lớn như trong lần chạy thứ hai, dữ liệu sẽ vượt qua cuối bộ đệm và ghi đè lên con trỏ khung lưu trữ và trả về địa chỉ sai tương ứng với biểu diễn nhị phân của các ký tự. Và khi hàm trả điều khiển cho địa chỉ trả về, nó nhảy đến vị trí bộ nhớ khơng hợp lệ, báo lỗi “Segmentation Fault” và dừng chương trình khơng bình thường như thơng báo trên hình sau đó. Kẻ tấn cơng tận dụng cơ hội này để truyền điều khiển về chương trình đã định trước.

Một phần của tài liệu Giáo trình An toàn và bảo mật thông tin (Nghề: Công nghệ thông tin - Cao đẳng) - Trường CĐ Nghề Kỹ thuật Công nghệ (Trang 43 - 44)