Đăng ký Đăng nhập

Tài liệu Buffer overflow

.PDF
32
486
82

Mô tả:

CHƯƠNG 17 : BUFFER OVERFLOW Người thực hiện: Lê Long Bảo Ngành : Mạng Máy Tính Lớp : MM03A 1 Lỗi “zero day” vượt qua sự kiểm soát của người sử dụng Window Sự tràn bộ nhớ đệm là thủ thuật đánh lừa hệ điều hành của Microsoft để hệ thống cấp quyền riêng cho kẻ tấn công Nhiều phiên bản của hệ điều hành Microsoft dễ bị tổn thương, nhưng trước tới nay chưa được tiết lộ, việc tràn bộ đệm do lỗi “zero day” có nguy cơ bị tổn thương mà qua đó cho phép một kẻ tấn công chiếm được quyền của hệ thống và kiểm soát máy tính. Theo nghiên cứu của công ty bảo mật Vupen, vấn đề này gây ra bởi một lỗi tràn bộ đệm trong bộ xử lý ‘win32k.sys’ khi lưu trữ các giá trị registry đã được xử lý với ‘reg_binary’, mà qua đó có thể cho phép người dùng không có đặc quyền phá bỏ sự quản lý của hệ thống hoặc thực thi mã nhị phân với hạt nhân (hệ thống) đặc quyền, bằng cách thay đổi các giá trị registry liên quan tới người dùng cuối được xác định bằng ký tự (EUDC) qua các mã. Theo tổ chức nghiên cứu an ninh Chester Wisniewski tại Sophos, một kẻ tấn công có thể sử dụng mã khóa liên quan tới EUDC “để mạo danh tài khoản hệ thống, và có quyền truy cập gần như không giới hạn cho tất cả các thành phần của hệ thống Windows”. 2 Cách thức tấn công 1 chương trình thực Sự phá vỡ ngăn xếp Tràn bộ nhớ đệm trên ngăn xếp Các bước tràn bộ nhớ đệm Khai thác sự biến đổi của tràn bộ nhớ đệm Phòng chống và công cụ đối phó Tràn bộ nhớ đệm trên heap Điều khiển ngăn xếp Cách xác định tràn bộ nhớ đệm Công cụ phát hiện tràn bộ nhớ đệm Điều khiển, kiểm tra tràn bộ nhớ đệm Các bước kiểm tra tràn bộ nhớ đệm Tràn bộ nhớ đệm là gì 3 4    Lỗi tràn bộ đệm tổng quát xảy ra khi một bộ nhớ đệm đã được phân chia cho một không gian lưu trữ cụ thể có chứa nhiều dữ liệu được sao chép vào lớn hơn mức mà nó có thể xử lý. Khi chương trình được biên dịch và chạy, nó sẽ chỉ định một phần của bộ nhớ có độ dài 11 bytes để chứa chuỗi tấn công. Hàm Strcpy sẽ sao chép chuỗi “DDDDDDDDDDDDDD” vào chuỗi tấn công, lúc này bộ đệm sẽ vượt quá kích thước 11 bytes, dẫn tới tràn bộ đệm. Đây là loại dễ bị tổn thương trong hệ thống dựa trên UNIX và NT. 5 Các bước kiểm tra phần mềm thường không được thực hiện đầy đủ, trong nhiều trường hợp chúng bị bỏ qua hoàn toàn Các ngôn ngữ lập trình như C thường chứa những lỗ hổng Các lập trình viên thường không tuân thủ đúng theo các chuẩn đã đặt ra khi tạo 1 phần mềm Các chức năng trong ngôn ngữ lập trình C : strcat(), strcpy(), sprintf(), vsprintf(), bcopy(), gets() và scanf() có thể bị khai thác vì các hàm này không kiểm tra kích thước của bộ đệm. 6 + Stack truy xuất các phần tử theo kiểu LIFO (Last in First out) sử dụng hàm chức năng , và tham chiếu tới các biến cục bộ. Phần dưới của bộ nhớ + Nó hoạt động như một bộ đệm, giữ các thông tin mà hàm cần + Được tạo ra vào thời điểm bắt đầu của hàm và giải phóng lúc kết thúc hàm Thanh ghi dùng để ghi địa chỉ bên trong stack +SP là một thanh ghi lưu giữ địa chỉ trỏ đến ô nhớ hiện tại của vùng nhớ stack. Bộ đệm 2 (Biến cục bộ 2) Các điểm SP nằm ở đây Bộ đệm 1 (Biến cục bộ 1) Hướng đi vào Quay lại con trỏ Hàm gọi các tham số Phần trên của bộ nhớ Hướng tăng dần của stack 7   Sự tràn bộ đệm trên stack xảy ra khi không gian bộ đệm trong stack không còn trống. Kẻ tấn công truyền các mã độc hại lên stack và khi sự tràn bộ đệm xảy ra các mã độc hại này liền ghi đè lên các mã trước đó, các con trỏ phải trỏ lại để điều khiển mã độc hại. Một stack bình thường Stack khi bị kẻ tấn công gọi chức năng Stack khi một chức năng nào đó bị phá hoại    Heap là một khu vực của bộ nhớ được sử dụng bởi một ứng dụng và được cấp phát động tại thời gian chạy của các hàm, chẳng hạn như malloc(). Các biến tĩnh được lưu trữ trên stack cùng với dữ liệu được giao sử dụng giao diện malloc. Heap lưu trữ tất cả các trường hoặc thuộc tính, hàm tạo và phương thức của một lớp hoặc một đối tượng. Khung nhớ Heap 9    Nếu một ứng dụng sao chép dữ liệu mà không kiểm tra mặc dù nó phù hợp với nơi được sao chép tới, thì kẻ tấn công có thể cung cấp một lượng lớn dữ liệu cho ứng dụng đó, thực hiện ghi đè lên thông tin quản lý của heap. Kẻ tấn công làm một bộ nhớ đệm bị tràn lên phần dưới của heap, ghi đè lên các biến động khác gây nên các biến đổi bất ngờ và không mong muốn. lưu ý: trong hầu hết các trường hợp, điều này sẽ cho phép kẻ tấn công kiểm soát được việc thực hiện của chương trình 10 11 I Shellcode là một mã nhỏ được sử dụng trong việc khai thác lỗ hổng của một phần mềm. II Bộ đệm là mục tiêu mềm cho các kẻ tấn công vì chúng rất dễ tràn nếu có điều kiện phù hợp. III Shellcode gây tràn bộ đệm, viết bằng hợp ngữ, khai thác các lỗ hổng trong ngăn xếp và bộ nhớ quản lí heap. 12 + Hầu hết các CPU đều có một lệnh No Operation (Không hoạt động) – nó không làm gì nhưng thúc đẩy lệnh con trỏ. +Thông thường, bạn có thể đặt một trong số chúng trước chương trình của bạn (trong chuỗi). +Hầu hết các hệ thống phát hiện xâm nhập (IDSs) bằng cách tìm kiếm ký hiệu của NOP. +Kẻ tấn công làm tràn bộ đệm với các lệnh dài của NOP , lúc này CPU sẽ không làm gì cả cho tới khi nó nhận được “sự kiện chính” (trước con trỏ quay về). + ADMutate (bởi K2) chấp nhận một lỗi tràn bộ đệm nhằm khai thác như là đầu vào và ngẫu nhiên tạo ra một phiên bản có chức năng tương đương (đa hình). 13 Hiểu biết về tiến trình, bộ nhớ stack và heap. Hiểu biết về cách hệ thống gọi các công việc ở cấp độ mã máy. Kiến thức về lắp ráp và ngôn ngữ máy. Quen với các công cụ biên dịch và sửa lỗi như gdb. Kiến thức ngôn ngữ lập trình C và Perl. 14 I Tìm sự hiện diện và vị trí của lỗ hổng tràn bộ đệm II Ghi nhiều dữ liệu vào bộ đệm hơn mức nó có thể xử lý III Ghi đè lên địa chỉ quay về của hàm IV Thay đổi luồng thực thi bằng mã được hacker chèn vào 15 Giả sử rằng một hàm chuỗi bị khai thác, kẻ tấn công có thể gửi một chuỗi dài đầu vào. Con trỏ trả về của hàm tiến hành ghi đè, và kẻ tấn công thành công trong việc thay đổi luồng thực hiện lệnh. Nếu người sử dụng chèn vào mã đầu vào, anh ta hoặc cô ta biết chính xác địa chỉ và kích thước của ngăn xếp và làm con trỏ trở về hướng tới đoạn mã của anh ta để thực hiện chỉ thị. 16 Có vấn đề nếu người dùng nhập =“%%%%%%%%%%%” Trong C, xét ví dụ của chuỗi định dạng có vấn đề. Int func(char *user) { Fprintf ( stdout, user); } + Chương trình có thể bị lỗi . + Nếu không, chương trình sẽ in nội dung bộ nhớ + Lúc này khai thác hoàn toàn có thể xảy ra bằng cách sử dụng user =“%n” Hình thức đúng Int func (char *user) { Fprintf ( stdout, “%s”, user) ; } Trong C, xét ví dụ của BoF sử dụng chuỗi định dạng Như thế nào nếu user = %500stràn bộ đệm sẽ xảy ra 18 Ý tưởng chung là gây ra tràn một bộ đệm để sau đó ghi đè lên địa chỉ trả về Khi hàm được thực hiện xong nó sẽ nhảy tới bất kỳ địa chỉ nào trên ngăn xếp. Tràn bộ nhớ đệm cho phép chúng ta thay đổi địa chỉ trả về của một hàm. Đặt một số mã trong bộ đệm và thiết lập địa chỉ trở về. 19  Một khi lỗ hổng bị phát hiện và bị phá vỡ bởi hacker, hacker có thể có đặc quyền tương tự và có thể điều khiển truy cập bình thường.  Sau đó anh ta hoặc cô ta có thể khai thác một lỗi tràn bộ đệm cục bộ để đạt được quyền truy cập của siêu người dùng.  Sau khi chiếm được, kẻ tấn công có thể dùng backdoor làm cửa sau để tạo lại kết nối cho lần sau 20
- Xem thêm -

Tài liệu liên quan