Kĩ thuật khai thác lỗ hổng bảo mật trong nhân hệ điều hành linux

63 1.4K 6
Kĩ thuật khai thác lỗ hổng bảo mật trong nhân hệ điều hành linux

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đồ án thực hiện tìm hiểu, nghiên cứu, thực hành các kĩ thuật khai thác lỗ hổng bảo mật trong Linux Kernel. Đồ án gồm chia thành các phần tường ứng với các giai đoạn làm đồ án: Phần 1 tìm hiểu các thành phần trong Linux Kernel như quản lý bộ nhớ, quản lý tiến trình, tương tác với bộ vi xử lý; Phần 2 tìm hiểu các lỗ hổng bảo mật phổ biến trong Linux Kernel, nắm rõ nguyên nhân gốc và các trường hợp dễ dẫn tới lỗ hổng; Phần 3 nghiên cứu, tổng hợp các kĩ thuật khai thác đã biết trên thế giới; Phần 4 thực hành các kĩ thuật nghiên cứu được để viết mã khai thác lỗ hổng, thực hành tấn công trên hệ thống lab; Phần 5 đưa ra các biện pháp phòng chống mà lâu nay các quản trị viên hệ thống chưa hiểu rõ và lắm vững.

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG ──────── * ─────── ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC NGÀNH KĨ THUẬT MÁY TÍNH TÊN ĐỀ TÀI Nghiên cứu kĩ thuật khai thác lỗ hổng bảo mật nhân hệ điều hành Linux Sinh viên thực : Phạm Văn Khánh Lớp KSTN - CNTT – K55 Giáo viên hướng dẫn: ThS Lương Ánh Hoàng HÀ NỘI 12-2015 PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Thông tin sinh viên Họ tên sinh viên: Phạm Văn Khánh Điện thoại liên lạc: 01642642065 Email: phamvankhanhbka@gmail.com Lớp: KSTN-CNTT-K55 Hệ đào tạo: Kĩ sư Đồ án tốt nghiệp thực tại: Hà Nội Thời gian làm ĐATN: Từ ngày 15/08/2015 đến 18/12/2015 Mục đích nội dung ĐATN Tìm hiểu, nghiên cứu thực hành kĩ thuật khai thác lỗ hổng bảo mật Linux Kernel Các nhiệm vụ cụ thể ĐATN     Tìm hiểu Linux Kernel Tìm hiểu lỗ hổng bảo mật Linux Kernel Nghiên cứu kĩ thuật khai thác lỗ hổng Linux Kernel Thực hành viết mã khai thác lỗ hổng điển hình minh họa kĩ thuật tìm hiểu nghiên cứu Lời cam đoan sinh viên: Tôi – Phạm Văn Khánh - cam kết ĐATN công trình nghiên cứu thân hướng dẫn Ths Lương Ánh Hoàng Các kết nêu ĐATN trung thực, chép toàn văn công trình khác Hà Nội, ngày 18 tháng 12 năm 2015 Tác giả ĐATN Phạm Văn Khánh Xác nhận giáo viên hướng dẫn mức độ hoàn thành ĐATN cho phép bảo vệ: ……………………………………………………………………………………………… ……………………………………………………………………………………………… ……………………………………………………………………………………………… ……………………………………………………………………………………………… …………………………… Hà Nội, ngày 18 tháng 12 năm 2015 Giáo viên hướng dẫn Ths Lương Ánh Hoàng TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang Đồ án thực tìm hiểu, nghiên cứu, thực hành kĩ thuật khai thác lỗ hổng bảo mật Linux Kernel Đồ án gồm chia thành phần tường ứng với giai đoạn làm đồ án: Phần tìm hiểu thành phần Linux Kernel quản lý nhớ, quản lý tiến trình, tương tác với vi xử lý; Phần tìm hiểu lỗ hổng bảo mật phổ biến Linux Kernel, nắm rõ nguyên nhân gốc trường hợp dễ dẫn tới lỗ hổng; Phần nghiên cứu, tổng hợp kĩ thuật khai thác biết giới; Phần thực hành kĩ thuật nghiên cứu để viết mã khai thác lỗ hổng, thực hành công hệ thống lab; Phần đưa biện pháp phòng chống mà lâu quản trị viên hệ thống chưa hiểu rõ vững MỤC LỤC Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang DANH MỤC HÌNH ẢNH Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang VÀ TỪ VIẾT TẮT  Linux: hệ điều hành mã nguồn cung cấp miễn phí dạng phân phối khác Thành phần Linux Linux Kernel  Linux Kernel: Thành phần hệ điều hành tương tác với phần cứng, thực chức quản lý nhớ, quản lý tiến trình, quản lý vào thiết bị ngoại vi  Debug: Quá trình chạy lệnh chương trình, kiểm tra nhớ, ghi, trạng thái chương trình  Debugger: Công cụ cho phép thực debug chương trình Trình debugger phổ linux gdb  Remote debug: Thực debug từ xa Kĩ thuật sử dụng cần debug kernel máy khác không truy cập trực tiếp vào máy khác  Little-endian: định dạng lưu trữ liệu byte quan trọng lưu địa cao Kiến trúc Intel sử dụng kiểu lưu trữ  Page frame: Không gian địa vật lí chia thành khối kích thước cố định để quản lý Mỗi khối gọi page frame Kích thước page frame thường 4KB  Page: Không gian địa ảo chia thành khối kích thước cố định để quản lý Mỗi khối gọi page Kích thước page thường 4KB  Page table: Bảng ánh xạ page vào page frame Bảng ánh xạ cho phép tìm địa vật lí RAM biết địa ảo vùng nhớ  Userland: Vùng nhớ dành cho tiến trình thông thường, thường 3GB từ địa 0x00000000 đến 0xC0000000  Kernelland: Vùng nhớ dành cho kernel, thường 1GB từ địa 0xC0000000 đến 0xFFFFFFFF Linux cho Intel x86  User Mode: Trạng thái CPU, lệnh bị giới hạn không phép truy cập không gian địa dành cho kernel Thỉnh thoảng user mode trạng thái tiến trình chạy user path  Kernel Mode: Trạng thái CPU, lệnh không bị giới hạn Thỉnh thoảng kernel mode trạng thái tiến trình chạy kernel path (xử lý ngắt gọi hàm hệ thống)  User Path: Mã lệnh thực thi nằm userland CPU chạy mã lệnh tiến trình bên phía user  Kernel Path: Mã lệnh thực thi nằm kernelland CPU chạy mã lệnh kernel (gọi hàm hệ thống, xử lý ngắt, lập lịch)  System Call: Lời gọi hệ thống cho phép tiến trình tương tác với kernel Bản chất system call hàm bình thường, gọi CPU chuyển sang kernel mode  Interrupt: Tín hiệu gửi đến CPU có kiện xảy ra, ví dụ người dùng gõ phím, di chuột, gói tin mạng đến card mạng  Interrupt Handler: Hàm xử lý ngắt gọi ngắt gửi đến CPU CPU định xử lý ngắt  Vector ngắt (Interrupt vector): Vùng nhớ chứa thông tin ngắt cụ thể: địa hàm xử lý ngắt, quyền để gọi ngắt,  IDT ( interrupt descriptor table): Bảng lưu trữ thông tin tất vector ngắt sử dụng hệ thống Bản chất IDT mảng lưu trữ kernelland, phần từ mảng lưu trữ vector ngắt Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang  Lỗ hổng: Là loại lỗi phần mềm cho phép kẻ công thay đổi luồng thực thi phần mềm theo ý kẻ công Lỗi thông thường (bug) thường làm phần mềm hoạt động sai  Shellcode: đoạn mã lệnh nhỏ đặt vùng nhớ Mục tiêu khai thác lỗ hổng thường để chuyển hướng thực thi đến shellcode  Payload: đoạn liệu gửi tới phần mềm để khai thác lỗ hổng đó, payload thường chứa shellcode  Local Privilege Escalation: Lỗ hổng phần mềm kẻ công chiếm tài khoản thông thường muốn chiếm quyền tài khoản cao hơn, nhiều quyền Mục tiêu thường tài khoản root Linux tài khoản Administrator Windows  Dereference: Một trỏ ngôn ngữ C lưu trữ địa vùng nhớ Dereference trình lấy địa vùng nhớ truy cập tới giá trị vùng nhớ  NULL Pointer Dereference: Lỗ hổng phần mềm trỏ NULL giải tham chiếu, tức truy cập tới vùng nhớ địa 0x0  Buffer: vùng nhớ cấp phát dùng để lưu trữ liệu, buffer xác định địa byte kích thước  Buffer Overflow: Lỗ hổng phần mềm gây chép liệu vào buffer Kích thước liệu lớn kích thước buffer dẫn tới tràn khỏi buffer, đè vùng nhớ nằm sau buffer  Stack Frame: Một vùng nhớ stack cấp phát gọi hàm Vùng nhớ bao gồm tham số truyền vào hàm, địa trả hàm kết thúc, địa stack frame hàm cha, biến cục dùng hàm  Return Address: Địa trả hàm lưu stack Khi hàm kết thúc gọi lệnh ret, pop địa trả stack chuyển hướng EIP vào địa Hàm cha tiếp tục chạy từ vị trí gọi hàm  Saved Frame Pointer: Địa stack frame hàm cha lưu stack frame hàm Địa hàm lưu ghi EBP Địa dùng để khôi phục lại EBP hàm thực xong  Stack Overflow: Thuộc loại lỗ hổng buffer overflow mà buffer cấp phát stack  Heap Overflow: Thuộc loại lỗ hổng buffer overflow mà buffer cấp phát động heap thông qua hàm malloc (userland) kalloc (kernelland)  Infoleak: Một loại lỗ hổng liệu quan trọng bị đọc Chẳng hạn vùng nhớ kernelland bị đọc tiến trình userland tiến trình quyền truy cập vùng địa kernel  Executable: Trạng thái để đánh dấu vùng nhớ có quyền thực thi MỞ ĐẦU Ngày an toàn thông tin vấn đề quan trọng Các hệ thống công nghệ thông tin tiềm ẩn nhiều nguy an toàn đặc biệt lỗ hổng bảo mật Nghiên cứu lỗ hổng bảo mật giúp ta hiểu rõ cách thức hacker lợi dụng Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang lỗ hổng để công hệ thống từ xây dựng biện pháp phòng chống, nâng cao mức độ an toàn cho hệ thống Từ trước đến nay, lỗ hổng bảo mật lớp ứng dụng biết đến nghiên cứu nhiều Việt Nam chẳng hạn lỗ hổng SQL Injection công website, lỗ hổng Microsoft Office cho phép cài đặt virus lên máy tính người dùng,… Tuy nhiên lớp lỗ hổng sâu nhân hệ điều hành lại chưa thực quan tâm Nguyên nhân nhân hệ điều hành thành phần phức tạp hệ thống, khó để tìm hiều đào sâu nghiên cứu, đòi hỏi nắm vững nhiều kiến thức hệ điều hành, vi xử lý máy tính Sau thời gian học tập trường, bảo hướng dẫn nhiệt tình thầy cô giáo viện Công nghệ thông tin truyền thông, trường đại học Bách Khoa Hà Nội, em kết thúc khoá học tích luỹ vốn kiến thức định Được đồng ý nhà trường thầy cô giáo viện em giao đề tài tốt nghiệp: “Nghiên cứu kĩ thuật khai thác lỗ hổng bảo mật nhân hệ điều hành Linux” Đồ án tốt nghiệp em bố cục gồm sáu chương:       Chương 1: Đặt vấn đề định hướng giải pháp Chương 2: Giới thiệu Linux Kernel Chương 3: Giới thiệu lỗ hổng Linux Kernel Chương 4: Kĩ thuật khai thác lỗ hổng Linux Kernel Chương 5: Thực khai thác lỗ hổng điển hình Linux Kernel Chương 6: Các biện pháp phòng chống Bằng cố gắng nỗ lực thân đặc biệt giúp đỡ tận tình, chu đáo thầy giáo Ths Lương Ánh Hoàng, em hoàn thành đồ án thời hạn Do thời gian làm đồ án có hạn trình độ nhiều hạn chế nên tránh khỏi thiếu sót Em mong nhận đóng góp ý kiến thầy cô bạn sinh viên để đồ án hoàn thiện Em xin chân thành cảm ơn thầy giáo Ths Lương Ánh Hoàng, thầy cô giáo viện Công nghệ thông tin truyền thông, trường Đại học Bách khoa Hà nội, anh chị bạn tập thể phòng An ninh ứng dụng, Trung tâm An ninh mạng Viettel tạo điều kiện giúp đỡ em thời gian qua Hà nội, ngày 18/12/2015 Phạm Văn Khánh Đặt vấn đề định hướng giải pháp Đặt vấn đề: Linux Kernel sử dụng phổ biến máy chủ, thiết bị di động, thiết bị nhúng Thống kê năm 2015 khoảng tỷ 400 triệu điện thoại Android chạy Linux, Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 35.9% số lượng máy chủ số triệu máy chủ khảo sát chạy hệ điều hành Linux, 98.8% siêu máy tính số 500 siêu máy tính chạy Linux (nguồn Wikipedia) Tuy nhiên nhận thức lỗ hổng bảo mật cho chúng lại chưa thực quan tâm Sở dĩ kiến thức lỗ hổng bảo mật cách khai thác lỗ hổng đặc biệt quản trị viên hệ thống, chuyên viên bảo mật Việt Nam Qua kinh nghiệm thực tế, em phát máy chủ Linux Việt Nam sử dụng phiên Kernel thấp, tồn nhiều lỗ hổng bảo mật dễ dàng bị hacker khai thác công leo thang lên tài khoản root; thiết bị Android người dùng hầu hết không cập nhật phiên thường xuyên Từ em nhận thấy để nâng cao nhận thức bảo mật Linux Kernel đồng thời nắm rõ biện pháp phòng chống trước tiên cần phải hiểu rõ chế hoạt động lỗ hổng, chứng minh nguy hiểm lỗ hổng thông qua việc tìm hiểu kĩ thuật khai thác viết mã công Để làm điều này, đề tài em thực tập trung giải cho toán gốc sau: “Làm chiếm quyền root có quyền người dùng bình thường hệ thống Linux” Nhiệm vụ đề tài:  Nghiên cứu kĩ thuật khai thác lỗ hổng bảo mật Linux Kernel: tổng hợp kĩ thuật phát triển giới  Thực hành viết mã khai thác lỗ hổng điển hình: chọn lỗ hổng hay, điển hình công bố Linux Kernel viết mã khai thác ngôn ngữ C cho lỗ hổng Dựng môi trường lab để thực công thử nghiệm  Đưa biện pháp phòng chống lỗ hổng bảo mật Linux Kernel Hướng giải quyết: Đề tài thiên hướng nghiên cứu, lý thuyết Do đó, hướng giải em tìm hiểu, nghiên cứu kĩ kiến thức lý thuyết Ba phần kiến thức lý thuyết cần đào sâu tìm hiểu đề tài kiến thức Linux Kernel, kiến thức lỗ hổng phần mềm kiến thức kĩ thuật khai thác lỗ hổng phần mềm sử dụng cho Linux Kernel Các kiến thức lý thuyết áp dụng phần thực hành viết mã khai thác thông qua công cụ lập trình công cụ debug môi trường lab mô hệ thống máy chủ Linux thực tế Các công cụ lựa chọn:  Phần mềm tạo máy ảo Vmware 10 có hỗ trợ module cho phép debug kernel máy ảo  Bản phân phối Ubuntu 12.04.0 chạy Linux Kernel phiên 3.2.0-23generic  Trình biên dịch gcc trình debug gdb Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang  Ngôn ngữ lập trình C Môi trường lab thực hiện: Hai máy ảo Ubuntu, máy ảo chạy gdb để thực remote debug kernel máy ảo lại, từ cho phép chạy lệnh hợp ngữ kernel, kiểm tra vùng nhớ, biến, trạng thái ghi Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 10 Bằng cách sử dụng lỗ hổng stack overflow, địa trả lưu stack ghi đè địa ta điều khiển Địa thường địa shellcode mà ta chuẩn bị từ bước (xem mục 3.2 chuẩn bị shellcode) Khi hàm trả về, địa shellcode gọi Trong hình minh họa bên dưới, shellcode cấp phát địa 0x80c03508, địa vùng userland Hình 3.36 Địa trả ghi đè địa 0x80C03508 - Ghi đè biến cục lân cận Tình phụ thuộc vào hàm gọi có chứa biến cục gì? Chúng sử dụng hàm Dựa thứ tự khai báo, buffer tràn ghi đè biến cục nào? Tình có kĩ thuật tồng quát để xử lý Mỗi trường hợp lỗ hổng, có cách xử lý riêng Một trường hợp phổ biến ghi đè trỏ dẫn lỗ hổng tới tình ghi đè giá trị địa (mục 3.3.4) 4.3.3 Heap Overflow Như giới thiệu phần 2.4, lỗ hổng Heap Overflow cho phép ghi đè vài vùng nhớ nằm sau buffer bao gồm: đối tượng lân cận cấp phát thông tin metadata đối tượng free - Ghi đè đối tượng lân cận cấp phát Đây kĩ thuật phổ biến dễ sử dụng Mục tiêu ghi đè số trường liệu quan trọng đối tượng lân cận, thường ta chọn trỏ hàm Vì thay đổi địa trỏ hàm chứa cách gọi trỏ hàm chuyển hướng luồng thực thi chương trình Vấn đề chọn đối tượng lân cận làm để xảy ghi đè đối tượng nằm sau đối Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 49 tượng tràn Kĩ thuật cho phép cấp phát xếp vị trí đối tượng heap:  Ép kernel cấp phát trang nhớ cho cache (Ta phải theo dõi thông tin       cấp phát file /proc/slabinfo) Cấp phát số đối tượng tạm gọi placeholder object Cấp phát đối tượng mục tiêu gọi target object, hiển nhiên target object nằm sau placeholder object Thực giải phóng placeholder object Cấp phát đối tượng nạn nhân gọi victim object Ta lựa chọn đối tượng kích thước, dó victim object cấp phát vào placeholder object vừa giải phóng Lúc mục tiêu target object nằm sau victim object hoàn thành Thực thi lỗ hổng heap overflow tác động lên victim object, victim object bị tràn, target object bị ghi đè Lợi dụng việc ghi đè ta thay đối liệu quan trọng target object Việc thay đổi tùy thuộc lỗi cụ thể thông thường ta thay đổi trỏ hàm đó, thay đổi trỏ cho phép ghi liệu vào địa Ta điều khiển target object, việc lại dựa vào để chuyển hướng đếu vị trí đặt shellcode Các bước thực minh họa hình vẽ sau: Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 50 Hình 3.37 Ghi đè đối tượng lân cận cấp phát - Ghi đè thông tin metadata đối tượng free Kĩ thuật phức tạp kĩ thuật ghi đè đối tượng lân cận, nhiên hữu dụng số trường hợp đặc biệt đây:  Chúng ta ghì đè phần nhỏ liệu nằm sau heap buffer (chẳng hạn ghi đè byte bytes) Ví dụ điển hình xử lý mảng, ta ghi đè tối đa phần tử mảng nghĩ phần tử mảng cuối có số ARRAY_SIZE Trong trường hợp sử dụng kĩ thuật trước, vùng nhớ ta ghi đè ít, trỏ hàm không đặt đầu đối tượng  Chúng ta tìm target object thích hợp để ghi đè Lưu ý target object phải có kích thước với victim object để việc cấp phát xếp đôi tượng thực Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 51  Kernel có chế chặn không cho phép dereference trỏ hàm tới userland Khi có ghi đè đối tượng lân cận, không thực thi lỗi Nhắc lại quản lý đối tượng free heap, đối tượng free đặt trỏ gọi next-free-object để chứa địa đối tượng free heap Các đối tượng free lập thành danh sách liên kết Khi kernel cần cấp phát đối tượng tìm danh sách free để cấp phát Nếu tìm cách ghi đè trỏ next-free-object này, thay đổi nó, cho trỏ tới vùng nhớ phía userland Hiển nhiên kernel cấp phát đối tượng mới, vùng nhớ phía userland cấp phát sử dụng Và điều quan trọng vùng nhớ phía userland ta hoàn toàn điều khiển được, ta đặt giá trị nào.Các bước thự sau:  Ép kernel cấp phát slab hoàn toàn (bằng cách theo dõi thông tin slab file /proc/slabinfo)  Thực cấp phát toàn đối tượng slab Khi slab trở thành đầy  Thực giải phóng số đối tượng cấp phát Hình 3.14 ta giải phóng đối tượng số số Các đối tượng giải phóng lập thành danh sách free, quản lý trỏ freelist  Thực thi lỗi ghi đè đối tượng số 3, thông tin metadata đói tượng free nằm sau bị ghi đè Cụ thể trỏ next-free-object ghi đè thành địa thuộc vùng nhớ userland  Thực cấp phát đối tượng mới, kernel bị ta lừa cấp phát đối tượng phía userland, nơi mà ta có toàn quyền điều khiển Đối tượng giả mạo gọi fake-object  Điều khiển fake object đẻ thay đổi luồng thưc thi chương trình ta mong muốn Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 52 Hình 3.38 Ghi đè trỏ next-free-object để trỏ tới vùng nhớ userland 4.3.4 Ghi đè giá trị địa Ghi đè địa tính thuận lợi Tình nghe vô lý thường xuyên xảy Xem xét lỗ hổng Stack Overflow, Heap Overflow, ta ghi đè vùng nhớ lân cận, stack biến cục lân cận, heap đối tượng cấp phát sau Nếu biến cục trỏ, đối tượng nằm sau chứa trỏ, điều phổ biến lập trình C sử dụng trỏ thường xuyên, giá trị trỏ bị ta điều khiển Nói cách khác, ta cho trỏ trỏ đến địa nhớ, kể vùng nhớ kernelland Chương trình thương thao tác với giá trị trỏ chúng, đặt giá trị, tăng giá trị, giảm giá trị, chép liệu vào Dữ liệu để thao tác thường đến từ phía người dùng, ta điều khiển Khi ta ghi đè giá trị địa bất kì, ta làm gì? Thông thường liệu quan khởi tạo địa khó khác định trước được, chẳng hạn địa trả lưu đâu stack, địa đối tượng heap khó lường Kĩ thuật cung cấp cách tổng quát Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 53 giúp khai thác lỗ hổng dạng Điểm mấu chốt ta tìm cách ghi đè trỏ hàm toàn cục – cụ thể ghi đè vector ngắt - Ghi đè vector ngắt Bảng ngắt bảng lưu trữ vector ngắt (IDT) Mỗi vector ngắt có chứa trỏ trỏ tời hàm xử lý ngắt (xem mục 3.1.2 Các thông tin cần thu thập) Bảng ngắt lưu địa kernelland, lấy lệnh getidt Khi ngắt xảy ra, hàm xử lý ngắt gọi Bằng cách thay đổi địa hàm xử lý ngắt địa shellcode, ta thực thi shellcode (hình 3) Hình 3.39 Kĩ thuật ghi đè vector ngắt Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 54 Khai thác lỗ hổng thực tế CVE-2013-2094 Thực khai thác lỗi điển hình kernel áp dụng vào thực tế Trong phần đồ án trình bày ví dụ thực tế cách thức attacker khai thác lỗ hổng để công chiếm quyền hệ thống Thông thường trình khai thác gồm hai bước: chiếm quyền người dùng từ xa (thâm nhập hệ thống) vượt quyền (leo thang hệ thống) Đồ án tập trung sâu vào phần vượt quyền phần minh họa khai thác lỗ hổng kernel 5.1 Khai thác lỗ hổng GHOST để chiếm quyền người dùng từ xa Phần đồ án giới thiệu lỗ hổng phía user cho phép attacker chiếm quyền từ xa hệ thống, chiếm quyền người dùng thông thường mà quyền root Phần 4.2 trình bày phần thực vượt quyền người dùng bình thường lên root thông qua lỗ hổng kernel sử dụng kĩ thuật mà ta nghiên cứu phần Lỗ hổng phía user sử dụng lỗ hổng GHOST GHOST lỗ hổng bảo mật nghiệm trọng phát thư viện GNU C Library (glibc) sử dụng hầu hết hệ điều hành Linux, lỗ hổng cho phép kẻ công xâm nhập từ bên thực thi lệnh điều khiển chiếm quyền máy chủ Lỗ hổng GHOST đăng ký mã lỗi CVE-2015-0235, phát chuyên gia nghiên cứu bảo mật Redwood Shores, từ công ty bảo mật tiếng Qualys Glibc viết ngôn ngữ lập trình C C++ nhằm cung cấp hàm gọi hệ thống (system calls), hàm gethostbyname glibc có trách nhiệm phân giải IP từ tên miền mà lập trình viên gọi đến GHOST xuất phát từ lỗ hổng tràn đệm heap tìm thấy hàm nss_hostname_digits_dots mà thư viện glibc hỗ trợ, hàm ảnh hưởng đặc biệt đến hàm gọi _gethostbyname gethostbyname2 Hiện lỗ hổng GHOST có mã khai thác cho phần mềm email server exim phổ biến Nếu máy chủ exim sử dụng phiên glibc cũ có khả bị công lỗ hổng Hình minh họa khai thác lỗ hổng GHOST máy chủ exim, chạy Ubuntu 12.04, exim 4.76 Máy attacker chạy Kali 2.0 công cụ công metasploit Khi khai thác thành công, attacker chiếm quyền tài khoản Debian-exim Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 55 Hình 4.40 Khai thác lỗ hổng GHOST để chiếm quyền người dùng Debian-exim 5.2 Khai thác lỗ hổng kernel chiếm quyền toàn hệ thống Phần trình bày chi tiết demo công lỗ hổng CVE-2013-2094, lỗ hổng thuộc thành phần “performance monitoring” kernel linux Lỗ hổng ảnh hưởng tới tất phiên kernel từ 2.6.37-2.8.9, ảnh hưởng tới số phiên 2.6.32 sử dụng Centos nhân linux lập trình viên Centos chỉnh sửa để thêm vào tính mà phiên cũ chưa có Linux Kernel cung cấp tập hàm api hệ thống (system call) cho phép thu thập quản lý hiệu hệ thống (performance monitoring) Một hàm số perf_event_open, sử dụng userland để lấy “file descriptor”, từ chương trình phía user đọc thông tin hiệu hệ thống thời gian CPU, số lệnh thực thi, số lần miss cache, từ “file descriptor” Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 56 Hình 4.41 Định nghĩa khai báo sử dụng hàm hệ thống perf_event_open Tham số hàm perf_event_open cấu trúc perf_event_attr Ta xem chi tiết số trường cấu trúc (Chú ý trường config số nguyên không dấu 64 bit): Hình 4.42 Cấu trúc perf_event_attr với trường config có kiểu unsigned 64 bit Khi ứng dụng gọi hàm perf_event_open, than perf_event_open gọi hàm perf_swevent_init, hàm tĩnh sử dụng phía kernel Ứng dụng gọi trực tiếp hàm Hình 4.43 Hàm perf_swevent_init ép kiểu config số nguyên 32 bit có dấu Trường config 64 bit không dấu ép kiểu số nguyên 32 bit có dấu event_id (hình 4.4) Và giá trị event_id sử dụng để truy cập mảng perf_swevent_enabled Hình dung trường hợp sau: Người dùng cung cấp giá trị có trường config với bit thứ 31 (giả sử 0x00000000800000ff) Giá trị ép kiểu int, cắt bỏ 32 bit, đặt vào biến event_id (0x800000ff) Event_id lúc có giá trị âm bit 1, phép so sánh với số PERF_COUNT_SW_MAX với giá trị âm Event_id mở rộng thành số nguyên 64 bit dùng số truy cập phần tử mảng perf_swevent_enabled, với event_id âm phép toán tăng giá trị tăng giá trị phần tử nằm phía trước mảng, địa phần tử Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 57 hoàn toàn điều khiển thông qua giá trị event_id Ta có lỗ hổng tăng giá trị địa Cách khai thác lỗ hổng sau:  Một vùng nhớ phía userland cấp phát hàm mmap cờ MAP_FIXED  Ta đặt đoạn NOP sled phần nhỏ shellcode vào vùng nhớ Shellcode có nhiệm vụ nâng quyền tiến trình khôi phục hệ thống (chuẩn bị shellcode)  Sử dụng lỗi tăng giá trị địa trên, để làm thay đổi địa xử lý ngắt ngắt số khoảng địa mà ta cấp phát (Địa xử lý ngắt xác định thông qua bước tìm hiểu môi trường)  Thực kích hoạt ngắt số (gọi lệnh int 4) Khi hàm xử lý ngắt gọi, bị thay đổi nên thực tế mã shellcode gọi (Bước thực thi) Hình ảnh mã khai thác chạy: Hình 4.44 Mã khai thác vượt quyền từ người dùng Debian-exim lên root Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 58 Biện pháp phòng chống 6.1 Nâng cấp vá Kernel thường xuyên Nâng cấp vá thường xuyên cách phòng chống lỗ hổng bảo mật hiệu không Kernel mà cho tất phần mềm khác Mỗi có lỗ hổng công bố, nhà phát hành cung cấp gói cập nhật vá lỗ hổng kèm Công việc người quản trị thực cập nhật vá Công việc cập nhật hoàn toàn đơn giản, hệ thống Centos Redhat, ta sử dụng công cụ yum, hệ thống Ubuntu, Debian ta sử dụng công cụ apt-get Hầu hết phân phối Linux khác cung cấp công cụ tương tự cho phép cập nhật vá nhanh chóng Ngay hệ thống kết nối Internet, download gói cập nhật (thường đóng gói rpm deb) sử dụng công cụ dòng lệnh rpm (đối với dòng Redhat, Centos) dpkg (đối với dòng Debian, Ubuntu) để cài đặt Việc cập nhật vá kernel có rủi ro định, chẳng hạn sau cập nhật xong hệ thống chạy không ổn định, bị crash Trường hợp xảy ra, cập nhật nhà phát hành kiểm tra kĩ trước public, cập nhật lỗ hổng thường không gây ảnh hưởng lớn đến chức kernel, cập nhật lỗ hổng sửa dòng code đó, thêm vài câu lệnh kiểm tra liệu Tuy nhiên trường hợp rủi ro cần tính đến, đặc biệt hệ thống quan trọng Trong trường hợp này, ta nên có hệ thống test trước để cập nhật, sau theo dõi xem cập nhật có ảnh hưởng đến hoạt động hệ thống khoảng thời gian định Hình 5.45 Cập nhật vá cách sử dụng công cụ yum Centos Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 59 Theo dõi lỗ hổng công bố nhiệm vụ quan trọng Hiện có nhiều kênh để theo dõi thông tin lỗ hổng công bố, không nguyên Linux Kernel mà ứng dụng khác Chẳng hạn trang tin tức www.exploit-db.com, www.packetstormsecurity.com; mailing list public phổ biến thảo luận security, cung cấp tin tức: http://www.openwall.com/lists/osssecurity/, http://seclists.org/fulldisclosure/, http://seclists.org/bugtraq/; trang cung cấp thông tin security nhà phát hành như: https://access.redhat.com/security/security-updates/#/security-advisories Cách theo dõi hiệu subscribe mailing list ngày vào đọc tin tức trang tin Một số nhà phát hành cung cấp dịch vụ tính phí, chẳng hạn redhat, mua gói hỗ trợ họ, có vá mới, nhanh thông qua email, ta kịp thời cập nhật lỗ hổng nguy hiểm Hình 5.46 Trang tin tức cập nhật vá lỗ hổng Redhat Thực trạng Việt Nam, công tác cập nhật vá lỗ hổng đặc biệt lỗ hổng Kernel không thực trọng tâm lí chung người quản trị sợ làm ảnh hưởng đến hoạt động bình thường hệ thống Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 60 6.2 Cấu hình bảo mật cho hệ thống Cầu hình bảo mật cho hệ thống không hoàn toàn chống lỗ hổng bảo mật, nhiên giúp phòng lỗ hổng phổ biến, hạn chế khả khai thác lỗ hổng bị công Dựa nghiên cứu kĩ thuật khai thác lỗ hổng cho Kernel (được trình bày phần đồ án), hệ thống Linux nên thực cấu sau để nâng cao tính bảo mật:  Giới hạn thông tin thu thập attacker: Phân quyền không cho người dùng     bình thường truy cập thư mục /boot, phân vùng /proc, giới hạn người dùng thường sử dụng công cụ dịch debug gcc, gdb Đây thư mục công cụ cho phép thu thập nhiều thông tin quan trọng, cần thiết cho trình viết mã khai thác lỗ hổng Chẳng hạn, attacker đọc danh sách, địa sysmbol file /boot/System-map, /proc/kallsyms, attacker dịch mã khai thác hệ thống Centos mặc định cho phép user thường truy cập file Tối giản hóa kernel module, device drivers cần sử dụng hệ thống Chẳng hạn nhiều phiên phân phối tích hợp sẵn usb drivers, thực tế ta không cần sử dụng chúng, ta nên tắt bỏ chúng, vừa an toàn lại vừa nâng cao hiệu hệ thống Các module GUI không cần thiết đối máy chủ sử dụng tương tác dòng lệnh Để tối giản hóa thành phần không cần thiết, quản trị viên phải thực hiểu sâu hệ thống, kernel, có nhiều kinh nghiệm Cấu hình ASLR (address space layout randomization) : địa stack heap khởi tạo ngẫu nhiên Attacker khai thác lỗ hổng, muốn chuyển hướng luồng thực thi chương trình không tính toán xác địa cần chuyển hướng Các phân phối Centos 6, Ubuntu 12 mặc định bật tính Cài đặt gói bảo mật từ bên thứ ba: Openwall Linux Kernel Patch, Exec Shield, Pax Team Các gói bảo mật hỗ trợ nhiều tính chẳng hạn cấm trả từ kernelland sang userland, khai thác lỗ hổng stack overflow, ta ghi đè địa trả ghi đè địa userland Cơ chế vượt qua gói bảo mật có thường khó Phạm vi đồ án chưa thể tìm hiểu sâu chế Build Kernel từ mã nguồn, đảm báo tối ưu hóa Kernel, cấu hình số tính bảo mật Việc build kernel từ mã nguồn đòi hỏi quản trị viên thực có kinh nghiệm với hệ thống Linux số lượng cấu hình cho kernel lớn Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 61 Kết luận Qua đồ án này, em nhận thấy thu số kết sau:  Nâng cao kiến thức hệ điều hành cụ thể nhân Linux, nâng cao kĩ đọc mã nguồn nhân Linux  Nắm bắt lớp lỗ hổng bảo mật kĩ thuật khai thác lỗ hổng bảo mật nhân Linux, tổng hợp dạng tài liệu tiếng việt tương đối đầy đủ  Thực khai thác thành công lỗ hổng cũ nhân Linux dựa kĩ thuật nghiên cứu, thực hành công hệ thống lab, từ nâng cao nhận thức mức độ nguy hiểm lỗ hổng Linux Kernel Mặc đù cố gắng nghiên cứu, chưa có nhiều kinh nghiệm lĩnh vực khai thác lỗ hổng bảo mật kiến thức nhân hệ điều hành Linux hạn chế nên chắn không tránh khỏi sai sót, mong thầy cô bạn đóng góp ý kiến để em rút kinh nghiệm cho công việc Định hướng phát triển:  Nghiên cứu kĩ thuật khai thác lỗ hổng nâng cao, vượt qua chế bảo vệ nhân Linux  Đi sâu mặt tìm kiếm lỗ hổng mới: tìm hiểu thành phần Kernel Linux, tiếp cận đọc mã nguồn Kernel Linux, nghiên cứu phương pháp để tìm lỗ hổng chưa công bố Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 62 Tài liệu tham khảo [1] Operating System Concepts 8th Edition by Abraham Silberschatz (Author), Peter B Galvin (Author), Greg Gagne (Author) Publisher: Wiley; edition (July 29, 2008) Language: English ISBN: 0470128720 [2] Hacking: The Art of Exploitation, 2nd Edition 2nd Edition by Jon Erickson (Author) Publisher: No Starch Press; 2nd edition (February 4, 2008) Language: English ISBN: 1593271441 [3] A Guide to Kernel Exploitation: Attacking the Core 1st Edition by Enrico Perla B.Sc Computer Science University of Torino M.Sc Computer Science Trinity College Dublin (Author), Massimiliano Oldani (Author) Publisher: Syngress; edition (September 15, 2010) Language: English ISBN: 1597494860 [4] The Shellcoder's Handbook: Discovering and Exploiting Security Holes 2nd Edition by Chris Anley (Author), John Heasman (Author), Felix Lindner (Author), Gerardo Richarte (Author) Publisher: Wiley; edition (August 20, 2007) Language: English ISBN: 047008023X [5] Understanding the Linux Kernel, 3rd Edition by Daniel P Bovet (Author), Marco Cesati (Author) Publisher: Syngress; edition (September 15, 2010) Language: English ISBN: 1597494860 [6] Phrack magazine:  Attacking the Core : Kernel Exploiting Notes - http://phrack.org/issues/64/6.html  Handling Interrupt Descriptor Table for fun and profit http://phrack.org/issues/59/4.html [7] Nghệ thuật tận dụng lỗi phần mềm – Tác giả Nguyễn Thành Nam Sinh viên Phạm Văn Khánh SHSV: 20101715 Lớp: KSTN-CNTT-K55 Trang 63 [...]... trường hệ điều hành, được thực hiện trước khi mã khai thác chạy Trong bước này cần chú ý những chi tiết sau: - - Không làm đổ vỡ hệ thống: Điều này rất quan trọng khi khai thác lỗi kernel Bước thu thập thông tin cho phép mã khai thác quyết định tại thời điểm runtime cần phải làm gì để mã khai thác không gây ảnh hưởng tới hệ thống Ví dụ, nếu mã khai thác phá vỡ các cấu trúc dữ liệu quan trọng trong kernel... thiệu Linux Kernel 2.1 Tổng quan về Linux và Linux Kernel Linux là hệ điều hành mã nguồn mở, được phát triển dựa trên hệ điều hành UNIX Linux gồm có một nhân kernel (mã cốt lõi quản lý các tài nguyên phần cứng và phần mềm) và một bộ sưu tập các ứng dụng của người dùng (chẳng hạn như các thư viện, các trình quản lý cửa sổ và các ứng dụng) (hình 1.1) Nhân Linux (Linux Kernel) là trung tâm điều khiển của hệ. .. KSTN-CNTT-K55 Trang 26 Hình 2.14 Stack Buffer Overflow xảy ra khi localbuf ghi đè địa chỉ trả về thành giá trị khác Lỗ hổng Stack Buffer Overflow được coi là lỗ hổng kinh điển nhất trong lịch sử khai thác lỗ hổng bảo mật Nó thường xảy ra khi lập trình bằng ngôn ngữ cấp thấp như C Nguyên nhân chính dẫn tới lỗ hổng này là do:  Sử dụng những hàm không an toàn của ngôn ngữ C như strcpy() hoặc sprint() Những... assembly Do đó, Linux Kernel tiềm ẩn nhiều lỗ hổng khác nhau Thực tế quá khứ đã cho thấy nhiều lỗ hổng đã từng được tìm ra và khai thác trên Linux Kernel Khi nhắc đến việc khai thác lỗ hổng trên kernel chúng ta thường sử dụng thuật ngữ local privilege escalation – vượt quyền Giả sử ta đã chiếm được quyền tài khoản thông thường trên hệ thống (đơn giản như là tấn công ứng dụng web của hệ thống), nhưng... Lỗ hổng phần mềm được chia thành nhiều loại: memory corruption như stack overflow, heap overflow, lỗi format string, sử dụng con trỏ không đúng như useafter-free, double-free, không khởi tạo con trỏ, các lỗi logic như race condition Lịch sử lĩnh vực nghiên cứu lỗ hổng phần mềm bắt đầu từ những năm 1982, khi mà con sâu máy tính đầu tiên Morris được viết khai thác lỗ hổng của phần mềm finger Các kĩ thuật. .. các dạng lỗ hổng thường gặp trong Linux Kernel 3.2 Lỗ hổng NULL Pointer Dereference Đây là lớp lỗ hổng đã từng rất phổ biến cho Linux Kernel Lỗ hổng này liên quan đến việc sử dụng con trỏ không đúng Như chúng ta đã biết, con trỏ được sử dụng để lưu trữ địa chỉ của một biến khác trong bộ nhớ, mỗi lần con trỏ được giải tham chiếu, giá trị được lưu tại địa chỉ mà con trỏ giữ sẽ được tham chiếu Trong ngôn... Kernel) là trung tâm điều khiển của hệ điều hành Linux chứa các mã nguồn điều khiển hoạt động toàn bộ của hệ thống, tương tác với vi xử lý, bộ nhớ, quản lý các tiến trình ứng dụng, quản lý vào ra Nhân Linux được lập trình bằng ngôn ngữ C và được Linus Torvalds phát triển từ năm 1991 Hình 1.1 Kiến trúc tổng quan hệ điều hành Linux Phạm vi đồ án sẽ tập trung vào Linux Kernel trên nền tảng Intel x86 và... để đảm bảo mã khai chạy đúng như kịch bản Nguyên tắc chung là mã khai thác chạy lỗi tốt hơn là làm chết hệ thống Đơn giản hóa tiến trình khai thác: Nói cách khác, bất kì thông tin nào mã hệ thống cung cấp sẽ cung cấp một điểm đầu vào an toàn và tốt hơn cho mã shellcode Giả sử một lỗi kernel cho phép ghi một giá trí tùy ý tại một địa chỉ bất kì (write-what-where) với quyền kernel, khi đó mã khai thác. .. nhau, đặc biệt nếu hệ thống kernel lại được build từ source Khi đó nếu hệ thống có thể cung cấp cho ta địa chỉ này thay vì là code cứng địa chỉ trong mã khai thác thì mã khai thác chạy sẽ ổn định hơn Hai chi tiết này có mối quan hệ chặt chẽ với nhau Chi tiết thứ hai cho phép viết mã khai thác một lần duy nhất nhưng có thể chạy trên nhiều phiên bản khác nhau, do đó làm giảm nguy cơ chết hệ thống Một lưu... Hình 2.16 Hai kiểu cấu trúc slab Chúng ta đã hiểu cơ bản về khái niệm heap được sử dụng trong kernel Vậy heap overflow là như thế nào Lỗ hổng heap overflow về bản chất cũng như nguyên nhân hoàn toàn giống với lỗ hổng stack overflow Điểm khác biệt là ngữ cảnh xảy ra lỗi và những vùng nhớ có thể bị ghi đè Trong lỗ hổng heap overflow, một vùng nhớ với kích thước cố đinh n được kernel cấp phát trên heap ... thường hệ thống Linux Nhiệm vụ đề tài:  Nghiên cứu kĩ thuật khai thác lỗ hổng bảo mật Linux Kernel: tổng hợp kĩ thuật phát triển giới  Thực hành viết mã khai thác lỗ hổng điển hình: chọn lỗ hổng. .. bảo mật Linux Kernel Các nhiệm vụ cụ thể ĐATN     Tìm hiểu Linux Kernel Tìm hiểu lỗ hổng bảo mật Linux Kernel Nghiên cứu kĩ thuật khai thác lỗ hổng Linux Kernel Thực hành viết mã khai thác lỗ. .. thiệu Linux Kernel Chương 3: Giới thiệu lỗ hổng Linux Kernel Chương 4: Kĩ thuật khai thác lỗ hổng Linux Kernel Chương 5: Thực khai thác lỗ hổng điển hình Linux Kernel Chương 6: Các biện pháp phòng

Ngày đăng: 13/03/2016, 10:39

Từ khóa liên quan

Mục lục

  • 1 Đặt vấn đề và định hướng giải pháp

  • 2 Giới thiệu Linux Kernel

    • 2.1 Tổng quan về Linux và Linux Kernel

    • 2.2 Nhắc lại kiến thức nền tảng về vi xử lý

    • 2.3 Quản lý bộ nhớ trong Linux Kernel

    • 2.4 Quản lý tiến trình trong Linux Kernel

    • 3 Giới thiệu lỗ hổng trong Linux Kernel

      • 3.1 Giới thiệu chung về lỗ hổng

      • 3.2 Lỗ hổng NULL Pointer Dereference

      • 3.3 Lỗ hổng Stack Buffer Overflow

      • 3.4 Lỗ hổng Kernel Heap Overflow

      • 3.5 Lỗ hổng liên quan đến số nguyên

      • 4 Kĩ thuật khai thác lỗ hổng cho Linux Kernel

        • 4.1 Bước 1 thu thập thông tin

          • 4.1.1 Mục đích thu thập thông tin

          • 4.1.2 Các thông tin cần thu thập

          • 4.2 Bước 2 chuẩn bị shellcode

            • 4.2.1 Tìm vị trí bộ nhớ đặt shellcode

            • 4.2.2 Kĩ thuật nâng quyền

            • 4.2.3 Khôi phục trạng thái Kernel sau khi nâng quyền

            • 4.3 Bước 3 thực thi mã khai thác

              • 4.3.1 NULL Pointer Dereference

              • 4.3.2 Stack Overflow

              • 4.3.3 Heap Overflow

              • 4.3.4 Ghi đè giá trị tại địa chỉ bất kì

              • 5 Khai thác lỗ hổng thực tế CVE-2013-2094

                • 5.1 Khai thác lỗ hổng GHOST để chiếm quyền người dùng từ xa.

Tài liệu cùng người dùng

Tài liệu liên quan